aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2013-04-18 00:10:52 +0100
committerMatthew Wild <mwild1@gmail.com>2013-04-18 00:10:52 +0100
commit18a0ca2f3d9e1be916f764538fab30a9eabc7716 (patch)
tree0604a6d66c0c755bf29a09127cce1c4ce854f6ac
parent3b6ed12bb6225d37e234c6c994b2114f1e5e0b84 (diff)
parent8432300448438ac440333c9b371826ace1fd7e86 (diff)
downloadprosody-18a0ca2f3d9e1be916f764538fab30a9eabc7716.tar.gz
prosody-18a0ca2f3d9e1be916f764538fab30a9eabc7716.zip
Merge 0.9->trunk
-rw-r--r--net/http.lua19
-rw-r--r--net/http/server.lua2
-rw-r--r--net/server_select.lua61
3 files changed, 44 insertions, 38 deletions
diff --git a/net/http.lua b/net/http.lua
index 4eb4a2ac..639ecf6a 100644
--- a/net/http.lua
+++ b/net/http.lua
@@ -66,24 +66,29 @@ end
function listener.ondisconnect(conn, err)
local request = requests[conn];
if request and request.conn then
- request:reader(nil);
+ request:reader(nil, err);
end
requests[conn] = nil;
end
-local function request_reader(request, data)
+local function request_reader(request, data, err)
if not request.parser then
- if not data then return; end
- local function success_cb(r)
+ local function error_cb(reason)
if request.callback then
- request.callback(r.body, r.code, r, request);
+ request.callback(reason or "connection-closed", 0, request);
request.callback = nil;
end
destroy_request(request);
end
- local function error_cb(r)
+
+ if not data then
+ error_cb(err);
+ return;
+ end
+
+ local function success_cb(r)
if request.callback then
- request.callback(r or "connection-closed", 0, request);
+ request.callback(r.body, r.code, r, request);
request.callback = nil;
end
destroy_request(request);
diff --git a/net/http/server.lua b/net/http/server.lua
index 830579c9..a983b8d5 100644
--- a/net/http/server.lua
+++ b/net/http/server.lua
@@ -159,7 +159,7 @@ function handle_request(conn, request, finish_cb)
local conn_header = request.headers.connection;
conn_header = conn_header and ","..conn_header:gsub("[ \t]", ""):lower().."," or ""
local httpversion = request.httpversion
- local persistent = conn_header:find(",keep-alive,", 1, true)
+ 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;
diff --git a/net/server_select.lua b/net/server_select.lua
index f123f4b7..983b06a2 100644
--- a/net/server_select.lua
+++ b/net/server_select.lua
@@ -569,7 +569,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
end
out_put( "server.lua: ssl handshake error: ", tostring(err or "handshake too long") )
_ = handler and handler:force_close("ssl handshake failed")
- return false, err -- handshake failed
+ return false, err -- handshake failed
end
)
end
@@ -613,7 +613,7 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
handler.readbuffer = handshake
handler.sendbuffer = handshake
- return handshake( socket ) -- do handshake
+ return handshake( socket ) -- do handshake
end
end
@@ -629,10 +629,10 @@ wrapconnection = function( server, listeners, socket, ip, serverport, clientport
if sslctx and luasec then
out_put "server.lua: auto-starting ssl negotiation..."
handler.autostart_ssl = true;
- local ok, err = handler:starttls(sslctx);
- if ok == false then
- return nil, nil, err
- end
+ local ok, err = handler:starttls(sslctx);
+ if ok == false then
+ return nil, nil, err
+ end
end
return handler, socket
@@ -846,6 +846,28 @@ loop = function(once) -- this is the main loop of the program
_closelist[ handler ] = nil;
end
_currenttime = luasocket_gettime( )
+
+ -- Check for socket timeouts
+ local difftime = os_difftime( _currenttime - _starttime )
+ if difftime > _checkinterval then
+ _starttime = _currenttime
+ for handler, timestamp in pairs( _writetimes ) do
+ if os_difftime( _currenttime - timestamp ) > _sendtimeout then
+ --_writetimes[ handler ] = nil
+ handler.disconnect( )( handler, "send timeout" )
+ handler:force_close() -- forced disconnect
+ end
+ end
+ for handler, timestamp in pairs( _readtimes ) do
+ if os_difftime( _currenttime - timestamp ) > _readtimeout then
+ --_readtimes[ handler ] = nil
+ handler.disconnect( )( handler, "read timeout" )
+ handler:close( ) -- forced disconnect?
+ end
+ end
+ end
+
+ -- Fire timers
if _currenttime - _timer >= math_min(next_timer_time, 1) then
next_timer_time = math_huge;
for i = 1, _timerlistlen do
@@ -856,8 +878,9 @@ loop = function(once) -- this is the main loop of the program
else
next_timer_time = next_timer_time - (_currenttime - _timer);
end
- socket_sleep( _sleeptime ) -- wait some time
- --collectgarbage( )
+
+ -- wait some time (0 by default)
+ socket_sleep( _sleeptime )
until quitting;
if once and quitting == "once" then quitting = nil; return; end
return "quitting"
@@ -921,28 +944,6 @@ use "setmetatable" ( _writetimes, { __mode = "k" } )
_timer = luasocket_gettime( )
_starttime = luasocket_gettime( )
-addtimer( function( )
- local difftime = os_difftime( _currenttime - _starttime )
- if difftime > _checkinterval then
- _starttime = _currenttime
- for handler, timestamp in pairs( _writetimes ) do
- if os_difftime( _currenttime - timestamp ) > _sendtimeout then
- --_writetimes[ handler ] = nil
- handler.disconnect( )( handler, "send timeout" )
- handler:force_close() -- forced disconnect
- end
- end
- for handler, timestamp in pairs( _readtimes ) do
- if os_difftime( _currenttime - timestamp ) > _readtimeout then
- --_readtimes[ handler ] = nil
- handler.disconnect( )( handler, "read timeout" )
- handler:close( ) -- forced disconnect?
- end
- end
- end
- end
-)
-
local function setlogger(new_logger)
local old_logger = log;
if new_logger then