Mercurial > prosody-hg
comparison net/http/server.lua @ 5300:fcb1be0b4a5c
net.http.server: Properly handle persistent connections
| author | Florian Zeitz <florob@babelmonkeys.de> |
|---|---|
| date | Sat, 12 Jan 2013 17:26:50 +0100 |
| parents | e14f5a156571 |
| children | 760c345dc7a1 |
comparison
equal
deleted
inserted
replaced
| 5299:cc9d460aa779 | 5300:fcb1be0b4a5c |
|---|---|
| 154 request.headers = headers; | 154 request.headers = headers; |
| 155 request.conn = conn; | 155 request.conn = conn; |
| 156 | 156 |
| 157 local date_header = os_date('!%a, %d %b %Y %H:%M:%S GMT'); -- FIXME use | 157 local date_header = os_date('!%a, %d %b %Y %H:%M:%S GMT'); -- FIXME use |
| 158 local conn_header = request.headers.connection; | 158 local conn_header = request.headers.connection; |
| 159 local keep_alive = conn_header == "Keep-Alive" or (request.httpversion == "1.1" and conn_header ~= "close"); | 159 conn_header = conn_header and ","..conn_header:gsub("[ \t]", ""):lower().."," or "" |
| 160 local httpversion = request.httpversion | |
| 161 local persistent = conn_header:find(",keep-alive,", 1, true) | |
| 162 or (httpversion == "1.1" and not conn_header:find(",close,", 1, true)); | |
| 163 | |
| 164 local response_conn_header; | |
| 165 if persistent then | |
| 166 response_conn_header = "Keep-Alive"; | |
| 167 else | |
| 168 response_conn_header = httpversion == "1.1" and "close" or nil | |
| 169 end | |
| 160 | 170 |
| 161 local response = { | 171 local response = { |
| 162 request = request; | 172 request = request; |
| 163 status_code = 200; | 173 status_code = 200; |
| 164 headers = { date = date_header, connection = (keep_alive and "Keep-Alive" or "close") }; | 174 headers = { date = date_header, connection = response_conn_header }; |
| 175 persistent = persistent; | |
| 165 conn = conn; | 176 conn = conn; |
| 166 send = _M.send_response; | 177 send = _M.send_response; |
| 167 finish_cb = finish_cb; | 178 finish_cb = finish_cb; |
| 168 }; | 179 }; |
| 169 conn._http_open_response = response; | 180 conn._http_open_response = response; |
| 239 response.conn:write(t_concat(output)); | 250 response.conn:write(t_concat(output)); |
| 240 if response.on_destroy then | 251 if response.on_destroy then |
| 241 response:on_destroy(); | 252 response:on_destroy(); |
| 242 response.on_destroy = nil; | 253 response.on_destroy = nil; |
| 243 end | 254 end |
| 244 if headers.connection == "Keep-Alive" then | 255 if response.persistent then |
| 245 response:finish_cb(); | 256 response:finish_cb(); |
| 246 else | 257 else |
| 247 response.conn:close(); | 258 response.conn:close(); |
| 248 end | 259 end |
| 249 end | 260 end |
