Diff

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
line wrap: on
line diff
--- a/net/http/server.lua	Thu Apr 10 16:49:59 2014 +0200
+++ b/net/http/server.lua	Tue Apr 15 18:07:45 2014 +0100
@@ -185,6 +185,7 @@
 		persistent = persistent;
 		conn = conn;
 		send = _M.send_response;
+		done = _M.finish_response;
 		finish_cb = finish_cb;
 	};
 	conn._http_open_response = response;
@@ -246,24 +247,31 @@
 	response.status_code = 404;
 	response:send(events.fire_event("http-error", { code = 404 }));
 end
-function _M.send_response(response, body)
-	if response.finished then return; end
-	response.finished = true;
-	response.conn._http_open_response = nil;
-
+local function prepare_header(response)
 	local status_line = "HTTP/"..response.request.httpversion.." "..(response.status or codes[response.status_code]);
 	local headers = response.headers;
-	body = body or response.body or "";
-	headers.content_length = #body;
-
 	local output = { status_line };
 	for k,v in pairs(headers) do
 		t_insert(output, headerfix[k]..v);
 	end
 	t_insert(output, "\r\n\r\n");
 	t_insert(output, body);
-
+	return output;
+end
+_M.prepare_header = prepare_header;
+function _M.send_response(response, body)
+	if response.finished then return; end
+	body = body or response.body or "";
+	headers.content_length = #body;
+	local output = prepare_header(respone);
+	t_insert(output, body);
 	response.conn:write(t_concat(output));
+	response:finish();
+end
+function _M.finish_response(response)
+	if response.finished then return; end
+	response.finished = true;
+	response.conn._http_open_response = nil;
 	if response.on_destroy then
 		response:on_destroy();
 		response.on_destroy = nil;