net.httpserver: More robust handling of headers split across multiple packets
authorMatthew Wild <mwild1@gmail.com>
Thu, 21 Jan 2010 14:53:01 +0000 (14:53 +0000)
committerMatthew Wild <mwild1@gmail.com>
Thu, 21 Jan 2010 14:53:01 +0000 (14:53 +0000)
net/httpserver.lua

index cf51521f93bd5ff1a705e513e94d176cc566c444..addbfac09a7469d3bd2803e5cd5e3a5dd39b1f65 100644 (file)
@@ -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