From b6ac804e3d3e38f8c9b9974b0e17ce70673209e8 Mon Sep 17 00:00:00 2001 From: Bryce McKinlay Date: Thu, 10 Aug 2000 10:10:25 +0100 Subject: [PATCH] Connection.java (gotHeaders): Removed. 2000-08-10 Bryce McKinlay John Stracke * gnu/gcj/protocol/http/Connection.java (gotHeaders): Removed. (connect): Don't falsely claim HTTP/1.1 compliance. Call getHttpHeaders(). (disconnect): Don't unset connected flag. (getHeaderField (String)): Call connect() if not connected. (getHeaderField (int)): Ditto. (getHeaderFieldKey): Ditto. (getHttpHeaders): Don't call connect(). * java/net/HttpURLConnection.java (instanceFollowRedirects, gotResponseVals): New fields. (getResponseCode): Call getResponseVals() conditionally. (getResponseMessage): Ditto. (getResponseVals): Call connect(). Don't throw FileNotFoundException. From-SVN: r35603 --- libjava/gnu/gcj/protocol/http/Connection.java | 84 +++++++++++++-------------- libjava/java/net/HttpURLConnection.java | 26 ++++++--- 2 files changed, 58 insertions(+), 52 deletions(-) diff --git a/libjava/gnu/gcj/protocol/http/Connection.java b/libjava/gnu/gcj/protocol/http/Connection.java index ba5903d..5ff1c32 100644 --- a/libjava/gnu/gcj/protocol/http/Connection.java +++ b/libjava/gnu/gcj/protocol/http/Connection.java @@ -1,6 +1,6 @@ // Connection.java - Implementation of HttpURLConnection for http protocol. -/* Copyright (C) 1999 Free Software Foundation +/* Copyright (C) 1999, 2000 Free Software Foundation This file is part of libgcj. @@ -37,7 +37,6 @@ class Connection extends HttpURLConnection private Hashtable requestProperties; private Hashtable hdrHash = new Hashtable(); private Vector hdrVec = new Vector(); - private boolean gotHeaders = false; private BufferedInputStream bufferedIn; public Connection(URL url) @@ -94,14 +93,15 @@ class Connection extends HttpURLConnection PrintWriter out = new PrintWriter(sock.getOutputStream()); // Send request including any request properties that were set. - out.print(getRequestMethod() + " " + url.getFile() + " HTTP/1.1\n"); + out.print(getRequestMethod() + " " + url.getFile() + " HTTP/1.0\n"); out.print("Host: " + url.getHost() + ":" + port + "\n"); Enumeration reqKeys = requestProperties.keys(); Enumeration reqVals = requestProperties.elements(); while (reqKeys.hasMoreElements()) out.print(reqKeys.nextElement() + ": " + reqVals.nextElement() + "\n"); out.print("\n"); - out.flush(); + out.flush(); + getHttpHeaders(); connected = true; } @@ -120,7 +120,6 @@ class Connection extends HttpURLConnection } sock = null; } - connected = false; } // TODO: public boolean usingProxy() @@ -135,10 +134,8 @@ class Connection extends HttpURLConnection if (!connected) connect(); - if (! doInput) + if (!doInput) throw new ProtocolException("Can't open InputStream if doInput is false"); - if (bufferedIn == null) - bufferedIn = new BufferedInputStream(sock.getInputStream()); return bufferedIn; } @@ -157,48 +154,52 @@ class Connection extends HttpURLConnection // Override default method in URLConnection. public String getHeaderField(String name) { - try - { - getHttpHeaders(); - } - catch (IOException x) - { - return null; - } + if (!connected) + try + { + connect(); + } + catch (IOException x) + { + return null; + } + return (String) hdrHash.get(name.toLowerCase()); } // Override default method in URLConnection. public String getHeaderField(int n) { - try - { - getHttpHeaders(); - } - catch (IOException x) - { - return null; - } + if (!connected) + try + { + connect(); + } + catch (IOException x) + { + return null; + } + if (n < hdrVec.size()) return getField((String) hdrVec.elementAt(n)); - return null; } // Override default method in URLConnection. public String getHeaderFieldKey(int n) { - try - { - getHttpHeaders(); - } - catch (IOException x) - { - return null; - } + if (!connected) + try + { + connect(); + } + catch (IOException x) + { + return null; + } + if (n < hdrVec.size()) return getKey((String) hdrVec.elementAt(n)); - return null; } @@ -226,20 +227,13 @@ class Connection extends HttpURLConnection private void getHttpHeaders() throws IOException { - if (gotHeaders) - return; - gotHeaders = true; - - connect(); - // Originally tried using a BufferedReader here to take advantage of // the readLine method and avoid the following, but the buffer read // past the end of the headers so the first part of the content was lost. // It is probably more robust than it needs to be, e.g. the byte[] // is unlikely to overflow and a '\r' should always be followed by a '\n', // but it is better to be safe just in case. - if (bufferedIn == null) - bufferedIn = new BufferedInputStream(sock.getInputStream()); + bufferedIn = new BufferedInputStream(sock.getInputStream()); int buflen = 100; byte[] buf = new byte[buflen]; @@ -247,6 +241,7 @@ class Connection extends HttpURLConnection boolean gotnl = false; byte[] ch = new byte[1]; ch[0] = (byte) '\n'; + while (true) { // Check for leftover byte from non-'\n' after a '\r'. @@ -254,9 +249,12 @@ class Connection extends HttpURLConnection line = line + '\r' + new String(ch, 0, 1); int i; + // FIXME: This is rather inefficient. for (i = 0; i < buflen; i++) { - bufferedIn.read(buf, i, 1); + buf[i] = (byte) bufferedIn.read(); + if (buf[i] == -1) + throw new IOException("Malformed HTTP header"); if (buf[i] == '\r') { bufferedIn.read(ch, 0, 1); diff --git a/libjava/java/net/HttpURLConnection.java b/libjava/java/net/HttpURLConnection.java index 673cc8a..84e9468 100644 --- a/libjava/java/net/HttpURLConnection.java +++ b/libjava/java/net/HttpURLConnection.java @@ -1,7 +1,7 @@ // HttpURLConnection.java - Subclass of communications links using // Hypertext Transfer Protocol. -/* Copyright (C) 1999 Free Software Foundation +/* Copyright (C) 1999, 2000 Free Software Foundation This file is part of libgcj. @@ -69,11 +69,14 @@ public abstract class HttpURLConnection extends URLConnection public static final int HTTP_GATEWAY_TIMEOUT = 504; public static final int HTTP_VERSION = 505; + static boolean followRedirects = true; + protected String method = "GET"; protected int responseCode = -1; protected String responseMessage; + protected boolean instanceFollowRedirects = followRedirects; - static boolean followRedirects = true; + private boolean gotResponseVals = false; protected HttpURLConnection(URL url) { @@ -121,21 +124,30 @@ public abstract class HttpURLConnection extends URLConnection public int getResponseCode() throws IOException { - getResponseVals(); + if (!gotResponseVals) + getResponseVals(); return responseCode; } public String getResponseMessage() throws IOException { - getResponseVals(); + if (!gotResponseVals) + getResponseVals(); return responseMessage; } private void getResponseVals() throws IOException { + // getHeaderField() will connect for us, but do it here first in + // order to pick up IOExceptions. + if (!connected) + connect(); + + gotResponseVals = true; // Response is the first header received from the connection. String respField = getHeaderField(0); - if (! respField.startsWith("HTTP/")) + + if (respField == null || ! respField.startsWith("HTTP/")) { // Set to default values on failure. responseCode = -1; @@ -158,10 +170,6 @@ public abstract class HttpURLConnection extends URLConnection responseCode = -1; responseMessage = null; } - if (responseCode == HTTP_NOT_FOUND) - throw new FileNotFoundException(url.toString()); - else if (responseCode >= 400) - throw new IOException(url.toString() + " " + respField); } // TODO12: public Permission getPermission() throws IOException -- 2.7.4