Mercurial > hg > release > icedtea-web-1.8
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; } }