moonbridge

diff moonbridge_http.lua @ 10:7e6faff049c3

Removed request.url; String in request.path does not contain a leading slash anymore; Stricter parsing of request targets
author jbe
date Thu Jan 29 16:07:56 2015 +0100 (2015-01-29)
parents 4d7551c962d5
children 44a13f4b706f
line diff
     1.1 --- a/moonbridge_http.lua	Thu Jan 29 15:14:58 2015 +0100
     1.2 +++ b/moonbridge_http.lua	Thu Jan 29 16:07:56 2015 +0100
     1.3 @@ -804,8 +804,8 @@
     1.4        if remaining_header_size_limit == 0 then
     1.5          return error_response("413 Request Entity Too Large", "Request line too long")
     1.6        end
     1.7 -      local proto
     1.8 -      request.method, request.target, proto =
     1.9 +      local target, proto
    1.10 +      request.method, target, proto =
    1.11          line:match("^([^ \t\r]+)[ \t]+([^ \t\r]+)[ \t]*([^ \t\r]*)[ \t]*\r?\n$")
    1.12        if not request.method then
    1.13          return error_response("400 Bad Request")
    1.14 @@ -865,20 +865,22 @@
    1.15              return error_response("417 Expectation Failed", "Unexpected Expect header")
    1.16            end
    1.17          end
    1.18 +        -- get mandatory Host header according to RFC 7230:
    1.19 +        request.host = request.headers_value["Host"]
    1.20 +        if not request.host then
    1.21 +          return error_response("400 Bad Request", "No valid host header")
    1.22 +        end
    1.23          -- parse request target:
    1.24 -        request.path, request.query = string.match(request.target, "^(/[^?]*)%??(.*)$")
    1.25 -        if request.path then
    1.26 -          request.host = request.headers_value["Host"]
    1.27 -          if not request.host then
    1.28 -            return error_response("400 Bad Request", "No valid host header")
    1.29 -          end
    1.30 -        else
    1.31 -          request.host, request.path, request.query = string.match(request.target, "^[Hh][Tt][Tt][Pp]://([^/?]+)/?([^?]*)%??(.*)$")
    1.32 -          if request.host then
    1.33 -            if request.host ~= request.headers_value["Host"] then
    1.34 +        request.path, request.query = string.match(target, "^/([^?]*)%??(.*)$")
    1.35 +        if not request.path then
    1.36 +          local host2
    1.37 +          host2, request.path, request.query = string.match(target, "^[Hh][Tt][Tt][Pp]://([^/?]+)/?([^?]*)%??(.*)$")
    1.38 +          if host2 then
    1.39 +            if request.host ~= host2 then
    1.40                return error_response("400 Bad Request", "No valid host header")
    1.41              end
    1.42 -            request.path = "/" .. request.path
    1.43 +          elseif not (target == "*" and request.method == "OPTIONS") then
    1.44 +            return error_response("400 Bad Request", "Invalid request target")
    1.45            end
    1.46          end
    1.47          -- parse GET params:

Impressum / About Us