# HG changeset patch # User Matthew Wild # Date 1264085581 0 # Node ID a17e73ab5f4cbc3395d528610693f1412e37230f # Parent dfb5fa77d4377c38c22355dfc9195918f30efab6 net.httpserver: More robust handling of headers split across multiple packets diff -r dfb5fa77d437 -r a17e73ab5f4c net/httpserver.lua --- a/net/httpserver.lua Thu Jan 21 13:14:52 2010 +0000 +++ b/net/httpserver.lua Thu Jan 21 14:53:01 2010 +0000 @@ -146,22 +146,29 @@ 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