You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@velocity.apache.org by "Gabriel Lavoie (JIRA)" <de...@velocity.apache.org> on 2011/03/16 19:07:29 UTC
[jira] Created: (VELTOOLS-138) StrutsLinkTool breaks paths
containing a query string
StrutsLinkTool breaks paths containing a query string
-----------------------------------------------------
Key: VELTOOLS-138
URL: https://issues.apache.org/jira/browse/VELTOOLS-138
Project: Velocity Tools
Issue Type: Bug
Components: GenericTools
Affects Versions: 2.0
Reporter: Gabriel Lavoie
Fix For: 2.0.x
When using StrutsLinkTool with a Struts global-forward containing a query string in its path, the question mark separating the path from the query string gets encoded into %3F and the generated link is broken. I traced problem down to the "public LinkTool absolute(Object obj)" method from the "LinkTool" class that doesn't manage well "non-absolute" links (not starting with the "http" prefix). Those links are managed as if they were only a path and the query string isn't extracted. The Java URI class is able to manage such link to extract correctly the information.
Here's a patch that solves the problem (including a unit test that will fail if LinkTool.java isn't patched):
--- src/main/java/org/apache/velocity/tools/generic/LinkTool.java Wed Mar 16 13:35:18 2011
+++ src/main/java/org/apache/velocity/tools/generic/LinkTool.java Wed Mar 16 13:42:28 2011
@@ -1349,40 +1349,44 @@
else
{
pth = String.valueOf(obj);
+
+ // looks absolute already
+ URI uri = toURI(pth);
+ if (uri == null)
+ {
+ return null;
+ }
+
if (pth.startsWith(DEFAULT_SCHEME))
{
- // looks absolute already
- URI uri = toURI(pth);
- if (uri == null)
- {
- return null;
- }
copy.setScheme(uri.getScheme());
copy.setUserInfo(uri.getUserInfo());
copy.setHost(uri.getHost());
copy.setPort(uri.getPort());
- // handle path, query and fragment with care
- pth = uri.getPath();
- if (pth.equals("/") || pth.length() == 0)
- {
- pth = null;
- }
- copy.setPath(pth);
- if (uri.getQuery() != null)
- {
- copy.setQuery(uri.getQuery());
- }
- if (uri.getFragment() != null)
- {
- copy.setFragment(uri.getFragment());
- }
- return copy;
}
- else if (!pth.startsWith("/"))
+
+ // handle path, query and fragment with care
+ pth = uri.getPath();
+
+ if (pth.equals("/") || pth.length() == 0)
+ {
+ pth = null;
+ }
+
+ if (pth != null && !pth.startsWith("/"))
{
// paths that don't start with '/'
// are considered relative to the current directory
pth = combinePath(getDirectory(), pth);
+ }
+
+ if (uri.getQuery() != null)
+ {
+ copy.setQuery(uri.getQuery());
+ }
+ if (uri.getFragment() != null)
+ {
+ copy.setFragment(uri.getFragment());
}
}
copy.setPath(pth);
--- src/test/java/org/apache/velocity/tools/generic/LinkToolTests.java Wed Mar 16 13:35:42 2011
+++ src/test/java/org/apache/velocity/tools/generic/LinkToolTests.java Wed Mar 16 13:43:35 2011
@@ -463,6 +463,16 @@
assertEquals("http://apache.org/test/bar.vm", result.toString());
result = result.absolute("/woogie.vm");
assertEquals("http://apache.org/woogie.vm", result.toString());
+
+ result = link.absolute("http://apache.org/a/path?param1=value1");
+ assertEquals("apache.org", result.getHost());
+ assertEquals("value1", result.getParams().get("param1"));
+ assertEquals("/a/path", result.getPath());
+
+ result = link.absolute("/a/path?param1=value1");
+ assertNull(result.getHost());
+ assertEquals("value1", result.getParams().get("param1"));
+ assertEquals("/a/path", result.getPath());
}
public @Test void methodGetBaseRef() throws Exception
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@velocity.apache.org
For additional commands, e-mail: dev-help@velocity.apache.org
[jira] Updated: (VELTOOLS-138) StrutsLinkTool breaks paths
containing a query string
Posted by "Gabriel Lavoie (JIRA)" <de...@velocity.apache.org>.
[ https://issues.apache.org/jira/browse/VELTOOLS-138?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Gabriel Lavoie updated VELTOOLS-138:
------------------------------------
Attachment: velocity-tools-strutslinktool-query-string-bug.patch
Patch to solve the problem (including a unit test that will fail if the patch isn't applied to LinkTool.java).
> StrutsLinkTool breaks paths containing a query string
> -----------------------------------------------------
>
> Key: VELTOOLS-138
> URL: https://issues.apache.org/jira/browse/VELTOOLS-138
> Project: Velocity Tools
> Issue Type: Bug
> Components: GenericTools
> Affects Versions: 2.0
> Reporter: Gabriel Lavoie
> Labels: patch
> Fix For: 2.0.x
>
> Attachments: velocity-tools-strutslinktool-query-string-bug.patch
>
> Original Estimate: 0h
> Remaining Estimate: 0h
>
> When using StrutsLinkTool with a Struts global-forward containing a query string in its path, the question mark separating the path from the query string gets encoded into %3F and the generated link is broken. I traced problem down to the "public LinkTool absolute(Object obj)" method from the "LinkTool" class that doesn't manage well "non-absolute" links (not starting with the "http" prefix). Those links are managed as if they were only a path and the query string isn't extracted. The Java URI class is able to manage such link to extract correctly the information.
> Here's a patch that solves the problem (including a unit test that will fail if LinkTool.java isn't patched):
> --- src/main/java/org/apache/velocity/tools/generic/LinkTool.java Wed Mar 16 13:35:18 2011
> +++ src/main/java/org/apache/velocity/tools/generic/LinkTool.java Wed Mar 16 13:42:28 2011
> @@ -1349,40 +1349,44 @@
> else
> {
> pth = String.valueOf(obj);
> +
> + // looks absolute already
> + URI uri = toURI(pth);
> + if (uri == null)
> + {
> + return null;
> + }
> +
> if (pth.startsWith(DEFAULT_SCHEME))
> {
> - // looks absolute already
> - URI uri = toURI(pth);
> - if (uri == null)
> - {
> - return null;
> - }
> copy.setScheme(uri.getScheme());
> copy.setUserInfo(uri.getUserInfo());
> copy.setHost(uri.getHost());
> copy.setPort(uri.getPort());
> - // handle path, query and fragment with care
> - pth = uri.getPath();
> - if (pth.equals("/") || pth.length() == 0)
> - {
> - pth = null;
> - }
> - copy.setPath(pth);
> - if (uri.getQuery() != null)
> - {
> - copy.setQuery(uri.getQuery());
> - }
> - if (uri.getFragment() != null)
> - {
> - copy.setFragment(uri.getFragment());
> - }
> - return copy;
> }
> - else if (!pth.startsWith("/"))
> +
> + // handle path, query and fragment with care
> + pth = uri.getPath();
> +
> + if (pth.equals("/") || pth.length() == 0)
> + {
> + pth = null;
> + }
> +
> + if (pth != null && !pth.startsWith("/"))
> {
> // paths that don't start with '/'
> // are considered relative to the current directory
> pth = combinePath(getDirectory(), pth);
> + }
> +
> + if (uri.getQuery() != null)
> + {
> + copy.setQuery(uri.getQuery());
> + }
> + if (uri.getFragment() != null)
> + {
> + copy.setFragment(uri.getFragment());
> }
> }
> copy.setPath(pth);
> --- src/test/java/org/apache/velocity/tools/generic/LinkToolTests.java Wed Mar 16 13:35:42 2011
> +++ src/test/java/org/apache/velocity/tools/generic/LinkToolTests.java Wed Mar 16 13:43:35 2011
> @@ -463,6 +463,16 @@
> assertEquals("http://apache.org/test/bar.vm", result.toString());
> result = result.absolute("/woogie.vm");
> assertEquals("http://apache.org/woogie.vm", result.toString());
> +
> + result = link.absolute("http://apache.org/a/path?param1=value1");
> + assertEquals("apache.org", result.getHost());
> + assertEquals("value1", result.getParams().get("param1"));
> + assertEquals("/a/path", result.getPath());
> +
> + result = link.absolute("/a/path?param1=value1");
> + assertNull(result.getHost());
> + assertEquals("value1", result.getParams().get("param1"));
> + assertEquals("/a/path", result.getPath());
> }
>
> public @Test void methodGetBaseRef() throws Exception
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@velocity.apache.org
For additional commands, e-mail: dev-help@velocity.apache.org
[jira] Updated: (VELTOOLS-138) StrutsLinkTool breaks paths
containing a query string
Posted by "Gabriel Lavoie (JIRA)" <de...@velocity.apache.org>.
[ https://issues.apache.org/jira/browse/VELTOOLS-138?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Gabriel Lavoie updated VELTOOLS-138:
------------------------------------
Description: When using StrutsLinkTool with a Struts global-forward containing a query string in its path, the question mark separating the path from the query string gets encoded into %3F and the generated link is broken. I traced problem down to the "public LinkTool absolute(Object obj)" method from the "LinkTool" class that doesn't manage well "non-absolute" links (not starting with the "http" prefix). Those links are managed as if they were only a path and the query string isn't extracted. The Java URI class is able to manage such link to extract correctly the information. (was: When using StrutsLinkTool with a Struts global-forward containing a query string in its path, the question mark separating the path from the query string gets encoded into %3F and the generated link is broken. I traced problem down to the "public LinkTool absolute(Object obj)" method from the "LinkTool" class that doesn't manage well "non-absolute" links (not starting with the "http" prefix). Those links are managed as if they were only a path and the query string isn't extracted. The Java URI class is able to manage such link to extract correctly the information.
Here's a patch that solves the problem (including a unit test that will fail if LinkTool.java isn't patched):
--- src/main/java/org/apache/velocity/tools/generic/LinkTool.java Wed Mar 16 13:35:18 2011
+++ src/main/java/org/apache/velocity/tools/generic/LinkTool.java Wed Mar 16 13:42:28 2011
@@ -1349,40 +1349,44 @@
else
{
pth = String.valueOf(obj);
+
+ // looks absolute already
+ URI uri = toURI(pth);
+ if (uri == null)
+ {
+ return null;
+ }
+
if (pth.startsWith(DEFAULT_SCHEME))
{
- // looks absolute already
- URI uri = toURI(pth);
- if (uri == null)
- {
- return null;
- }
copy.setScheme(uri.getScheme());
copy.setUserInfo(uri.getUserInfo());
copy.setHost(uri.getHost());
copy.setPort(uri.getPort());
- // handle path, query and fragment with care
- pth = uri.getPath();
- if (pth.equals("/") || pth.length() == 0)
- {
- pth = null;
- }
- copy.setPath(pth);
- if (uri.getQuery() != null)
- {
- copy.setQuery(uri.getQuery());
- }
- if (uri.getFragment() != null)
- {
- copy.setFragment(uri.getFragment());
- }
- return copy;
}
- else if (!pth.startsWith("/"))
+
+ // handle path, query and fragment with care
+ pth = uri.getPath();
+
+ if (pth.equals("/") || pth.length() == 0)
+ {
+ pth = null;
+ }
+
+ if (pth != null && !pth.startsWith("/"))
{
// paths that don't start with '/'
// are considered relative to the current directory
pth = combinePath(getDirectory(), pth);
+ }
+
+ if (uri.getQuery() != null)
+ {
+ copy.setQuery(uri.getQuery());
+ }
+ if (uri.getFragment() != null)
+ {
+ copy.setFragment(uri.getFragment());
}
}
copy.setPath(pth);
--- src/test/java/org/apache/velocity/tools/generic/LinkToolTests.java Wed Mar 16 13:35:42 2011
+++ src/test/java/org/apache/velocity/tools/generic/LinkToolTests.java Wed Mar 16 13:43:35 2011
@@ -463,6 +463,16 @@
assertEquals("http://apache.org/test/bar.vm", result.toString());
result = result.absolute("/woogie.vm");
assertEquals("http://apache.org/woogie.vm", result.toString());
+
+ result = link.absolute("http://apache.org/a/path?param1=value1");
+ assertEquals("apache.org", result.getHost());
+ assertEquals("value1", result.getParams().get("param1"));
+ assertEquals("/a/path", result.getPath());
+
+ result = link.absolute("/a/path?param1=value1");
+ assertNull(result.getHost());
+ assertEquals("value1", result.getParams().get("param1"));
+ assertEquals("/a/path", result.getPath());
}
public @Test void methodGetBaseRef() throws Exception
)
> StrutsLinkTool breaks paths containing a query string
> -----------------------------------------------------
>
> Key: VELTOOLS-138
> URL: https://issues.apache.org/jira/browse/VELTOOLS-138
> Project: Velocity Tools
> Issue Type: Bug
> Components: GenericTools
> Affects Versions: 2.0
> Reporter: Gabriel Lavoie
> Labels: patch
> Fix For: 2.0.x
>
> Attachments: velocity-tools-strutslinktool-query-string-bug.patch
>
> Original Estimate: 0h
> Remaining Estimate: 0h
>
> When using StrutsLinkTool with a Struts global-forward containing a query string in its path, the question mark separating the path from the query string gets encoded into %3F and the generated link is broken. I traced problem down to the "public LinkTool absolute(Object obj)" method from the "LinkTool" class that doesn't manage well "non-absolute" links (not starting with the "http" prefix). Those links are managed as if they were only a path and the query string isn't extracted. The Java URI class is able to manage such link to extract correctly the information.
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@velocity.apache.org
For additional commands, e-mail: dev-help@velocity.apache.org
[jira] Updated: (VELTOOLS-138) StrutsLinkTool breaks paths
containing a query string
Posted by "Gabriel Lavoie (JIRA)" <de...@velocity.apache.org>.
[ https://issues.apache.org/jira/browse/VELTOOLS-138?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Gabriel Lavoie updated VELTOOLS-138:
------------------------------------
Labels: patch (was: )
> StrutsLinkTool breaks paths containing a query string
> -----------------------------------------------------
>
> Key: VELTOOLS-138
> URL: https://issues.apache.org/jira/browse/VELTOOLS-138
> Project: Velocity Tools
> Issue Type: Bug
> Components: GenericTools
> Affects Versions: 2.0
> Reporter: Gabriel Lavoie
> Labels: patch
> Fix For: 2.0.x
>
> Attachments: velocity-tools-strutslinktool-query-string-bug.patch
>
> Original Estimate: 0h
> Remaining Estimate: 0h
>
> When using StrutsLinkTool with a Struts global-forward containing a query string in its path, the question mark separating the path from the query string gets encoded into %3F and the generated link is broken. I traced problem down to the "public LinkTool absolute(Object obj)" method from the "LinkTool" class that doesn't manage well "non-absolute" links (not starting with the "http" prefix). Those links are managed as if they were only a path and the query string isn't extracted. The Java URI class is able to manage such link to extract correctly the information.
> Here's a patch that solves the problem (including a unit test that will fail if LinkTool.java isn't patched):
> --- src/main/java/org/apache/velocity/tools/generic/LinkTool.java Wed Mar 16 13:35:18 2011
> +++ src/main/java/org/apache/velocity/tools/generic/LinkTool.java Wed Mar 16 13:42:28 2011
> @@ -1349,40 +1349,44 @@
> else
> {
> pth = String.valueOf(obj);
> +
> + // looks absolute already
> + URI uri = toURI(pth);
> + if (uri == null)
> + {
> + return null;
> + }
> +
> if (pth.startsWith(DEFAULT_SCHEME))
> {
> - // looks absolute already
> - URI uri = toURI(pth);
> - if (uri == null)
> - {
> - return null;
> - }
> copy.setScheme(uri.getScheme());
> copy.setUserInfo(uri.getUserInfo());
> copy.setHost(uri.getHost());
> copy.setPort(uri.getPort());
> - // handle path, query and fragment with care
> - pth = uri.getPath();
> - if (pth.equals("/") || pth.length() == 0)
> - {
> - pth = null;
> - }
> - copy.setPath(pth);
> - if (uri.getQuery() != null)
> - {
> - copy.setQuery(uri.getQuery());
> - }
> - if (uri.getFragment() != null)
> - {
> - copy.setFragment(uri.getFragment());
> - }
> - return copy;
> }
> - else if (!pth.startsWith("/"))
> +
> + // handle path, query and fragment with care
> + pth = uri.getPath();
> +
> + if (pth.equals("/") || pth.length() == 0)
> + {
> + pth = null;
> + }
> +
> + if (pth != null && !pth.startsWith("/"))
> {
> // paths that don't start with '/'
> // are considered relative to the current directory
> pth = combinePath(getDirectory(), pth);
> + }
> +
> + if (uri.getQuery() != null)
> + {
> + copy.setQuery(uri.getQuery());
> + }
> + if (uri.getFragment() != null)
> + {
> + copy.setFragment(uri.getFragment());
> }
> }
> copy.setPath(pth);
> --- src/test/java/org/apache/velocity/tools/generic/LinkToolTests.java Wed Mar 16 13:35:42 2011
> +++ src/test/java/org/apache/velocity/tools/generic/LinkToolTests.java Wed Mar 16 13:43:35 2011
> @@ -463,6 +463,16 @@
> assertEquals("http://apache.org/test/bar.vm", result.toString());
> result = result.absolute("/woogie.vm");
> assertEquals("http://apache.org/woogie.vm", result.toString());
> +
> + result = link.absolute("http://apache.org/a/path?param1=value1");
> + assertEquals("apache.org", result.getHost());
> + assertEquals("value1", result.getParams().get("param1"));
> + assertEquals("/a/path", result.getPath());
> +
> + result = link.absolute("/a/path?param1=value1");
> + assertNull(result.getHost());
> + assertEquals("value1", result.getParams().get("param1"));
> + assertEquals("/a/path", result.getPath());
> }
>
> public @Test void methodGetBaseRef() throws Exception
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@velocity.apache.org
For additional commands, e-mail: dev-help@velocity.apache.org