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