[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]