moonbridge

changeset 5:4b6d7ca25381

Forward compatibility with future HTTP versions (accept absolute URLs as target); Always require "Host" header; Renamed request.url to request.target
author jbe
date Sun Jan 11 23:18:12 2015 +0100 (2015-01-11)
parents 583e2ad140dc
children 0449f6a4005f
files moonbridge_http.lua
line diff
     1.1 --- a/moonbridge_http.lua	Fri Jan 09 22:51:25 2015 +0100
     1.2 +++ b/moonbridge_http.lua	Sun Jan 11 23:18:12 2015 +0100
     1.3 @@ -77,7 +77,7 @@
     1.4  -- status codes that carry no response body (in addition to 1xx):
     1.5  -- (set to "zero_content_length" if Content-Length header is required)
     1.6  status_without_response_body = {
     1.7 -  ["101"] = true,
     1.8 +  ["101"] = true,  -- list 101 to allow protocol switch
     1.9    ["204"] = true,
    1.10    ["205"] = "zero_content_length",
    1.11    ["304"] = true
    1.12 @@ -798,7 +798,7 @@
    1.13          return error_response("413 Request Entity Too Large", "Request line too long")
    1.14        end
    1.15        local proto
    1.16 -      request.method, request.url, proto =
    1.17 +      request.method, request.target, proto =
    1.18          line:match("^([^ \t\r]+)[ \t]+([^ \t\r]+)[ \t]*([^ \t\r]*)[ \t]*\r?\n$")
    1.19        if not request.method then
    1.20          return error_response("400 Bad Request")
    1.21 @@ -858,9 +858,26 @@
    1.22              return error_response("417 Expectation Failed", "Unexpected Expect header")
    1.23            end
    1.24          end
    1.25 +        -- parse request target:
    1.26 +        request.path, request.query = string.match(request.target, "^(/[^?]*)%??(.*)$")
    1.27 +        if request.path then
    1.28 +          request.host = request.headers_value["Host"]
    1.29 +          if not request.host then
    1.30 +            return error_response("400 Bad Request", "No valid host header")
    1.31 +          end
    1.32 +        else
    1.33 +          request.host, request.path, request.query = string.match(request.target, "^[Hh][Tt][Tt][Pp]://([^/?]+)/?([^?]*)%??(.*)$")
    1.34 +          if request.host then
    1.35 +            if request.host ~= request.headers_value["Host"] then
    1.36 +              return error_response("400 Bad Request", "No valid host header")
    1.37 +            end
    1.38 +            request.path = "/" .. request.path
    1.39 +          end
    1.40 +        end
    1.41          -- parse GET params:
    1.42 -        request.path, request.query = string.match(request.url, "^([^?]*)%??(.*)$")
    1.43 -        read_urlencoded_form(request.get_params_list, request.query)
    1.44 +        if request.query then
    1.45 +          read_urlencoded_form(request.get_params_list, request.query)
    1.46 +        end
    1.47          -- parse cookies:
    1.48          for i, line in ipairs(request.headers["Cookie"]) do
    1.49            for rawkey, rawvalue in

Impressum / About Us