First commit
This commit is contained in:
		
							
								
								
									
										278
									
								
								app/SabrehavenServer/SabrehavenOTClient/modules/corelib/http.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										278
									
								
								app/SabrehavenServer/SabrehavenOTClient/modules/corelib/http.lua
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,278 @@
 | 
			
		||||
HTTP = {
 | 
			
		||||
  timeout=5,
 | 
			
		||||
  websocketTimeout=15,
 | 
			
		||||
  agent="Mozilla/5.0",
 | 
			
		||||
  imageId=1000,
 | 
			
		||||
  images={},
 | 
			
		||||
  operations={},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function HTTP.get(url, callback)
 | 
			
		||||
  if not g_http or not g_http.get then
 | 
			
		||||
    return error("HTTP.get is not supported")
 | 
			
		||||
  end
 | 
			
		||||
  local operation = g_http.get(url, HTTP.timeout)
 | 
			
		||||
  HTTP.operations[operation] = {type="get", url=url, callback=callback}  
 | 
			
		||||
  return operation
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function HTTP.getJSON(url, callback)
 | 
			
		||||
  if not g_http or not g_http.get then
 | 
			
		||||
    return error("HTTP.getJSON is not supported")
 | 
			
		||||
  end
 | 
			
		||||
  local operation = g_http.get(url, HTTP.timeout)
 | 
			
		||||
  HTTP.operations[operation] = {type="get", json=true, url=url, callback=callback}  
 | 
			
		||||
  return operation
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function HTTP.post(url, data, callback)
 | 
			
		||||
  if not g_http or not g_http.post then
 | 
			
		||||
    return error("HTTP.post is not supported")
 | 
			
		||||
  end
 | 
			
		||||
  if type(data) == "table" then
 | 
			
		||||
    data = json.encode(data)
 | 
			
		||||
  end
 | 
			
		||||
  local operation = g_http.post(url, data, HTTP.timeout)
 | 
			
		||||
  HTTP.operations[operation] = {type="post", url=url, callback=callback}
 | 
			
		||||
  return operation
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function HTTP.postJSON(url, data, callback)
 | 
			
		||||
  if not g_http or not g_http.post then
 | 
			
		||||
    return error("HTTP.postJSON is not supported")
 | 
			
		||||
  end
 | 
			
		||||
  if type(data) == "table" then
 | 
			
		||||
    data = json.encode(data)
 | 
			
		||||
  end
 | 
			
		||||
  local operation = g_http.post(url, data, HTTP.timeout)
 | 
			
		||||
  HTTP.operations[operation] = {type="post", json=true, url=url, callback=callback}
 | 
			
		||||
  return operation
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function HTTP.download(url, file, callback, progressCallback)
 | 
			
		||||
  if not g_http or not g_http.download then
 | 
			
		||||
    return error("HTTP.download is not supported")
 | 
			
		||||
  end
 | 
			
		||||
  local operation = g_http.download(url, file, HTTP.timeout)
 | 
			
		||||
  HTTP.operations[operation] = {type="download", url=url, file=file, callback=callback, progressCallback=progressCallback}  
 | 
			
		||||
  return operation
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function HTTP.downloadImage(url, callback)
 | 
			
		||||
  if not g_http or not g_http.download then
 | 
			
		||||
    return error("HTTP.downloadImage is not supported")
 | 
			
		||||
  end
 | 
			
		||||
  if HTTP.images[url] ~= nil then
 | 
			
		||||
    if callback then
 | 
			
		||||
      callback('/downloads/' .. HTTP.images[url], nil)
 | 
			
		||||
    end
 | 
			
		||||
    return
 | 
			
		||||
  end
 | 
			
		||||
  local file = "autoimage_" .. HTTP.imageId .. ".png"
 | 
			
		||||
  HTTP.imageId = HTTP.imageId + 1
 | 
			
		||||
  local operation = g_http.download(url, file, HTTP.timeout)
 | 
			
		||||
  HTTP.operations[operation] = {type="image", url=url, file=file, callback=callback}  
 | 
			
		||||
  return operation
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function HTTP.webSocket(url, callbacks, timeout, jsonWebsocket)
 | 
			
		||||
  if not g_http or not g_http.ws then
 | 
			
		||||
    return error("WebSocket is not supported")
 | 
			
		||||
  end
 | 
			
		||||
  if not timeout or timeout < 1 then
 | 
			
		||||
    timeout = HTTP.websocketTimeout
 | 
			
		||||
  end
 | 
			
		||||
  local operation = g_http.ws(url, timeout)
 | 
			
		||||
  HTTP.operations[operation] = {type="ws", json=jsonWebsocket, url=url, callbacks=callbacks}  
 | 
			
		||||
  return {
 | 
			
		||||
    id = operation,
 | 
			
		||||
    url = url,
 | 
			
		||||
    close = function() 
 | 
			
		||||
      g_http.wsClose(operation)
 | 
			
		||||
    end,
 | 
			
		||||
    send = function(message)
 | 
			
		||||
      if type(message) == "table" then
 | 
			
		||||
        message = json.encode(message)
 | 
			
		||||
      end
 | 
			
		||||
      g_http.wsSend(operation, message)
 | 
			
		||||
    end
 | 
			
		||||
  }
 | 
			
		||||
end
 | 
			
		||||
HTTP.WebSocket = HTTP.webSocket
 | 
			
		||||
 | 
			
		||||
function HTTP.webSocketJSON(url, callbacks, timeout)
 | 
			
		||||
  return HTTP.webSocket(url, callbacks, timeout, true)
 | 
			
		||||
end
 | 
			
		||||
HTTP.WebSocketJSON = HTTP.webSocketJSON
 | 
			
		||||
 | 
			
		||||
function HTTP.cancel(operationId)
 | 
			
		||||
  if not g_http or not g_http.cancel then
 | 
			
		||||
    return
 | 
			
		||||
  end
 | 
			
		||||
  HTTP.operations[operationId] = nil
 | 
			
		||||
  return g_http.cancel(operationId)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function HTTP.onGet(operationId, url, err, data)
 | 
			
		||||
  local operation = HTTP.operations[operationId]
 | 
			
		||||
  if operation == nil then
 | 
			
		||||
    return
 | 
			
		||||
  end
 | 
			
		||||
  if err and err:len() == 0 then
 | 
			
		||||
    err = nil
 | 
			
		||||
  end
 | 
			
		||||
  if not err and operation.json then
 | 
			
		||||
    local status, result = pcall(function() return json.decode(data) end)
 | 
			
		||||
    if not status then
 | 
			
		||||
      err = "JSON ERROR: " .. result
 | 
			
		||||
      if data and data:len() > 0 then
 | 
			
		||||
        err = err .. " (" .. data:sub(1, 100) .. ")"
 | 
			
		||||
      end
 | 
			
		||||
    end  
 | 
			
		||||
    data = result
 | 
			
		||||
  end
 | 
			
		||||
  if operation.callback then
 | 
			
		||||
    operation.callback(data, err)
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function HTTP.onGetProgress(operationId, url, progress)
 | 
			
		||||
  local operation = HTTP.operations[operationId]
 | 
			
		||||
  if operation == nil then
 | 
			
		||||
    return
 | 
			
		||||
  end
 | 
			
		||||
  
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function HTTP.onPost(operationId, url, err, data)
 | 
			
		||||
  local operation = HTTP.operations[operationId]
 | 
			
		||||
  if operation == nil then
 | 
			
		||||
    return
 | 
			
		||||
  end
 | 
			
		||||
  if err and err:len() == 0 then
 | 
			
		||||
    err = nil
 | 
			
		||||
  end
 | 
			
		||||
  if not err and operation.json then
 | 
			
		||||
    local status, result = pcall(function() return json.decode(data) end)
 | 
			
		||||
    if not status then
 | 
			
		||||
      err = "JSON ERROR: " .. result
 | 
			
		||||
      if data and data:len() > 0 then
 | 
			
		||||
        err = err .. " (" .. data:sub(1, 100) .. ")"
 | 
			
		||||
      end
 | 
			
		||||
    end  
 | 
			
		||||
    data = result
 | 
			
		||||
  end
 | 
			
		||||
  if operation.callback then
 | 
			
		||||
    operation.callback(data, err)
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function HTTP.onPostProgress(operationId, url, progress)
 | 
			
		||||
  local operation = HTTP.operations[operationId]
 | 
			
		||||
  if operation == nil then
 | 
			
		||||
    return
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function HTTP.onDownload(operationId, url, err, path, checksum)
 | 
			
		||||
  local operation = HTTP.operations[operationId]
 | 
			
		||||
  if operation == nil then
 | 
			
		||||
    return
 | 
			
		||||
  end
 | 
			
		||||
  if err and err:len() == 0 then
 | 
			
		||||
    err = nil
 | 
			
		||||
  end
 | 
			
		||||
  if operation.callback then
 | 
			
		||||
    if operation["type"] == "image" then
 | 
			
		||||
      if not err then
 | 
			
		||||
        HTTP.images[url] = path
 | 
			
		||||
      end
 | 
			
		||||
      operation.callback('/downloads/' .. path, err)    
 | 
			
		||||
    else
 | 
			
		||||
      operation.callback(path, checksum, err)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function HTTP.onDownloadProgress(operationId, url, progress, speed)
 | 
			
		||||
  local operation = HTTP.operations[operationId]
 | 
			
		||||
  if operation == nil then
 | 
			
		||||
    return
 | 
			
		||||
  end
 | 
			
		||||
  if operation.progressCallback then
 | 
			
		||||
    operation.progressCallback(progress, speed)
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function HTTP.onWsOpen(operationId, message)
 | 
			
		||||
  local operation = HTTP.operations[operationId]
 | 
			
		||||
  if operation == nil then
 | 
			
		||||
    return
 | 
			
		||||
  end
 | 
			
		||||
  if operation.callbacks.onOpen then
 | 
			
		||||
    operation.callbacks.onOpen(message, operationId)
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function HTTP.onWsMessage(operationId, message)
 | 
			
		||||
  local operation = HTTP.operations[operationId]
 | 
			
		||||
  if operation == nil then
 | 
			
		||||
    return
 | 
			
		||||
  end
 | 
			
		||||
  if operation.callbacks.onMessage then
 | 
			
		||||
    if operation.json then
 | 
			
		||||
      local status, result = pcall(function() return json.decode(message) end)
 | 
			
		||||
      local err = nil
 | 
			
		||||
      if not status then
 | 
			
		||||
        err = "JSON ERROR: " .. result
 | 
			
		||||
        if message and message:len() > 0 then
 | 
			
		||||
          err = err .. " (" .. message:sub(1, 100) .. ")"
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      if err then
 | 
			
		||||
        if operation.callbacks.onError then
 | 
			
		||||
          operation.callbacks.onError(err, operationId)
 | 
			
		||||
        end        
 | 
			
		||||
      else
 | 
			
		||||
        operation.callbacks.onMessage(result, operationId)    
 | 
			
		||||
      end
 | 
			
		||||
    else
 | 
			
		||||
      operation.callbacks.onMessage(message, operationId)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function HTTP.onWsClose(operationId, message)
 | 
			
		||||
  local operation = HTTP.operations[operationId]
 | 
			
		||||
  if operation == nil then
 | 
			
		||||
    return
 | 
			
		||||
  end
 | 
			
		||||
  if operation.callbacks.onClose then
 | 
			
		||||
    operation.callbacks.onClose(message, operationId)
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function HTTP.onWsError(operationId, message)
 | 
			
		||||
  local operation = HTTP.operations[operationId]
 | 
			
		||||
  if operation == nil then
 | 
			
		||||
    return
 | 
			
		||||
  end
 | 
			
		||||
  if operation.callbacks.onError then
 | 
			
		||||
    operation.callbacks.onError(message, operationId)
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
connect(g_http, 
 | 
			
		||||
  {
 | 
			
		||||
    onGet = HTTP.onGet,
 | 
			
		||||
    onGetProgress = HTTP.onGetProgress,
 | 
			
		||||
    onPost = HTTP.onPost,
 | 
			
		||||
    onPostProgress = HTTP.onPostProgress,
 | 
			
		||||
    onDownload = HTTP.onDownload,
 | 
			
		||||
    onDownloadProgress = HTTP.onDownloadProgress,
 | 
			
		||||
    onWsOpen = HTTP.onWsOpen,
 | 
			
		||||
    onWsMessage = HTTP.onWsMessage,
 | 
			
		||||
    onWsClose = HTTP.onWsClose,
 | 
			
		||||
    onWsError = HTTP.onWsError,
 | 
			
		||||
  })
 | 
			
		||||
g_http.setUserAgent(HTTP.agent)
 | 
			
		||||
		Reference in New Issue
	
	Block a user