HTTPURLConnection.java (connect): Accept absolute and relative paths in Location...
authorChris Burdess <dog@gnu.org>
Wed, 27 Apr 2005 18:57:02 +0000 (18:57 +0000)
committerMichael Koch <mkoch@gcc.gnu.org>
Wed, 27 Apr 2005 18:57:02 +0000 (18:57 +0000)
2005-04-27  Chris Burdess  <dog@gnu.org>

* java/net/protocol/http/HTTPURLConnection.java (connect): Accept
absolute and relative paths in Location header.

2005-04-27  Chris Burdess  <dog@gnu.org>

* gnu/java/net/protocol/http/HTTPURLConnection.java: Throw
FileNotFoundException and implement getErrorStream on 404.

From-SVN: r98875

libjava/ChangeLog
libjava/gnu/java/net/protocol/http/HTTPURLConnection.java

index 375b41d..9d66db2 100644 (file)
@@ -1,3 +1,13 @@
+2005-04-27  Chris Burdess  <dog@gnu.org>
+
+       * java/net/protocol/http/HTTPURLConnection.java (connect): Accept
+       absolute and relative paths in Location header.
+
+2005-04-27  Chris Burdess  <dog@gnu.org>
+
+       * gnu/java/net/protocol/http/HTTPURLConnection.java: Throw
+       FileNotFoundException and implement getErrorStream on 404.
+
 2005-04-27  Sven de Marothy <sven@physto.se>
 
        * java/util/TimeZone.java,
index 2938dfc..50a6ed1 100644 (file)
@@ -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)