diff options
author | Andrew Haley <aph@redhat.com> | 2005-07-14 18:20:10 +0000 |
---|---|---|
committer | Andrew Haley <aph@gcc.gnu.org> | 2005-07-14 18:20:10 +0000 |
commit | 3fefd0193cc8dcd50fe626a9d81719ba3c845a2f (patch) | |
tree | 8de981c27b99e5f3550c9d6ebf969b8edaec99fa /libjava/gnu/java | |
parent | b11e14262e1381cc7e7322aec4d5be27bb15529b (diff) | |
download | gcc-3fefd0193cc8dcd50fe626a9d81719ba3c845a2f.zip gcc-3fefd0193cc8dcd50fe626a9d81719ba3c845a2f.tar.gz gcc-3fefd0193cc8dcd50fe626a9d81719ba3c845a2f.tar.bz2 |
Connection.java (unquote): New method.
2005-07-13 Andrew Haley <aph@redhat.com>
* gnu/java/net/protocol/file/Connection.java (unquote): New
method.
(connect): Unquote filename.
gnu/java/net/protocol/jar/Connection.java (getInputStream):
Likewise.
(getJarFile): Likewise.
* java/net/URLConnection.java (getContentHandler): Guard cast with
instaceof.
* java/net/URL.java (URL): If the file part of a spec is absolute,
ignore the file part of its context.
From-SVN: r102029
Diffstat (limited to 'libjava/gnu/java')
-rw-r--r-- | libjava/gnu/java/net/protocol/file/Connection.java | 51 | ||||
-rw-r--r-- | libjava/gnu/java/net/protocol/jar/Connection.java | 13 |
2 files changed, 59 insertions, 5 deletions
diff --git a/libjava/gnu/java/net/protocol/file/Connection.java b/libjava/gnu/java/net/protocol/file/Connection.java index 52bd048..8e4a413 100644 --- a/libjava/gnu/java/net/protocol/file/Connection.java +++ b/libjava/gnu/java/net/protocol/file/Connection.java @@ -59,6 +59,7 @@ import java.security.Permission; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; +import java.net.MalformedURLException; /** * This subclass of java.net.URLConnection models a URLConnection via @@ -125,6 +126,54 @@ public class Connection extends URLConnection } /** + * Unquote "%" + hex quotes characters + * + * @param str The string to unquote or null. + * + * @return The unquoted string or null if str was null. + * + * @exception MalformedURLException If the given string contains invalid + * escape sequences. + * + * Sadly the same as URI.unquote, but there's nothing we can do to + * make it accessible. + * + */ + public static String unquote(String str) throws MalformedURLException + { + if (str == null) + return null; + byte[] buf = new byte[str.length()]; + int pos = 0; + for (int i = 0; i < str.length(); i++) + { + char c = str.charAt(i); + if (c > 127) + throw new MalformedURLException(str + " : Invalid character"); + if (c == '%') + { + if (i + 2 >= str.length()) + throw new MalformedURLException(str + " : Invalid quoted character"); + int hi = Character.digit(str.charAt(++i), 16); + int lo = Character.digit(str.charAt(++i), 16); + if (lo < 0 || hi < 0) + throw new MalformedURLException(str + " : Invalid quoted character"); + buf[pos++] = (byte) (hi * 16 + lo); + } + else + buf[pos++] = (byte) c; + } + try + { + return new String(buf, 0, pos, "utf-8"); + } + catch (java.io.UnsupportedEncodingException x2) + { + throw (Error) new InternalError().initCause(x2); + } + } + + /** * "Connects" to the file by opening it. */ public void connect() throws IOException @@ -134,7 +183,7 @@ public class Connection extends URLConnection return; // If not connected, then file needs to be openned. - file = new File (getURL().getFile()); + file = new File (unquote(getURL().getFile())); if (! file.isDirectory()) { diff --git a/libjava/gnu/java/net/protocol/jar/Connection.java b/libjava/gnu/java/net/protocol/jar/Connection.java index 8ec35cc..34df183 100644 --- a/libjava/gnu/java/net/protocol/jar/Connection.java +++ b/libjava/gnu/java/net/protocol/jar/Connection.java @@ -151,7 +151,8 @@ public final class Connection extends JarURLConnection if (jarfile != null) { // this is the easy way... - ZipEntry entry = jarfile.getEntry(getEntryName()); + ZipEntry entry = jarfile.getEntry + (gnu.java.net.protocol.file.Connection.unquote(getEntryName())); if (entry != null) return jarfile.getInputStream (entry); @@ -164,12 +165,14 @@ public final class Connection extends JarURLConnection JarInputStream zis = new JarInputStream( jarFileURLConnection.getInputStream ()); + String entryName = gnu.java.net.protocol.file.Connection.unquote(getEntryName()); + // This is hideous, we're doing a linear search... for (ZipEntry entry = zis.getNextEntry(); entry != null; entry = zis.getNextEntry()) { - if (getEntryName().equals(entry.getName())) + if (entryName.equals(entry.getName())) { int size = (int) entry.getSize(); byte[] data = new byte[size]; @@ -203,12 +206,14 @@ public final class Connection extends JarURLConnection jar_file = (JarFile) file_cache.get (jarFileURL); if (jar_file == null) { - jar_file = new JarFile (jarFileURL.getFile()); + jar_file = new JarFile + (gnu.java.net.protocol.file.Connection.unquote(jarFileURL.getFile())); file_cache.put (jarFileURL, jar_file); } } else - jar_file = new JarFile (jarFileURL.getFile()); + jar_file = new JarFile + (gnu.java.net.protocol.file.Connection.unquote(jarFileURL.getFile())); } else { |