// Copyright (c) 1996-2002 Brian D. Carlstrom

package bdc.util;

/**
    HTTP.  The HTTP/1.0 protocol.

    http://info.internet.isi.edu/in-notes/rfc/files/rfc1945.txt

    Status codes from HTTP/1.1 protocol

    http://info.internet.isi.edu/in-notes/rfc/files/rfc2068.txt

*/
public class HTTP
{
    /*-----------------------------------------------------------------------
        Public Constants
      -----------------------------------------------------------------------*/

    /**
        the version 1.0 of HTTP supported
    */
    public static final String Version10 = "HTTP/1.0";
    public static final double VersionNumber10 = 1.0; 

    /**
        the version 1.1 of HTTP supported
    */
    public static final String Version11 = "HTTP/1.1";
    public static final double VersionNumber11 = 1.1;
    
    /**
        the name of the HTTP protocol
    */
    public static final String Protocol = "http";

    /**
        default port number for HTTP connections
    */
    public static final int Port = 80;

    /**
        the name of the HTTPS protocol
    */
    public static final String SecureProtocol = "https";

    /**
        default port number for HTTPS connections
    */
    public static final int SecurePort = 443;

        // request methods
    public static final String GetMethod  = "GET";
    public static final String PostMethod = "POST";
    public static final String HeadMethod = "HEAD";

        // entity headers
    public static final String HeaderContentEncoding  = "CONTENT-ENCODING";
    public static final String HeaderExpires          = "EXPIRES";
    public static final String HeaderLastModified     = "LAST-MODIFIED";
    public static final String HeaderAllow            = "ALLOW";
    public static final String HeaderUserAgent        = "USER-AGENT";
    public static final String HeaderCookie           = "COOKIE";
    public static final String HeaderSetCookie        = "SET-COOKIE";
    public static final String HeaderFrom             = "FROM";
    public static final String HeaderAccept           = "ACCEPT";
    public static final String HeaderAcceptEncoding   = "ACCEPT-ENCODING";
    public static final String HeaderAcceptLanguage   = "ACCEPT-LANGUAGE";
    public static final String HeaderReferer          = "REFERER";
    public static final String HeaderAuthorization    = "AUTHORIZATION";
    public static final String HeaderChargeTo         = "CHARGETO";
    public static final String HeaderIfModifiedSince  = "IF-MODIFIED-SINCE";
    public static final String HeaderHost             = "HOST";
    
    public static final String CookieVersion = "$VERSION";
    public static final String CookieDomain  = "$DOMAIN";
    public static final String CookiePath    = "$PATH";

        // response headers
    public static final String HeaderLocation = "LOCATION";
    
    public static final String HeaderPragma = "PRAGMA";
    public static final String PragmaNoCache = "no-cache";

    public static final String HeaderWWWAuthenticate = "WWW-Authenticate";
    public static final String AuthSchemeBasic = "Basic ";
    public static final String AuthSchemeBasicWithRealm = (AuthSchemeBasic +
                                                           "realm=");

    public static final String HeaderConnection       = "CONNECTION";
    public static final String ConnectionClose        = "close";
    
        // response codes
    public static final int CodeContinue                    = 100;
    public static final int CodeSwitchingProtocols          = 101;
    public static final int CodeOK                          = 200;
    public static final int CodeCreated                     = 201;
    public static final int CodeAccepted                    = 202;
    public static final int CodeNonAuthoritativeInformation = 203;
    public static final int CodeNoContent                   = 204;
    public static final int CodeResetContent                = 205;
    public static final int CodePartialContent              = 206;
    public static final int CodeMultipleChoices             = 300;
    public static final int CodeMovedPermanently            = 301;
    public static final int CodeMovedTemporarily            = 302;
    public static final int CodeSeeOther                    = 303;
    public static final int CodeNotModified                 = 304;
    public static final int CodeUseProxy                    = 305;
    public static final int CodeBadRequest                  = 400;
    public static final int CodeUnauthorized                = 401;
    public static final int CodePaymentRequired             = 402;
    public static final int CodeForbidden                   = 403;
    public static final int CodeNotFound                    = 404;
    public static final int CodeMethodNotAllowed            = 405;
    public static final int CodeNotAcceptable               = 406;
    public static final int CodeProxyAuthenticationRequired = 407;
    public static final int CodeRequestTimeOut              = 408;
    public static final int CodeConflict                    = 409;
    public static final int CodeGone                        = 410;
    public static final int CodeLengthRequired              = 411;
    public static final int CodePreconditionFailed          = 412;
    public static final int CodeRequestEntityTooLarge       = 413;
    public static final int CodeRequestURITooLarge          = 414;
    public static final int CodeUnsupportedMediaType        = 415;
    public static final int CodeInternalServerError         = 500;
    public static final int CodeNotImplemented              = 501;
    public static final int CodeBadGateway                  = 502;
    public static final int CodeServiceUnavailable          = 503;
    public static final int CodeGatewayTimeOut              = 504;
    public static final int CodeHTTPVersionNotSupported     = 505;

        // response messages
    public static final String MsgContinue =
        "Continue";
    public static final String MsgSwitchingProtocols =
        "Switching Protocols";
    public static final String MsgOK =
        "OK";
    public static final String MsgCreated =
        "Created";
    public static final String MsgAccepted =
        "Accepted";
    public static final String MsgNonAuthoritativeInformation =
        "Non-Authoritative Information";
    public static final String MsgNoContent =
        "No Content";
    public static final String MsgResetContent =
        "Reset Content";
    public static final String MsgPartialContent =
        "Partial Content";
    public static final String MsgMultipleChoices =
        "Multiple Choices";
    public static final String MsgMovedPermanently =
        "Moved Permanently";
    public static final String MsgMovedTemporarily =
        "Moved Temporarily";
    public static final String MsgSeeOther =
        "See Other";
    public static final String MsgNotModified =
        "Not Modified";
    public static final String MsgUseProxy =
        "Use Proxy";
    public static final String MsgBadRequest =
        "Bad Request";
    public static final String MsgUnauthorized =
        "Unauthorized";
    public static final String MsgPaymentRequired =
        "Payment Required";
    public static final String MsgForbidden =
        "Forbidden";
    public static final String MsgNotFound =
        "Not Found";
    public static final String MsgMethodNotAllowed =
        "Method Not Allowed";
    public static final String MsgNotAcceptable =
        "Not Acceptable";
    public static final String MsgProxyAuthenticationRequired =
        "Proxy Authentication Required";
    public static final String MsgRequestTimeOut =
        "Request Time-out";
    public static final String MsgConflict =
        "Conflict";
    public static final String MsgGone =
        "Gone";
    public static final String MsgLengthRequired =
        "Length Required";
    public static final String MsgPreconditionFailed =
        "Precondition Failed";
    public static final String MsgRequestEntityTooLarge =
        "Request Entity Too Large";
    public static final String MsgRequestURITooLarge =
        "Request-URI Too Large";
    public static final String MsgUnsupportedMediaType =
        "Unsupported Media Type";
    public static final String MsgInternalServerError =
        "Internal Server Error";
    public static final String MsgNotImplemented =
        "Not Implemented";
    public static final String MsgBadGateway =
        "Bad Gateway";
    public static final String MsgServiceUnavailable =
        "Service Unavailable";
    public static final String MsgGatewayTimeOut =
        "Gateway Time-out";
    public static final String MsgHTTPVersionNotSupported =
        "HTTP Version not supported";


    public static final String message (int code)
    {
        switch (code) {
          case CodeContinue:
            return MsgContinue;
          case CodeSwitchingProtocols:
            return MsgSwitchingProtocols;
          case CodeOK:
            return MsgOK;
          case CodeCreated:
            return MsgCreated;
          case CodeAccepted:
            return MsgAccepted;
          case CodeNonAuthoritativeInformation:
            return MsgNonAuthoritativeInformation;
          case CodeNoContent:
            return MsgNoContent;
          case CodeResetContent:
            return MsgResetContent;
          case CodePartialContent:
            return MsgPartialContent;
          case CodeMultipleChoices:
            return MsgMultipleChoices;
          case CodeMovedPermanently:
            return MsgMovedPermanently;
          case CodeMovedTemporarily:
            return MsgMovedTemporarily;
          case CodeSeeOther:
            return MsgSeeOther;
          case CodeNotModified:
            return MsgNotModified;
          case CodeUseProxy:
            return MsgUseProxy;
          case CodeBadRequest:
            return MsgBadRequest;
          case CodeUnauthorized:
            return MsgUnauthorized;
          case CodePaymentRequired:
            return MsgPaymentRequired;
          case CodeForbidden:
            return MsgForbidden;
          case CodeNotFound:
            return MsgNotFound;
          case CodeMethodNotAllowed:
            return MsgMethodNotAllowed;
          case CodeNotAcceptable:
            return MsgNotAcceptable;
          case CodeProxyAuthenticationRequired:
            return MsgProxyAuthenticationRequired;
          case CodeRequestTimeOut:
            return MsgRequestTimeOut;
          case CodeConflict:
            return MsgConflict;
          case CodeGone:
            return MsgGone;
          case CodeLengthRequired:
            return MsgLengthRequired;
          case CodePreconditionFailed:
            return MsgPreconditionFailed;
          case CodeRequestEntityTooLarge:
            return MsgRequestEntityTooLarge;
          case CodeRequestURITooLarge:
            return MsgRequestURITooLarge;
          case CodeUnsupportedMediaType:
            return MsgUnsupportedMediaType;
          case CodeInternalServerError:
            return MsgInternalServerError;
          case CodeNotImplemented:
            return MsgNotImplemented;
          case CodeBadGateway:
            return MsgBadGateway;
          case CodeServiceUnavailable:
            return MsgServiceUnavailable;
          case CodeGatewayTimeOut:
            return MsgGatewayTimeOut;
          case CodeHTTPVersionNotSupported:
            return MsgHTTPVersionNotSupported;
          default:
            return Fmt.S("Code %s", Constants.getInteger(code));
        }
    }
}
