From fe736a54f914b7cf406988f42df6c5c129d821a5 Mon Sep 17 00:00:00 2001
From: Jeremy Kemper <jeremy@bitsweat.net>
Date: Fri, 12 Jan 2007 07:01:39 +0000
Subject: Set request.env['REQUEST_URI'] when absent.

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@5895 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
---
 actionpack/lib/action_controller/request.rb | 12 +++++++-----
 actionpack/test/controller/request_test.rb  | 20 +++++++++++++-------
 2 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/actionpack/lib/action_controller/request.rb b/actionpack/lib/action_controller/request.rb
index 8c21adb8df..62ce9929da 100755
--- a/actionpack/lib/action_controller/request.rb
+++ b/actionpack/lib/action_controller/request.rb
@@ -145,19 +145,21 @@ module ActionController
       @env['RAW_POST_DATA']
     end
 
-    # Returns the request URI correctly, taking into account the idiosyncracies
-    # of the various servers.
+    # Return the request URI, accounting for server idiosyncracies.
+    # WEBrick includes the full URL. IIS leaves REQUEST_URI blank.
     def request_uri
       if uri = @env['REQUEST_URI']
-        (%r{^\w+\://[^/]+(/.*|$)$} =~ uri) ? $1 : uri # Remove domain, which webrick puts into the request_uri.
-      else  # REQUEST_URI is blank under IIS - get this from PATH_INFO and SCRIPT_NAME
+        # Remove domain, which webrick puts into the request_uri.
+        (%r{^\w+\://[^/]+(/.*|$)$} =~ uri) ? $1 : uri
+      else
+        # Construct IIS missing REQUEST_URI from SCRIPT_NAME and PATH_INFO.
         script_filename = @env['SCRIPT_NAME'].to_s.match(%r{[^/]+$})
         uri = @env['PATH_INFO']
         uri = uri.sub(/#{script_filename}\//, '') unless script_filename.nil?
         unless (env_qs = @env['QUERY_STRING']).nil? || env_qs.empty?
           uri << '?' << env_qs
         end
-        uri
+        @env['REQUEST_URI'] = uri
       end
     end
 
diff --git a/actionpack/test/controller/request_test.rb b/actionpack/test/controller/request_test.rb
index db81eb3097..f27e71262e 100644
--- a/actionpack/test/controller/request_test.rb
+++ b/actionpack/test/controller/request_test.rb
@@ -174,48 +174,54 @@ class RequestTest < Test::Unit::TestCase
     assert_equal "/path/of/some/uri?mapped=1", @request.request_uri
     assert_equal "/path/of/some/uri", @request.path
 
+    @request.set_REQUEST_URI nil
     @request.relative_url_root = nil
     @request.env['PATH_INFO'] = "/path/of/some/uri?mapped=1"
     @request.env['SCRIPT_NAME'] = "/path/dispatch.rb"
     assert_equal "/path/of/some/uri?mapped=1", @request.request_uri
     assert_equal "/of/some/uri", @request.path
 
+    @request.set_REQUEST_URI nil
     @request.relative_url_root = nil
     @request.env['PATH_INFO'] = "/path/of/some/uri"
     @request.env['SCRIPT_NAME'] = nil
     assert_equal "/path/of/some/uri", @request.request_uri
     assert_equal "/path/of/some/uri", @request.path
 
+    @request.set_REQUEST_URI nil
     @request.relative_url_root = nil
     @request.env['PATH_INFO'] = "/"
     assert_equal "/", @request.request_uri
     assert_equal "/", @request.path
 
+    @request.set_REQUEST_URI nil
     @request.relative_url_root = nil
     @request.env['PATH_INFO'] = "/?m=b"
     assert_equal "/?m=b", @request.request_uri
     assert_equal "/", @request.path
-    
+
+    @request.set_REQUEST_URI nil
     @request.relative_url_root = nil
     @request.env['PATH_INFO'] = "/"
     @request.env['SCRIPT_NAME'] = "/dispatch.cgi"
     assert_equal "/", @request.request_uri
-    assert_equal "/", @request.path    
+    assert_equal "/", @request.path
 
+    @request.set_REQUEST_URI nil
     @request.relative_url_root = nil
     @request.env['PATH_INFO'] = "/hieraki/"
     @request.env['SCRIPT_NAME'] = "/hieraki/dispatch.cgi"
     assert_equal "/hieraki/", @request.request_uri
-    assert_equal "/", @request.path    
-                                              
+    assert_equal "/", @request.path
+
     @request.set_REQUEST_URI '/hieraki/dispatch.cgi'
     @request.relative_url_root = '/hieraki'
-    assert_equal "/dispatch.cgi", @request.path    
+    assert_equal "/dispatch.cgi", @request.path
     @request.relative_url_root = nil
 
     @request.set_REQUEST_URI '/hieraki/dispatch.cgi'
     @request.relative_url_root = '/foo'
-    assert_equal "/hieraki/dispatch.cgi", @request.path    
+    assert_equal "/hieraki/dispatch.cgi", @request.path
     @request.relative_url_root = nil
 
     # This test ensures that Rails uses REQUEST_URI over PATH_INFO
@@ -226,7 +232,7 @@ class RequestTest < Test::Unit::TestCase
     assert_equal "/some/path", @request.request_uri
     assert_equal "/some/path", @request.path
   end
-  
+
 
   def test_host_with_port
     @request.host = "rubyonrails.org"
-- 
cgit v1.2.3