/hg/icedtea-web: Fix for PR1204, handling of query strings and a...

aazores at icedtea.classpath.org aazores at icedtea.classpath.org
Thu Sep 26 07:26:23 PDT 2013


changeset 654630a490cb in /hg/icedtea-web
details: http://icedtea.classpath.org/hg/icedtea-web?cmd=changeset;node=654630a490cb
author: Andrew Azores <aazores at redhat.com>
date: Thu Sep 26 10:25:33 2013 -0400

	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


diffstat:

 ChangeLog                                                                                         |   23 +
 netx/net/sourceforge/jnlp/cache/ResourceUrlCreator.java                                           |   44 +-
 plugin/icedteanp/java/sun/applet/PluginAppletViewer.java                                          |   28 +-
 tests/netx/unit/net/sourceforge/jnlp/cache/ResourceUrlCreatorTest.java                            |   51 ++++-
 tests/netx/unit/sun/applet/PluginAppletViewerTest.java                                            |   42 +++-
 tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQueryStrings.html |   48 ++++
 tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQueryStrings.jnlp |   53 ++++
 tests/reproducers/simple/AbsolutePathsAndQueryStrings/testcases/AbsolutePathsAndQueryStrings.java |  116 ++++++++++
 8 files changed, 371 insertions(+), 34 deletions(-)

diffs (truncated from 517 to 500 lines):

diff -r 11430ea879f6 -r 654630a490cb ChangeLog
--- a/ChangeLog	Wed Sep 25 16:32:44 2013 -0400
+++ b/ChangeLog	Thu Sep 26 10:25:33 2013 -0400
@@ -1,3 +1,26 @@
+2013-09-26  Andrew Azores  <aazores at redhat.com>
+
+	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  <aazores at redhat.com>
 
 	* Makefile.am: clean up summary_unit.txt and summary_reproducers.txt for
diff -r 11430ea879f6 -r 654630a490cb netx/net/sourceforge/jnlp/cache/ResourceUrlCreator.java
--- a/netx/net/sourceforge/jnlp/cache/ResourceUrlCreator.java	Wed Sep 25 16:32:44 2013 -0400
+++ b/netx/net/sourceforge/jnlp/cache/ResourceUrlCreator.java	Thu Sep 26 10:25:33 2013 -0400
@@ -38,6 +38,8 @@
 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 @@
             }
         }
 
-        url = getVersionedUrlUsingQuery(resource);
+        url = getVersionedUrl(resource);
         urls.add(url);
 
         urls.add(resource.getLocation());
@@ -146,29 +148,29 @@
     }
 
     /**
-     * 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();
+    protected URL getVersionedUrl(Resource resource) {
+        URL resourceUrl = resource.getLocation();
+        try {
+            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 resourceUrl;
+        } catch (URISyntaxException e) {
+            return resourceUrl;
         }
-        actualLocation += resource.getLocation().getPath();
-        if (resource.requestVersion != null
-                && resource.requestVersion.isVersionId()) {
-            actualLocation += "?version-id=" + resource.requestVersion;
-        }
-        URL versionedURL;
-        try {
-            versionedURL = new URL(actualLocation);
-        } catch (MalformedURLException e) {
-            return resource.getLocation();
-        }
-        return versionedURL;
     }
 
-}
\ No newline at end of file
+}
diff -r 11430ea879f6 -r 654630a490cb plugin/icedteanp/java/sun/applet/PluginAppletViewer.java
--- a/plugin/icedteanp/java/sun/applet/PluginAppletViewer.java	Wed Sep 25 16:32:44 2013 -0400
+++ b/plugin/icedteanp/java/sun/applet/PluginAppletViewer.java	Thu Sep 26 10:25:33 2013 -0400
@@ -86,6 +86,7 @@
 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 @@
         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 @@
         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 -r 11430ea879f6 -r 654630a490cb tests/netx/unit/net/sourceforge/jnlp/cache/ResourceUrlCreatorTest.java
--- a/tests/netx/unit/net/sourceforge/jnlp/cache/ResourceUrlCreatorTest.java	Wed Sep 25 16:32:44 2013 -0400
+++ b/tests/netx/unit/net/sourceforge/jnlp/cache/ResourceUrlCreatorTest.java	Thu Sep 26 10:25:33 2013 -0400
@@ -5,6 +5,7 @@
 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 @@
     @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 -r 11430ea879f6 -r 654630a490cb tests/netx/unit/sun/applet/PluginAppletViewerTest.java
--- a/tests/netx/unit/sun/applet/PluginAppletViewerTest.java	Wed Sep 25 16:32:44 2013 -0400
+++ b/tests/netx/unit/sun/applet/PluginAppletViewerTest.java	Thu Sep 26 10:25:33 2013 -0400
@@ -42,8 +42,11 @@
 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 @@
         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 @@
         int expectedLength = 6;
         return parseAndCheckJSMessage(message, expectedLength, "ToString", contextObjectID);
     }
-}
\ No newline at end of file
+}
diff -r 11430ea879f6 -r 654630a490cb tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQueryStrings.html
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQueryStrings.html	Thu Sep 26 10:25:33 2013 -0400
@@ -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 -r 11430ea879f6 -r 654630a490cb tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQueryStrings.jnlp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/reproducers/simple/AbsolutePathsAndQueryStrings/resources/AbsolutePathsAndQueryStrings.jnlp	Thu Sep 26 10:25:33 2013 -0400
@@ -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 -r 11430ea879f6 -r 654630a490cb tests/reproducers/simple/AbsolutePathsAndQueryStrings/testcases/AbsolutePathsAndQueryStrings.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/reproducers/simple/AbsolutePathsAndQueryStrings/testcases/AbsolutePathsAndQueryStrings.java	Thu Sep 26 10:25:33 2013 -0400
@@ -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[] {


More information about the distro-pkg-dev mailing list