// HttpURLConnection.java - Subclass of communications links using // Hypertext Transfer Protocol. /* Copyright (C) 1999, 2000 Free Software Foundation This file is part of libgcj. This software is copyrighted work licensed under the terms of the Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ package java.net; import java.io.*; import java.security.Permission; /** * @author Warren Levy * @since 1.1 * @date March 29, 1999. */ /** * Written using on-line Java Platform 1.2 API Specification, as well * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998). * Status: Believed complete and correct. */ public abstract class HttpURLConnection extends URLConnection { /* HTTP Success Response Codes */ public static final int HTTP_OK = 200; public static final int HTTP_CREATED = 201; public static final int HTTP_ACCEPTED = 202; public static final int HTTP_NOT_AUTHORITATIVE = 203; public static final int HTTP_NO_CONTENT = 204; public static final int HTTP_RESET = 205; public static final int HTTP_PARTIAL = 206; /* HTTP Redirection Response Codes */ public static final int HTTP_MULT_CHOICE = 300; public static final int HTTP_MOVED_PERM = 301; public static final int HTTP_MOVED_TEMP = 302; public static final int HTTP_SEE_OTHER = 303; public static final int HTTP_NOT_MODIFIED = 304; public static final int HTTP_USE_PROXY = 305; /* HTTP Client Error Response Codes */ public static final int HTTP_BAD_REQUEST = 400; public static final int HTTP_UNAUTHORIZED = 401; public static final int HTTP_PAYMENT_REQUIRED = 402; public static final int HTTP_FORBIDDEN = 403; public static final int HTTP_NOT_FOUND = 404; public static final int HTTP_BAD_METHOD = 405; public static final int HTTP_NOT_ACCEPTABLE = 406; public static final int HTTP_PROXY_AUTH = 407; public static final int HTTP_CLIENT_TIMEOUT = 408; public static final int HTTP_CONFLICT = 409; public static final int HTTP_GONE = 410; public static final int HTTP_LENGTH_REQUIRED = 411; public static final int HTTP_PRECON_FAILED = 412; public static final int HTTP_ENTITY_TOO_LARGE = 413; public static final int HTTP_REQ_TOO_LONG = 414; public static final int HTTP_UNSUPPORTED_TYPE = 415; /* HTTP Server Error Response Codes */ public static final int HTTP_SERVER_ERROR = 500; public static final int HTTP_INTERNAL_ERROR = 500; public static final int HTTP_NOT_IMPLEMENTED = 501; public static final int HTTP_BAD_GATEWAY = 502; public static final int HTTP_UNAVAILABLE = 503; 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; private boolean gotResponseVals = false; protected HttpURLConnection(URL url) { super(url); } public abstract void disconnect(); public abstract boolean usingProxy(); /** * Sets whether HTTP redirects (requests with response code 3xx) should be * automatically followed by this class. True by default * * @exception SecurityException If a security manager exists and its * checkSetFactory method doesn't allow the operation */ public static void setFollowRedirects(boolean set) { // Throw an exception if an extant security mgr precludes // setting the factory. SecurityManager s = System.getSecurityManager(); if (s != null) s.checkSetFactory(); followRedirects = set; } public static boolean getFollowRedirects() { return followRedirects; } /** * Returns the value of this HttpURLConnection's instanceFollowRedirects * field */ public boolean getInstanceFollowRedirects () { return instanceFollowRedirects; } /** * Sets the value of this HttpURLConnection's instanceFollowRedirects field */ public void setInstanceFollowRedirects (boolean follow) { instanceFollowRedirects = follow; } /** * Set the method for the URL request, one of: * GET POST HEAD OPTIONS PUT DELETE TRACE are legal * * @exception ProtocolException If the method cannot be reset or if the * requested method isn't valid for HTTP */ public void setRequestMethod(String method) throws ProtocolException { if (connected) throw new ProtocolException("Already connected"); if (method.equals("GET") || method.equals("POST") || method.equals("HEAD") || method.equals("OPTIONS") || method.equals("PUT") || method.equals("DELETE") || method.equals("TRACE")) this.method = method; else throw new ProtocolException("Invalid HTTP request method"); } public String getRequestMethod() { return method; } /** * Gets the status code from an HTTP response message * * @exception IOException If an error occurs */ public int getResponseCode() throws IOException { if (!gotResponseVals) getResponseVals(); return responseCode; } /** * Gets the HTTP response message, if any, returned along with the * response code from a server * * @exception IOException If an error occurs */ public String getResponseMessage() throws IOException { 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 == null || ! respField.startsWith("HTTP/")) { // Set to default values on failure. responseCode = -1; responseMessage = null; return; } int firstSpc, nextSpc; firstSpc = respField.indexOf(' '); nextSpc = respField.indexOf(' ', firstSpc + 1); responseMessage = respField.substring(nextSpc + 1); String codeStr = respField.substring(firstSpc + 1, nextSpc); try { responseCode = Integer.parseInt(codeStr); } catch (NumberFormatException e) { // Set to default values on failure. responseCode = -1; responseMessage = null; } } // TODO12: public Permission getPermission() throws IOException // { // } // TODO12: public InputStream getErrorStream() // { // } }