diff options
author | Chris Burdess <dog@bluezoo.org> | 2005-03-02 08:46:33 +0000 |
---|---|---|
committer | Chris Burdess <dog@bluezoo.org> | 2005-03-02 08:46:33 +0000 |
commit | 4acaecf09941b4666cb69f9c31025695a66be25f (patch) | |
tree | 365c2dbd3a095f785be2922e75ab3ea8b71508f0 /gnu/java/net/protocol/file/Connection.java | |
parent | f4d6232dba6b9e2ea3567d6b9c6f8752195c8c60 (diff) | |
download | classpath-4acaecf09941b4666cb69f9c31025695a66be25f.tar.gz |
2005-02-27 Chris Burdess <dog@gnu.org>
* gnu/java/net/protocol/file/Connection.java: Return correct content
length for directory listing.
* java/net/URLClassLoader.java: Correction for URLClassLoader, bug
#11285: return valid URLs for directories.
Diffstat (limited to 'gnu/java/net/protocol/file/Connection.java')
-rw-r--r-- | gnu/java/net/protocol/file/Connection.java | 54 |
1 files changed, 46 insertions, 8 deletions
diff --git a/gnu/java/net/protocol/file/Connection.java b/gnu/java/net/protocol/file/Connection.java index 3a37def99..4acc458d2 100644 --- a/gnu/java/net/protocol/file/Connection.java +++ b/gnu/java/net/protocol/file/Connection.java @@ -42,6 +42,7 @@ import gnu.classpath.SystemProperties; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -49,6 +50,8 @@ import java.io.FilePermission; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; import java.net.ProtocolException; import java.net.URL; import java.net.URLConnection; @@ -92,6 +95,11 @@ public class Connection extends URLConnection private File file; /** + * If a directory, contains a list of files in the directory. + */ + private byte[] directoryListing; + + /** * InputStream if we are reading from the file */ private InputStream inputStream; @@ -140,13 +148,7 @@ public class Connection extends URLConnection { if (doInput) { - StringBuffer sb = new StringBuffer(); - String[] files = file.list(); - - for (int index = 0; index < files.length; ++index) - sb.append(files[index]).append(StaticData.lineSeparator); - - inputStream = new ByteArrayInputStream(sb.toString().getBytes()); + inputStream = new ByteArrayInputStream(getDirectoryListing()); } if (doOutput) @@ -156,6 +158,32 @@ public class Connection extends URLConnection connected = true; } + + /** + * Populates the <code>directoryListing</code> field with a byte array + * containing a representation of the directory listing. + */ + byte[] getDirectoryListing() + throws IOException + { + if (directoryListing == null) + { + ByteArrayOutputStream sink = new ByteArrayOutputStream(); + // NB uses default character encoding for this system + Writer writer = new OutputStreamWriter(sink); + + String[] files = file.list(); + + for (int i = 0; i < files.length; i++) + { + writer.write(files[i]); + writer.write(StaticData.lineSeparator); + } + + directoryListing = sink.toByteArray(); + } + return directoryListing; + } /** * Opens the file for reading and returns a stream for it. @@ -229,7 +257,13 @@ public class Connection extends URLConnection if (field.equals("content-type")) return guessContentTypeFromName(file.getName()); else if (field.equals("content-length")) - return Long.toString(file.length()); + { + if (file.isDirectory()) + { + return Integer.toString(getContentLength()); + } + return Long.toString(file.length()); + } else if (field.equals("last-modified")) { synchronized (StaticData.dateFormat) @@ -258,6 +292,10 @@ public class Connection extends URLConnection if (!connected) connect(); + if (file.isDirectory()) + { + return getDirectoryListing().length; + } return (int) file.length(); } catch (IOException e) |