XZTablets

ProxyService

Apr 8th, 2020
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.97 KB | None | 0 0
  1. local http = game:GetService('HttpService')
  2. local _get = syn.request
  3. local _post = syn.post
  4. local _decode = http.JSONDecode
  5.  
  6. local POST_METHODS = {'POST', 'PUT', 'PATCH'}
  7. local GET_METHODS = {'GET', 'DELETE'}
  8.  
  9. local ProxyService = {}
  10.  
  11. local processBody = function (body)
  12.   local pos, _, match = body:find('"""(.+)"""$')
  13.   local data = _decode(http, match)
  14.   local res = {
  15.     headers = data.headers,
  16.     status = data.status,
  17.     body = body:sub(1, pos - 1)
  18.   }
  19.   return res
  20. end
  21.  
  22. local httpGet = function (...)
  23.   local body = _get(http, ...)
  24.   return processBody(body)
  25. end
  26.  
  27. local httpPost = function (...)
  28.   local body = _post(http, ...)
  29.   return processBody(body)
  30. end
  31.  
  32. local getHeaders = function (this, method, target, headers, overrideProto)
  33.   local sendHeaders = headers or {}
  34.   sendHeaders['proxy-access-key'] = this.accessKey
  35.   sendHeaders['proxy-target'] = target
  36.   if overrideProto then
  37.     sendHeaders['proxy-target-override-proto'] = overrideProto
  38.   end
  39.   if method ~= 'GET' and method ~= 'POST' then
  40.     sendHeaders['proxy-target-override-method'] = method
  41.   end
  42.   if headers then
  43.     for header, value in next, headers do
  44.       local headerLower = header:lower();
  45.       if headerLower == 'user-agent' then
  46.         sendHeaders['user-agent'] = nil
  47.         sendHeaders['proxy-override-user-agent'] = value
  48.       end
  49.     end
  50.   end
  51.   return sendHeaders
  52. end
  53.  
  54. local generatePostHandler = function (method)
  55.   return function (self, target, path, data, contentType, compress, headers, overrideProto)
  56.     local sendHeaders = getHeaders(self, method, target, headers, overrideProto)
  57.     return httpPost(self.root .. path, data, contentType, compress, sendHeaders)
  58.   end
  59. end
  60.  
  61. local generateGetHandler = function (method)
  62.   return function (self, target, path, nocache, headers, overrideProto)
  63.     local sendHeaders = getHeaders(self, method, target, headers, overrideProto)
  64.     return httpGet(self.root .. path, nocache, sendHeaders)
  65.   end
  66. end
  67.  
  68. local urlProcessor = function (callback)
  69.   return function (self, url, ...)
  70.     local _, endpos = url:find('://')
  71.     local nextpos = url:find('/', endpos + 1) or #url + 1
  72.     local target = url:sub(endpos + 1, nextpos - 1)
  73.     local path = url:sub(nextpos)
  74.     return callback(self, target, path, ...)
  75.   end
  76. end
  77.  
  78. local generateWithHandler = function (handler, method, handlerMethod)
  79.   ProxyService[method:sub(1,1):upper() .. method:sub(2):lower()] = urlProcessor(handler(method))
  80. end
  81.  
  82. for _, method in next, POST_METHODS do
  83.   generateWithHandler(generatePostHandler, method)
  84. end
  85. for _, method in next, GET_METHODS do
  86.   generateWithHandler(generateGetHandler, method)
  87. end
  88.  
  89. function ProxyService:New(root, accessKey)
  90.   if root:sub(#root, #root) == '/' then
  91.     root = root:sub(1, #root - 1)
  92.   end
  93.   if not root:find('^http[s]?://') then
  94.     error('Root must include http:// or https:// at the beginning')
  95.   end
  96.   self.root = root
  97.   self.accessKey = accessKey
  98.   return self
  99. end
  100.  
  101. return ProxyService
Add Comment
Please, Sign In to add comment