Author: hlship
Date: Mon Jul 28 14:46:33 2008
New Revision: 680517

URL: http://svn.apache.org/viewvc?rev=680517&view=rev
Log:
TAPESTRY-2522: RequestPathOptimizer will corrupt query parameters in the 
optimized URL if the parameters container slashes

Modified:
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RequestPathOptimizerImpl.java
    
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RequestPathOptimizerImplTest.java

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RequestPathOptimizerImpl.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RequestPathOptimizerImpl.java?rev=680517&r1=680516&r2=680517&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RequestPathOptimizerImpl.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/RequestPathOptimizerImpl.java
 Mon Jul 28 14:46:33 2008
@@ -58,11 +58,16 @@
 
         String[] requestTerms = SLASH_PATTERN.split(requestURI);
 
+        int questionx = absolutePath.indexOf('?');
+
+        String path = questionx < 0 ? absolutePath : absolutePath.substring(0, 
questionx);
+        String suffix = questionx < 0 ? "" : absolutePath.substring(questionx);
+
         // Degenerate case when getting the root application
 
         if (requestPath.endsWith("/") || requestPath.equals("")) requestTerms 
= add(requestTerms, "");
 
-        String[] pathTerms = SLASH_PATTERN.split(absolutePath);
+        String[] pathTerms = SLASH_PATTERN.split(path);
 
         builder.setLength(0);
 
@@ -112,7 +117,13 @@
             if (slashx < 0 || slashx > firstColon) builder.insert(0, "./");
         }
 
-        if (builder.length() < absolutePath.length()) return 
builder.toString();
+        if (builder.length() < path.length())
+        {
+            // Restore the query parameter portion of the URL path
+            builder.append(suffix);
+
+            return builder.toString();
+        }
 
         // The absolute path is actually shorter than the relative path, so 
just return the absolute
         // path.

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RequestPathOptimizerImplTest.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RequestPathOptimizerImplTest.java?rev=680517&r1=680516&r2=680517&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RequestPathOptimizerImplTest.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/RequestPathOptimizerImplTest.java
 Mon Jul 28 14:46:33 2008
@@ -24,75 +24,82 @@
     @DataProvider(name = "uri_optimization")
     public Object[][] uri_optimization_data()
     {
-        return new Object[][] { { "/context", "/foo/bar.png", 
"/context/foo/baz.png", "baz.png" },
+        return new Object[][]{{"/context", "/foo/bar.png", 
"/context/foo/baz.png", "baz.png"},
 
-                { "/context", "/foo/bar.gif", "/context/foo//baz.gif", 
"baz.gif" },
+                {"/context", "/foo/bar.gif", "/context/foo//baz.gif", 
"baz.gif"},
 
-                { "/context", "/foo//bar.css", "/context/foo/baz.css", 
"baz.css" },
+                {"/context", "/foo//bar.css", "/context/foo/baz.css", 
"baz.css"},
 
-                { "", "/foo/bar.css", "/foo/baz.css", "baz.css" },
+                {"", "/foo/bar.css", "/foo/baz.css", "baz.css"},
 
-                { "/reallylongcontexttoensureitisrelative", 
"/foo/bar/baz/biff.gif",
-                        
"/reallylongcontexttoensureitisrelative/gnip/gnop.gif", 
"../../../gnip/gnop.gif" },
+                {"/reallylongcontexttoensureitisrelative", 
"/foo/bar/baz/biff.gif",
+                        
"/reallylongcontexttoensureitisrelative/gnip/gnop.gif", 
"../../../gnip/gnop.gif"},
 
-                { "", 
"/foo/bar/baz/biff/yepthisissolongthatabsoluteurlisshorter/dude", "/gnip/gnop",
-                        "/gnip/gnop" },
+                {"", 
"/foo/bar/baz/biff/yepthisissolongthatabsoluteurlisshorter/dude", "/gnip/gnop",
+                        "/gnip/gnop"},
 
-                { "", "/foo/bar", "/foo/bar/baz/bif", "bar/baz/bif" },
+                {"", "/foo/bar", "/foo/bar/baz/bif", "bar/baz/bif"},
 
-                { "", "/foo/bar/baz/bif", "/foo", "/foo" },
+                {"", "/foo/bar/baz/bif", "/foo", "/foo"},
 
-                { "/ctx", "/foo/bar/baz/bif", "/ctx/foo", "/ctx/foo" },
+                {"/ctx", "/foo/bar/baz/bif", "/ctx/foo", "/ctx/foo"},
 
-                { "/anotherobnoxiouslylongcontextthatiwllforcerelative", 
"/foo/bar/baz/bif",
-                        
"/anotherobnoxiouslylongcontextthatiwllforcerelative/foo", "../../../foo" },
+                {"/anotherobnoxiouslylongcontextthatiwllforcerelative", 
"/foo/bar/baz/bif",
+                        
"/anotherobnoxiouslylongcontextthatiwllforcerelative/foo", "../../../foo"},
 
                 // A couple of better examples, see TAPESTRY-2033
 
-                { "/manager", "", "/manager/asset/foo.gif", "asset/foo.gif" },
+                {"/manager", "", "/manager/asset/foo.gif", "asset/foo.gif"},
 
-                { "", "", "/asset/foo.gif", "asset/foo.gif" },
+                {"", "", "/asset/foo.gif", "asset/foo.gif"},
 
-                { "", "/griddemo.grid.columns.sort/title", 
"/assets/default.css", "/assets/default.css" },
+                {"", "/griddemo.grid.columns.sort/title", 
"/assets/default.css", "/assets/default.css"},
 
-                { "/example", "/", "/example/assets/tapestry/default.css", 
"assets/tapestry/default.css" },
+                {"/example", "/", "/example/assets/tapestry/default.css", 
"assets/tapestry/default.css"},
 
-                { "/example", "/newaccount", 
"/example/assets/tapestry/default.css",
-                        "assets/tapestry/default.css" },
+                {"/example", "/newaccount", 
"/example/assets/tapestry/default.css",
+                        "assets/tapestry/default.css"},
 
-                { "/verylongcontextname", "/style/app.css", 
"/verylongcontextname/asset/foo.gif",
-                        "../asset/foo.gif" },
+                {"/verylongcontextname", "/style/app.css", 
"/verylongcontextname/asset/foo.gif",
+                        "../asset/foo.gif"},
 
-                { "", "/eventhandlerdemo.barney/one", 
"/eventhandlerdemo.clear/anything",
-                        "/eventhandlerdemo.clear/anything" },
+                {"", "/eventhandlerdemo.barney/one", 
"/eventhandlerdemo.clear/anything",
+                        "/eventhandlerdemo.clear/anything"},
 
-                { "/verylongcontextname", "/eventhandlerdemo.barney/one",
+                {"/verylongcontextname", "/eventhandlerdemo.barney/one",
                         "/verylongcontextname/eventhandlerdemo.clear/anything",
-                        "../eventhandlerdemo.clear/anything" },
+                        "../eventhandlerdemo.clear/anything"},
 
-                { "/verylongcontextname", "/page", 
"/verylongcontextname/page:sort/foo",
-                        "./page:sort/foo" },
+                {"/verylongcontextname", "/page", 
"/verylongcontextname/page:sort/foo",
+                        "./page:sort/foo"},
 
-                { "", "/page", "/page:sort/foo", "/page:sort/foo" },
+                {"", "/page", "/page:sort/foo", "/page:sort/foo"},
 
                 // TAPESTRY-2046
 
-                { "/attendance", "/view/sites", 
"/attendance/assets/tapestry/tapestry.js",
-                        "../assets/tapestry/tapestry.js" },
+                {"/attendance", "/view/sites", 
"/attendance/assets/tapestry/tapestry.js",
+                        "../assets/tapestry/tapestry.js"},
 
                 // TAPESTRY-2095
 
-                { "", "/", "/component:event", "/component:event" },
+                {"", "/", "/component:event", "/component:event"},
 
                 // TAPESTRY-2333
 
-                { "", "/nested/actiondemo/", 
"/nested/actiondemo.actionlink/2", "../actiondemo.actionlink/2" },
+                {"", "/nested/actiondemo/", "/nested/actiondemo.actionlink/2", 
"../actiondemo.actionlink/2"},
 
                 // Make sure the ./ prefix is added even when the relative 
path doesn't contain
                 // a slash ... otherwise, invalid URL component:event (i.e., 
"component" protocol, not "http").
 
-                { "/verylongcontextname", "/", 
"/verylongcontextname/component:event", "./component:event" }
+                {"/verylongcontextname", "/", 
"/verylongcontextname/component:event", "./component:event"},
 
+                // Don't optimize away base64-data ('//').  TAPESTRY-2522
+
+                {"/context", "/mypage/action1", 
"/context/start?t:state:client=Hasc//asc==",
+                        "../start?t:state:client=Hasc//asc=="},
+                {"/context", "/mypage/action1",
+                        
"/context/start?t:state:client=H4sIAAAAAAAAAE2OsUoDQRCGJ2rQIFgEwRewnthYWYmeEHKIEvMA4+242bA7u+6uMWeR1tIX8YWsre2srNwDkUz1D//Mx/f+Bf3nHQDopQgTHzVSoGbOmClwyrE9RSOZo5DFxHFpGk54YQ1LvuGYTMolXRm2app9JM1jF+zxhNuP76O33c+f1y3YrmG/8S54KadjlWFYL2hJI0uiR9McjeizGgYPHeSaHD/CGno17IVC+99XIWQYuMvidNcGznDYRSOUjZd0Li9sNMs6wkkzx3tWpLGo4cIl5wWVd2QEnVdsceOxQ8HfDAFWEQ46NezUsJInt1kWgf7trJpVv/V1i1c0AQAA",
+                        
"../start?t:state:client=H4sIAAAAAAAAAE2OsUoDQRCGJ2rQIFgEwRewnthYWYmeEHKIEvMA4+242bA7u+6uMWeR1tIX8YWsre2srNwDkUz1D//Mx/f+Bf3nHQDopQgTHzVSoGbOmClwyrE9RSOZo5DFxHFpGk54YQ1LvuGYTMolXRm2app9JM1jF+zxhNuP76O33c+f1y3YrmG/8S54KadjlWFYL2hJI0uiR9McjeizGgYPHeSaHD/CGno17IVC+99XIWQYuMvidNcGznDYRSOUjZd0Li9sNMs6wkkzx3tWpLGo4cIl5wWVd2QEnVdsceOxQ8HfDAFWEQ46NezUsJInt1kWgf7trJpVv/V1i1c0AQAA"},
         };
     }
 


Reply via email to