0
0
mirror of https://github.com/Doodle3D/doodle3d-firmware.git synced 2024-06-26 19:41:22 +02:00
doodle3d-firmware/src/rest/request.lua

117 lines
2.5 KiB
Lua

local urlcode = require("util.urlcode")
local M = {}
M.__index = M
local function kvTableFromUrlEncodedString(encodedText)
local args = {}
if (encodedText ~= nil) then
urlcode.parsequery(encodedText, args)
end
return args
end
local function kvTableFromArray(argArray)
local args = {}
for _, v in ipairs(argArray) do
local split = v:find("=")
if split ~= nil then
args[v:sub(1, split - 1)] = v:sub(split + 1)
else
args[v] = true
end
end
return args
end
setmetatable(M, {
__call = function(cls, ...)
return cls.new(...)
end
})
function M.new(postData, debug)
local self = setmetatable({}, M)
--NOTE: is it correct to assume that absence of REQUEST_METHOD indicates command line invocation?
self.requestMethod = os.getenv("REQUEST_METHOD")
if self.requestMethod ~= nil then
self.remoteHost = os.getenv("REMOTE_HOST")
self.remotePort = os.getenv("REMOTE_PORT")
self.userAgent = os.getenv("HTTP_USER_AGENT")
else
self.requestMethod = "CMDLINE"
end
self.cmdLineArgs = kvTableFromArray(arg)
self.getArgs = kvTableFromUrlEncodedString(os.getenv("QUERY_STRING"))
self.postArgs = kvTableFromUrlEncodedString(postData)
--TEMP: until these can be extracted from the url path itself
self.apiModule = self.getArgs["m"]
self.apiFunction = self.getArgs["f"]
if debug then
self.apiModule = self.cmdLineArgs["m"] or self.apiModule
self.apiFunction = self.cmdLineArgs["f"] or self.apiFunction
end
if self.apiModule == "" then self.apiModule = nil end
if self.apiFunction == "" then self.apiFunction = nil end
return self
end
function M:getRequestMethod()
return self.requestMethod
end
function M:getApiModule()
return self.apiModule
end
function M:getApiFunction()
return self.apiFunction
end
function M:getBlankArgument()
return self.blankArgument
end
function M:setBlankArgument(arg)
self.blankArgument = arg
end
function M:getRemoteHost() return self.remoteHost or "" end
function M:getRemotePort() return self.remotePort or 0 end
function M:getUserAgent() return self.userAgent or "" end
function M:get(key)
if self.requestMethod == "GET" then
return self.getArgs[key]
elseif self.requestMethod == "POST" then
return self.postArgs[key]
elseif self.requestMethod == "CMDLINE" then
return self.cmdLineArgs[key]
else
return nil
end
end
function M:getAll()
if self.requestMethod == "GET" then
return self.getArgs
elseif self.requestMethod == "POST" then
return self.postArgs
elseif self.requestMethod == "CMDLINE" then
return self.cmdLineArgs
else
return nil
end
end
return M