[14:28:29] daurnimator: instead of calling send_response I want to send
just the headers; take my time about the body. but then use proper finish
logic

The below patch makes it easy to implement streaming http responses such as
multipart/mixed or 'Transfer-Encoding: chunked'
Tried to make it as minimal as possible, and keep existing behaviour

diff -r f321536afeec net/http/server.lua
--- a/net/http/server.lua Fri Apr 04 11:20:20 2014 -0400
+++ b/net/http/server.lua Mon Apr 07 14:55:11 2014 -0400
@@ -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;

-- 
You received this message because you are subscribed to the Google Groups 
"prosody-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to prosody-dev+unsubscr...@googlegroups.com.
To post to this group, send email to prosody-dev@googlegroups.com.
Visit this group at http://groups.google.com/group/prosody-dev.
For more options, visit https://groups.google.com/d/optout.

Reply via email to