Class: PhusionPassenger::AbstractRequestHandler

Inherits:
Object
  • Object
show all
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

Instance Method Details

#main_loopObject

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.message != HARD_TERMINATION_SIGNAL &&
		   signal.message != 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