diff options
Diffstat (limited to 'lib/unicorn/http_request.rb')
-rw-r--r-- | lib/unicorn/http_request.rb | 37 |
1 files changed, 15 insertions, 22 deletions
diff --git a/lib/unicorn/http_request.rb b/lib/unicorn/http_request.rb index 399aee5..24da085 100644 --- a/lib/unicorn/http_request.rb +++ b/lib/unicorn/http_request.rb @@ -1,5 +1,4 @@ require 'tempfile' -require 'uri' require 'stringio' # compiled extension @@ -19,11 +18,11 @@ module Unicorn "rack.multiprocess" => true, "rack.multithread" => false, "rack.run_once" => false, - "rack.version" => [0, 1], - "SCRIPT_NAME" => "", + "rack.version" => [0, 1].freeze, + "SCRIPT_NAME" => "".freeze, # this is not in the Rack spec, but some apps may rely on it - "SERVER_SOFTWARE" => "Unicorn #{Const::UNICORN_VERSION}" + "SERVER_SOFTWARE" => "Unicorn #{Const::UNICORN_VERSION}".freeze }.freeze def initialize(logger) @@ -56,6 +55,16 @@ module Unicorn # This does minimal exception trapping and it is up to the caller # to handle any socket errors (e.g. user aborted upload). def read(socket) + # From http://www.ietf.org/rfc/rfc3875: + # "Script authors should be aware that the REMOTE_ADDR and + # REMOTE_HOST meta-variables (see sections 4.1.8 and 4.1.9) + # may not identify the ultimate source of the request. They + # identify the client for the immediate request to the server; + # that client may be a proxy, gateway, or other intermediary + # acting on behalf of the actual source client." + @params[Const::REMOTE_ADDR] = + TCPSocket === socket ? socket.peeraddr.last : '127.0.0.1' + # short circuit the common case with small GET requests first @parser.execute(@params, read_socket(socket)) and return handle_body(socket) @@ -71,7 +80,7 @@ module Unicorn rescue HttpParserError => e @logger.error "HTTP parse error, malformed request " \ "(#{@params[Const::HTTP_X_FORWARDED_FOR] || - socket.unicorn_peeraddr}): #{e.inspect}" + @params[Const::REMOTE_ADDR]}): #{e.inspect}" @logger.error "REQUEST DATA: #{data.inspect}\n---\n" \ "PARAMS: #{@params.inspect}\n---\n" raise e @@ -87,7 +96,7 @@ module Unicorn remain = content_length - http_body.length # must read more data to complete body - @body = remain < Const::MAX_BODY ? StringIO.new : Tempfile.new('') + @body = remain < Const::MAX_BODY ? StringIO.new : Tempfile.new('unicorn') @body.binmode @body.sync = true @body.syswrite(http_body) @@ -116,22 +125,6 @@ module Unicorn # over the HTTP response. # @params["unicorn.client"] = socket - # From http://www.ietf.org/rfc/rfc3875: - # "Script authors should be aware that the REMOTE_ADDR and - # REMOTE_HOST meta-variables (see sections 4.1.8 and 4.1.9) - # may not identify the ultimate source of the request. They - # identify the client for the immediate request to the server; - # that client may be a proxy, gateway, or other intermediary - # acting on behalf of the actual source client." - @params[Const::REMOTE_ADDR] = socket.unicorn_peeraddr - - # It might be a dumbass full host request header - @params[Const::PATH_INFO] = ( - @params[Const::REQUEST_PATH] ||= - URI.parse(@params[Const::REQUEST_URI]).path) or - raise "No REQUEST_PATH" - - @params[Const::QUERY_STRING] ||= '' @params[Const::RACK_INPUT] = @body @params.update(DEF_PARAMS) end |