aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Azores <[email protected]>2013-09-26 10:25:33 -0400
committerAndrew Azores <[email protected]>2013-09-26 10:25:33 -0400
commitc824b24b3c7656e6230b6c1d398a927b1225f0c2 (patch)
treedc6594b350e9583b1bda9d1be35259e03f9ce9fa
parent22c0eae35d290f25bfd69b937c09c10b6f961db7 (diff)
Fix for PR1204, handling of query strings and absolute paths.
Absolute paths in resource URLs are correctly handled when appended to host URLs and URL query strings are not removed. * netx/net/sourceforge/jnlp/cache/ResourceUrlCreator.java: (getVersionedUrlUsingQuery) renamed to getVersionedUrl, refactored construction of URL * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: (requestPluginProxyInfo) extracted proxy URI logic. (processProxyUri) new method for finding proxy URIs, handles absolute resource paths correctly * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceUrlCreatorTest.java: added tests for ResourceUrlCreator#getVersionedUrl * tests/netx/unit/sun/applet/PluginAppletViewerTest.java: added tests for PluginAppletViewer.processProxyUri * tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQueryStrings.html: new reproducer checks that absolute paths and query strings in resource URLs are properly handled, and caching still works * tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQueryStrings.jnlp: same * tests/reproducers/simple/AbsolutePathsAndQueryStrings/testcases/AbsolutePathsAndQueryStrings.java: same
-rw-r--r--ChangeLog23
-rw-r--r--netx/net/sourceforge/jnlp/cache/ResourceUrlCreator.java40
-rw-r--r--plugin/icedteanp/java/sun/applet/PluginAppletViewer.java28
-rw-r--r--tests/netx/unit/net/sourceforge/jnlp/cache/ResourceUrlCreatorTest.java51
-rw-r--r--tests/netx/unit/sun/applet/PluginAppletViewerTest.java42
-rw-r--r--tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQueryStrings.html48
-rw-r--r--tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQueryStrings.jnlp53
-rw-r--r--tests/reproducers/simple/AbsolutePathsAndQueryStrings/testcases/AbsolutePathsAndQueryStrings.java116
8 files changed, 369 insertions, 32 deletions
diff --git a/ChangeLog b/ChangeLog
index 0396259..e58a177 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,26 @@
+2013-09-26 Andrew Azores <[email protected]>
+
+ Fix for PR1204. Absolute paths in resource URLs are correctly handled when
+ appended to host URLs and URL query strings are not removed.
+ * netx/net/sourceforge/jnlp/cache/ResourceUrlCreator.java:
+ (getVersionedUrlUsingQuery) renamed to getVersionedUrl, refactored
+ construction of URL
+ * plugin/icedteanp/java/sun/applet/PluginAppletViewer.java:
+ (requestPluginProxyInfo) extracted proxy URI logic.
+ (processProxyUri) new method for finding proxy URIs, handles absolute
+ resource paths correctly
+ * tests/netx/unit/net/sourceforge/jnlp/cache/ResourceUrlCreatorTest.java:
+ added tests for ResourceUrlCreator#getVersionedUrl
+ * tests/netx/unit/sun/applet/PluginAppletViewerTest.java: added tests for
+ PluginAppletViewer.processProxyUri
+ * tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQueryStrings.html:
+ new reproducer checks that absolute paths and query strings in resource
+ URLs are properly handled, and caching still works
+ * tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQueryStrings.jnlp:
+ same
+ * tests/reproducers/simple/AbsolutePathsAndQueryStrings/testcases/AbsolutePathsAndQueryStrings.java:
+ same
+
2013-09-25 Andrew Azores <[email protected]>
* Makefile.am: clean up summary_unit.txt and summary_reproducers.txt for
diff --git a/netx/net/sourceforge/jnlp/cache/ResourceUrlCreator.java b/netx/net/sourceforge/jnlp/cache/ResourceUrlCreator.java
index 68ab009..0da5466 100644
--- a/netx/net/sourceforge/jnlp/cache/ResourceUrlCreator.java
+++ b/netx/net/sourceforge/jnlp/cache/ResourceUrlCreator.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package net.sourceforge.jnlp.cache;
import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
import java.net.URL;
import java.util.LinkedList;
import java.util.List;
@@ -89,7 +91,7 @@ public class ResourceUrlCreator {
}
}
- url = getVersionedUrlUsingQuery(resource);
+ url = getVersionedUrl(resource);
urls.add(url);
urls.add(resource.getLocation());
@@ -146,29 +148,29 @@ public class ResourceUrlCreator {
}
/**
- * Returns the URL for a resource, relying on HTTP query for getting the
- * right version
+ * Returns the URL for a resource, including the resource's version number in the query string
*
* @param resource the resource to get the url for
*/
- protected URL getVersionedUrlUsingQuery(Resource resource) {
- String actualLocation = resource.getLocation().getProtocol() + "://"
- + resource.getLocation().getHost();
- if (resource.getLocation().getPort() != -1) {
- actualLocation += ":" + resource.getLocation().getPort();
- }
- actualLocation += resource.getLocation().getPath();
- if (resource.requestVersion != null
- && resource.requestVersion.isVersionId()) {
- actualLocation += "?version-id=" + resource.requestVersion;
- }
- URL versionedURL;
+ protected URL getVersionedUrl(Resource resource) {
+ URL resourceUrl = resource.getLocation();
try {
- versionedURL = new URL(actualLocation);
+ String query = resourceUrl.getQuery(); // returns null if there was no query string
+ if (resource.requestVersion != null && resource.requestVersion.isVersionId()) {
+ if (query == null) {
+ query = "";
+ } else {
+ query += "&";
+ }
+ query += "version-id=" + resource.requestVersion;
+ }
+ URI uri = new URI(resourceUrl.getProtocol(), resourceUrl.getUserInfo(), resourceUrl.getHost(), resourceUrl.getPort(), resourceUrl.getPath(), query, null);
+ return uri.toURL();
} catch (MalformedURLException e) {
- return resource.getLocation();
+ return resourceUrl;
+ } catch (URISyntaxException e) {
+ return resourceUrl;
}
- return versionedURL;
}
-} \ No newline at end of file
+}
diff --git a/plugin/icedteanp/java/sun/applet/PluginAppletViewer.java b/plugin/icedteanp/java/sun/applet/PluginAppletViewer.java
index f0c1cc5..bd4c0d5 100644
--- a/plugin/icedteanp/java/sun/applet/PluginAppletViewer.java
+++ b/plugin/icedteanp/java/sun/applet/PluginAppletViewer.java
@@ -86,6 +86,7 @@ import java.lang.reflect.InvocationTargetException;
import java.net.MalformedURLException;
import java.net.SocketPermission;
import java.net.URI;
+import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLConnection;
import java.security.AccessController;
@@ -1243,17 +1244,7 @@ public class PluginAppletViewer extends XEmbeddedFrame
Long reference = getRequestIdentifier();
try {
-
- // there is no easy way to get SOCKS proxy info. So, we tell mozilla that we want proxy for
- // an HTTP uri in case of non http/ftp protocols. If we get back a SOCKS proxy, we can
- // use that, if we get back an http proxy, we fallback to DIRECT connect
-
- String scheme = uri.getScheme();
- String port = uri.getPort() != -1 ? ":" + uri.getPort() : "";
- if (!uri.getScheme().startsWith("http") && !uri.getScheme().equals("ftp"))
- scheme = "http";
-
- requestURI = UrlUtil.encode(scheme + "://" + uri.getHost() + port + "/" + uri.getPath(), "UTF-8");
+ requestURI = convertUriSchemeForProxyQuery(uri);
} catch (Exception e) {
PluginDebug.debug("Cannot construct URL from ", uri.toString(), " ... falling back to DIRECT proxy");
OutputController.getLogger().log(OutputController.Level.ERROR_ALL,e);
@@ -1283,6 +1274,21 @@ public class PluginAppletViewer extends XEmbeddedFrame
return request.getObject();
}
+ public static String convertUriSchemeForProxyQuery(URI uri) throws URISyntaxException, UnsupportedEncodingException {
+ // there is no easy way to get SOCKS proxy info. So, we tell mozilla that we want proxy for
+ // an HTTP uri in case of non http/ftp protocols. If we get back a SOCKS proxy, we can
+ // use that, if we get back an http proxy, we fallback to DIRECT connect
+
+ String scheme = uri.getScheme();
+ if (!scheme.startsWith("http") && !scheme.equals("ftp")) {
+ scheme = "http";
+ }
+
+ URI result = new URI(scheme, uri.getUserInfo(), uri.getHost(), uri.getPort(),
+ uri.getPath(), uri.getQuery(), uri.getFragment());
+ return UrlUtil.encode(result.toString(), "UTF-8");
+ }
+
public static void JavaScriptFinalize(long internal) {
Long reference = getRequestIdentifier();
diff --git a/tests/netx/unit/net/sourceforge/jnlp/cache/ResourceUrlCreatorTest.java b/tests/netx/unit/net/sourceforge/jnlp/cache/ResourceUrlCreatorTest.java
index 208180d..5c5b6b1 100644
--- a/tests/netx/unit/net/sourceforge/jnlp/cache/ResourceUrlCreatorTest.java
+++ b/tests/netx/unit/net/sourceforge/jnlp/cache/ResourceUrlCreatorTest.java
@@ -5,6 +5,7 @@ import static org.junit.Assert.assertEquals;
import java.net.MalformedURLException;
import java.net.URL;
+import net.sourceforge.jnlp.DownloadOptions;
import net.sourceforge.jnlp.Version;
import org.junit.Test;
@@ -37,7 +38,55 @@ public class ResourceUrlCreatorTest {
@Test
public void testVersionAndPackEncode() throws MalformedURLException {
Resource resource = Resource.getResource(new URL("http://test.jar"), new Version("1.1"), null);
- URL result = ResourceUrlCreator.getUrl(resource, true /*use pack suffix*/, true/*use version suffix*/);
+ URL result = ResourceUrlCreator.getUrl(resource, true /*use pack suffix*/, true /*use version suffix*/);
assertEquals("http://test__V1.1.jar.pack.gz", result.toString());
}
+
+ @Test
+ public void testGetVersionedUrl() throws MalformedURLException {
+ Resource resource = Resource.getResource(new URL("http://foo.com/bar.jar"), new Version("1.1"), null);
+ ResourceUrlCreator ruc = new ResourceUrlCreator(resource, new DownloadOptions(false, true));
+ URL result = ruc.getVersionedUrl(resource);
+ assertEquals("http://foo.com/bar.jar?version-id=1.1", result.toString());
+ }
+
+ @Test
+ public void testGetNonVersionIdUrl() throws MalformedURLException {
+ Resource resource = Resource.getResource(new URL("http://foo.com/some.jar"), new Version("version two"), null);
+ ResourceUrlCreator ruc = new ResourceUrlCreator(resource, new DownloadOptions(false, true));
+ URL result = ruc.getVersionedUrl(resource);
+ assertEquals("http://foo.com/some.jar", result.toString());
+ }
+
+ @Test
+ public void testGetVersionedUrlWithQuery() throws MalformedURLException {
+ Resource resource = Resource.getResource(new URL("http://bar.com/bar.jar?i=1234abcd"), new Version("1.1"), null);
+ ResourceUrlCreator ruc = new ResourceUrlCreator(resource, new DownloadOptions(false, true));
+ URL result = ruc.getVersionedUrl(resource);
+ assertEquals("http://bar.com/bar.jar?i=1234abcd&version-id=1.1", result.toString());
+ }
+
+ @Test
+ public void testGetVersionedUrlWithoutVersion() throws MalformedURLException {
+ Resource resource = Resource.getResource(new URL("http://baz.com/bar.jar"), null, null);
+ ResourceUrlCreator ruc = new ResourceUrlCreator(resource, new DownloadOptions(false, false));
+ URL result = ruc.getVersionedUrl(resource);
+ assertEquals("http://baz.com/bar.jar", result.toString());
+ }
+
+ @Test
+ public void testGetVersionedUrlWithoutVersionWithQuery() throws MalformedURLException {
+ Resource resource = Resource.getResource(new URL("http://rhat.com/bar.jar?i=1234abcd"), null, null);
+ ResourceUrlCreator ruc = new ResourceUrlCreator(resource, new DownloadOptions(false, false));
+ URL result = ruc.getVersionedUrl(resource);
+ assertEquals("http://rhat.com/bar.jar?i=1234abcd", result.toString());
+ }
+
+ @Test
+ public void testGetVersionedUrlWithLongQuery() throws MalformedURLException {
+ Resource resource = Resource.getResource(new URL("http://yyz.com/bar.jar?i=1234&j=abcd"), new Version("2.0"), null);
+ ResourceUrlCreator ruc = new ResourceUrlCreator(resource, new DownloadOptions(false, true));
+ URL result = ruc.getVersionedUrl(resource);
+ assertEquals("http://yyz.com/bar.jar?i=1234&j=abcd&version-id=2.0", result.toString());
+ }
}
diff --git a/tests/netx/unit/sun/applet/PluginAppletViewerTest.java b/tests/netx/unit/sun/applet/PluginAppletViewerTest.java
index cecedfc..69e5cb1 100644
--- a/tests/netx/unit/sun/applet/PluginAppletViewerTest.java
+++ b/tests/netx/unit/sun/applet/PluginAppletViewerTest.java
@@ -42,8 +42,11 @@ import static org.junit.Assert.assertEquals;
import static sun.applet.PluginPipeMockUtil.getPluginStoreId;
import static sun.applet.PluginPipeMockUtil.getPluginStoreObject;
+import java.net.URI;
import java.util.concurrent.Callable;
+import junit.framework.Assert;
+
import net.sourceforge.jnlp.AsyncCall;
import net.sourceforge.jnlp.ServerAccess;
@@ -156,6 +159,43 @@ public class PluginAppletViewerTest {
assertEquals(expectedReturn, call.join());
}
+ @Test
+ public void testConvertUriSchemeForProxyQuery() throws Exception {
+ URI[] testUris = {
+ new URI("http", "foo.com", "/bar", null),
+ new URI("https", "foo.com", "/bar", null),
+ new URI("ftp", "foo.com", "/app/res/pub/channel.jar?i=1234", null),
+ new URI("socket", "foo.co.uk", "/bar/pub/ale.jar", null),
+ };
+
+ for (URI uri : testUris) {
+ URI result = new URI(PluginAppletViewer.convertUriSchemeForProxyQuery(uri));
+ assertQueryForBrowserProxyUsesHttpFallback(uri, result);
+ String hierarchicalPath = result.getAuthority() + result.getPath();
+ assertQueryForBrowserProxyContainsNoDoubleSlashes(hierarchicalPath);
+ assertQueryForBrowserProxyDoesNotChangeQuery(uri, result);
+ }
+ }
+
+ // Test that only HTTP is used as fallback scheme if a protocol other than HTTP(S) or FTP is specified
+ public void assertQueryForBrowserProxyUsesHttpFallback(URI expected, URI result) {
+ if (expected.getScheme().equals("ftp") || expected.getScheme().startsWith("http")) {
+ Assert.assertEquals(expected.getScheme(), result.getScheme());
+ } else {
+ Assert.assertEquals(result.getScheme(), "http");
+ }
+ }
+
+ // Test that absolute resource paths do not result in double-slashes within the URI
+ public void assertQueryForBrowserProxyContainsNoDoubleSlashes(String uri) {
+ Assert.assertFalse(uri.contains("//"));
+ }
+
+ // Test that the query string of the URI is not changed
+ public void assertQueryForBrowserProxyDoesNotChangeQuery(URI expected, URI result) {
+ Assert.assertEquals(expected.getQuery(), result.getQuery());
+ }
+
/**************************************************************************
* Test utilities *
**************************************************************************/
@@ -238,4 +278,4 @@ public class PluginAppletViewerTest {
int expectedLength = 6;
return parseAndCheckJSMessage(message, expectedLength, "ToString", contextObjectID);
}
-} \ No newline at end of file
+}
diff --git a/tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQueryStrings.html b/tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQueryStrings.html
new file mode 100644
index 0000000..f2fc6eb
--- /dev/null
+++ b/tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQueryStrings.html
@@ -0,0 +1,48 @@
+<!--
+
+This file is part of IcedTea.
+
+IcedTea is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+IcedTea is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with IcedTea; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version.
+
+ -->
+<html>
+ <head></head>
+ <body>
+ <embed code="StripHttpPathParams"
+ archive="/StripHttpPathParams.jar?i=1234abcd"
+ type="application/x-java-applet;version=1.6"
+ width="800"
+ height="600">
+ </embed>
+ </body>
+</html>
diff --git a/tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQueryStrings.jnlp b/tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQueryStrings.jnlp
new file mode 100644
index 0000000..c499bc8
--- /dev/null
+++ b/tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQueryStrings.jnlp
@@ -0,0 +1,53 @@
+<!--
+
+This file is part of IcedTea.
+
+IcedTea is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+IcedTea is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with IcedTea; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version.
+
+ -->
+<?xml version="1.0" encoding="utf-8"?>
+<jnlp spec="1.0" href="AbsolutePathsAndQueryStrings.jnlp" codebase=".">
+ <information>
+ <title>AbsolutePathsAndQueryStrings</title>
+ <vendor>IcedTea</vendor>
+ <homepage href="http://icedtea.classpath.org/wiki/IcedTea-Web#Testing_IcedTea-Web"/>
+ <description>Use relative codebase URLs to append to host names, and correctly parse query strings</description>
+ <offline/>
+ </information>
+ <resources>
+ <j2se version="1.4+"/>
+ <jar href="/StripHttpPathParams.jar?i=1234abcd"/>
+ </resources>
+ <application-desc main-class="StripHttpPathParams">
+ </application-desc>
+</jnlp>
diff --git a/tests/reproducers/simple/AbsolutePathsAndQueryStrings/testcases/AbsolutePathsAndQueryStrings.java b/tests/reproducers/simple/AbsolutePathsAndQueryStrings/testcases/AbsolutePathsAndQueryStrings.java
new file mode 100644
index 0000000..7f561e7
--- /dev/null
+++ b/tests/reproducers/simple/AbsolutePathsAndQueryStrings/testcases/AbsolutePathsAndQueryStrings.java
@@ -0,0 +1,116 @@
+/* AbsolutePathsAndQueryStrings.java
+Copyright (C) 2013 Red Hat, Inc.
+
+This file is part of IcedTea.
+
+IcedTea is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation, version 2.
+
+IcedTea is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with IcedTea; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version.
+ */
+
+import java.io.File;
+import java.net.URL;
+import net.sourceforge.jnlp.ProcessResult;
+import net.sourceforge.jnlp.ServerAccess.AutoClose;
+import net.sourceforge.jnlp.annotations.Bug;
+import net.sourceforge.jnlp.annotations.KnownToFail;
+import net.sourceforge.jnlp.annotations.NeedsDisplay;
+import net.sourceforge.jnlp.annotations.TestInBrowsers;
+import net.sourceforge.jnlp.browsertesting.BrowserTest;
+import net.sourceforge.jnlp.browsertesting.Browsers;
+import net.sourceforge.jnlp.closinglisteners.AutoOkClosingListener;
+import net.sourceforge.jnlp.ServerAccess;
+import net.sourceforge.jnlp.cache.CacheUtil;
+import net.sourceforge.jnlp.runtime.JNLPRuntime;
+import net.sourceforge.jnlp.config.DeploymentConfiguration;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.AfterClass;
+
+public class AbsolutePathsAndQueryStrings extends BrowserTest {
+
+ private static final String appletCloseString = AutoOkClosingListener.MAGICAL_OK_CLOSING_STRING;
+
+ @Bug(id="PR1204")
+ @NeedsDisplay
+ @Test
+ @TestInBrowsers(testIn={Browsers.one})
+ public void testAbsolutePathAndQueryStringBrowser() throws Exception {
+ /* HTML specifies absolute path and path params, ensure that this is able to launch correctly */
+ ProcessResult pr = server.executeBrowser("/AbsolutePathsAndQueryStrings.html", AutoClose.CLOSE_ON_BOTH);
+ Assert.assertTrue("stdout should contain " + appletCloseString + " but did not", pr.stdout.contains(appletCloseString));
+ }
+
+ @Bug(id="PR1204")
+ @NeedsDisplay
+ @Test
+ public void testAbsolutePathAndQueryStringWebstart() throws Exception {
+ /* JNLP specifies absolute path and path params, ensure that this is able to launch correctly */
+ ProcessResult pr = server.executeJavawsHeadless("/AbsolutePathsAndQueryStrings.jnlp");
+ Assert.assertTrue("stdout should contain \"running\"but did not", pr.stdout.contains("running"));
+ }
+
+ @Bug(id="PR1204")
+ @Test
+ public void testCaching() throws Exception {
+ /* Test that caching ignores path parameters and double-slash issue from absolute codebase paths
+ */
+ URL plainLocation = new URL("http://localhost:1234/StripHttpPathParams.jar");
+ URL paramLocation = new URL("http://localhost:1234/StripHttpPathParams.jar?i=abcd");
+ URL absoluteLocation = new URL("http://localhost:1234//StripHttpPathParams.jar");
+ URL absoluteParamLocation = new URL("http://localhost:1234//StripHttpPathParams.jar?i=abcd");
+
+ DeploymentConfiguration config = JNLPRuntime.getConfiguration();
+ config.load();
+ String cacheLocation = config.getProperty(DeploymentConfiguration.KEY_USER_CACHE_DIR) + File.separator;
+ File cacheDir = new File(cacheLocation);
+ Assert.assertTrue(cacheDir.isDirectory());
+
+ boolean hasCachedCopy = false;
+ for (File cache : cacheDir.listFiles()) {
+ File[] cacheFiles = new File[] {
+ CacheUtil.urlToPath(plainLocation, cache.getPath()),
+ CacheUtil.urlToPath(paramLocation, cache.getPath()),
+ CacheUtil.urlToPath(absoluteLocation, cache.getPath()),
+ CacheUtil.urlToPath(absoluteParamLocation, cache.getPath()),
+ };
+ for (File f : cacheFiles) {
+ if (f.isFile())
+ hasCachedCopy = true;
+ for (File g : cacheFiles) {
+ Assert.assertEquals(f.getPath(), g.getPath());
+ }
+ }
+ }
+ Assert.assertTrue(hasCachedCopy);
+ }
+
+}