aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/net/URLStreamHandler.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/java/net/URLStreamHandler.java')
-rw-r--r--libjava/java/net/URLStreamHandler.java35
1 files changed, 30 insertions, 5 deletions
diff --git a/libjava/java/net/URLStreamHandler.java b/libjava/java/net/URLStreamHandler.java
index 128a0d2d3da..d3dd3ccf0f7 100644
--- a/libjava/java/net/URLStreamHandler.java
+++ b/libjava/java/net/URLStreamHandler.java
@@ -1,5 +1,5 @@
/* URLStreamHandler.java -- Abstract superclass for all protocol handlers
- Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2002, 2003 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -39,6 +39,7 @@ exception statement from your version. */
package java.net;
import java.io.IOException;
+import java.io.File;
/*
* Written using on-line Java Platform 1.2 API Specification, as well
@@ -112,7 +113,7 @@ public abstract class URLStreamHandler
* subclasses that implement protocols with URL's the follow a different
* syntax should override this method. The lone exception is that if
* the protocol name set in the URL is "file", this method will accept
- * a an empty hostname (i.e., "file:///"), which is legal for that protocol
+ * an empty hostname (i.e., "file:///"), which is legal for that protocol
*
* @param url The URL object in which to store the results
* @param spec The String-ized URL to parse
@@ -176,8 +177,32 @@ public abstract class URLStreamHandler
else if (start < end)
{
// Context is available, but only override it if there is a new file.
- file = file.substring(0, file.lastIndexOf('/'))
- + '/' + spec.substring(start, end);
+ char sepChar = '/';
+ int lastSlash = file.lastIndexOf (sepChar);
+ if (lastSlash < 0 && File.separatorChar != sepChar
+ && url.getProtocol ().equals ("file"))
+ {
+ // On Windows, even '\' is allowed in a "file" URL.
+ sepChar = File.separatorChar;
+ lastSlash = file.lastIndexOf (sepChar);
+ }
+
+ file = file.substring(0, lastSlash)
+ + sepChar + spec.substring (start, end);
+
+ if (url.getProtocol ().equals ("file"))
+ {
+ // For "file" URLs constructed relative to a context, we
+ // need to canonicalise the file path.
+ try
+ {
+ file = new File (file).getCanonicalPath ();
+ }
+ catch (IOException e)
+ {
+ }
+ }
+
ref = null;
}
@@ -436,7 +461,7 @@ public abstract class URLStreamHandler
// ignores a non-default port if host is null or "". That is inconsistent
// with the spec since the result of this method is spec'ed so it can be
// used to construct a new URL that is equivalent to the original.
- boolean port_needed = port >= 0 && port != getDefaultPort();
+ boolean port_needed = port > 0 && port != getDefaultPort();
if (port_needed)
sb.append(':').append(port);