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

Impressum / About Us