# HG changeset patch # User jbe # Date 1496773149 -7200 # Node ID dec24bd2592c49f10e7ebc64cdf0b6556d4013b5 # Parent d4c82c90d244ee575b27e63645f815607f519966 Close idle HTTP connections on SIGTERM diff -r d4c82c90d244 -r dec24bd2592c moonbridge_http.lua --- a/moonbridge_http.lua Tue Jun 06 20:01:29 2017 +0200 +++ b/moonbridge_http.lua Tue Jun 06 20:19:09 2017 +0200 @@ -203,9 +203,15 @@ local response_timeout = default("response_timeout", 3600) local drain_timeout = default("drain_timeout", 2) local poll = options.poll_function or moonbridge_io.poll + -- install SIGTERM handler: + local sigterm_socket = moonbridge_io.signalsocket("TERM") -- return socket handler: return function(socket) local socket_set = {[socket] = true} -- used for poll function + local socket_term_set = { -- used for poll function + [socket] = true, + [sigterm_socket] = true -- also wakeup if SIGTERM has been received + } local survive = true -- set to false if process shall be terminated later local consume -- can be set to function that reads some input if possible -- function that may be used as "consume" function @@ -1094,9 +1100,12 @@ return true -- success end -- wait for input: - if not poll(socket_set, nil, idle_timeout) then + if not poll(socket_term_set, nil, idle_timeout) then return request_error(false, "408 Request Timeout", "Idle connection timed out") end + if #assert(sigterm_socket:read_nb()) > 0 then + return request_error(false, "408 Request Timeout", "Server shutdown") + end -- read headers (with timeout): do local coro = coroutine.wrap(read_headers)