ruby-changes:20830
From: yugui <ko1@a...>
Date: Sun, 7 Aug 2011 19:04:30 +0900 (JST)
Subject: [ruby-changes:20830] yugui:r32879 (ruby_1_9_2): merges r32222 from trunk into ruby_1_9_2.
yugui 2011-08-07 19:02:43 +0900 (Sun, 07 Aug 2011) New Revision: 32879 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=32879 Log: merges r32222 from trunk into ruby_1_9_2. -- * lib/webrick/httprequest.rb (setup_forwarded_info): Parsing request header failed when the request is from 2 or more Apache reverse proxies. It's said that all X-Forwarded-* headers will contain more than one (comma-separated) value if the original request already contained one of these headers. Since we could use these values as Host header, we choose the initial(first) value. See #4922. * test/webrick/test_httprequest.rb (test_forwarded): Test it. Modified files: branches/ruby_1_9_2/ChangeLog branches/ruby_1_9_2/lib/webrick/httprequest.rb branches/ruby_1_9_2/test/webrick/test_httprequest.rb branches/ruby_1_9_2/version.h Index: ruby_1_9_2/ChangeLog =================================================================== --- ruby_1_9_2/ChangeLog (revision 32878) +++ ruby_1_9_2/ChangeLog (revision 32879) @@ -1,3 +1,14 @@ +Fri Jun 24 19:57:30 2011 Hiroshi Nakamura <nahi@r...> + + * lib/webrick/httprequest.rb (setup_forwarded_info): Parsing request + header failed when the request is from 2 or more Apache reverse + proxies. It's said that all X-Forwarded-* headers will contain more + than one (comma-separated) value if the original request already + contained one of these headers. Since we could use these values as + Host header, we choose the initial(first) value. See #4922. + + * test/webrick/test_httprequest.rb (test_forwarded): Test it. + Sat Jul 9 19:25:02 2011 Yuki Sonoda (Yugui) <yugui@y...> * ext/tk/extconf.rb: I gave up to fix the build issue of ext/tk with Windows Index: ruby_1_9_2/lib/webrick/httprequest.rb =================================================================== --- ruby_1_9_2/lib/webrick/httprequest.rb (revision 32878) +++ ruby_1_9_2/lib/webrick/httprequest.rb (revision 32879) @@ -385,10 +385,18 @@ ^(::ffff:)?(10|172\.(1[6-9]|2[0-9]|3[01])|192\.168)\. /ixo + # It's said that all X-Forwarded-* headers will contain more than one + # (comma-separated) value if the original request already contained one of + # these headers. Since we could use these values as Host header, we choose + # the initial(first) value. (apr_table_mergen() adds new value after the + # existing value with ", " prefix) def setup_forwarded_info - @forwarded_server = self["x-forwarded-server"] + if @forwarded_server = self["x-forwarded-server"] + @forwarded_server = @forwarded_server.split(",", 2).first + end @forwarded_proto = self["x-forwarded-proto"] if host_port = self["x-forwarded-host"] + host_port = host_port.split(",", 2).first @forwarded_host, tmp = host_port.split(":", 2) @forwarded_port = (tmp || (@forwarded_proto == "https" ? 443 : 80)).to_i end Index: ruby_1_9_2/version.h =================================================================== --- ruby_1_9_2/version.h (revision 32878) +++ ruby_1_9_2/version.h (revision 32879) @@ -1,13 +1,13 @@ #define RUBY_VERSION "1.9.2" -#define RUBY_PATCHLEVEL 290 +#define RUBY_PATCHLEVEL 291 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 9 #define RUBY_VERSION_TEENY 1 #define RUBY_RELEASE_YEAR 2011 -#define RUBY_RELEASE_MONTH 7 -#define RUBY_RELEASE_DAY 9 -#define RUBY_RELEASE_DATE "2011-07-09" +#define RUBY_RELEASE_MONTH 8 +#define RUBY_RELEASE_DAY 7 +#define RUBY_RELEASE_DATE "2011-08-07" #include "ruby/version.h" Index: ruby_1_9_2/test/webrick/test_httprequest.rb =================================================================== --- ruby_1_9_2/test/webrick/test_httprequest.rb (revision 32878) +++ ruby_1_9_2/test/webrick/test_httprequest.rb (revision 32879) @@ -303,6 +303,28 @@ assert_equal(443, req.port) assert_equal("234.234.234.234", req.remote_ip) assert(req.ssl?) + + msg = <<-_end_of_message_ + GET /foo HTTP/1.1 + Host: localhost:10080 + Client-IP: 234.234.234.234 + X-Forwarded-Proto: https + X-Forwarded-For: 192.168.1.10 + X-Forwarded-Host: forward1.example.com:1234, forward2.example.com:5678 + X-Forwarded-Server: server1.example.com, server2.example.com + X-Requested-With: XMLHttpRequest + Connection: Keep-Alive + + _end_of_message_ + msg.gsub!(/^ {6}/, "") + req = WEBrick::HTTPRequest.new(WEBrick::Config::HTTP) + req.parse(StringIO.new(msg)) + assert_equal("server1.example.com", req.server_name) + assert_equal("https://forward1.example.com:1234/foo", req.request_uri.to_s) + assert_equal("forward1.example.com", req.host) + assert_equal(1234, req.port) + assert_equal("234.234.234.234", req.remote_ip) + assert(req.ssl?) end def test_bad_messages -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/