# HG changeset patch # User jbe # Date 1421014692 -3600 # Node ID 4b6d7ca25381e9f049ba1e3145b395564e7b6057 # Parent 583e2ad140dc21bb3df44e28a0fd66b8a28da60f Forward compatibility with future HTTP versions (accept absolute URLs as target); Always require "Host" header; Renamed request.url to request.target diff -r 583e2ad140dc -r 4b6d7ca25381 moonbridge_http.lua --- a/moonbridge_http.lua Fri Jan 09 22:51:25 2015 +0100 +++ b/moonbridge_http.lua Sun Jan 11 23:18:12 2015 +0100 @@ -77,7 +77,7 @@ -- status codes that carry no response body (in addition to 1xx): -- (set to "zero_content_length" if Content-Length header is required) status_without_response_body = { - ["101"] = true, + ["101"] = true, -- list 101 to allow protocol switch ["204"] = true, ["205"] = "zero_content_length", ["304"] = true @@ -798,7 +798,7 @@ return error_response("413 Request Entity Too Large", "Request line too long") end local proto - request.method, request.url, proto = + request.method, request.target, proto = line:match("^([^ \t\r]+)[ \t]+([^ \t\r]+)[ \t]*([^ \t\r]*)[ \t]*\r?\n$") if not request.method then return error_response("400 Bad Request") @@ -858,9 +858,26 @@ return error_response("417 Expectation Failed", "Unexpected Expect header") end end + -- parse request target: + request.path, request.query = string.match(request.target, "^(/[^?]*)%??(.*)$") + if request.path then + request.host = request.headers_value["Host"] + if not request.host then + return error_response("400 Bad Request", "No valid host header") + end + else + request.host, request.path, request.query = string.match(request.target, "^[Hh][Tt][Tt][Pp]://([^/?]+)/?([^?]*)%??(.*)$") + if request.host then + if request.host ~= request.headers_value["Host"] then + return error_response("400 Bad Request", "No valid host header") + end + request.path = "/" .. request.path + end + end -- parse GET params: - request.path, request.query = string.match(request.url, "^([^?]*)%??(.*)$") - read_urlencoded_form(request.get_params_list, request.query) + if request.query then + read_urlencoded_form(request.get_params_list, request.query) + end -- parse cookies: for i, line in ipairs(request.headers["Cookie"]) do for rawkey, rawvalue in