Enter the request handler’s main loop.
# File lib/phusion_passenger/abstract_request_handler.rb, line 180
180: def main_loop
181: reset_signal_handlers
182: begin
183: @graceful_termination_pipe = IO.pipe
184: @graceful_termination_pipe[0].close_on_exec!
185: @graceful_termination_pipe[1].close_on_exec!
186:
187: @main_loop_thread_lock.synchronize do
188: @main_loop_generation += 1
189: @main_loop_running = true
190: @main_loop_thread_cond.broadcast
191: end
192:
193: install_useful_signal_handlers
194:
195: while true
196: @iterations += 1
197: client = accept_connection
198: if client.nil?
199: break
200: end
201: begin
202: headers, input = parse_request(client)
203: if headers
204: if headers[REQUEST_METHOD] == PING
205: process_ping(headers, input, client)
206: else
207: process_request(headers, input, client)
208: end
209: end
210: rescue IOError, SocketError, SystemCallError => e
211: print_exception("Passenger RequestHandler", e)
212: ensure
213: # 'input' is the same as 'client' so we don't
214: # need to close that.
215: # The 'close_write' here prevents forked child
216: # processes from unintentionally keeping the
217: # connection open.
218: client.close_write rescue nil
219: client.close rescue nil
220: end
221: @processed_requests += 1
222: end
223: rescue EOFError
224: # Exit main loop.
225: rescue Interrupt
226: # Exit main loop.
227: rescue SignalException => signal
228: if signal.message != HARD_TERMINATION_SIGNAL &&
229: signal.message != SOFT_TERMINATION_SIGNAL
230: raise
231: end
232: ensure
233: revert_signal_handlers
234: @main_loop_thread_lock.synchronize do
235: @graceful_termination_pipe[0].close rescue nil
236: @graceful_termination_pipe[1].close rescue nil
237: @main_loop_generation += 1
238: @main_loop_running = false
239: @main_loop_thread_cond.broadcast
240: end
241: end
242: end