diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 375b41dc46a..9d66db23bdf 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,13 @@ +2005-04-27 Chris Burdess + + * java/net/protocol/http/HTTPURLConnection.java (connect): Accept + absolute and relative paths in Location header. + +2005-04-27 Chris Burdess + + * gnu/java/net/protocol/http/HTTPURLConnection.java: Throw + FileNotFoundException and implement getErrorStream on 404. + 2005-04-27 Sven de Marothy * java/util/TimeZone.java, diff --git a/libjava/gnu/java/net/protocol/http/HTTPURLConnection.java b/libjava/gnu/java/net/protocol/http/HTTPURLConnection.java index 2938dfc953a..50a6ed12e7a 100644 --- a/libjava/gnu/java/net/protocol/http/HTTPURLConnection.java +++ b/libjava/gnu/java/net/protocol/http/HTTPURLConnection.java @@ -40,6 +40,7 @@ package gnu.java.net.protocol.http; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -94,6 +95,7 @@ public class HTTPURLConnection private Response response; private ByteArrayInputStream responseSink; + private ByteArrayInputStream errorSink; private HandshakeCompletedEvent handshakeEvent; @@ -281,11 +283,32 @@ public class HTTPURLConnection file = location.substring(end); retry = true; } - // Otherwise this is not an HTTP redirect, can't follow + else if (location.length() > 0) + { + // Malformed absolute URI, treat as file part of URI + if (location.charAt(0) == '/') + { + // Absolute path + file = location; + } + else + { + // Relative path + int lsi = file.lastIndexOf('/'); + file = (lsi == -1) ? "/" : file.substring(0, lsi + 1); + file += location; + } + retry = true; + } } else { responseSink = new ByteArrayInputStream(reader.toByteArray ()); + if (response.getCode() == 404) + { + errorSink = responseSink; + throw new FileNotFoundException(url.toString()); + } } } while (retry); @@ -455,6 +478,11 @@ public class HTTPURLConnection return responseSink; } + public InputStream getErrorStream() + { + return errorSink; + } + public Map getHeaderFields() { if (!connected)