Software /
code /
prosody
Comparison
net/httpserver.lua @ 2837:a17e73ab5f4c
net.httpserver: More robust handling of headers split across multiple packets
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Thu, 21 Jan 2010 14:53:01 +0000 |
parent | 2836:dfb5fa77d437 |
child | 2877:1edeb8fe7d14 |
comparison
equal
deleted
inserted
replaced
2836:dfb5fa77d437 | 2837:a17e73ab5f4c |
---|---|
144 end | 144 end |
145 end | 145 end |
146 elseif request.state == "headers" then | 146 elseif request.state == "headers" then |
147 log("debug", "Reading headers...") | 147 log("debug", "Reading headers...") |
148 local pos = startpos; | 148 local pos = startpos; |
149 local headers = request.headers or {}; | 149 local headers, headers_complete = request.headers; |
150 if not headers then | |
151 headers = {}; | |
152 request.headers = headers; | |
153 end | |
154 | |
150 for line in data:gmatch("(.-)\r\n") do | 155 for line in data:gmatch("(.-)\r\n") do |
151 startpos = (startpos or 1) + #line + 2; | 156 startpos = (startpos or 1) + #line + 2; |
152 local k, v = line:match("(%S+): (.+)"); | 157 local k, v = line:match("(%S+): (.+)"); |
153 if k and v then | 158 if k and v then |
154 headers[k:lower()] = v; | 159 headers[k:lower()] = v; |
155 -- log("debug", "Header: "..k:lower().." = "..v); | 160 --log("debug", "Header: '"..k:lower().."' = '"..v.."'"); |
156 elseif #line == 0 then | 161 elseif #line == 0 then |
157 request.headers = headers; | 162 headers_complete = true; |
158 break; | 163 break; |
159 else | 164 else |
160 log("debug", "Unhandled header line: "..line); | 165 log("debug", "Unhandled header line: "..line); |
161 end | 166 end |
162 end | 167 end |
163 | 168 |
164 if not expectbody(request) then | 169 if not headers_complete then return; end |
170 | |
171 if not expectbody(request) then | |
165 call_callback(request); | 172 call_callback(request); |
166 return; | 173 return; |
167 end | 174 end |
168 | 175 |
169 -- Reached the end of the headers | 176 -- Reached the end of the headers |