httpserver-request.lua 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. -- httpserver-request
  2. -- Part of nodemcu-httpserver, parses incoming client requests.
  3. -- Author: Marcos Kirsch
  4. local function validateMethod(method)
  5. local httpMethods = {GET=true, HEAD=true, POST=true, PUT=true, DELETE=true, TRACE=true, OPTIONS=true, CONNECT=true, PATCH=true}
  6. if httpMethods[method] then return true else return false end
  7. end
  8. local function uriToFilename(uri)
  9. return "http/" .. string.sub(uri, 2, -1)
  10. end
  11. local function parseArgs(args)
  12. local r = {}; i=1
  13. if args == nil or args == "" then return r end
  14. for arg in string.gmatch(args, "([^&]+)") do
  15. local name, value = string.match(arg, "(.*)=(.*)")
  16. if name ~= nil then r[name] = value end
  17. i = i + 1
  18. end
  19. return r
  20. end
  21. local function parseUri(uri)
  22. local r = {}
  23. local filename
  24. local ext
  25. local fullExt = {}
  26. if uri == nil then return r end
  27. if uri == "/" then uri = "/index.html" end
  28. questionMarkPos, b, c, d, e, f = uri:find("?")
  29. if questionMarkPos == nil then
  30. r.file = uri:sub(1, questionMarkPos)
  31. r.args = {}
  32. else
  33. r.file = uri:sub(1, questionMarkPos - 1)
  34. r.args = parseArgs(uri:sub(questionMarkPos+1, #uri))
  35. end
  36. filename = r.file
  37. while filename:match("%.") do
  38. filename,ext = filename:match("(.+)%.(.+)")
  39. table.insert(fullExt,1,ext)
  40. end
  41. r.ext = table.concat(fullExt,".")
  42. -- _, r.ext = r.file:match("(.+)%.(.+)")
  43. r.isScript = r.ext == "lua" or r.ext == "lc"
  44. r.file = uriToFilename(r.file)
  45. return r
  46. end
  47. -- Parses the client's request. Returns a dictionary containing pretty much everything
  48. -- the server needs to know about the uri.
  49. return function (request)
  50. local e = request:find("\r\n", 1, true)
  51. if not e then return nil end
  52. local line = request:sub(1, e - 1)
  53. local r = {}
  54. _, i, r.method, r.request = line:find("^([A-Z]+) (.-) HTTP/[1-9]+.[0-9]+$")
  55. r.methodIsValid = validateMethod(r.method)
  56. r.uri = parseUri(r.request)
  57. return r
  58. end