Author: mrdon
Date: Mon Sep 25 22:48:00 2006
New Revision: 449915

URL: http://svn.apache.org/viewvc?view=rev&rev=449915
Log:
Fixed several url building issues dealing with relative paths - omitted forward 
slash
and support for Servlet 2.4 forwarding behaviors
Patch provided by Erik Pilz
WW-1302 WW-1301

Modified:
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java
    
struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/util/UrlHelperTest.java

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java?view=diff&rev=449915&r1=449914&r2=449915
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/UrlHelper.java
 Mon Sep 25 22:48:00 2006
@@ -124,8 +124,17 @@
                     link.append(contextPath);
                 }
             } else if (changedScheme) {
-                String uri = request.getRequestURI();
-                link.append(uri.substring(0, uri.lastIndexOf('/')));
+                
+                // (Applicable to Servlet 2.4 containers)
+                // If the request was forwarded, the attribute below will be 
set with the original URL
+                String uri = (String) 
request.getAttribute("javax.servlet.forward.request_uri");
+                
+                // If the attribute wasn't found, default to the value in the 
request object
+                if (uri == null) {
+                    uri = request.getRequestURI();
+                }
+                
+                link.append(uri.substring(0, uri.lastIndexOf('/') + 1));
             }
 
             // Add page
@@ -134,6 +143,13 @@
             // Go to "same page"
             String requestURI = (String) 
request.getAttribute("struts.request_uri");
 
+            // (Applicable to Servlet 2.4 containers)
+            // If the request was forwarded, the attribute below will be set 
with the original URL
+            if (requestURI == null) {
+                requestURI = (String) 
request.getAttribute("javax.servlet.forward.request_uri");
+            }
+            
+            // If neither request attributes were found, default to the value 
in the request object
             if (requestURI == null) {
                 requestURI = request.getRequestURI();
             }

Modified: 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/util/UrlHelperTest.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/util/UrlHelperTest.java?view=diff&rev=449915&r1=449914&r2=449915
==============================================================================
--- 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/util/UrlHelperTest.java
 (original)
+++ 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/util/UrlHelperTest.java
 Mon Sep 25 22:48:00 2006
@@ -249,25 +249,27 @@
     }
 
     /**
-     * A check to verify that the scheme, server, and port number are omitted 
when the scheme of the current request
-     * matches the scheme supplied when building the URL.
+     * The UrlHelper should build a URL that starts with "https" followed by 
the server name when the scheme of the
+     * current request is "http" and the port for the "https" scheme is 443. 
When the request has been forwarded
+     * in a Servlet 2.4 container, the UrlHelper should use the 
javax.servlet.forward.request_uri request attribute
+     * instead of a call to HttpServletRequest#getRequestURI().
      */
-    public void testBuildWithSameScheme() {
-        String expectedString = 
"/mywebapp/MyAction.action?foo=bar&hello=earth&hello=mars";
+    public void testForwardedRequest() {
+        String expectedString = 
"https://www.example.com/mywebapp/product/widget/promo.html";;
 
         Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
-        mockHttpServletRequest.expectAndReturn("getServerName", 
"www.mydomain.com");
-        mockHttpServletRequest.expectAndReturn("getScheme", "https");
-        mockHttpServletRequest.expectAndReturn("getServerPort", 443);
+        mockHttpServletRequest.expectAndReturn("getServerName", 
"www.example.com");
+        mockHttpServletRequest.expectAndReturn("getScheme", "http");
+        mockHttpServletRequest.expectAndReturn("getServerPort", 80);
         mockHttpServletRequest.expectAndReturn("getContextPath", "/mywebapp");
+        mockHttpServletRequest.expectAndReturn("getAttribute", 
"javax.servlet.forward.request_uri", "/mywebapp/product/widget/");
+        mockHttpServletRequest.expectAndReturn("getRequestURI", "/mywebapp/");
 
         Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
         mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, 
expectedString);
 
-        String actionName = "/MyAction.action";
-        TreeMap params = new TreeMap();
-        params.put("hello", new String[]{"earth", "mars"});
-        params.put("foo", "bar");
+        String actionName = "promo.html";
+        Map params = new TreeMap();
 
         String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) 
mockHttpServletRequest.proxy(), (HttpServletResponse) 
mockHttpServletResponse.proxy(), params, "https", true, true);
         assertEquals(expectedString, urlString);


Reply via email to