diff options
author | Matthew Wild <mwild1@gmail.com> | 2010-01-21 14:53:01 +0000 |
---|---|---|
committer | Matthew Wild <mwild1@gmail.com> | 2010-01-21 14:53:01 +0000 |
commit | 08eb2962487da4fad181f7d3eaac51490be253c5 (patch) | |
tree | 76f7fa2bf79eab97d90761bbb659067ce081b893 | |
parent | 2545e17aebeaca777b976428a7b233afcd5bf692 (diff) | |
download | prosody-08eb2962487da4fad181f7d3eaac51490be253c5.tar.gz prosody-08eb2962487da4fad181f7d3eaac51490be253c5.zip |
net.httpserver: More robust handling of headers split across multiple packets
-rw-r--r-- | net/httpserver.lua | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/net/httpserver.lua b/net/httpserver.lua index cf51521f..addbfac0 100644 --- a/net/httpserver.lua +++ b/net/httpserver.lua @@ -142,22 +142,29 @@ local function request_reader(request, data, startpos) elseif request.state == "headers" then log("debug", "Reading headers...") local pos = startpos; - local headers = request.headers or {}; + local headers, headers_complete = request.headers; + if not headers then + headers = {}; + request.headers = headers; + end + for line in data:gmatch("(.-)\r\n") do startpos = (startpos or 1) + #line + 2; local k, v = line:match("(%S+): (.+)"); if k and v then headers[k:lower()] = v; --- log("debug", "Header: "..k:lower().." = "..v); + --log("debug", "Header: '"..k:lower().."' = '"..v.."'"); elseif #line == 0 then - request.headers = headers; + headers_complete = true; break; else log("debug", "Unhandled header line: "..line); end end - if not expectbody(request) then + if not headers_complete then return; end + + if not expectbody(request) then call_callback(request); return; end |