aboutsummaryrefslogtreecommitdiffstats
path: root/net/http
diff options
context:
space:
mode:
authorFlorian Zeitz <florob@babelmonkeys.de>2013-01-12 17:26:50 +0100
committerFlorian Zeitz <florob@babelmonkeys.de>2013-01-12 17:26:50 +0100
commit1931de09249a06487cd72bd086eab8d32b48a3e9 (patch)
tree3a2dc881045eca3ff4afeaab2750337e7c5ce3e5 /net/http
parent18e11c4dbc18f8cc48e1533ac5a9e79aa9a293cd (diff)
downloadprosody-1931de09249a06487cd72bd086eab8d32b48a3e9.tar.gz
prosody-1931de09249a06487cd72bd086eab8d32b48a3e9.zip
net.http.server: Properly handle persistent connections
Diffstat (limited to 'net/http')
-rw-r--r--net/http/server.lua17
1 files changed, 14 insertions, 3 deletions
diff --git a/net/http/server.lua b/net/http/server.lua
index 69908e4e..7cf25009 100644
--- a/net/http/server.lua
+++ b/net/http/server.lua
@@ -156,12 +156,23 @@ function handle_request(conn, request, finish_cb)
local date_header = os_date('!%a, %d %b %Y %H:%M:%S GMT'); -- FIXME use
local conn_header = request.headers.connection;
- local keep_alive = conn_header == "Keep-Alive" or (request.httpversion == "1.1" and conn_header ~= "close");
+ conn_header = conn_header and ","..conn_header:gsub("[ \t]", ""):lower().."," or ""
+ local httpversion = request.httpversion
+ local persistent = conn_header:find(",keep-alive,", 1, true)
+ or (httpversion == "1.1" and not conn_header:find(",close,", 1, true));
+
+ local response_conn_header;
+ if persistent then
+ response_conn_header = "Keep-Alive";
+ else
+ response_conn_header = httpversion == "1.1" and "close" or nil
+ end
local response = {
request = request;
status_code = 200;
- headers = { date = date_header, connection = (keep_alive and "Keep-Alive" or "close") };
+ headers = { date = date_header, connection = response_conn_header };
+ persistent = persistent;
conn = conn;
send = _M.send_response;
finish_cb = finish_cb;
@@ -241,7 +252,7 @@ function _M.send_response(response, body)
response:on_destroy();
response.on_destroy = nil;
end
- if headers.connection == "Keep-Alive" then
+ if response.persistent then
response:finish_cb();
else
response.conn:close();