summary refs log tree commit
diff options
context:
space:
mode:
authorJoshua Peek <josh@joshpeek.com>2009-12-20 20:39:11 -0600
committerJoshua Peek <josh@joshpeek.com>2009-12-20 20:39:11 -0600
commitfb32ff74f1e68650b7b4fa9889d277ef1fd30380 (patch)
treef50796a16471a2be288b54f67a0ea51e43e3654d
parente2a1a644efda64614e2b5cab3a4ff89e5fc6d642 (diff)
downloadrack-fb32ff74f1e68650b7b4fa9889d277ef1fd30380.tar.gz
Request#host knows about forwared host [#77 state:resolved]
-rw-r--r--lib/rack/request.rb10
-rw-r--r--test/spec_rack_request.rb11
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)