summaryrefslogtreecommitdiff
path: root/lib/webrick
diff options
context:
space:
mode:
authorgotoyuzo <gotoyuzo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-01-09 11:37:03 +0000
committergotoyuzo <gotoyuzo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-01-09 11:37:03 +0000
commitb04f5e661f98474b4779cb627a956a0ec02b2e9b (patch)
tree2cf323adb5ad5e281a25084883c0996ea4e714c0 /lib/webrick
parent53ac21c325ca360b1f61a21ea6e6660776092b15 (diff)
* lib/webrick/httprequest.rb: supprt X-Forwarded-* header fields.
WEBrick::HTTPRequest#{host,port,request_uri} is derived having regards to X-Forwarded-Proto and X-Forwarded-Host. * lib/webrick/httprequest.rb (WEBrick::HTTPRequest#server_name?): new method. (WEBrick::HTTPRequest#remote_ip?): new method. (WEBrick::HTTPRequest#ssl?): new method. * string.c (rb_enc_cr_str_buf_cat): fix self appending. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14968 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/webrick')
-rw-r--r--lib/webrick/httprequest.rb50
1 files changed, 48 insertions, 2 deletions
diff --git a/lib/webrick/httprequest.rb b/lib/webrick/httprequest.rb
index 430054bb29..77e7fcfb17 100644
--- a/lib/webrick/httprequest.rb
+++ b/lib/webrick/httprequest.rb
@@ -69,6 +69,9 @@ module WEBrick
@remaining_size = nil
@socket = nil
+
+ @forwarded_proto = @forwarded_host = @forwarded_port =
+ @forwarded_server = @forwarded_for = nil
end
def parse(socket=nil)
@@ -95,6 +98,7 @@ module WEBrick
return if @unparsed_uri == "*"
begin
+ setup_forwarded_info
@request_uri = parse_uri(@unparsed_uri)
@path = HTTPUtils::unescape(@request_uri.path)
@path = HTTPUtils::normalize_path(@path)
@@ -153,6 +157,26 @@ module WEBrick
}
end
+ def host
+ return @forwarded_host || @host
+ end
+
+ def port
+ return @forwarded_port || @port
+ end
+
+ def server_name
+ return @forwarded_server || @config[:ServerName]
+ end
+
+ def remote_ip
+ return self["client-ip"] || @forwarded_for || @peeraddr[3]
+ end
+
+ def ssl?
+ return @request_uri.scheme == "https"
+ end
+
def keep_alive?
@keep_alive
end
@@ -255,7 +279,9 @@ module WEBrick
end
uri = URI::parse(str)
return uri if uri.absolute?
- if self["host"]
+ if @forwarded_host
+ host, port = @forwarded_host, @forwarded_port
+ elsif self["host"]
pattern = /\A(#{URI::REGEXP::PATTERN::HOST})(?::(\d+))?\z/n
host, port = *self['host'].scan(pattern)[0]
elsif @addr.size > 0
@@ -263,7 +289,7 @@ module WEBrick
else
host, port = @config[:ServerName], @config[:Port]
end
- uri.scheme = scheme
+ uri.scheme = @forwarded_proto || scheme
uri.host = host
uri.port = port ? port.to_i : nil
return URI::parse(uri.to_s)
@@ -356,5 +382,25 @@ module WEBrick
raise HTTPStatus::BadRequest, ex.message
end
end
+
+ PrivateNetworkRegexp = /
+ ^unknown$|
+ ^((::ffff:)?127.0.0.1|::1)$|
+ ^(::ffff:)?(10|172\.(1[6-9]|2[0-9]|3[01])|192\.168)\.
+ /ixo
+
+ def setup_forwarded_info
+ @forwarded_server = self["x-forwarded-server"]
+ @forwarded_proto = self["x-forwarded-proto"]
+ if host_port = self["x-forwarded-host"]
+ @forwarded_host, tmp = host_port.split(":", 2)
+ @forwarded_port = (tmp || (@forwarded_proto == "https" ? 443 : 80)).to_i
+ end
+ if addrs = self["x-forwarded-for"]
+ addrs = addrs.split(",").collect(&:strip)
+ addrs.reject!{|ip| PrivateNetworkRegexp =~ ip }
+ @forwarded_for = addrs.first
+ end
+ end
end
end