summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/rack/request.rb2
-rw-r--r--test/spec_request.rb11
2 files changed, 11 insertions, 2 deletions
diff --git a/lib/rack/request.rb b/lib/rack/request.rb
index 6307b614..6fcf6ee9 100644
--- a/lib/rack/request.rb
+++ b/lib/rack/request.rb
@@ -261,7 +261,7 @@ module Rack
forwarded_ips = split_ip_addresses(get_header('HTTP_X_FORWARDED_FOR'))
- return reject_trusted_ip_addresses(forwarded_ips).last || get_header("REMOTE_ADDR")
+ return reject_trusted_ip_addresses(forwarded_ips).last || forwarded_ips.first || get_header("REMOTE_ADDR")
end
# The media type (type/subtype) portion of the CONTENT_TYPE header
diff --git a/test/spec_request.rb b/test/spec_request.rb
index cfaedbcf..6ed27ced 100644
--- a/test/spec_request.rb
+++ b/test/spec_request.rb
@@ -1286,7 +1286,16 @@ EOF
res.body.must_equal '2.2.2.3'
end
- it "regard local addresses as proxies" do
+ it "preserves ip for trusted proxy chain" do
+ mock = Rack::MockRequest.new(Rack::Lint.new(ip_app))
+ res = mock.get '/',
+ 'HTTP_X_FORWARDED_FOR' => '192.168.0.11, 192.168.0.7',
+ 'HTTP_CLIENT_IP' => '127.0.0.1'
+ res.body.must_equal '192.168.0.11'
+
+ end
+
+ it "regards local addresses as proxies" do
req = make_request(Rack::MockRequest.env_for("/"))
req.trusted_proxy?('127.0.0.1').must_equal 0
req.trusted_proxy?('10.0.0.1').must_equal 0