moonbridge
diff moonbridge_http.lua @ 66:3d1f23f1dbc6
Work on non-blocking I/O; Improved efficiency of :readuntil(...)
author | jbe |
---|---|
date | Sat Apr 04 05:10:05 2015 +0200 (2015-04-04) |
parents | 12950c28b73a |
children | ad06fc76906a |
line diff
1.1 --- a/moonbridge_http.lua Sat Apr 04 03:22:06 2015 +0200 1.2 +++ b/moonbridge_http.lua Sat Apr 04 05:10:05 2015 +0200 1.3 @@ -180,13 +180,16 @@ 1.4 end 1.5 local input_chunk_size = options.maximum_input_chunk_size or options.chunk_size or 16384 1.6 local output_chunk_size = options.minimum_output_chunk_size or options.chunk_size or 1024 1.7 - local request_header_timeout, response_timeout 1.8 + local request_idle_timeout, request_header_timeout, response_timeout 1.9 + if options.request_idle_timeout ~= nil then 1.10 + request_idle_timeout = options.request_idle_timeout or 0 1.11 + else 1.12 + request_idle_timeout = 330 1.13 + end 1.14 if options.request_header_timeout ~= nil then 1.15 - request_header_timeout = options.request_header_timeout 1.16 - elseif options.timeout ~= nil then 1.17 - request_header_timeout = options.timeout or 0 1.18 + request_header_timeout = options.request_header_timeout or 0 1.19 else 1.20 - request_header_timeout = 360 1.21 + request_header_timeout = 30 1.22 end 1.23 if options.timeout ~= nil then 1.24 response_timeout = options.timeout or 0 1.25 @@ -197,8 +200,6 @@ 1.26 return function(socket) 1.27 local survive = true -- set to false if process shall be terminated later 1.28 repeat 1.29 - -- (re)set timeout: 1.30 - timeout(request_header_timeout or 0) 1.31 -- process named arguments "request_header_size_limit" and "request_body_size_limit": 1.32 local remaining_header_size_limit = options.request_header_size_limit or 1024*1024 1.33 local remaining_body_size_limit = options.request_body_size_limit or 64*1024*1024 1.34 @@ -893,6 +894,14 @@ 1.35 end 1.36 end 1.37 }) 1.38 + -- wait for input: 1.39 + if not socket.input:pending() then 1.40 + if not io.poll({socket.input}, nil, request_idle_timeout) then 1.41 + return request_error(false, "408 Request Timeout") 1.42 + end 1.43 + end 1.44 + -- set timeout for request header processing: 1.45 + timeout(request_header_timeout) 1.46 -- read and parse request line: 1.47 local line = socket:readuntil("\n", remaining_header_size_limit) 1.48 if not line then return survive end 1.49 @@ -991,12 +1000,14 @@ 1.50 request.cookies[decode_uri(rawkey)] = decode_uri(rawvalue) 1.51 end 1.52 end 1.53 - -- (re)set timeout: 1.54 + -- (re)set timeout for handler: 1.55 timeout(response_timeout or 0) 1.56 -- call underlying handler and remember boolean result: 1.57 if handler(request) ~= true then survive = false end 1.58 -- finish request (unless already done by underlying handler): 1.59 request:finish() 1.60 + -- stop timeout timer: 1.61 + timeout(0) 1.62 until connection_close_responded 1.63 return survive 1.64 end