aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaurnimator <quae@daurnimator.com>2014-04-15 18:07:45 +0100
committerDaurnimator <quae@daurnimator.com>2014-04-15 18:07:45 +0100
commit98f1c94f12e06d9b1326f5c7f321958ce4092954 (patch)
treec97eaf7076896112ee9f656c157e874d6056640e
parent793af5630894999a11f2485c2162ff9ca1454799 (diff)
downloadprosody-98f1c94f12e06d9b1326f5c7f321958ce4092954.tar.gz
prosody-98f1c94f12e06d9b1326f5c7f321958ce4092954.zip
net.http.server: Add prepare_header() and finish_response() to allow sending chunked responses via the API
-rw-r--r--net/http/server.lua26
1 files changed, 17 insertions, 9 deletions
diff --git a/net/http/server.lua b/net/http/server.lua
index 5961169f..25fce43f 100644
--- a/net/http/server.lua
+++ b/net/http/server.lua
@@ -185,6 +185,7 @@ function handle_request(conn, request, finish_cb)
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 @@ function handle_request(conn, request, finish_cb)
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;