You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2008/07/28 23:46:33 UTC
svn commit: r680517 - in /tapestry/tapestry5/trunk/tapestry-core/src:
main/java/org/apache/tapestry5/internal/services/RequestPathOptimizerImpl.java
test/java/org/apache/tapestry5/internal/services/RequestPathOptimizerImplTest.java
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"},
};
}