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