Comparison

net/http/server.lua @ 6071:420c0d3b8583

net.http.server: Add prepare_header() and finish_response() to allow sending chunked responses via the API
author Daurnimator <quae@daurnimator.com>
date Tue, 15 Apr 2014 18:07:45 +0100
parent 5776:bd0ff8ae98a8
child 6082:d0e824a21861
comparison
equal deleted inserted replaced
6069:446148cad35e 6071:420c0d3b8583
183 status_code = 200; 183 status_code = 200;
184 headers = { date = date_header, connection = response_conn_header }; 184 headers = { date = date_header, connection = response_conn_header };
185 persistent = persistent; 185 persistent = persistent;
186 conn = conn; 186 conn = conn;
187 send = _M.send_response; 187 send = _M.send_response;
188 done = _M.finish_response;
188 finish_cb = finish_cb; 189 finish_cb = finish_cb;
189 }; 190 };
190 conn._http_open_response = response; 191 conn._http_open_response = response;
191 192
192 local host = (request.headers.host or ""):match("[^:]+"); 193 local host = (request.headers.host or ""):match("[^:]+");
244 245
245 -- if handler not called, return 404 246 -- if handler not called, return 404
246 response.status_code = 404; 247 response.status_code = 404;
247 response:send(events.fire_event("http-error", { code = 404 })); 248 response:send(events.fire_event("http-error", { code = 404 }));
248 end 249 end
250 local function prepare_header(response)
251 local status_line = "HTTP/"..response.request.httpversion.." "..(response.status or codes[response.status_code]);
252 local headers = response.headers;
253 local output = { status_line };
254 for k,v in pairs(headers) do
255 t_insert(output, headerfix[k]..v);
256 end
257 t_insert(output, "\r\n\r\n");
258 t_insert(output, body);
259 return output;
260 end
261 _M.prepare_header = prepare_header;
249 function _M.send_response(response, body) 262 function _M.send_response(response, body)
263 if response.finished then return; end
264 body = body or response.body or "";
265 headers.content_length = #body;
266 local output = prepare_header(respone);
267 t_insert(output, body);
268 response.conn:write(t_concat(output));
269 response:finish();
270 end
271 function _M.finish_response(response)
250 if response.finished then return; end 272 if response.finished then return; end
251 response.finished = true; 273 response.finished = true;
252 response.conn._http_open_response = nil; 274 response.conn._http_open_response = nil;
253
254 local status_line = "HTTP/"..response.request.httpversion.." "..(response.status or codes[response.status_code]);
255 local headers = response.headers;
256 body = body or response.body or "";
257 headers.content_length = #body;
258
259 local output = { status_line };
260 for k,v in pairs(headers) do
261 t_insert(output, headerfix[k]..v);
262 end
263 t_insert(output, "\r\n\r\n");
264 t_insert(output, body);
265
266 response.conn:write(t_concat(output));
267 if response.on_destroy then 275 if response.on_destroy then
268 response:on_destroy(); 276 response:on_destroy();
269 response.on_destroy = nil; 277 response.on_destroy = nil;
270 end 278 end
271 if response.persistent then 279 if response.persistent then