diff options
author | Mark Wielaard <mark@gcc.gnu.org> | 2005-11-18 00:59:33 +0000 |
---|---|---|
committer | Mark Wielaard <mark@gcc.gnu.org> | 2005-11-18 00:59:33 +0000 |
commit | ca9e049bc145ae985bc0e2dd6079dacdd51717ac (patch) | |
tree | 4c44aaa3ed1ee1b4f15732664c05cfc9214e1fa9 /libjava/classpath/gnu/java/net/protocol | |
parent | fb3a09c214e19c97d3751003d9a2ea8008f5005e (diff) | |
download | gcc-ca9e049bc145ae985bc0e2dd6079dacdd51717ac.zip gcc-ca9e049bc145ae985bc0e2dd6079dacdd51717ac.tar.gz gcc-ca9e049bc145ae985bc0e2dd6079dacdd51717ac.tar.bz2 |
Imported GNU Classpath gcj-import-20051117.
* gnu/java/net/protocol/file/Connection.java: Removed, fully merged.
* sources.am: Regenerated.
* Makefile.in: Likewise.
From-SVN: r107153
Diffstat (limited to 'libjava/classpath/gnu/java/net/protocol')
-rw-r--r-- | libjava/classpath/gnu/java/net/protocol/file/Connection.java | 51 | ||||
-rw-r--r-- | libjava/classpath/gnu/java/net/protocol/jar/Connection.java | 60 |
2 files changed, 109 insertions, 2 deletions
diff --git a/libjava/classpath/gnu/java/net/protocol/file/Connection.java b/libjava/classpath/gnu/java/net/protocol/file/Connection.java index 52bd048..8e4a413 100644 --- a/libjava/classpath/gnu/java/net/protocol/file/Connection.java +++ b/libjava/classpath/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/classpath/gnu/java/net/protocol/jar/Connection.java b/libjava/classpath/gnu/java/net/protocol/jar/Connection.java index e8548742..e2a052e 100644 --- a/libjava/classpath/gnu/java/net/protocol/jar/Connection.java +++ b/libjava/classpath/gnu/java/net/protocol/jar/Connection.java @@ -47,7 +47,10 @@ import java.net.MalformedURLException; import java.net.ProtocolException; import java.net.URL; import java.net.URLConnection; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.Hashtable; +import java.util.Locale; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.zip.ZipFile; @@ -60,6 +63,12 @@ import java.util.zip.ZipFile; */ public final class Connection extends JarURLConnection { + /** + * HTTP-style DateFormat, used to format the last-modified header. + * Lazy initialized since jar files are used during bootstrapping. + */ + private static SimpleDateFormat dateFormat; + private JarFile jar_file; private JarEntry jar_entry; private URL jar_url; @@ -82,7 +91,9 @@ public final class Connection extends JarURLConnection if ("file".equals (url.getProtocol())) { - File f = new File (url.getFile()); + String fn = url.getFile(); + fn = gnu.java.net.protocol.file.Connection.unquote(fn); + File f = new File (fn); jf = new JarFile (f, true, ZipFile.OPEN_READ); } else @@ -165,6 +176,38 @@ public final class Connection extends JarURLConnection return jar_file; } + public String getHeaderField(String field) + { + try + { + if (!connected) + connect(); + + if (field.equals("content-type")) + return guessContentTypeFromName(getJarEntry().getName()); + else if (field.equals("content-length")) + return Long.toString(getJarEntry().getSize()); + else if (field.equals("last-modified")) + { + // Both creating and manipulating dateFormat need synchronization. + synchronized (this.getClass()) + { + if (dateFormat == null) + dateFormat = new SimpleDateFormat + ("EEE, dd MMM yyyy hh:mm:ss 'GMT'", + new Locale ("En", "Us", "Unix")); + + return dateFormat.format(new Date(getJarEntry().getTime())); + } + } + } + catch (IOException e) + { + // Fall through. + } + return null; + } + public int getContentLength() { if (!connected) @@ -172,4 +215,19 @@ public final class Connection extends JarURLConnection return (int) jar_entry.getSize(); } + + public long getLastModified() + { + if (!connected) + return -1; + + try + { + return getJarEntry().getTime(); + } + catch (IOException e) + { + return -1; + } + } } |