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