changeset 592:95fc28e972ad

PR909: URL is invalid after normalization
author Saad Mohammad <smohammad@redhat.com>
date Thu, 20 Dec 2012 15:46:26 -0500
parents 2b2073cc9a19
children 4d294d8ea881
files ChangeLog NEWS netx/net/sourceforge/jnlp/cache/ResourceTracker.java
diffstat 3 files changed, 21 insertions(+), 99 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Thu Dec 20 11:11:05 2012 -0500
+++ b/ChangeLog	Thu Dec 20 15:46:26 2012 -0500
@@ -1,3 +1,9 @@
+2012-12-20  Saad Mohammad  <smohammad@redhat.com>
+
+	Fix PR909 - URL is invalid after normalization.
+	* netx/net/sourceforge/jnlp/cache/ResourceTracker.java (normalizeUrl):
+	Converts the URL to an URI object which handles all percent encodings.
+
 2012-12-20  Adam Domurad  <adomurad@redhat.com>
 
 	* plugin/icedteanp/IcedTeaScriptablePluginObject.cc
--- a/NEWS	Thu Dec 20 11:11:05 2012 -0500
+++ b/NEWS	Thu Dec 20 15:46:26 2012 -0500
@@ -28,6 +28,7 @@
   - PR1161: X509VariableTrustManager does not work correctly with OpenJDK7
   - PR822: Applets fail to load if jars have different signers
   - PR1186: System.getProperty("deployment.user.security.trusted.cacerts") is null
+  - PR909: The Java applet at http://de.gosupermodel.com/games/wardrobegame.jsp fails
 
 New in release 1.3 (2012-XX-XX):
 * NetX
--- a/netx/net/sourceforge/jnlp/cache/ResourceTracker.java	Thu Dec 20 11:11:05 2012 -0500
+++ b/netx/net/sourceforge/jnlp/cache/ResourceTracker.java	Thu Dec 20 15:46:26 2012 -0500
@@ -27,10 +27,11 @@
 import java.io.UnsupportedEncodingException;
 import java.net.HttpURLConnection;
 import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.net.URL;
 import java.net.URLConnection;
 import java.net.URLDecoder;
-import java.net.URLEncoder;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.util.ArrayList;
@@ -1143,115 +1144,29 @@
         }
     };
 
-    private static String normalizeChunk(String base, boolean debug) throws UnsupportedEncodingException {
-        if (base == null) {
-            return base;
-        }
-        if ("".equals(base)) {
-            return base;
-        }
-        String result = base;
-        String ssE = URLDecoder.decode(base, UTF8);
-        //            System.out.println("*" + base + "*");
-        //            System.out.println("-" + ssE + "-");
-        if (base.equals(ssE)) {
-            result = URLEncoder.encode(base, UTF8);
-            if (debug) {
-                System.out.println(base + " chunk needs to be encoded => " + result);
-            }
-        } else {
-            if (debug) {
-                System.out.println(base + " chunk already encoded");
-            }
-        }
-        return result;
-    }
-
-    public static URL normalizeUrl(URL u, boolean debug) throws MalformedURLException, UnsupportedEncodingException {
+    public static URL normalizeUrl(URL u, boolean debug) throws MalformedURLException, UnsupportedEncodingException, URISyntaxException {
         if (u == null) {
             return null;
         }
         String protocol = u.getProtocol();
+
         if (protocol == null || "file".equals(protocol)) {
             return u;
         }
-        String file = u.getPath();
-        if (file == null) {
+
+        if (u.getPath() == null) {
             return u;
         }
-        String host = u.getHost();
-        String ref = u.getRef();
-        int port = u.getPort();
-        String query = u.getQuery();
-        String[] qq = {};
-        if (query != null) {
-            qq = query.split(QUERY_DELIMITER);
-        }
-        String[] ss = file.split(PATH_DELIMITER);
-        int normalized = 0;
-        if (debug) {
-            System.out.println("normalizing path " + file + " in " + u.toString());
-        }
-        for (int i = 0; i < ss.length; i++) {
-            String base = ss[i];
-            String r = normalizeChunk(base, debug);
-            if (!r.equals(ss[i])) {
-                normalized++;
-            }
-            ss[i] = r;
-        }
-        if (debug) {
-            System.out.println("normalizing query " + query + " in " + u.toString());
-        }
-        for (int i = 0; i < qq.length; i++) {
-            String base = qq[i];
-            String r = normalizeChunk(base, debug);
-            if (!r.equals(qq[i])) {
-                normalized++;
-            }
-            qq[i] = r;
-        }
-        if (normalized == 0) {
-            if (debug) {
-                System.out.println("Nothing was normalized in this url");
-            }
-            return u;
-        } else {
-            if (debug) {
-                System.out.println(normalized + " chunks normalized, rejoining url");
-            }
-        }
-        StringBuilder composed = new StringBuilder("");
-        for (int i = 0; i < ss.length; i++) {
-            String string = ss[i];
-            if (ss.length <= 1 || (string != null && !"".equals(string))) {
-                composed.append(PATH_DELIMITER_MARK).append(string);
-            }
-        }
-        String composed1 = composed.toString();
-        if (query != null && !query.trim().equals("")) {
-            composed.append(QUERY_MARK);
-            for (int i = 0; i < qq.length; i++) {
-                String string = qq[i];
-                if ((string != null && !"".equals(string))) {
-                    composed.append(string);
-                    if (i != qq.length - 1) {
-                        composed.append(QUERY_DELIMITER_MARK);
-                    }
-                }
-            }
-        }
-        String composed2 = composed.substring(composed1.length() - 1);
-        if (ref != null && !ref.trim().equals("")) {
-            composed.append(HREF_MARK).append(ref);
-        }
+
+        //Decode the URL before encoding
+        URL decodedURL = new URL(URLDecoder.decode(u.toString(), UTF8));
 
-        URL result = new URL(protocol, host, port, composed.toString());
+        //Create URI with the decoded URL
+        URI uri = new URI(decodedURL.getProtocol(), null, decodedURL.getHost(), decodedURL.getPort(), decodedURL.getPath(), decodedURL.getQuery(), null);
 
-        if (debug) {
-            System.out.println("normalized `" + composed1 + "` and `" + composed2 + "` in " + result.toString());
-        }
-        return result;
+        //Returns the encoded URL
+        URL encodedURL = new URL(uri.toASCIIString());
 
+        return encodedURL;
     }
 }