From fb32ff74f1e68650b7b4fa9889d277ef1fd30380 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Sun, 20 Dec 2009 20:39:11 -0600 Subject: Request#host knows about forwared host [#77 state:resolved] --- lib/rack/request.rb | 10 +++++++++- test/spec_rack_request.rb | 11 ++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/rack/request.rb b/lib/rack/request.rb index e755d5c0..d15273a6 100644 --- a/lib/rack/request.rb +++ b/lib/rack/request.rb @@ -64,9 +64,17 @@ module Rack media_type_params['charset'] end + def host_with_port + if forwarded = @env["HTTP_X_FORWARDED_HOST"] + forwarded.split(/,\s?/).last + else + @env['HTTP_HOST'] || "#{@env['SERVER_NAME'] || @env['SERVER_ADDR']}:#{@env['SERVER_PORT']}" + end + end + def host # Remove port number. - (@env["HTTP_HOST"] || @env["SERVER_NAME"]).to_s.gsub(/:\d+\z/, '') + host_with_port.to_s.gsub(/:\d+\z/, '') end def script_name=(s); @env["SCRIPT_NAME"] = s.to_s end diff --git a/test/spec_rack_request.rb b/test/spec_rack_request.rb index 2e6bb6b2..f0e1a5ca 100644 --- a/test/spec_rack_request.rb +++ b/test/spec_rack_request.rb @@ -35,9 +35,18 @@ context "Rack::Request" do req.host.should.equal "www2.example.org" req = Rack::Request.new \ - Rack::MockRequest.env_for("/", "SERVER_NAME" => "example.org:9292") + Rack::MockRequest.env_for("/", "SERVER_NAME" => "example.org", "SERVER_PORT" => "9292") req.host.should.equal "example.org" + req = Rack::Request.new \ + Rack::MockRequest.env_for("/", "HTTP_HOST" => "localhost:81", "HTTP_X_FORWARDED_HOST" => "example.org:9292") + req.host.should.equal "example.org" + + env = Rack::MockRequest.env_for("/", "SERVER_ADDR" => "192.168.1.1", "SERVER_PORT" => "9292") + env.delete("SERVER_NAME") + req = Rack::Request.new(env) + req.host.should.equal "192.168.1.1" + env = Rack::MockRequest.env_for("/") env.delete("SERVER_NAME") req = Rack::Request.new(env) -- cgit v1.2.3-24-ge0c7