summaryrefslogtreecommitdiff
path: root/gnu/java/net/protocol/file/Connection.java
diff options
context:
space:
mode:
authorChris Burdess <dog@bluezoo.org>2005-03-02 08:46:33 +0000
committerChris Burdess <dog@bluezoo.org>2005-03-02 08:46:33 +0000
commit4acaecf09941b4666cb69f9c31025695a66be25f (patch)
tree365c2dbd3a095f785be2922e75ab3ea8b71508f0 /gnu/java/net/protocol/file/Connection.java
parentf4d6232dba6b9e2ea3567d6b9c6f8752195c8c60 (diff)
downloadclasspath-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.java54
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)