http.h
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:55k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * http.h
  3.  *
  4.  * HyperText Transport Protocol classes.
  5.  *
  6.  * Portable Windows Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  25.  * All Rights Reserved.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: http.h,v $
  30.  * Revision 1.42  2000/05/02 08:28:10  craigs
  31.  * Removed "memory leaks" caused by brain-dead GNU linker
  32.  *
  33.  * Revision 1.41  1999/09/17 01:11:14  robertj
  34.  * Fixed some documentation typos.
  35.  *
  36.  * Revision 1.40  1999/05/13 04:04:04  robertj
  37.  * Fixed problem of initialised commandName in ConnectionInfo.
  38.  *
  39.  * Revision 1.39  1999/05/04 15:26:01  robertj
  40.  * Improved HTTP/1.1 compatibility (pass through user commands).
  41.  * Fixed problems with quicktime installer.
  42.  *
  43.  * Revision 1.38  1999/04/21 01:58:08  robertj
  44.  * Fixed problem with reading data for request using second form of PHTTPRequestInfo constructor.
  45.  *
  46.  * Revision 1.37  1999/03/09 08:01:46  robertj
  47.  * Changed comments for doc++ support (more to come).
  48.  *
  49.  * Revision 1.36  1999/02/16 08:07:10  robertj
  50.  * MSVC 6.0 compatibility changes.
  51.  *
  52.  * Revision 1.35  1998/11/30 02:50:47  robertj
  53.  * New directory structure
  54.  *
  55.  * Revision 1.34  1998/10/31 12:49:21  robertj
  56.  * Added read/write mutex to the HTTP space variable to avoid thread crashes.
  57.  *
  58.  * Revision 1.33  1998/10/25 01:00:46  craigs
  59.  * Added ability to specify per-directory authorisation for PHTTPDirectory
  60.  *
  61.  * Revision 1.32  1998/09/23 06:19:29  robertj
  62.  * Added open source copyright license.
  63.  *
  64.  * Revision 1.31  1998/07/24 06:58:42  robertj
  65.  * Changed PostData function so just has string for data instead of dictionary.
  66.  *
  67.  * Revision 1.30  1998/06/16 03:33:33  robertj
  68.  * Changed TCP connection shutdown to be parameterised.
  69.  * Propagated persistence and proxy flags in new connection info instances.
  70.  *
  71.  * Revision 1.29  1998/04/14 03:42:59  robertj
  72.  * Fixed error code propagation in HTTP client.
  73.  *
  74.  * Revision 1.28  1998/02/03 06:29:38  robertj
  75.  * Added local address and port to PHTTPRequest.
  76.  *
  77.  * Revision 1.27  1998/01/26 00:24:24  robertj
  78.  * Added more information to PHTTPConnectionInfo.
  79.  * Added function to allow HTTPClient to automatically connect if URL has hostname.
  80.  *
  81.  * Revision 1.26  1997/10/30 10:22:52  robertj
  82.  * Added multiple user basic authorisation scheme.
  83.  *
  84.  * Revision 1.25  1997/10/03 13:30:15  craigs
  85.  * Added ability to access client socket from within HTTP resources
  86.  *
  87.  * Revision 1.24  1997/03/28 04:40:22  robertj
  88.  * Added tags for cookies.
  89.  *
  90.  * Revision 1.23  1997/01/12 04:15:19  robertj
  91.  * Globalised MIME tag strings.
  92.  *
  93.  * Revision 1.22  1996/10/26 03:31:05  robertj
  94.  * Changed OnError so can pass in full HTML page as parameter.
  95.  *
  96.  * Revision 1.21  1996/09/14 13:09:10  robertj
  97.  * Major upgrade:
  98.  *   rearranged sockets to help support IPX.
  99.  *   added indirect channel class and moved all protocols to descend from it,
  100.  *   separating the protocol from the low level byte transport.
  101.  *
  102.  * Revision 1.20  1996/08/22 13:20:55  robertj
  103.  * Fixed bug in authorisation, missing virtual prevented polymorphism.
  104.  *
  105.  * Revision 1.19  1996/08/19 13:44:06  robertj
  106.  * Fixed authorisation so if have no user/password on basic authentication, does not require it.
  107.  *
  108.  * Revision 1.18  1996/06/28 13:15:23  robertj
  109.  * Modified HTTPAuthority so gets PHTTPReqest (mainly for URL) passed in.
  110.  * Moved HTTP form resource to another compilation module.
  111.  *
  112.  * Revision 1.17  1996/06/07 13:52:20  robertj
  113.  * Added PUT to HTTP proxy FTP. Necessitating redisign of entity body processing.
  114.  *
  115.  * Revision 1.16  1996/05/23 10:00:52  robertj
  116.  * Added common function for GET and HEAD commands.
  117.  * Fixed status codes to be the actual status code instead of sequential enum.
  118.  * This fixed some problems with proxy pass through of status codes.
  119.  *
  120.  * Revision 1.14  1996/03/31 08:46:51  robertj
  121.  * HTTP 1.1 upgrade.
  122.  *
  123.  * Revision 1.13  1996/03/17 05:41:57  robertj
  124.  * Added hit count to PHTTPResource.
  125.  *
  126.  * Revision 1.12  1996/03/16 04:39:55  robertj
  127.  * Added ParseReponse() for splitting reponse line into code and info.
  128.  * Added client side support for HTTP socket.
  129.  * Added hooks for proxy support in HTTP socket.
  130.  *
  131.  * Revision 1.11  1996/03/10 13:15:23  robertj
  132.  * Redesign to make resources thread safe.
  133.  *
  134.  * Revision 1.10  1996/03/02 03:12:55  robertj
  135.  * Added radio button and selection boxes to HTTP form resource.
  136.  *
  137.  * Revision 1.9  1996/02/25 11:14:21  robertj
  138.  * Radio button support for forms.
  139.  *
  140.  * Revision 1.8  1996/02/25 02:57:48  robertj
  141.  * Removed pass through HTTP resource.
  142.  *
  143.  * Revision 1.7  1996/02/19 13:25:43  robertj
  144.  * Added overwrite option to AddResource().
  145.  * Added get/set string to PHTTPString resource.
  146.  * Moved nested classes from PHTTPForm.
  147.  *
  148.  * Revision 1.6  1996/02/13 13:09:16  robertj
  149.  * Added extra parameters to callback function in PHTTPResources, required
  150.  *   by descendants to make informed decisions on data being loaded.
  151.  *
  152.  * Revision 1.5  1996/02/08 12:04:19  robertj
  153.  * Redesign of resource object callback virtuals.
  154.  * Added HTML form resource type.
  155.  *
  156.  * Revision 1.4  1996/02/03 11:03:32  robertj
  157.  * Added ismodified since and expires time checking.
  158.  * Added PHTTPString that defaults to empty string.
  159.  *
  160.  * Revision 1.3  1996/01/28 14:15:38  robertj
  161.  * Changed PCharArray in OnLoadData to PString for convenience in mangling data.
  162.  * Beginning of pass through resource type.
  163.  *
  164.  * Revision 1.2  1996/01/26 02:24:26  robertj
  165.  * Further implemetation.
  166.  *
  167.  * Revision 1.1  1996/01/23 13:04:20  robertj
  168.  * Initial revision
  169.  *
  170.  */
  171. #ifndef _PHTTP
  172. #define _PHTTP
  173. #ifdef __GNUC__
  174. #pragma interface
  175. #endif
  176. #include <ptclib/inetprot.h>
  177. #include <ptclib/mime.h>
  178. #include <ptclib/url.h>
  179. #include <ptclib/html.h>
  180. #include <ptlib/ipsock.h>
  181. //////////////////////////////////////////////////////////////////////////////
  182. // PHTTPSpace
  183. class PHTTPResource;
  184. /** This class describes a name space that a Universal Resource Locator operates
  185.    in. Each section of the hierarchy field of the URL points to a leg in the
  186.    tree specified by this class.
  187.  */
  188. class PHTTPSpace : public PContainer
  189. {
  190.   PCONTAINERINFO(PHTTPSpace, PContainer)
  191.   public:
  192.     /// Constructor for HTTP URL Name Space
  193.     PHTTPSpace();
  194.   // New functions for class.
  195.     enum AddOptions {
  196.       ErrorOnExist,
  197.       Overwrite
  198.     };
  199.     /** Add a new resource to the URL space. If there is already a resource at
  200.        the location in the tree, or that location in the tree is already in
  201.        the path to another resource then the function will fail.
  202.        The <CODE>overwrite</CODE> flag can be used to replace an existing
  203.        resource. The function will still fail if the resource is on a partial
  204.        path to another resource but not if it is a leaf node.
  205.        @return
  206.        TRUE if resource added, FALSE if failed.
  207.      */
  208.     BOOL AddResource(
  209.       PHTTPResource * resource, /// Resource to add to the name space.
  210.       AddOptions overwrite = ErrorOnExist
  211.         /// Flag to overwrite an existing resource if it already exists.
  212.     );
  213.     /** Delete an existing resource to the URL space. If there is not a resource
  214.        at the location in the tree, or that location in the tree is in the
  215.        path to another resource then the function will fail.
  216.        @return
  217.        TRUE if resource deleted, FALSE if failed.
  218.      */
  219.     BOOL DelResource(
  220.       const PURL & url          /// URL to search for in the name space.
  221.     );
  222.     /** Locate the resource specified by the URL in the URL name space.
  223.        @return
  224.        The resource found or NULL if no resource at that position in hiearchy.
  225.      */
  226.     PHTTPResource * FindResource(
  227.       const PURL & url   /// URL to search for in the name space.
  228.     );
  229.     /** This function attempts to acquire the mutex for reading.
  230.      */
  231.     void StartRead() const
  232.       { mutex->StartRead(); }
  233.     /** This function attempts to release the mutex for reading.
  234.      */
  235.     void EndRead() const
  236.       { mutex->EndRead(); }
  237.     /** This function attempts to acquire the mutex for writing.
  238.      */
  239.     void StartWrite() const
  240.       { mutex->StartWrite(); }
  241.     /** This function attempts to release the mutex for writing.
  242.      */
  243.     void EndWrite() const
  244.       { mutex->EndWrite(); }
  245.   protected:
  246.     PReadWriteMutex * mutex;
  247.     class Node;
  248.     PSORTED_LIST(ChildList, Node);
  249.     class Node : public PString
  250.     {
  251.       PCLASSINFO(Node, PString)
  252.       public:
  253.         Node(const PString & name, Node * parentNode);
  254.         ~Node();
  255.         Node          * parent;
  256.         ChildList       children;
  257.         PHTTPResource * resource;
  258.     } * root;
  259.   private:
  260.     BOOL SetSize(PINDEX) { return FALSE; }
  261. };
  262. //////////////////////////////////////////////////////////////////////////////
  263. // PHTTP
  264. /** A common base class for TCP/IP socket for the HyperText Transfer Protocol
  265. version 1.0 client and server.
  266.  */
  267. class PHTTP : public PInternetProtocol
  268. {
  269.   PCLASSINFO(PHTTP, PInternetProtocol)
  270.   public:
  271.   // New functions for class.
  272.     enum Commands {
  273.       // HTTP/1.0 commands
  274.       GET, HEAD, POST,
  275.       // HTTP/1.1 commands
  276.       PUT, DELETE, TRACE, OPTIONS,
  277.       // HTTPS command
  278.       CONNECT,
  279.       NumCommands
  280.     };
  281.     enum StatusCode {
  282.       Continue = 100,              // 100 - Continue
  283.       SwitchingProtocols,          // 101 - upgrade allowed
  284.       OK = 200,                    // 200 - request has succeeded
  285.       Created,                     // 201 - new resource created: entity body contains URL
  286.       Accepted,                    // 202 - request accepted, but not yet completed
  287.       NonAuthoritativeInformation, // 203 - not definitive entity header
  288.       NoContent,                   // 204 - no new information
  289.       ResetContent,                // 205 - contents have been reset
  290.       PartialContent,              // 206 - partial GET succeeded
  291.       MultipleChoices = 300,       // 300 - requested resource available elsewehere 
  292.       MovedPermanently,            // 301 - resource moved permanently: location field has new URL
  293.       MovedTemporarily,            // 302 - resource moved temporarily: location field has new URL
  294.       SeeOther,                    // 303 - see other URL
  295.       NotModified,                 // 304 - document has not been modified
  296.       UseProxy,                    // 305 - proxy redirect
  297.       BadRequest = 400,            // 400 - request malformed or not understood
  298.       UnAuthorised,                // 401 - request requires authentication
  299.       PaymentRequired,             // 402 - reserved 
  300.       Forbidden,                   // 403 - request is refused due to unsufficient authorisation
  301.       NotFound,                    // 404 - resource cannot be found
  302.       MethodNotAllowed,            // 405 - not allowed on this resource
  303.       NoneAcceptable,              // 406 - encoding not acceptable
  304.       ProxyAuthenticationRequired, // 407 - must authenticate with proxy first
  305.       RequestTimeout,              // 408 - server timeout on request
  306.       Conflict,                    // 409 - resource conflict on action
  307.       Gone,                        // 410 - resource gone away
  308.       LengthRequired,              // 411 - no Content-Length
  309.       UnlessTrue,                  // 412 - no Range header for TRUE Unless
  310.       InternalServerError = 500,   // 500 - server has encountered an unexpected error
  311.       NotImplemented,              // 501 - server does not implement request
  312.       BadGateway,                  // 502 - error whilst acting as gateway
  313.       ServiceUnavailable,          // 503 - server temporarily unable to service request
  314.       GatewayTimeout               // 504 - timeout whilst talking to gateway
  315.     };
  316.     // Common MIME header tags
  317.     static const char * AllowTag;
  318.     static const char * AuthorizationTag;
  319.     static const char * ContentEncodingTag;
  320.     static const char * ContentLengthTag;
  321.     static const char * ContentTypeTag;
  322.     static const char * DateTag;
  323.     static const char * ExpiresTag;
  324.     static const char * FromTag;
  325.     static const char * IfModifiedSinceTag;
  326.     static const char * LastModifiedTag;
  327.     static const char * LocationTag;
  328.     static const char * PragmaTag;
  329.     static const char * PragmaNoCacheTag;
  330.     static const char * RefererTag;
  331.     static const char * ServerTag;
  332.     static const char * UserAgentTag;
  333.     static const char * WWWAuthenticateTag;
  334.     static const char * MIMEVersionTag;
  335.     static const char * ConnectionTag;
  336.     static const char * KeepAliveTag;
  337.     static const char * ProxyConnectionTag;
  338.     static const char * ProxyAuthorizationTag;
  339.     static const char * ProxyAuthenticateTag;
  340.     static const char * ForwardedTag;
  341.     static const char * SetCookieTag;
  342.     static const char * CookieTag;
  343.   protected:
  344.     /** Create a TCP/IP HTTP protocol channel.
  345.      */
  346.     PHTTP();
  347.     /** Parse a response line string into a response code and any extra info
  348.        on the line. Results are placed into the member variables
  349.        <CODE>lastResponseCode</CODE> and <CODE>lastResponseInfo</CODE>.
  350.        The default bahaviour looks for a space or a '-' and splits the code
  351.        and info either side of that character, then returns FALSE.
  352.        @return
  353.        Position of continuation character in response, 0 if no continuation
  354.        lines are possible.
  355.      */
  356.     virtual PINDEX ParseResponse(
  357.       const PString & line // Input response line to be parsed
  358.     );
  359. };
  360. //////////////////////////////////////////////////////////////////////////////
  361. // PHTTPClient
  362. /** A TCP/IP socket for the HyperText Transfer Protocol version 1.0.
  363.    When acting as a client, the procedure is to make the connection to a
  364.    remote server, then to retrieve a document using the following procedure:
  365.       <PRE><CODE>
  366.       PHTTPSocket web("webserver");
  367.       if (web.IsOpen()) {
  368.         if (web.GetDocument("http://www.someone.com/somewhere/url")) {
  369.           while (web.Read(block, sizeof(block)))
  370.             ProcessHTML(block);
  371.         }
  372.         else
  373.            PError << "Could not get page." << endl;
  374.       }
  375.       else
  376.          PError << "HTTP conection failed." << endl;
  377.       </PRE></CODE>
  378.  */
  379. class PHTTPClient : public PHTTP
  380. {
  381.   PCLASSINFO(PHTTPClient, PHTTP)
  382.   public:
  383.     /// Create a new HTTP client channel.
  384.     PHTTPClient();
  385.   // New functions for class.
  386.     /** Send a command and wait for the response header (including MIME fields).
  387.        Note that a body may still be on its way even if lasResponseCode is not
  388.        200!
  389.        @return
  390.        TRUE if all of header returned and ready to receive body.
  391.      */
  392.     int ExecuteCommand(Commands cmd,
  393.                        const PString & url,
  394.                        const PMIMEInfo & outMIME,
  395.                        const PString & dataBody,
  396.                        PMIMEInfo & replyMime,
  397.                        BOOL persist = TRUE);
  398.     int ExecuteCommand(const PString & cmdName,
  399.                        const PString & url,
  400.                        const PMIMEInfo & outMIME,
  401.                        const PString & dataBody,
  402.                        PMIMEInfo & replyMime,
  403.                        BOOL persist = TRUE);
  404.     /// Write a HTTP command to server
  405.     BOOL WriteCommand(Commands cmd,
  406.                       const PString & url,
  407.                       const PMIMEInfo & outMIME,
  408.                       const PString & dataBody);
  409.     BOOL WriteCommand(const PString & cmdName,
  410.                       const PString & url,
  411.                       const PMIMEInfo & outMIME,
  412.                       const PString & dataBody);
  413.     /// Read a response from the server
  414.     BOOL ReadResponse(PMIMEInfo & replyMIME);
  415.     /** Get the document specified by the URL.
  416.        @return
  417.        TRUE if document is being transferred.
  418.      */
  419.     BOOL GetDocument(
  420.       const PURL & url,         // Universal Resource Locator for document.
  421.       PMIMEInfo & outMIME,      // MIME info in request
  422.       PMIMEInfo & replyMIME,    // MIME info in response
  423.       BOOL persist = TRUE
  424.     );
  425.     /** Get the header for the document specified by the URL.
  426.        @return
  427.        TRUE if document header is being transferred.
  428.      */
  429.     BOOL GetHeader(
  430.       const PURL & url,         // Universal Resource Locator for document.
  431.       PMIMEInfo & outMIME,      // MIME info in request
  432.       PMIMEInfo & replyMIME,    // MIME info in response
  433.       BOOL persist = TRUE
  434.     );
  435.     /** Post the data specified to the URL.
  436.        @return
  437.        TRUE if document is being transferred.
  438.      */
  439.     BOOL PostData(
  440.       const PURL & url,       // Universal Resource Locator for document.
  441.       PMIMEInfo & outMIME,    // MIME info in request
  442.       const PString & data,   // Information posted to the HTTP server.
  443.       PMIMEInfo & replyMIME,  // MIME info in response
  444.       BOOL persist = TRUE
  445.     );
  446.   protected:
  447.     BOOL AssureConnect(const PURL & url, PMIMEInfo & outMIME);
  448. };
  449. //////////////////////////////////////////////////////////////////////////////
  450. // PHTTPConnectionInfo
  451. class PHTTPServer;
  452. /** This object describes the connectiono associated with a HyperText Transport
  453.    Protocol request. This information is required by handler functions on
  454.    #PHTTPResource# descendant classes to manage the connection correctly.
  455. */
  456. class PHTTPConnectionInfo : public PObject
  457. {
  458.   PCLASSINFO(PHTTPConnectionInfo, PObject)
  459.   public:
  460.     PHTTPConnectionInfo();
  461.     PHTTP::Commands GetCommandCode() const { return commandCode; }
  462.     const PString & GetCommandName() const { return commandName; }
  463.     const PURL & GetURL() const       { return url; }
  464.     const PMIMEInfo & GetMIME() const { return mimeInfo; }
  465.     void SetMIME(const PString & tag, const PString & value);
  466.     void SetPersistance(BOOL newPersist);
  467.     BOOL IsCompatible(int major, int minor) const;
  468.     BOOL IsPersistant() const         { return isPersistant; }
  469.     BOOL IsProxyConnection() const    { return isProxyConnection; }
  470.     int  GetMajorVersion() const      { return majorVersion; }
  471.     int  GetMinorVersion() const      { return minorVersion; }
  472.     long GetEntityBodyLength() const  { return entityBodyLength; }
  473.   protected:
  474.     BOOL Initialise(PHTTPServer & server, PString & args);
  475.     PHTTP::Commands commandCode;
  476.     PString   commandName;
  477.     PURL      url;
  478.     PMIMEInfo mimeInfo;
  479.     BOOL      isPersistant;
  480.     BOOL      isProxyConnection;
  481.     int       majorVersion;
  482.     int       minorVersion;
  483.     long      entityBodyLength;
  484.   friend class PHTTPServer;
  485. };
  486. //////////////////////////////////////////////////////////////////////////////
  487. // PHTTPServer
  488. /** A TCP/IP socket for the HyperText Transfer Protocol version 1.0.
  489.     When acting as a server, a descendant class would be created to override
  490.     at least the #HandleOpenMailbox()#, #HandleSendMessage()# and
  491.     #HandleDeleteMessage()# functions. Other functions may be overridden
  492.     for further enhancement to the sockets capabilities, but these will give a
  493.     basic POP3 server functionality.
  494.     The server socket thread would continuously call the
  495.     #ProcessMessage()# function until it returns FALSE. This will then
  496.     call the appropriate virtual function on parsing the POP3 protocol.
  497.  */
  498. class PHTTPServer : public PHTTP
  499. {
  500.   PCLASSINFO(PHTTPServer, PHTTP)
  501.   public:
  502.     /** Create a TCP/IP HTTP protocol socket channel. The form with the single
  503.        <CODE>port</CODE> parameter creates an unopened socket, the form with
  504.        the <CODE>address</CODE> parameter makes a connection to a remote
  505.        system, opening the socket. The form with the <CODE>socket</CODE>
  506.        parameter opens the socket to an incoming call from a "listening"
  507.        socket.
  508.      */
  509.     PHTTPServer();
  510.     PHTTPServer(
  511.       const PHTTPSpace & urlSpace  // Name space to use for URLs received.
  512.     );
  513.   // New functions for class.
  514.     /** Get the name of the server.
  515.        @return
  516.        String name of the server.
  517.      */
  518.     virtual PString GetServerName() const;
  519.     /** Get the name space being used by the HTTP server socket.
  520.        @return
  521.        URL name space tree.
  522.      */
  523.     PHTTPSpace & GetURLSpace() { return urlSpace; }
  524.     /// Use a new URL name space for this HTTP socket.
  525.     void SetURLSpace(
  526.       const PHTTPSpace & space   // New URL name space to use.
  527.     );
  528.     /** Process commands, dispatching to the appropriate virtual function. This
  529.        is used when the socket is acting as a server.
  530.        @return
  531.        TRUE if the request specified persistant mode and the request version
  532.        allows it, FALSE if the socket closed, timed out, the protocol does not
  533.        allow persistant mode, or the client did not request it
  534.        timed out
  535.      */
  536.     BOOL ProcessCommand();
  537.     /** Handle a GET command from a client.
  538.        The default implementation looks up the URL in the name space declared by
  539.        the #PHTTPSpace# class tree and despatches to the
  540.        #PHTTPResource# object contained therein.
  541.        @return
  542.        TRUE if the connection may persist, FALSE if the connection must close
  543.        If there is no ContentLength field in the response, this value must
  544.        be FALSE for correct operation.
  545.      */
  546.     virtual BOOL OnGET(
  547.       const PURL & url,                    // Universal Resource Locator for document.
  548.       const PMIMEInfo & info,              // Extra MIME information in command.
  549.       const PHTTPConnectionInfo & conInfo
  550.     );
  551.     /** Handle a HEAD command from a client.
  552.        The default implemetation looks up the URL in the name space declared by
  553.        the #PHTTPSpace# class tree and despatches to the
  554.        #PHTTPResource# object contained therein.
  555.        @return
  556.        TRUE if the connection may persist, FALSE if the connection must close
  557.        If there is no ContentLength field in the response, this value must
  558.        be FALSE for correct operation.
  559.      */
  560.     virtual BOOL OnHEAD(
  561.       const PURL & url,                   // Universal Resource Locator for document.
  562.       const PMIMEInfo & info,             // Extra MIME information in command.
  563.       const PHTTPConnectionInfo & conInfo
  564.     );
  565.     /** Handle a POST command from a client.
  566.        The default implementation looks up the URL in the name space declared by
  567.        the #PHTTPSpace# class tree and despatches to the
  568.        #PHTTPResource# object contained therein.
  569.        @return
  570.        TRUE if the connection may persist, FALSE if the connection must close
  571.        If there is no ContentLength field in the response, this value must
  572.        be FALSE for correct operation.
  573.      */
  574.     virtual BOOL OnPOST(
  575.       const PURL & url,                   // Universal Resource Locator for document.
  576.       const PMIMEInfo & info,             // Extra MIME information in command.
  577.       const PStringToString & data,       // Variables provided in the POST data.
  578.       const PHTTPConnectionInfo & conInfo
  579.     );
  580.     /** Handle a proxy command request from a client. This will only get called
  581.        if the request was not for this particular server. If it was a proxy
  582.        request for this server (host and port number) then the appropriate
  583.        #OnGET()#, #OnHEAD()# or #OnPOST()# command is called.
  584.        The default implementation returns OnError(BadGateway).
  585.        @return
  586.        TRUE if the connection may persist, FALSE if the connection must close
  587.        If there is no ContentLength field in the response, this value must
  588.        be FALSE for correct operation.
  589.      */
  590.     virtual BOOL OnProxy(
  591.       const PHTTPConnectionInfo & conInfo
  592.     );
  593.     /** Read the entity body associated with a HTTP request, and close the
  594.        socket if not a persistant connection.
  595.        @return
  596.        The entity body of the command
  597.      */
  598.     virtual PString ReadEntityBody();
  599.     /** Handle an unknown command.
  600.        @return
  601.        TRUE if the connection may persist, FALSE if the connection must close
  602.      */
  603.     virtual BOOL OnUnknown(
  604.       const PCaselessString & command, // Complete command line received.
  605.       const PHTTPConnectionInfo & connectInfo
  606.     );
  607.     /** Write a command reply back to the client, and construct some of the
  608.        outgoing MIME fields. The MIME fields are not sent.
  609.        The <CODE>bodySize</CODE> parameter determines the size of the 
  610.        entity body associated with the response. If <CODE>bodySize</CODE> is
  611.        >= 0, then a ContentLength field will be added to the outgoing MIME
  612.        headers if one does not already exist.
  613.        If <CODE>bodySize</CODE> is < 0, then it is assumed that the size of
  614.        the entity body is unknown, or has already been added, and no
  615.        ContentLength field will be constructed. 
  616.        If the version of the request is less than 1.0, then this function does
  617.        nothing.
  618.      */
  619.     void StartResponse(
  620.       StatusCode code,      // Status code for the response.
  621.       PMIMEInfo & headers,  // MIME variables included in response.
  622.       long bodySize         // Size of the rest of the response.
  623.     );
  624.     /** Write an error response for the specified code.
  625.        Depending on the <CODE>code</CODE> parameter this function will also
  626.        send a HTML version of the status code for display on the remote client
  627.        viewer.
  628.        @return
  629.        TRUE if the connection may persist, FALSE if the connection must close
  630.      */
  631.     virtual BOOL OnError(
  632.       StatusCode code,                         // Status code for the error response.
  633.       const PCaselessString & extra,           // Extra information included in the response.
  634.       const PHTTPConnectionInfo & connectInfo
  635.     );
  636.     /** Set the default mime info
  637.      */
  638.     void SetDefaultMIMEInfo(
  639.       PMIMEInfo & info,      // Extra MIME information in command.
  640.       const PHTTPConnectionInfo & connectInfo
  641.     );
  642.   protected:
  643.     void Construct();
  644.     PHTTPConnectionInfo connectInfo;
  645.     PINDEX transactionCount;
  646.     PTimeInterval nextTimeout;
  647.     PHTTPSpace urlSpace;
  648. };
  649. //////////////////////////////////////////////////////////////////////////////
  650. // PHTTPRequest
  651. /** This object describes a HyperText Transport Protocol request. An individual
  652.    request is passed to handler functions on #PHTTPResource# descendant
  653.    classes.
  654.  */
  655. class PHTTPRequest : public PObject
  656. {
  657.   PCLASSINFO(PHTTPRequest, PObject)
  658.   public:
  659.     PHTTPRequest(
  660.       const PURL & url,             // Universal Resource Locator for document.
  661.       const PMIMEInfo & inMIME,     // Extra MIME information in command.
  662.       PHTTPServer & socket          // socket that request initiated on
  663.     );
  664.     const PURL & url;               // Universal Resource Locator for document.
  665.     const PMIMEInfo & inMIME;       // Extra MIME information in command.
  666.     PHTTP::StatusCode code;         // Status code for OnError() reply.
  667.     PMIMEInfo outMIME;              // MIME information used in reply.
  668.     PINDEX contentSize;             // Size of the body of the resource data.
  669.     PIPSocket::Address origin;      // IP address of origin host for request
  670.     PIPSocket::Address localAddr;   // IP address of local interface for request
  671.     WORD               localPort;   // Port number of local server for request
  672. };
  673. //////////////////////////////////////////////////////////////////////////////
  674. // PHTTPAuthority
  675. /** This abstract class describes the authorisation mechanism for a Universal
  676.    Resource Locator.
  677.  */
  678. class PHTTPAuthority : public PObject
  679. {
  680.   PCLASSINFO(PHTTPAuthority, PObject)
  681.   public:
  682.   // New functions for class.
  683.     /** Get the realm or name space for the user authorisation name and
  684.        password as required by the basic authorisation system of HTTP/1.0.
  685.        @return
  686.        String for the authorisation realm name.
  687.      */
  688.     virtual PString GetRealm(
  689.       const PHTTPRequest & request   // Request information.
  690.     ) const = 0;
  691.     /** Validate the user and password provided by the remote HTTP client for
  692.        the realm specified by the class instance.
  693.        @return
  694.        TRUE if the user and password are authorised in the realm.
  695.      */
  696.     virtual BOOL Validate(
  697.       const PHTTPRequest & request,  // Request information.
  698.       const PString & authInfo       // Authority information string.
  699.     ) const = 0;
  700.     /** Determine if the authirisation is to be applied. This could be used to
  701.        distinguish between net requiring authorisation and requiring autorisation
  702.        but having no password.
  703.        The default behaviour is to return TRUE.
  704.        @return
  705.        TRUE if the authorisation in the realm is to be applied.
  706.      */
  707.     virtual BOOL IsActive() const;
  708.   protected:
  709.     static void DecodeBasicAuthority(
  710.       const PString & authInfo,   // Authority information string.
  711.       PString & username,         // User name decoded from authInfo
  712.       PString & password          // Password decoded from authInfo
  713.     );
  714. };
  715. //////////////////////////////////////////////////////////////////////////////
  716. // PHTTPSimpleAuth
  717. /** This class describes the simplest authorisation mechanism for a Universal
  718.    Resource Locator, a fixed realm, username and password.
  719.  */
  720. class PHTTPSimpleAuth : public PHTTPAuthority
  721. {
  722.   PCLASSINFO(PHTTPSimpleAuth, PHTTPAuthority)
  723.   public:
  724.     PHTTPSimpleAuth(
  725.       const PString & realm,      // Name space for the username and password.
  726.       const PString & username,   // Username that this object wiull authorise.
  727.       const PString & password    // Password for the above username.
  728.     );
  729.     // Construct the simple authorisation structure.
  730.   // Overrides from class PObject.
  731.     /** Create a copy of the class on the heap. This is used by the
  732.        #PHTTPResource# classes for maintaining authorisation to
  733.        resources.
  734.        @return
  735.        pointer to new copy of the class instance.
  736.      */
  737.     virtual PObject * Clone() const;
  738.   // Overrides from class PHTTPAuthority.
  739.     /** Get the realm or name space for the user authorisation name and
  740.        password as required by the basic authorisation system of HTTP/1.0.
  741.        @return
  742.        String for the authorisation realm name.
  743.      */
  744.     virtual PString GetRealm(
  745.       const PHTTPRequest & request   // Request information.
  746.     ) const;
  747.     /** Validate the user and password provided by the remote HTTP client for
  748.        the realm specified by the class instance.
  749.        @return
  750.        TRUE if the user and password are authorised in the realm.
  751.      */
  752.     virtual BOOL Validate(
  753.       const PHTTPRequest & request,  // Request information.
  754.       const PString & authInfo       // Authority information string.
  755.     ) const;
  756.     /** Determine if the authirisation is to be applied. This could be used to
  757.        distinguish between net requiring authorisation and requiring autorisation
  758.        but having no password.
  759.        The default behaviour is to return TRUE.
  760.        @return
  761.        TRUE if the authorisation in the realm is to be applied.
  762.      */
  763.     virtual BOOL IsActive() const;
  764.     /** Get the user name allocated to this simple authorisation.
  765.        @return
  766.        String for the authorisation user name.
  767.      */
  768.     const PString & GetUserName() const { return username; }
  769.     /** Get the password allocated to this simple authorisation.
  770.        @return
  771.        String for the authorisation password.
  772.      */
  773.     const PString & GetPassword() const { return password; }
  774.   protected:
  775.     PString realm;
  776.     PString username;
  777.     PString password;
  778. };
  779. //////////////////////////////////////////////////////////////////////////////
  780. // PHTTPMultiSimpAuth
  781. /** This class describes the simple authorisation mechanism for a Universal
  782.    Resource Locator, a fixed realm, multiple usernames and passwords.
  783.  */
  784. class PHTTPMultiSimpAuth : public PHTTPAuthority
  785. {
  786.   PCLASSINFO(PHTTPMultiSimpAuth, PHTTPAuthority)
  787.   public:
  788.     PHTTPMultiSimpAuth(
  789.       const PString & realm      // Name space for the username and password.
  790.     );
  791.     PHTTPMultiSimpAuth(
  792.       const PString & realm,             // Name space for the usernames.
  793.       const PStringToString & userList // List of usernames and passwords.
  794.     );
  795.     // Construct the simple authorisation structure.
  796.   // Overrides from class PObject.
  797.     /** Create a copy of the class on the heap. This is used by the
  798.        #PHTTPResource# classes for maintaining authorisation to
  799.        resources.
  800.        @return
  801.        pointer to new copy of the class instance.
  802.      */
  803.     virtual PObject * Clone() const;
  804.   // Overrides from class PHTTPAuthority.
  805.     /** Get the realm or name space for the user authorisation name and
  806.        password as required by the basic authorisation system of HTTP/1.0.
  807.        @return
  808.        String for the authorisation realm name.
  809.      */
  810.     virtual PString GetRealm(
  811.       const PHTTPRequest & request   // Request information.
  812.     ) const;
  813.     /** Validate the user and password provided by the remote HTTP client for
  814.        the realm specified by the class instance.
  815.        @return
  816.        TRUE if the user and password are authorised in the realm.
  817.      */
  818.     virtual BOOL Validate(
  819.       const PHTTPRequest & request,  // Request information.
  820.       const PString & authInfo       // Authority information string.
  821.     ) const;
  822.     /** Determine if the authirisation is to be applied. This could be used to
  823.        distinguish between net requiring authorisation and requiring autorisation
  824.        but having no password.
  825.        The default behaviour is to return TRUE.
  826.        @return
  827.        TRUE if the authorisation in the realm is to be applied.
  828.      */
  829.     virtual BOOL IsActive() const;
  830.     /** Get the user name allocated to this simple authorisation.
  831.        @return
  832.        String for the authorisation user name.
  833.      */
  834.     void AddUser(
  835.       const PString & username,   // Username that this object wiull authorise.
  836.       const PString & password    // Password for the above username.
  837.     );
  838.   protected:
  839.     PString realm;
  840.     PStringToString users;
  841. };
  842. //////////////////////////////////////////////////////////////////////////////
  843. // PHTTPResource
  844. /** This object describes a HyperText Transport Protocol resource. A tree of
  845.    these resources are available to the #PHTTPSocket# class.
  846.  */
  847. class PHTTPResource : public PObject
  848. {
  849.   PCLASSINFO(PHTTPResource, PObject)
  850.   protected:
  851.     PHTTPResource(
  852.       const PURL & url               // Name of the resource in URL space.
  853.     );
  854.     PHTTPResource(
  855.       const PURL & url,              // Name of the resource in URL space.
  856.       const PHTTPAuthority & auth    // Authorisation for the resource.
  857.     );
  858.     PHTTPResource(
  859.       const PURL & url,              // Name of the resource in URL space.
  860.       const PString & contentType    // MIME content type for the resource.
  861.     );
  862.     PHTTPResource(
  863.       const PURL & url,              // Name of the resource in URL space.
  864.       const PString & contentType,   // MIME content type for the resource.
  865.       const PHTTPAuthority & auth    // Authorisation for the resource.
  866.     );
  867.     // Create a new HTTP Resource.
  868.   public:
  869.     virtual ~PHTTPResource();
  870.     // Destroy the HTTP Resource.
  871.   // New functions for class.
  872.     /** Get the URL for this resource.
  873.        @return
  874.        The URL for this resource.
  875.      */
  876.     const PURL & GetURL() const { return baseURL; }
  877.     /** Get the current content type for the resource.
  878.        @return
  879.        string for the current MIME content type.
  880.      */
  881.     const PString & GetContentType() const { return contentType; }
  882.     /** Set the current content type for the resource.
  883.      */
  884.     void SetContentType(
  885.       const PString & newType
  886.     ) { contentType = newType; }
  887.     /** Get the current authority for the resource.
  888.        @return
  889.        Pointer to authority or NULL if unrestricted.
  890.      */
  891.     PHTTPAuthority * GetAuthority() const { return authority; }
  892.     /** Set the current authority for the resource.
  893.      */
  894.     void SetAuthority(
  895.       const PHTTPAuthority & auth
  896.     );
  897.     /** Set the current authority for the resource to unrestricted.
  898.      */
  899.     void ClearAuthority();
  900.     /** Get the current hit count for the resource. This is the total number of
  901.        times the resource was asked for by a remote client.
  902.        @return
  903.        Hit count for the resource.
  904.      */
  905.     DWORD GetHitCount() const { return hitCount; }
  906.     void ClearHitCount() { hitCount = 0; }
  907.     // Clear the hit count for the resource.
  908.     /** Handle the GET command passed from the HTTP socket.
  909.        The default action is to check the authorisation for the resource and
  910.        call the virtuals #LoadHeaders()# and #OnGETData()# to get
  911.        a resource to be sent to the socket.
  912.        @return
  913.        TRUE if the connection may persist, FALSE if the connection must close.
  914.        If there is no ContentLength field in the response, this value must
  915.        be FALSE for correct operation.
  916.      */
  917.     virtual BOOL OnGET(
  918.       PHTTPServer & server,       // HTTP server that received the request
  919.       const PURL & url,           // Universal Resource Locator for document.
  920.       const PMIMEInfo & info,     // Extra MIME information in command.
  921.       const PHTTPConnectionInfo & conInfo
  922.     );
  923.     /** Load the data associated with a GET command.
  924.        The default action is to call the virtual #LoadData()# to get a
  925.        resource to be sent to the socket.
  926.        @return
  927.        TRUE if the connection may persist, FALSE if the connection must close.
  928.        If there is no ContentLength field in the response, this value must
  929.        be FALSE for correct operation.
  930.     */
  931.     virtual BOOL OnGETData(
  932.       PHTTPServer & server,
  933.       const PURL & url,
  934.       const PHTTPConnectionInfo & connectInfo,
  935.       PHTTPRequest & request
  936.     );
  937.     /** Handle the HEAD command passed from the HTTP socket.
  938.        The default action is to check the authorisation for the resource and
  939.        call the virtual #LoadHeaders()# to get the header information to
  940.        be sent to the socket.
  941.        @return
  942.        TRUE if the connection may persist, FALSE if the connection must close
  943.        If there is no ContentLength field in the response, this value must
  944.        be FALSE for correct operation.
  945.      */
  946.     virtual BOOL OnHEAD(
  947.       PHTTPServer & server,       // HTTP server that received the request
  948.       const PURL & url,           // Universal Resource Locator for document.
  949.       const PMIMEInfo & info,     // Extra MIME information in command.
  950.       const PHTTPConnectionInfo & conInfo
  951.     );
  952.     /** Handle the POST command passed from the HTTP socket.
  953.        The default action is to check the authorisation for the resource and
  954.        call the virtual #Post()# function to handle the data being
  955.        received.
  956.        @return
  957.        TRUE if the connection may persist, FALSE if the connection must close
  958.        If there is no ContentLength field in the response, this value must
  959.        be FALSE for correct operation.
  960.      */
  961.     virtual BOOL OnPOST(
  962.       PHTTPServer & server,         // HTTP server that received the request
  963.       const PURL & url,             // Universal Resource Locator for document.
  964.       const PMIMEInfo & info,       // Extra MIME information in command.
  965.       const PStringToString & data, // Variables in the POST data.
  966.       const PHTTPConnectionInfo & conInfo
  967.     );
  968.     /** Check to see if the resource has been modified since the date
  969.        specified.
  970.        @return
  971.        TRUE if has been modified since.
  972.      */
  973.     virtual BOOL IsModifiedSince(
  974.       const PTime & when    // Time to see if modified later than
  975.     );
  976.     /** Get a block of data (eg HTML) that the resource contains.
  977.        @return
  978.        Status of load operation.
  979.      */
  980.     virtual BOOL GetExpirationDate(
  981.       PTime & when          // Time that the resource expires
  982.     );
  983.     /** Create a new request block for this type of resource.
  984.        The default behaviour is to create a new PHTTPRequest instance.
  985.        @return
  986.        Pointer to instance of PHTTPRequest descendant class.
  987.      */
  988.     virtual PHTTPRequest * CreateRequest(
  989.       const PURL & url,                   // Universal Resource Locator for document.
  990.       const PMIMEInfo & inMIME,           // Extra MIME information in command.
  991.   PHTTPServer & socket
  992.     );
  993.     /** Get the headers for block of data (eg HTML) that the resource contains.
  994.        This will fill in all the fields of the <CODE>outMIME</CODE> parameter
  995.        required by the resource and return the status for the load.
  996.        @return
  997.        TRUE if all OK, FALSE if an error occurred.
  998.      */
  999.     virtual BOOL LoadHeaders(
  1000.       PHTTPRequest & request    // Information on this request.
  1001.     ) = 0;
  1002.     /** Get a block of data that the resource contains.
  1003.        The default behaviour is to call the #LoadText()# function and
  1004.        if successful, call the #OnLoadedText()# function.
  1005.        @return
  1006.        TRUE if there is still more to load.
  1007.      */
  1008.     virtual BOOL LoadData(
  1009.       PHTTPRequest & request,    // Information on this request.
  1010.       PCharArray & data          // Data used in reply.
  1011.     );
  1012.     /** Get a block of text data (eg HTML) that the resource contains.
  1013.        The default behaviour is to assert, one of #LoadText()# or
  1014.        #LoadData()# functions must be overridden for correct operation.
  1015.        @return
  1016.        String for loaded text.
  1017.      */
  1018.     virtual PString LoadText(
  1019.       PHTTPRequest & request    // Information on this request.
  1020.     );
  1021.     /** This is called after the text has been loaded and may be used to
  1022.        customise or otherwise mangle a loaded piece of text. Typically this is
  1023.        used with HTML responses.
  1024.        The default action for this function is to do nothing.
  1025.      */
  1026.     virtual void OnLoadedText(
  1027.       PHTTPRequest & request,    // Information on this request.
  1028.       PString & text             // Data used in reply.
  1029.     );
  1030.     /** Get a block of data (eg HTML) that the resource contains.
  1031.        The default action for this function is to do nothing and return
  1032.        success.
  1033.        @return
  1034.        TRUE if the connection may persist, FALSE if the connection must close
  1035.      */
  1036.     virtual BOOL Post(
  1037.       PHTTPRequest & request,       // Information on this request.
  1038.       const PStringToString & data, // Variables in the POST data.
  1039.       PHTML & replyMessage          // Reply message for post.
  1040.     );
  1041.   protected:
  1042.     /** See if the resource is authorised given the mime info
  1043.      */
  1044.     virtual BOOL CheckAuthority(
  1045.       PHTTPServer & server,               // Server to send response to.
  1046.       const PHTTPRequest & request,       // Information on this request.
  1047.       const PHTTPConnectionInfo & conInfo // Information on the connection
  1048.     );
  1049.     static BOOL CheckAuthority(
  1050.                    PHTTPAuthority & authority,
  1051.                       PHTTPServer & server,
  1052.                const PHTTPRequest & request,
  1053.         const PHTTPConnectionInfo & connectInfo
  1054.     );
  1055.     /** common code for GET and HEAD commands */
  1056.     virtual BOOL OnGETOrHEAD(
  1057.       PHTTPServer & server,       // HTTP server that received the request
  1058.       const PURL & url,           // Universal Resource Locator for document.
  1059.       const PMIMEInfo & info,     // Extra MIME information in command.
  1060.       const PHTTPConnectionInfo & conInfo,
  1061.       BOOL  IsGet
  1062.     );
  1063.     /// Base URL for the resource, may accept URLS with a longer hierarchy
  1064.     PURL             baseURL;
  1065.     /// MIME content type for the resource
  1066.     PString          contentType;
  1067.     /// Authorisation method for the resource
  1068.     PHTTPAuthority * authority;
  1069.     /// COunt of number of times resource was accessed.
  1070.     volatile DWORD   hitCount;
  1071. };
  1072. //////////////////////////////////////////////////////////////////////////////
  1073. // PHTTPString
  1074. /** This object describes a HyperText Transport Protocol resource which is a
  1075.    string kept in memory. For instance a pre-calculated HTML string could be
  1076.    set in this type of resource.
  1077.  */
  1078. class PHTTPString : public PHTTPResource
  1079. {
  1080.   PCLASSINFO(PHTTPString, PHTTPResource)
  1081.   public:
  1082.     /** Contruct a new simple string resource for the HTTP space. If no MIME
  1083.        content type is specified then a default type is "text/html".
  1084.      */
  1085.     PHTTPString(
  1086.       const PURL & url             // Name of the resource in URL space.
  1087.     );
  1088.     PHTTPString(
  1089.       const PURL & url,            // Name of the resource in URL space.
  1090.       const PHTTPAuthority & auth  // Authorisation for the resource.
  1091.     );
  1092.     PHTTPString(
  1093.       const PURL & url,            // Name of the resource in URL space.
  1094.       const PString & str          // String to return in this resource.
  1095.     );
  1096.     PHTTPString(
  1097.       const PURL & url,            // Name of the resource in URL space.
  1098.       const PString & str,         // String to return in this resource.
  1099.       const PString & contentType  // MIME content type for the file.
  1100.     );
  1101.     PHTTPString(
  1102.       const PURL & url,            // Name of the resource in URL space.
  1103.       const PString & str,         // String to return in this resource.
  1104.       const PHTTPAuthority & auth  // Authorisation for the resource.
  1105.     );
  1106.     PHTTPString(
  1107.       const PURL & url,            // Name of the resource in URL space.
  1108.       const PString & str,         // String to return in this resource.
  1109.       const PString & contentType, // MIME content type for the file.
  1110.       const PHTTPAuthority & auth  // Authorisation for the resource.
  1111.     );
  1112.   // Overrides from class PHTTPResource
  1113.     /** Get the headers for block of data (eg HTML) that the resource contains.
  1114.        This will fill in all the fields of the <CODE>outMIME</CODE> parameter
  1115.        required by the resource and return the status for the load.
  1116.        @return
  1117.        TRUE if all OK, FALSE if an error occurred.
  1118.      */
  1119.     virtual BOOL LoadHeaders(
  1120.       PHTTPRequest & request    // Information on this request.
  1121.     );
  1122.     /** Get a block of text data (eg HTML) that the resource contains.
  1123.        The default behaviour is to assert, one of #LoadText()# or
  1124.        #LoadData()# functions must be overridden for correct operation.
  1125.        @return
  1126.        String for loaded text.
  1127.      */
  1128.     virtual PString LoadText(
  1129.       PHTTPRequest & request    // Information on this request.
  1130.     );
  1131.   // New functions for class.
  1132.     /** Get the string for this resource.
  1133.        @return
  1134.        String for resource.
  1135.      */
  1136.     const PString & GetString() { return string; }
  1137.     /** Set the string to be returned by this resource.
  1138.      */
  1139.     void SetString(
  1140.       const PString & str   // New string for the resource.
  1141.     ) { string = str; }
  1142.   protected:
  1143.     PString string;
  1144. };
  1145. //////////////////////////////////////////////////////////////////////////////
  1146. // PHTTPFile
  1147. /** This object describes a HyperText Transport Protocol resource which is a
  1148.    single file. The file can be anywhere in the file system and is mapped to
  1149.    the specified URL location in the HTTP name space defined by the
  1150.    #PHTTPSpace# class.
  1151.  */
  1152. class PHTTPFile : public PHTTPResource
  1153. {
  1154.   PCLASSINFO(PHTTPFile, PHTTPResource)
  1155.   public:
  1156.     /** Contruct a new simple file resource for the HTTP space. If no MIME
  1157.        content type is specified then a default type is used depending on the
  1158.        file type. For example, "text/html" is used of the file type is
  1159.        ".html" or ".htm". The default for an unknown type is
  1160.        "application/octet-stream".
  1161.      */
  1162.     PHTTPFile(
  1163.       const PString & filename     // file in file system and URL name.
  1164.     );
  1165.     PHTTPFile(
  1166.       const PString & filename,    // file in file system and URL name.
  1167.       const PHTTPAuthority & auth  // Authorisation for the resource.
  1168.     );
  1169.     PHTTPFile(
  1170.       const PURL & url,            // Name of the resource in URL space.
  1171.       const PFilePath & file       // Location of file in file system.
  1172.     );
  1173.     PHTTPFile(
  1174.       const PURL & url,            // Name of the resource in URL space.
  1175.       const PFilePath & file,      // Location of file in file system.
  1176.       const PString & contentType  // MIME content type for the file.
  1177.     );
  1178.     PHTTPFile(
  1179.       const PURL & url,            // Name of the resource in URL space.
  1180.       const PFilePath & file,      // Location of file in file system.
  1181.       const PHTTPAuthority & auth  // Authorisation for the resource.
  1182.     );
  1183.     PHTTPFile(
  1184.       const PURL & url,            // Name of the resource in URL space.
  1185.       const PFilePath & file,      // Location of file in file system.
  1186.       const PString & contentType, // MIME content type for the file.
  1187.       const PHTTPAuthority & auth  // Authorisation for the resource.
  1188.     );
  1189.   // Overrides from class PHTTPResource
  1190.     /** Create a new request block for this type of resource.
  1191.        @return
  1192.        Pointer to instance of PHTTPRequest descendant class.
  1193.      */
  1194.     virtual PHTTPRequest * CreateRequest(
  1195.       const PURL & url,                  // Universal Resource Locator for document.
  1196.       const PMIMEInfo & inMIME,          // Extra MIME information in command.
  1197.      PHTTPServer & socket
  1198.     );
  1199.     /** Get the headers for block of data (eg HTML) that the resource contains.
  1200.        This will fill in all the fields of the <CODE>outMIME</CODE> parameter
  1201.        required by the resource and return the status for the load.
  1202.        @return
  1203.        TRUE if all OK, FALSE if an error occurred.
  1204.      */
  1205.     virtual BOOL LoadHeaders(
  1206.       PHTTPRequest & request    // Information on this request.
  1207.     );
  1208.     /** Get a block of data that the resource contains.
  1209.        @return
  1210.        TRUE if more to load.
  1211.      */
  1212.     virtual BOOL LoadData(
  1213.       PHTTPRequest & request,    // Information on this request.
  1214.       PCharArray & data          // Data used in reply.
  1215.     );
  1216.     /** Get a block of text data (eg HTML) that the resource contains.
  1217.        The default behaviour is to assert, one of #LoadText()# or
  1218.        #LoadData()# functions must be overridden for correct operation.
  1219.        @return
  1220.        String for loaded text.
  1221.      */
  1222.     virtual PString LoadText(
  1223.       PHTTPRequest & request    // Information on this request.
  1224.     );
  1225.   protected:
  1226.     PHTTPFile(
  1227.       const PURL & url,       // Name of the resource in URL space.
  1228.       int dummy
  1229.     );
  1230.     // Constructor used by PHTTPDirectory
  1231.     PFilePath filePath;
  1232. };
  1233. class PHTTPFileRequest : public PHTTPRequest
  1234. {
  1235.   PCLASSINFO(PHTTPFileRequest, PHTTPRequest)
  1236.   public:
  1237.     PHTTPFileRequest(
  1238.       const PURL & url,             // Universal Resource Locator for document.
  1239.       const PMIMEInfo & inMIME,     // Extra MIME information in command.
  1240.   PHTTPServer & server
  1241.     );
  1242.     PFile file;
  1243. };
  1244. //////////////////////////////////////////////////////////////////////////////
  1245. // PHTTPDirectory
  1246. /** This object describes a HyperText Transport Protocol resource which is a
  1247.    set of files in a directory. The directory can be anywhere in the file
  1248.    system and is mapped to the specified URL location in the HTTP name space
  1249.    defined by the #PHTTPSpace# class.
  1250.    All subdirectories and files are available as URL names in the HTTP name
  1251.    space. This effectively grafts a file system directory tree onto the URL
  1252.    name space tree.
  1253.    See the #PMIMEInfo# class for more information on the mappings between
  1254.    file types and MIME types.
  1255.  */
  1256. class PHTTPDirectory : public PHTTPFile
  1257. {
  1258.   PCLASSINFO(PHTTPDirectory, PHTTPFile)
  1259.   public:
  1260.     PHTTPDirectory(
  1261.       const PURL & url,            /// Name of the resource in URL space.
  1262.       const PDirectory & dir       /// Location of file in file system.
  1263.     );
  1264.     PHTTPDirectory(
  1265.       const PURL & url,            /// Name of the resource in URL space.
  1266.       const PDirectory & dir,      /// Location of file in file system.
  1267.       const PHTTPAuthority & auth  /// Authorisation for the resource.
  1268.     );
  1269.     // Construct a new directory resource for HTTP.
  1270.   // Overrides from class PHTTPResource
  1271.     /** Create a new request block for this type of resource.
  1272.        @return
  1273.        Pointer to instance of PHTTPRequest descendant class.
  1274.      */
  1275.     virtual PHTTPRequest * CreateRequest(
  1276.       const PURL & url,                  // Universal Resource Locator for document.
  1277.       const PMIMEInfo & inMIME,          // Extra MIME information in command.
  1278.      PHTTPServer & socket
  1279.     );
  1280.     /** Get the headers for block of data (eg HTML) that the resource contains.
  1281.        This will fill in all the fields of the <CODE>outMIME</CODE> parameter
  1282.        required by the resource and return the status for the load.
  1283.        @return
  1284.        TRUE if all OK, FALSE if an error occurred.
  1285.      */
  1286.     virtual BOOL LoadHeaders(
  1287.       PHTTPRequest & request    /// Information on this request.
  1288.     );
  1289.     /** Get a block of text data (eg HTML) that the resource contains.
  1290.        The default behaviour is to assert, one of #LoadText()# or
  1291.        #LoadData()# functions must be overridden for correct operation.
  1292.        @return
  1293.        String for loaded text.
  1294.      */
  1295.     virtual PString LoadText(
  1296.       PHTTPRequest & request    /// Information on this request.
  1297.     );
  1298.     /** Enable or disable access control using .access files. A directory tree containing
  1299.        a _access file will require authorisation to allow access. This file has 
  1300.        contains one or more lines, each containing a username and password seperated 
  1301.        by a ":" character.
  1302.        The parameter sets the realm used for authorisation requests. An empty realm disables
  1303.        auhtorisation.
  1304.      */
  1305.     void EnableAuthorisation(const PString & realm);
  1306.     /** Enable or disable directory listings when a default directory file does not exist
  1307.      */
  1308.     void AllowDirectories(BOOL enable = TRUE);
  1309.   protected:
  1310.     BOOL CheckAuthority(
  1311.       PHTTPServer & server,               // Server to send response to.
  1312.       const PHTTPRequest & request,       // Information on this request.
  1313.       const PHTTPConnectionInfo & conInfo // Information on the connection
  1314.     );
  1315.     BOOL FindAuthorisations(const PDirectory & dir, PString & realm, PStringToString & authorisations);
  1316.     PDirectory basePath;
  1317.     PString authorisationRealm;
  1318.     BOOL allowDirectoryListing;
  1319. };
  1320. class PHTTPDirRequest : public PHTTPFileRequest
  1321. {
  1322.   PCLASSINFO(PHTTPDirRequest, PHTTPFileRequest)
  1323.   public:
  1324.     PHTTPDirRequest(
  1325.       const PURL & url,             // Universal Resource Locator for document.
  1326.       const PMIMEInfo & inMIME,     // Extra MIME information in command.
  1327.       PHTTPServer & server
  1328.     );
  1329.     PString fakeIndex;
  1330.     PFilePath realPath;
  1331. };
  1332. #endif
  1333. // End Of File ///////////////////////////////////////////////////////////////