diff options
author | Kim Alvefur <zash@zash.se> | 2016-07-13 10:25:52 +0200 |
---|---|---|
committer | Kim Alvefur <zash@zash.se> | 2016-07-13 10:25:52 +0200 |
commit | 21898f125205e79455e4e4539988e42a4d935b18 (patch) | |
tree | 211c2095c4ed506159c6508b1a901ac0ac56af38 /net | |
parent | 609cd70a7c4ab80fad47a77a32c7d70fda8779ae (diff) | |
parent | a8523999b65f39d8a8a242f38bc825a5a6accd4d (diff) | |
download | prosody-21898f125205e79455e4e4539988e42a4d935b18.tar.gz prosody-21898f125205e79455e4e4539988e42a4d935b18.zip |
Merge 0.10->trunk
Diffstat (limited to 'net')
-rw-r--r-- | net/dns.lua | 4 | ||||
-rw-r--r-- | net/http/server.lua | 42 |
2 files changed, 44 insertions, 2 deletions
diff --git a/net/dns.lua b/net/dns.lua index 4a35fc1b..726b2b80 100644 --- a/net/dns.lua +++ b/net/dns.lua @@ -1011,7 +1011,7 @@ end function resolver.print(response) -- - - - - - - - - - - - - resolver.print - for s,s in pairs { 'id', 'qr', 'opcode', 'aa', 'tc', 'rd', 'ra', 'z', + for _, s in pairs { 'id', 'qr', 'opcode', 'aa', 'tc', 'rd', 'ra', 'z', 'rcode', 'qdcount', 'ancount', 'nscount', 'arcount' } do print( string.format('%-30s', 'header.'..s), response.header[s], hint(response.header, s) ); end @@ -1024,7 +1024,7 @@ function resolver.print(response) -- - - - - - - - - - - - - resolver.print local common = { name=1, type=1, class=1, ttl=1, rdlength=1, rdata=1 }; local tmp; - for s,s in pairs({'answer', 'authority', 'additional'}) do + for _, s in pairs({'answer', 'authority', 'additional'}) do for i,rr in pairs(response[s]) do for j,t in pairs({ 'name', 'type', 'class', 'ttl', 'rdlength' }) do tmp = string.format('%s[%i].%s', s, i, t); diff --git a/net/http/server.lua b/net/http/server.lua index aeaa7416..bc39767f 100644 --- a/net/http/server.lua +++ b/net/http/server.lua @@ -13,10 +13,12 @@ local traceback = debug.traceback; local tostring = tostring; local cache = require "util.cache"; local codes = require "net.http.codes"; +local blocksize = require "socket".BLOCKSIZE or 2048; local _M = {}; local sessions = {}; +local incomplete = {}; local listener = {}; local hosts = {}; local default_host; @@ -140,17 +142,26 @@ function listener.ondisconnect(conn) open_response.finished = true; open_response:on_destroy(); end + incomplete[conn] = nil; sessions[conn] = nil; end function listener.ondetach(conn) sessions[conn] = nil; + incomplete[conn] = nil; end function listener.onincoming(conn, data) sessions[conn]:feed(data); end +function listener.ondrain(conn) + local response = incomplete[conn]; + if response and response._send_more then + response._send_more(); + end +end + local headerfix = setmetatable({}, { __index = function(t, k) local v = "\r\n"..k:gsub("_", "-"):gsub("%f[%w].", s_upper)..": "; @@ -190,6 +201,7 @@ function handle_request(conn, request, finish_cb) persistent = persistent; conn = conn; send = _M.send_response; + send_file = _M.send_file; done = _M.finish_response; finish_cb = finish_cb; }; @@ -272,6 +284,36 @@ function _M.send_response(response, body) response.conn:write(t_concat(output)); response:done(); end +function _M.send_file(response, f) + if response.finished then return; end + local chunked = not response.headers.content_length; + if chunked then response.headers.transfer_encoding = "chunked"; end + incomplete[response.conn] = response; + response._send_more = function () + if response.finished then + incomplete[response.conn] = nil; + return; + end + local chunk = f:read(blocksize); + if chunk then + if chunked then + chunk = ("%x\r\n%s\r\n"):format(#chunk, chunk); + end + -- io.write("."); io.flush(); + response.conn:write(chunk); + else + if chunked then + response.conn:write("0\r\n\r\n"); + end + -- io.write("\n"); + if f.close then f:close(); end + incomplete[response.conn] = nil; + return response:done(); + end + end + response.conn:write(t_concat(prepare_header(response))); + return true; +end function _M.finish_response(response) if response.finished then return; end response.finished = true; |