/* HttpURLConnection.java -- Subclass of communications links using
   Hypertext Transfer Protocol.
   Copyright (C) 1998, 1999, 2000, 2002, 2003  Free Software Foundation

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */

package java.net;

import java.io.IOException;
import java.io.InputStream;
import java.io.PushbackInputStream;
import java.security.Permission;


/*
 * 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.
 */

/**
 * This class provides a common abstract implementation for those
 * URL connection classes that will connect using the HTTP protocol.
 * In addition to the functionality provided by the URLConnection
 * class, it defines constants for HTTP return code values and
 * methods for setting the HTTP request method and determining whether
 * or not to follow redirects.
 *
 * @since 1.1
 *
 * @author Warren Levy (warrenl@cygnus.com)
 * @author Aaron M. Renn (arenn@urbanophile.com)
 */
public abstract class HttpURLConnection extends URLConnection
{
  /* HTTP Success Response Codes */

  /**
   * Indicates that the client may continue with its request.  This value
   * is specified as part of RFC 2068 but was not included in Sun's JDK, so
   * beware of using this value
   */
  static final int HTTP_CONTINUE = 100;

  /**
   * Indicates the request succeeded.
   */
  public static final int HTTP_OK = 200;

  /**
   * The requested resource has been created.
   */
  public static final int HTTP_CREATED = 201;

  /**
   * The request has been accepted for processing but has not completed.
   * There is no guarantee that the requested action will actually ever
   * be completed succesfully, but everything is ok so far.
   */
  public static final int HTTP_ACCEPTED = 202;

  /**
   * The meta-information returned in the header is not the actual data
   * from the original server, but may be from a local or other copy.
   * Normally this still indicates a successful completion.
   */
  public static final int HTTP_NOT_AUTHORITATIVE = 203;

  /**
   * The server performed the request, but there is no data to send
   * back.  This indicates that the user's display should not be changed.
   */
  public static final int HTTP_NO_CONTENT = 204;

  /**
   * The server performed the request, but there is no data to sent back,
   * however, the user's display should be "reset" to clear out any form
   * fields entered.
   */
  public static final int HTTP_RESET = 205;

  /**
   * The server completed the partial GET request for the resource.
   */
  public static final int HTTP_PARTIAL = 206;

  /* HTTP Redirection Response Codes */

  /**
   * There is a list of choices available for the requested resource.
   */
  public static final int HTTP_MULT_CHOICE = 300;

  /**
   * The resource has been permanently moved to a new location.
   */
  public static final int HTTP_MOVED_PERM = 301;

  /**
   * The resource requested has been temporarily moved to a new location.
   */
  public static final int HTTP_MOVED_TEMP = 302;

  /**
   * The response to the request issued is available at another location.
   */
  public static final int HTTP_SEE_OTHER = 303;

  /**
   * The document has not been modified since the criteria specified in
   * a conditional GET.
   */
  public static final int HTTP_NOT_MODIFIED = 304;

  /**
   * The requested resource needs to be accessed through a proxy.
   */
  public static final int HTTP_USE_PROXY = 305;

  /* HTTP Client Error Response Codes */

  /**
   * The request was misformed or could not be understood.
   */
  public static final int HTTP_BAD_REQUEST = 400;

  /**
   * The request made requires user authorization.  Try again with
   * a correct authentication header.
   */
  public static final int HTTP_UNAUTHORIZED = 401;

  /**
   * Code reserved for future use - I hope way in the future.
   */
  public static final int HTTP_PAYMENT_REQUIRED = 402;

  /**
   * There is no permission to access the requested resource.
   */
  public static final int HTTP_FORBIDDEN = 403;

  /**
   * The requested resource was not found.
   */
  public static final int HTTP_NOT_FOUND = 404;

  /**
   * The specified request method is not allowed for this resource.
   */
  public static final int HTTP_BAD_METHOD = 405;

  /**
   * Based on the input headers sent, the resource returned in response
   * to the request would not be acceptable to the client.
   */
  public static final int HTTP_NOT_ACCEPTABLE = 406;

  /**
   * The client must authenticate with a proxy prior to attempting this
   * request.
   */
  public static final int HTTP_PROXY_AUTH = 407;

  /**
   * The request timed out.
   */
  public static final int HTTP_CLIENT_TIMEOUT = 408;

  /**
   * There is a conflict between the current state of the resource and the
   * requested action.
   */
  public static final int HTTP_CONFLICT = 409;

  /**
   * The requested resource is no longer available.  This ususally indicates
   * a permanent condition.
   */
  public static final int HTTP_GONE = 410;

  /**
   * A Content-Length header is required for this request, but was not
   * supplied.
   */
  public static final int HTTP_LENGTH_REQUIRED = 411;

  /**
   * A client specified pre-condition was not met on the server.
   */
  public static final int HTTP_PRECON_FAILED = 412;

  /**
   * The request sent was too large for the server to handle.
   */
  public static final int HTTP_ENTITY_TOO_LARGE = 413;

  /**
   * The name of the resource specified was too long.
   */
  public static final int HTTP_REQ_TOO_LONG = 414;

  /**
   * The request is in a format not supported by the requested resource.
   */
  public static final int HTTP_UNSUPPORTED_TYPE = 415;

  /* HTTP Server Error Response Codes */

  /**
   * This error code indicates that some sort of server error occurred.
   *
   * @deprecated
   */
  public static final int HTTP_SERVER_ERROR = 500;

  /**
   * The server encountered an unexpected error (such as a CGI script crash)
   * that prevents the request from being fulfilled.
   */
  public static final int HTTP_INTERNAL_ERROR = 500;

  /**
   * The server does not support the requested functionality.
   * @since 1.3
   */
  public static final int HTTP_NOT_IMPLEMENTED = 501;

  /**
   * The proxy encountered a bad response from the server it was proxy-ing for
   */
  public static final int HTTP_BAD_GATEWAY = 502;

  /**
   * The HTTP service is not availalble, such as because it is overloaded
   * and does not want additional requests.
   */
  public static final int HTTP_UNAVAILABLE = 503;

  /**
   * The proxy timed out getting a reply from the remote server it was
   * proxy-ing for.
   */
  public static final int HTTP_GATEWAY_TIMEOUT = 504;

  /**
   * This server does not support the protocol version requested.
   */
  public static final int HTTP_VERSION = 505;

  // Non-HTTP response static variables

  /**
   * Flag to indicate whether or not redirects should be automatically
   * followed by default.
   */
  private static boolean followRedirects = true;

  /**
   * This is a list of valid request methods, separated by "|" characters.
   */
  private static final String valid_methods =
    "|GET|POST|HEAD|OPTIONS|PUT|DELETE|TRACE|";

  // Instance Variables

  /**
   * The requested method in use for this connection. Default is GET.
   */
  protected String method = "GET";

  /**
   * The response code received from the server
   */
  protected int responseCode = -1;

  /**
   * The response message string received from the server.
   */
  protected String responseMessage;

  /**
   * If this instance should follow redirect requests.
   */
  protected boolean instanceFollowRedirects = followRedirects;

  /**
   * Whether we already got a valid response code for this connection.
   * Used by <code>getResponseCode()</code> and
   * <code>getResponseMessage()</code>.
   */
  private boolean gotResponseVals;

  /**
   * Create an HttpURLConnection for the specified URL
   *
   * @param url The URL to create this connection for.
   */
  protected HttpURLConnection(URL url)
  {
    super(url);
  }

  /**
   * Closes the connection to the server.
   */
  public abstract void disconnect();

  /**
   * Returns a boolean indicating whether or not this connection is going
   * through a proxy
   *
   * @return true if through a proxy, false otherwise
   */
  public abstract boolean usingProxy();

  /**
   * Sets whether HTTP redirects (requests with response code 3xx) should be
   * automatically followed by this class. True by default
   *
   * @param set true if redirects should be followed, false otherwis.
   *
   * @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;
  }

  /**
   * Returns a boolean indicating whether or not HTTP redirects will
   * automatically be followed or not.
   *
   * @return true if redirects will be followed, false otherwise
   */
  public static boolean getFollowRedirects()
  {
    return followRedirects;
  }

  /**
   * Returns the value of this HttpURLConnection's instanceFollowRedirects
   * field
   * 
   * @return true if following redirects is enabled, false otherwise
   */
  public boolean getInstanceFollowRedirects()
  {
    return instanceFollowRedirects;
  }

  /**
   * Sets the value of this HttpURLConnection's instanceFollowRedirects field
   *
   * @param follow true to enable following redirects, false otherwise
   */
  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
   *
   * @param method the method to use
   *
   * @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");

    method = method.toUpperCase();
    if (valid_methods.indexOf("|" + method + "|") != -1)
      this.method = method;
    else
      throw new ProtocolException("Invalid HTTP request method: " + method);
  }

  /**
   * The request method currently in use for this connection.
   *
   * @return The request method
   */
  public String getRequestMethod()
  {
    return method;
  }

  /**
   * Gets the status code from an HTTP response message, or -1 if
   * the response code could not be determined.
   * Note that all valid response codes have class variables
   * defined for them in this class.
   *
   * @return The response code
   *
   * @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. Null if no response message was set
   * or an error occured while connecting.
   *
   * @return The response message
   *
   * @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;

    // If responseCode not yet explicitly set by subclass
    if (responseCode == -1)
      {
	// 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;
	int 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;
	  }
      }
  }

  /**
   * Returns a permission object representing the permission necessary to make
   * the connection represented by this object
   *
   * @return the permission necessary for this connection
   *
   * @exception IOException If an error occurs
   */
  public Permission getPermission() throws IOException
  {
    URL url = getURL();
    String host = url.getHost();
    int port = url.getPort();
    if (port == -1)
      port = 80;

    host = host + ":" + port;

    return new SocketPermission(host, "connect");
  }

  /**
   * This method allows the caller to retrieve any data that might have
   * been sent despite the fact that an error occurred.  For example, the
   * HTML page sent along with a 404 File Not Found error.  If the socket
   * is not connected, or if no error occurred or no data was returned,
   * this method returns <code>null</code>.
   *
   * @return An <code>InputStream</code> for reading error data.
   */
  public InputStream getErrorStream()
  {
    if (! connected)
      return null;

    int code;
    try
      {
	code = getResponseCode();
      }
    catch (IOException e)
      {
	code = -1;
      }

    if (code == -1)
      return null;

    if (((code / 100) != 4) || ((code / 100) != 5))
      return null;

    try
      {
	PushbackInputStream pbis = new PushbackInputStream(getInputStream());

	int i = pbis.read();
	if (i == -1)
	  return null;

	pbis.unread(i);
	return pbis;
      }
    catch (IOException e)
      {
	return null;
      }
  }

  /**
   * Returns the value of the named field parsed as date
   *
   * @param key the key of the header field
   * @param value the default value if the header field is not present
   *
   * @return the value of the header field
   */
  public long getHeaderFieldDate(String key, long value)
  {
    // FIXME: implement this correctly
    // http://www.w3.org/Protocols/HTTP-NG/ng-notes.txt
    return super.getHeaderFieldDate(key, value);
  }
}
