Mercurial > prosody-hg
comparison net/http/server.lua @ 4691:a164fc7057ae
net.http.server: Support for on_destroy callback on response objects, and a 'finished' flag to say when they are destroyed (responded to or connection closed)
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Wed, 25 Apr 2012 23:08:33 +0100 |
| parents | e8c357259993 |
| children | f9a091b6dfd5 |
comparison
equal
deleted
inserted
replaced
| 4690:55f690fdc915 | 4691:a164fc7057ae |
|---|---|
| 115 end | 115 end |
| 116 sessions[conn] = parser_new(success_cb, error_cb); | 116 sessions[conn] = parser_new(success_cb, error_cb); |
| 117 end | 117 end |
| 118 | 118 |
| 119 function listener.ondisconnect(conn) | 119 function listener.ondisconnect(conn) |
| 120 local open_response = conn._http_open_response; | |
| 121 if open_response and open_response.on_destroy then | |
| 122 open_response.finished = true; | |
| 123 open_response:on_destroy(); | |
| 124 end | |
| 120 sessions[conn] = nil; | 125 sessions[conn] = nil; |
| 121 end | 126 end |
| 122 | 127 |
| 123 function listener.onincoming(conn, data) | 128 function listener.onincoming(conn, data) |
| 124 sessions[conn]:feed(data); | 129 sessions[conn]:feed(data); |
| 152 headers = { date = date_header, connection = (keep_alive and "Keep-Alive" or "close") }; | 157 headers = { date = date_header, connection = (keep_alive and "Keep-Alive" or "close") }; |
| 153 conn = conn; | 158 conn = conn; |
| 154 send = _M.send_response; | 159 send = _M.send_response; |
| 155 finish_cb = finish_cb; | 160 finish_cb = finish_cb; |
| 156 }; | 161 }; |
| 162 conn._http_open_response = response; | |
| 157 | 163 |
| 158 if not request.headers.host then | 164 if not request.headers.host then |
| 159 response.status_code = 400; | 165 response.status_code = 400; |
| 160 response.headers.content_type = "text/html"; | 166 response.headers.content_type = "text/html"; |
| 161 response:send("<html><head>400 Bad Request</head><body>400 Bad Request: No Host header.</body></html>"); | 167 response:send("<html><head>400 Bad Request</head><body>400 Bad Request: No Host header.</body></html>"); |
| 193 response.headers.content_type = "text/html"; | 199 response.headers.content_type = "text/html"; |
| 194 response:send("<html><head><title>404 Not Found</title></head><body>404 Not Found: No such page.</body></html>"); | 200 response:send("<html><head><title>404 Not Found</title></head><body>404 Not Found: No such page.</body></html>"); |
| 195 end | 201 end |
| 196 end | 202 end |
| 197 function _M.send_response(response, body) | 203 function _M.send_response(response, body) |
| 204 if response.finished then return; end | |
| 205 response.finished = true; | |
| 206 response.conn._http_open_response = nil; | |
| 207 | |
| 198 local status_line = "HTTP/"..response.request.httpversion.." "..(response.status or codes[response.status_code]); | 208 local status_line = "HTTP/"..response.request.httpversion.." "..(response.status or codes[response.status_code]); |
| 199 local headers = response.headers; | 209 local headers = response.headers; |
| 200 body = body or ""; | 210 body = body or ""; |
| 201 headers.content_length = #body; | 211 headers.content_length = #body; |
| 202 | 212 |
| 206 end | 216 end |
| 207 t_insert(output, "\r\n\r\n"); | 217 t_insert(output, "\r\n\r\n"); |
| 208 t_insert(output, body); | 218 t_insert(output, body); |
| 209 | 219 |
| 210 response.conn:write(t_concat(output)); | 220 response.conn:write(t_concat(output)); |
| 221 if response.on_destroy then | |
| 222 response:on_destroy(); | |
| 223 response.on_destroy = nil; | |
| 224 end | |
| 211 if headers.connection == "Keep-Alive" then | 225 if headers.connection == "Keep-Alive" then |
| 212 response:finish_cb(); | 226 response:finish_cb(); |
| 213 else | 227 else |
| 214 response.conn:close(); | 228 response.conn:close(); |
| 215 end | 229 end |
