HTTPClient
Class HttpURLConnection

java.lang.Object
  |
  +--java.net.URLConnection
        |
        +--java.net.HttpURLConnection
              |
              +--HTTPClient.HttpURLConnection

public class HttpURLConnection
extends HttpURLConnection

This class is a wrapper around HTTPConnection providing the interface defined by java.net.URLConnection and java.net.HttpURLConnection.

This class can be used to replace the HttpClient in the JDK with this HTTPClient by defining the property java.protocol.handler.pkgs=HTTPClient.

One difference between Sun's HttpClient and this one is that this one will provide you with a real output stream if possible. This leads to two changes: you should set the request property "Content-Length", if possible, before invoking getOutputStream(); and in many cases getOutputStream() implies connect(). This should be transparent, though, apart from the fact that you can't change any headers or other settings anymore once you've gotten the output stream. So, for large data do:

   HttpURLConnection con = (HttpURLConnection) url.openConnection();

   con.setDoOutput(true);
   con.setRequestProperty("Content-Length", ...);
   OutputStream out = con.getOutputStream();

   out.write(...);
   out.close();

   if (con.getResponseCode() != 200)
       ...
 

The HTTPClient will send the request data using the chunked transfer encoding when no Content-Length is specified and the server is HTTP/1.1 compatible. Because cgi-scripts can't usually handle this, you may experience problems trying to POST data. For this reason, whenever the Content-Type is application/x-www-form-urlencoded getOutputStream() will buffer the data before sending it so as prevent chunking. If you are sending requests with a different Content-Type and are experiencing problems then you may want to try setting the system property HTTPClient.dontChunkRequests to true (this needs to be done either on the command line or somewhere in the code before the first URLConnection.openConnection() is invoked).

A second potential incompatibility is that the HTTPClient aggresively resuses connections, and can do so more often that Sun's client. This can cause problems if you send multiple requests, and the first one has a long response. In this case (assuming the server allows the connection to be used for multiple requests) the responses to second, third, etc request won't be received until the first response has been completely read. With Sun's client on the other hand you may not experience this, as it may not be able to keep the connection open and there may create multiple connections for the requests. This allows the responses to the second, third, etc requests to be read before the first response has completed. Note: whether this will happen depends on details of the resource being requested and the server. In many cases the HTTPClient and Sun's client will exhibit the same behaviour. Also, applications which depend on being able to read the second response before the first one has completed must be considered broken, because A) this behaviour cannot be relied upon even in Sun's current client, and B) Sun's implementation will exhibit the same problem if they ever switch to HTTP/1.1.

Since:
V0.3
Version:
0.3-3 06/05/2001
Author:
Ronald Tschalär

Field Summary
protected  HTTPConnection con
          the current connection
protected static Hashtable connections
          the cache of HTTPConnections
protected  HTTPResponse resp
          the response
 
Fields inherited from class java.net.HttpURLConnection
HTTP_ACCEPTED, HTTP_BAD_GATEWAY, HTTP_BAD_METHOD, HTTP_BAD_REQUEST, HTTP_CLIENT_TIMEOUT, HTTP_CONFLICT, HTTP_CREATED, HTTP_ENTITY_TOO_LARGE, HTTP_FORBIDDEN, HTTP_GATEWAY_TIMEOUT, HTTP_GONE, HTTP_INTERNAL_ERROR, HTTP_LENGTH_REQUIRED, HTTP_MOVED_PERM, HTTP_MOVED_TEMP, HTTP_MULT_CHOICE, HTTP_NO_CONTENT, HTTP_NOT_ACCEPTABLE, HTTP_NOT_AUTHORITATIVE, HTTP_NOT_FOUND, HTTP_NOT_MODIFIED, HTTP_OK, HTTP_PARTIAL, HTTP_PAYMENT_REQUIRED, HTTP_PRECON_FAILED, HTTP_PROXY_AUTH, HTTP_REQ_TOO_LONG, HTTP_RESET, HTTP_SEE_OTHER, HTTP_SERVER_ERROR, HTTP_UNAUTHORIZED, HTTP_UNAVAILABLE, HTTP_UNSUPPORTED_TYPE, HTTP_USE_PROXY, HTTP_VERSION, method, responseCode, responseMessage
 
Fields inherited from class java.net.URLConnection
allowUserInteraction, connected, doInput, doOutput, ifModifiedSince, url, useCaches
 
Constructor Summary
HttpURLConnection(URL url)
          Construct a connection to the specified url.
 
Method Summary
 void connect()
          Connects to the server (if connection not still kept alive) and issues the request.
 void disconnect()
          Closes all the connections to this server.
protected  HTTPConnection getConnection(URL url)
          Returns an HTTPConnection.
static String getDefaultRequestProperty(String name)
          Gets the value for a given default request header.
 InputStream getErrorStream()
          Returns the error stream if the connection failed but the server sent useful data nonetheless.
 String getHeaderField(int n)
          Gets header value of the n-th header.
 String getHeaderField(String name)
          Get the value part of a header.
 long getHeaderFieldDate(String name, long def)
          Get the value part of a header, interprets it as a date and converts it to a long representing the number of milliseconds since 1970.
 int getHeaderFieldInt(String name, int def)
          Get the value part of a header and converts it to an int.
 String getHeaderFieldKey(int n)
          Gets header name of the n-th header.
 InputStream getInputStream()
          Gets an input stream from which the data in the response may be read.
 boolean getInstanceFollowRedirects()
           
 OutputStream getOutputStream()
          Gets an output stream which can be used send an entity with the request.
 String getRequestMethod()
          Return the request method used.
 String getRequestProperty(String name)
          Gets the value of a given request header.
 int getResponseCode()
          Get the response code.
 String getResponseMessage()
          Get the response message describing the response code.
 URL getURL()
          Gets the url for this connection.
static void setDefaultRequestProperty(String name, String value)
          Sets an arbitrary default request header.
 void setIfModifiedSince(long time)
          Sets the If-Modified-Since header.
 void setInstanceFollowRedirects(boolean set)
          Enables or disables the automatic handling of redirection responses for this instance only.
 void setRequestMethod(String method)
          Sets the request method (e.g.
 void setRequestProperty(String name, String value)
          Sets an arbitrary request header.
 String toString()
          produces a string.
 boolean usingProxy()
          Shows if request are being made through an http proxy or directly.
 
Methods inherited from class java.net.HttpURLConnection
getFollowRedirects, getPermission, setFollowRedirects
 
Methods inherited from class java.net.URLConnection
getAllowUserInteraction, getContent, getContentEncoding, getContentLength, getContentType, getDate, getDefaultAllowUserInteraction, getDefaultUseCaches, getDoInput, getDoOutput, getExpiration, getFileNameMap, getIfModifiedSince, getLastModified, getUseCaches, guessContentTypeFromName, guessContentTypeFromStream, setAllowUserInteraction, setContentHandlerFactory, setDefaultAllowUserInteraction, setDefaultUseCaches, setDoInput, setDoOutput, setFileNameMap, setUseCaches
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

connections

protected static Hashtable connections
the cache of HTTPConnections

con

protected HTTPConnection con
the current connection

resp

protected HTTPResponse resp
the response
Constructor Detail

HttpURLConnection

public HttpURLConnection(URL url)
                  throws ProtocolNotSuppException,
                         IOException
Construct a connection to the specified url. A cache of HTTPConnections is used to maximize the reuse of these across multiple HttpURLConnections.
The default method is "GET".
Parameters:
url - the url of the request
Throws:
ProtocolNotSuppException - if the protocol is not supported
Method Detail

getConnection

protected HTTPConnection getConnection(URL url)
                                throws ProtocolNotSuppException
Returns an HTTPConnection. A cache of connections is kept and first consulted; only when the cache lookup fails is a new one created and added to the cache.
Parameters:
url - the url
Returns:
an HTTPConnection
Throws:
ProtocolNotSuppException - if the protocol is not supported

setRequestMethod

public void setRequestMethod(String method)
                      throws ProtocolException
Sets the request method (e.g. "PUT" or "HEAD"). Can only be set before connect() is called.
Overrides:
setRequestMethod in class HttpURLConnection
Parameters:
method - the http method.
Throws:
ProtocolException - if already connected.

getRequestMethod

public String getRequestMethod()
Return the request method used.
Overrides:
getRequestMethod in class HttpURLConnection
Returns:
the http method.

getResponseCode

public int getResponseCode()
                    throws IOException
Get the response code. Calls connect() if not connected.
Overrides:
getResponseCode in class HttpURLConnection
Returns:
the http response code returned.

getResponseMessage

public String getResponseMessage()
                          throws IOException
Get the response message describing the response code. Calls connect() if not connected.
Overrides:
getResponseMessage in class HttpURLConnection
Returns:
the http response message returned with the response code.

getHeaderField

public String getHeaderField(String name)
Get the value part of a header. Calls connect() if not connected.
Overrides:
getHeaderField in class URLConnection
Parameters:
name - the of the header.
Returns:
the value of the header, or null if no such header was returned.

getHeaderFieldInt

public int getHeaderFieldInt(String name,
                             int def)
Get the value part of a header and converts it to an int. If the header does not exist or if its value could not be converted to an int then the default is returned. Calls connect() if not connected.
Overrides:
getHeaderFieldInt in class URLConnection
Parameters:
name - the of the header.
def - the default value to return in case of an error.
Returns:
the value of the header, or null if no such header was returned.

getHeaderFieldDate

public long getHeaderFieldDate(String name,
                               long def)
Get the value part of a header, interprets it as a date and converts it to a long representing the number of milliseconds since 1970. If the header does not exist or if its value could not be converted to a date then the default is returned. Calls connect() if not connected.
Overrides:
getHeaderFieldDate in class URLConnection
Parameters:
name - the of the header.
def - the default value to return in case of an error.
Returns:
the value of the header, or def in case of an error.

getHeaderFieldKey

public String getHeaderFieldKey(int n)
Gets header name of the n-th header. Calls connect() if not connected. The name of the 0-th header is null, even though it the 0-th header has a value.
Overrides:
getHeaderFieldKey in class URLConnection
Parameters:
n - which header to return.
Returns:
the header name, or null if not that many headers.

getHeaderField

public String getHeaderField(int n)
Gets header value of the n-th header. Calls connect() if not connected. The value of 0-th header is the Status-Line (e.g. "HTTP/1.1 200 Ok").
Overrides:
getHeaderField in class URLConnection
Parameters:
n - which header to return.
Returns:
the header value, or null if not that many headers.

getInputStream

public InputStream getInputStream()
                           throws IOException
Gets an input stream from which the data in the response may be read. Calls connect() if not connected.
Overrides:
getInputStream in class URLConnection
Returns:
an InputStream
Throws:
ProtocolException - if input not enabled.
See Also:
URLConnection.setDoInput(boolean)

getErrorStream

public InputStream getErrorStream()
Returns the error stream if the connection failed but the server sent useful data nonetheless.

This method will not cause a connection to be initiated.

Overrides:
getErrorStream in class HttpURLConnection
Returns:
an InputStream, or null if either the connection hasn't been established yet or no error occured
Since:
V0.3-1
See Also:
HttpURLConnection.getErrorStream()

getOutputStream

public OutputStream getOutputStream()
                             throws IOException
Gets an output stream which can be used send an entity with the request. Can be called multiple times, in which case always the same stream is returned.

The default request method changes to "POST" when this method is called. Cannot be called after connect().

If no Content-type has been set it defaults to application/x-www-form-urlencoded. Furthermore, if the Content-type is application/x-www-form-urlencoded then all output will be collected in a buffer before sending it to the server; otherwise an HttpOutputStream is used.

Overrides:
getOutputStream in class URLConnection
Returns:
an OutputStream
Throws:
ProtocolException - if already connect()'ed, if output is not enabled or if the request method does not support output.
See Also:
URLConnection.setDoOutput(boolean), HttpOutputStream

getURL

public URL getURL()
Gets the url for this connection. If we're connect()'d and the request was redirected then the url returned is that of the final request.
Overrides:
getURL in class URLConnection
Returns:
the final url, or null if any exception occured.

setIfModifiedSince

public void setIfModifiedSince(long time)
Sets the If-Modified-Since header.
Overrides:
setIfModifiedSince in class URLConnection
Parameters:
time - the number of milliseconds since 1970.

setRequestProperty

public void setRequestProperty(String name,
                               String value)
Sets an arbitrary request header.
Overrides:
setRequestProperty in class URLConnection
Parameters:
name - the name of the header.
value - the value for the header.

getRequestProperty

public String getRequestProperty(String name)
Gets the value of a given request header.
Overrides:
getRequestProperty in class URLConnection
Parameters:
name - the name of the header.
Returns:
the value part of the header, or null if no such header.

setDefaultRequestProperty

public static void setDefaultRequestProperty(String name,
                                             String value)
Sets an arbitrary default request header. All headers set here are automatically sent with each request.
Parameters:
name - the name of the header.
value - the value for the header.

getDefaultRequestProperty

public static String getDefaultRequestProperty(String name)
Gets the value for a given default request header.
Parameters:
name - the name of the header.
Returns:
the value part of the header, or null if no such header.

setInstanceFollowRedirects

public void setInstanceFollowRedirects(boolean set)
Enables or disables the automatic handling of redirection responses for this instance only. Cannot be called after connect().
Parameters:
set - enables automatic redirection handling if true.

getInstanceFollowRedirects

public boolean getInstanceFollowRedirects()
Returns:
true if automatic redirection handling for this instance is enabled.

connect

public void connect()
             throws IOException
Connects to the server (if connection not still kept alive) and issues the request.
Overrides:
connect in class URLConnection

disconnect

public void disconnect()
Closes all the connections to this server.
Overrides:
disconnect in class HttpURLConnection

usingProxy

public boolean usingProxy()
Shows if request are being made through an http proxy or directly.
Overrides:
usingProxy in class HttpURLConnection
Returns:
true if an http proxy is being used.

toString

public String toString()
produces a string.
Overrides:
toString in class URLConnection
Returns:
a string containing the HttpURLConnection