add x-forwarded-for header to the client
This adds the way to find out the actual ip of the client machine, even if it is hidden behind a local reverse proxy.
This commit is contained in:
parent
3876754ab4
commit
4aab135bc6
|
@ -4,6 +4,8 @@ module Zero
|
||||||
class Client
|
class Client
|
||||||
# the key for the ip of the client
|
# the key for the ip of the client
|
||||||
KEY_REMOTE_ADDR = 'REMOTE_ADDR'
|
KEY_REMOTE_ADDR = 'REMOTE_ADDR'
|
||||||
|
# in proxy setups, this is the real address of the client
|
||||||
|
KEY_FORWARDED_FOR = 'X_FORWARDED_FOR'
|
||||||
# the key for the hostname
|
# the key for the hostname
|
||||||
KEY_REMOTE_HOST = 'REMOTE_HOST'
|
KEY_REMOTE_HOST = 'REMOTE_HOST'
|
||||||
# the key for the user agent
|
# the key for the user agent
|
||||||
|
@ -12,7 +14,10 @@ module Zero
|
||||||
# creates a new client with the data of the request environment
|
# creates a new client with the data of the request environment
|
||||||
# @param environment a hash representation of the request
|
# @param environment a hash representation of the request
|
||||||
def initialize(environment)
|
def initialize(environment)
|
||||||
@address = environment[KEY_REMOTE_ADDR]
|
# extract the two possible ips
|
||||||
|
@forwarded_for = environment[KEY_FORWARDED_FOR]
|
||||||
|
@remote_address = environment[KEY_REMOTE_ADDR]
|
||||||
|
@address = forwarded_for || remote_address
|
||||||
@hostname = environment[KEY_REMOTE_HOST]
|
@hostname = environment[KEY_REMOTE_HOST]
|
||||||
@user_agent = environment[KEY_USER_AGENT]
|
@user_agent = environment[KEY_USER_AGENT]
|
||||||
end
|
end
|
||||||
|
@ -26,6 +31,14 @@ module Zero
|
||||||
# the user agent of the client
|
# the user agent of the client
|
||||||
# @return [String] the user agent of the client
|
# @return [String] the user agent of the client
|
||||||
attr_reader :user_agent
|
attr_reader :user_agent
|
||||||
|
|
||||||
|
# get the forwarded address, set in proxy setups
|
||||||
|
# @return [String] the address set in KEY_FORWARDED_FOR header
|
||||||
|
attr_reader :forwarded_for
|
||||||
|
|
||||||
|
# get the remote address given by KEY_REMOTE_ADDR
|
||||||
|
# @return [String] the remote address defined in KEY_REMOTE_ADDR header
|
||||||
|
attr_reader :remote_address
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,8 +2,26 @@ require 'spec_helper'
|
||||||
|
|
||||||
describe Zero::Request::Client, '#address' do
|
describe Zero::Request::Client, '#address' do
|
||||||
subject { Zero::Request::Client.new(env) }
|
subject { Zero::Request::Client.new(env) }
|
||||||
let(:address) { '127.0.0.1' }
|
|
||||||
let(:env) { {'REMOTE_ADDR' => address} }
|
|
||||||
|
|
||||||
its(:address) { should == address }
|
context 'without a proxy' do
|
||||||
|
let(:address) { '127.0.0.1' }
|
||||||
|
let(:env) { {'REMOTE_ADDR' => address} }
|
||||||
|
|
||||||
|
its(:address) { should == address }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with a proxy' do
|
||||||
|
let(:proxy) { '127.0.0.1' }
|
||||||
|
let(:address) { '192.168.42.3' }
|
||||||
|
let(:env) do
|
||||||
|
{
|
||||||
|
'REMOTE_ADDR' => proxy,
|
||||||
|
'X_FORWARDED_FOR' => address
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
its(:address) { should == address }
|
||||||
|
its(:remote_address) { should == proxy }
|
||||||
|
its(:forwarded_for) { should == address }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue