Class: PhusionPassenger::AbstractRequestHandler
- Inherits:
-
Object
- Object
- PhusionPassenger::AbstractRequestHandler
- Defined in:
- lib/after_response/adapters/passenger2_2.rb,
lib/after_response/adapters/passenger3.rb
Overview
ACK… Passenger < 3.0 sucks because request loop can’t be wrapped to do what we need. github.com/FooBarWidget/passenger/blob/release-2.2.14/lib/phusion_passenger/abstract_request_handler.rb We have to overwrite the entire AbstractRequestHandler#main_loop method. Here goes.
Instance Method Summary collapse
-
#main_loop ⇒ Object
Enter the request handler’s main loop.
Instance Method Details
#main_loop ⇒ Object
Enter the request handler’s main loop.
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/after_response/adapters/passenger2_2.rb', line 7 def main_loop reset_signal_handlers begin @graceful_termination_pipe = IO.pipe @graceful_termination_pipe[0].close_on_exec! @graceful_termination_pipe[1].close_on_exec! @main_loop_thread_lock.synchronize do @main_loop_generation += 1 @main_loop_running = true @main_loop_thread_cond.broadcast end install_useful_signal_handlers while true @iterations += 1 client = accept_connection if client.nil? break end begin headers, input = parse_request(client) if headers if headers[REQUEST_METHOD] == PING process_ping(headers, input, client) else process_request(headers, input, client) end end rescue IOError, SocketError, SystemCallError => e print_exception("Passenger RequestHandler", e) ensure # 'input' is the same as 'client' so we don't # need to close that. # The 'close_write' here prevents forked child # processes from unintentionally keeping the # connection open. client.close_write rescue nil client.close rescue nil # All this crap to add one line... AfterResponse::Callbacks.perform_after_response_callbacks! end @processed_requests += 1 end rescue EOFError # Exit main loop. rescue Interrupt # Exit main loop. rescue SignalException => signal if signal. != HARD_TERMINATION_SIGNAL && signal. != SOFT_TERMINATION_SIGNAL raise end ensure revert_signal_handlers @main_loop_thread_lock.synchronize do @graceful_termination_pipe[0].close rescue nil @graceful_termination_pipe[1].close rescue nil @main_loop_generation += 1 @main_loop_running = false @main_loop_thread_cond.broadcast end end end |