A request handler for Rack applications.
Methods
Public Class methods
app is the Rack application object.
[ show source ]
# File lib/phusion_passenger/rack/request_handler.rb, line 56
56: def initialize(owner_pipe, app, options = {})
57: super(owner_pipe, options)
58: @app = app
59: end
Protected Instance methods
Overrided method.
[ show source ]
# File lib/phusion_passenger/rack/request_handler.rb, line 63
63: def process_request(env, input, output)
64: rewindable_input = Utils::RewindableInput.new(input)
65: begin
66: env[RACK_VERSION] = RACK_VERSION_VALUE
67: env[RACK_INPUT] = rewindable_input
68: env[RACK_ERRORS] = STDERR
69: env[RACK_MULTITHREAD] = false
70: env[RACK_MULTIPROCESS] = true
71: env[RACK_RUN_ONCE] = false
72:
73: if env[HTTP_CONTENT_LENGTH] && env[CONTENT_LENGTH]
74: env.delete(HTTP_CONTENT_LENGTH)
75: elsif env[HTTP_CONTENT_LENGTH] && !env[CONTENT_LENGTH]
76: env[CONTENT_LENGTH] = env[HTTP_CONTENT_LENGTH]
77: env.delete(HTTP_CONTENT_LENGTH)
78: end
79: if env[HTTP_CONTENT_TYPE] && env[CONTENT_TYPE]
80: env.delete(HTTP_CONTENT_TYPE)
81: elsif env[HTTP_CONTENT_TYPE] && !env[CONTENT_TYPE]
82: env[CONTENT_TYPE] = env[HTTP_CONTENT_TYPE]
83: env.delete(HTTP_CONTENT_TYPE)
84: end
85:
86: if env[HTTPS] == YES || env[HTTPS] == ON || env[HTTPS] == ONE
87: env[RACK_URL_SCHEME] = HTTPS_DOWNCASE
88: else
89: env[RACK_URL_SCHEME] = HTTP
90: end
91:
92: status, headers, body = @app.call(env)
93: begin
94: output.write("Status: #{status.to_i}#{CRLF}")
95: output.write("X-Powered-By: #{PASSENGER_HEADER}#{CRLF}")
96: headers.each do |key, values|
97: if values.is_a?(String)
98: values = values.split("\n")
99: end
100: values.each do |value|
101: output.write("#{key}: #{value}#{CRLF}")
102: end
103: end
104: output.write(CRLF)
105: if body.is_a?(String)
106: output.write(body)
107: elsif body
108: body.each do |s|
109: output.write(s)
110: end
111: end
112: ensure
113: body.close if body.respond_to?(:close)
114: end
115: ensure
116: rewindable_input.close
117: end
118: end