# http.h

Go to the documentation of this file.

    00001 /*
    00002  * http.h
    00003  *
    00004  * HyperText Transport Protocol classes.
    00005  *
    00006  * Portable Windows Library
    00007  *
    00008  * Copyright (c) 1993-2002 Equivalence Pty. Ltd.
    00009  *
    00010  * The contents of this file are subject to the Mozilla Public License
    00011  * Version 1.0 (the "License"); you may not use this file except in
    00012  * compliance with the License. You may obtain a copy of the License at
    00013  * http://www.mozilla.org/MPL/
    00014  *
    00015  * Software distributed under the License is distributed on an "AS IS"
    00016  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
    00017  * the License for the specific language governing rights and limitations
    00018  * under the License.
    00019  *
    00020  * The Original Code is Portable Windows Library.
    00021  *
    00022  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
    00023  *
    00024  * Contributor(s): ______________________________________.
    00025  *
    00026  * $Revision: 29065 $
    00027  * $Author: rjongbloed $
    00028  * $Date: 2013-02-11 18:26:26 -0600 (Mon, 11 Feb 2013) $
    00029  */
    00030
    00031 #ifndef PTLIB_HTTP_H
    00032 #define PTLIB_HTTP_H
    00033
    00034 #ifdef P_USE_PRAGMA
    00035 #pragma interface
    00036 #endif
    00037
    00038 #if P_HTTP
    00039
    00040 #include <ptclib/inetprot.h>
    00041 #include <ptclib/mime.h>
    00042 #include <ptclib/url.h>
    00043 #include <ptlib/ipsock.h>
    00044 #include <ptlib/pfactory.h>
    00045
    00046
    00047 #include <ptclib/html.h>
    00048
    00050 // PHTTPSpace
    00051
    00052 class PHTTPResource;
    00053
    00058 class PHTTPSpace : public PContainer
    00059 {
    00060   PCONTAINERINFO(PHTTPSpace, PContainer)
    00061   public:
    00063     PHTTPSpace();
    00064
    00065
    00066   // New functions for class.
    00067     enum AddOptions {
    00068       ErrorOnExist,
    00069       Overwrite
    00070     };
    00071
    00072
    00084     PBoolean AddResource(
    00085       PHTTPResource * resource,
    00086       AddOptions overwrite = ErrorOnExist
    00088     );
    00089
    00097     PBoolean DelResource(
    00098       const PURL & url
    00099     );
    00100
    00106     PHTTPResource * FindResource(
    00107       const PURL & url
    00108     );
    00109
    00112     void StartRead() const
    00113       { mutex->StartRead(); }
    00114
    00117     void EndRead() const
    00118       { mutex->EndRead(); }
    00119
    00122     void StartWrite() const
    00123       { mutex->StartWrite(); }
    00124
    00127     void EndWrite() const
    00128       { mutex->EndWrite(); }
    00129
    00130
    00131   protected:
    00132     PReadWriteMutex * mutex;
    00133
    00134     class Node;
    00135     PSORTED_LIST(ChildList, Node);
    00136     class Node : public PString
    00137     {
    00138       PCLASSINFO(Node, PString)
    00139       public:
    00140         Node(const PString & name, Node * parentNode);
    00141         ~Node();
    00142
    00143         Node          * parent;
    00144         ChildList       children;
    00145         PHTTPResource * resource;
    00146     } * root;
    00147
    00148   private:
    00149     PBoolean SetSize(PINDEX) { return false; }
    00150 };
    00151
    00152 #ifdef TRACE
    00153 #undef TRACE
    00154 #endif
    00155
    00157 // PHTTP
    00158
    00162 class PHTTP : public PInternetProtocol
    00163 {
    00164   PCLASSINFO(PHTTP, PInternetProtocol)
    00165
    00166   public:
    00167   // New functions for class.
    00168     enum Commands {
    00169       // HTTP/1.0 commands
    00170       GET, HEAD, POST,
    00171       // HTTP/1.1 commands
    00172       PUT, DELETE, TRACE, OPTIONS,
    00173       // HTTPS command
    00174       CONNECT,
    00175       NumCommands
    00176     };
    00177
    00178     enum StatusCode {
    00179       Continue = 100,
    00180       SwitchingProtocols,
    00181       RequestOK = 200,
    00182       Created,
    00183       Accepted,
    00184       NonAuthoritativeInformation,
    00185       NoContent,
    00186       ResetContent,
    00187       PartialContent,
    00188       MultipleChoices = 300,
    00189       MovedPermanently,
    00190       MovedTemporarily,
    00191       SeeOther,
    00192       NotModified,
    00193       UseProxy,
    00194       BadRequest = 400,
    00195       UnAuthorised,
    00196       PaymentRequired,
    00197       Forbidden,
    00198       NotFound,
    00199       MethodNotAllowed,
    00200       NoneAcceptable,
    00201       ProxyAuthenticationRequired,
    00202       RequestTimeout,
    00203       Conflict,
    00204       Gone,
    00205       LengthRequired,
    00206       UnlessTrue,
    00207       InternalServerError = 500,
    00208       NotImplemented,
    00209       BadGateway,
    00210       ServiceUnavailable,
    00211       GatewayTimeout
    00212     };
    00213
    00214     // Common MIME header tags
    00215     static const PCaselessString & AllowTag();
    00216     static const PCaselessString & AuthorizationTag();
    00217     static const PCaselessString & ContentEncodingTag();
    00218     static const PCaselessString & ContentLengthTag();
    00219     static const PCaselessString & ContentTypeTag() { return PMIMEInfo::ContentTypeTag(); }
    00220     static const PCaselessString & DateTag();
    00221     static const PCaselessString & ExpiresTag();
    00222     static const PCaselessString & FromTag();
    00223     static const PCaselessString & IfModifiedSinceTag();
    00224     static const PCaselessString & LastModifiedTag();
    00225     static const PCaselessString & LocationTag();
    00226     static const PCaselessString & PragmaTag();
    00227     static const PCaselessString & PragmaNoCacheTag();
    00228     static const PCaselessString & RefererTag();
    00229     static const PCaselessString & ServerTag();
    00230     static const PCaselessString & UserAgentTag();
    00231     static const PCaselessString & WWWAuthenticateTag();
    00232     static const PCaselessString & MIMEVersionTag();
    00233     static const PCaselessString & ConnectionTag();
    00234     static const PCaselessString & KeepAliveTag();
    00235     static const PCaselessString & TransferEncodingTag();
    00236     static const PCaselessString & ChunkedTag();
    00237     static const PCaselessString & ProxyConnectionTag();
    00238     static const PCaselessString & ProxyAuthorizationTag();
    00239     static const PCaselessString & ProxyAuthenticateTag();
    00240     static const PCaselessString & ForwardedTag();
    00241     static const PCaselessString & SetCookieTag();
    00242     static const PCaselessString & CookieTag();
    00243
    00244   protected:
    00247     PHTTP();
    00248
    00260     virtual PINDEX ParseResponse(
    00261       const PString & line
    00262     );
    00263 };
    00264
    00265
    00266
    00267 class PHTTPClientAuthentication : public PObject
    00268 {
    00269   PCLASSINFO(PHTTPClientAuthentication, PObject);
    00270   public:
    00271     class AuthObject {
    00272       public:
    00273         virtual ~AuthObject() { }
    00274         virtual PMIMEInfo & GetMIME() = 0;
    00275         virtual PString GetURI() = 0;
    00276         virtual PString GetEntityBody() = 0;
    00277         virtual PString GetMethod() = 0;
    00278     };
    00279
    00280     PHTTPClientAuthentication();
    00281
    00282     virtual Comparison Compare(
    00283       const PObject & other
    00284     ) const;
    00285
    00286     virtual PBoolean Parse(
    00287       const PString & auth,
    00288       PBoolean proxy
    00289     ) = 0;
    00290
    00291     virtual PBoolean Authorise(
    00292       AuthObject & pdu
    00293     ) const =  0;
    00294
    00295     virtual PBoolean IsProxy() const               { return isProxy; }
    00296
    00297     virtual PString GetUsername() const   { return username; }
    00298     virtual PString GetPassword() const   { return password; }
    00299     virtual PString GetAuthRealm() const  { return PString::Empty(); }
    00300
    00301     virtual void SetUsername(const PString & user) { username = user; }
    00302     virtual void SetPassword(const PString & pass) { password = pass; }
    00303     virtual void SetAuthRealm(const PString &)     { }
    00304
    00305     PString GetAuthParam(const PString & auth, const char * name) const;
    00306     PString AsHex(PMessageDigest5::Code & digest) const;
    00307     PString AsHex(const PBYTEArray & data) const;
    00308
    00309     static PHTTPClientAuthentication * ParseAuthenticationRequired(bool isProxy, const PMIMEInfo & line, PString & errorMsg);
    00310
    00311
    00312   protected:
    00313     PBoolean  isProxy;
    00314     PString   username;
    00315     PString   password;
    00316 };
    00317
    00318 typedef PFactory<PHTTPClientAuthentication> PHTTPClientAuthenticationFactory;
    00319
    00320 class PHTTPClientAuthenticator : public PHTTPClientAuthentication::AuthObject
    00321 {
    00322   public:
    00323     PHTTPClientAuthenticator(
    00324       const PString & cmdName,
    00325       const PString & uri,
    00326       PMIMEInfo & mime,
    00327       const PString & body
    00328     );
    00329     virtual PMIMEInfo & GetMIME();
    00330     virtual PString GetURI();
    00331     virtual PString GetEntityBody();
    00332     virtual PString GetMethod();
    00333   protected:
    00334     PString m_method;
    00335     PString m_uri;
    00336     PMIMEInfo & m_mime;
    00337     PString m_body;
    00338 };
    00339
    00341
    00342 class PHTTPClientBasicAuthentication : public PHTTPClientAuthentication
    00343 {
    00344   PCLASSINFO(PHTTPClientBasicAuthentication, PHTTPClientAuthentication);
    00345   public:
    00346     PHTTPClientBasicAuthentication();
    00347
    00348     virtual Comparison Compare(
    00349       const PObject & other
    00350     ) const;
    00351
    00352     virtual PBoolean Parse(
    00353       const PString & auth,
    00354       PBoolean proxy
    00355     );
    00356
    00357     virtual PBoolean Authorise(
    00358       AuthObject & pdu
    00359     ) const;
    00360 };
    00361
    00363
    00364 class PHTTPClientDigestAuthentication : public PHTTPClientAuthentication
    00365 {
    00366   PCLASSINFO(PHTTPClientDigestAuthentication, PHTTPClientAuthentication);
    00367   public:
    00368     PHTTPClientDigestAuthentication();
    00369
    00370     PHTTPClientDigestAuthentication & operator =(
    00371       const PHTTPClientDigestAuthentication & auth
    00372     );
    00373
    00374     virtual Comparison Compare(
    00375       const PObject & other
    00376     ) const;
    00377
    00378     virtual PBoolean Parse(
    00379       const PString & auth,
    00380       PBoolean proxy
    00381     );
    00382
    00383     virtual PBoolean Authorise(
    00384       AuthObject & pdu
    00385     ) const;
    00386
    00387     virtual PString GetAuthRealm() const         { return authRealm; }
    00388     virtual void SetAuthRealm(const PString & r) { authRealm = r; }
    00389
    00390     enum Algorithm {
    00391       Algorithm_MD5,
    00392       NumAlgorithms
    00393     };
    00394     const PString & GetNonce() const       { return nonce; }
    00395     Algorithm GetAlgorithm() const         { return algorithm; }
    00396     const PString & GetOpaque() const      { return opaque; }
    00397     bool GetStale() const                  { return stale; }
    00398
    00399   protected:
    00400     PString   authRealm;
    00401     PString   nonce;
    00402     Algorithm algorithm;
    00403     PString   opaque;
    00404
    00405     bool    qopAuth;
    00406     bool    qopAuthInt;
    00407     bool    stale;
    00408     PString cnonce;
    00409     mutable PAtomicInteger nonceCount;
    00410 };
    00411
    00412
    00414 // PHTTPClient
    00415
    00436 class PHTTPClient : public PHTTP
    00437 {
    00438   PCLASSINFO(PHTTPClient, PHTTP)
    00439
    00440   public:
    00442     PHTTPClient(
    00443       const PString & userAgentName = PString::Empty()
    00444     );
    00445
    00446
    00447   // New functions for class.
    00455     int ExecuteCommand(
    00456       Commands cmd,
    00457       const PURL & url,
    00458       PMIMEInfo & outMIME,
    00459       const PString & dataBody,
    00460       PMIMEInfo & replyMime
    00461     );
    00462     int ExecuteCommand(
    00463       const PString & cmdName,
    00464       const PURL & url,
    00465       PMIMEInfo & outMIME,
    00466       const PString & dataBody,
    00467       PMIMEInfo & replyMime
    00468     );
    00469
    00471     bool WriteCommand(
    00472       Commands cmd,
    00473       const PString & url,
    00474       PMIMEInfo & outMIME,
    00475       const PString & dataBody
    00476     );
    00477     bool WriteCommand(
    00478       const PString & cmdName,
    00479       const PString & url,
    00480       PMIMEInfo & outMIME,
    00481       const PString & dataBody
    00482     );
    00483
    00485     bool ReadResponse(
    00486       PMIMEInfo & replyMIME
    00487     );
    00488
    00490     bool ReadContentBody(
    00491       PMIMEInfo & replyMIME
    00492     );
    00493
    00495     bool ReadContentBody(
    00496       PMIMEInfo & replyMIME,
    00497       PString & body
    00498     );
    00499
    00501     bool ReadContentBody(
    00502       PMIMEInfo & replyMIME,
    00503       PBYTEArray & body
    00504     );
    00505
    00506
    00513     bool GetDocument(
    00514       const PURL & url,
    00515       PMIMEInfo & outMIME,
    00516       PMIMEInfo & replyMIME
    00517     );
    00518     bool GetDocument(
    00519       const PURL & url,
    00520       PMIMEInfo & replyMIME
    00521     );
    00522
    00530     bool GetTextDocument(
    00531       const PURL & url,
    00532       PString & document,
    00533       const PString & contentType = PString::Empty()
    00534     );
    00535
    00541     bool GetHeader(
    00542       const PURL & url,
    00543       PMIMEInfo & outMIME,
    00544       PMIMEInfo & replyMIME
    00545     );
    00546
    00547
    00553     bool PostData(
    00554       const PURL & url,
    00555       const PStringToString & data
    00556     );
    00557
    00563     bool PostData(
    00564       const PURL & url,
    00565       PMIMEInfo & outMIME,
    00566       const PString & data
    00567     );
    00568
    00575     bool PostData(
    00576       const PURL & url,
    00577       PMIMEInfo & outMIME,
    00578       const PString & data,
    00579       PMIMEInfo & replyMIME
    00580     );
    00581
    00587     bool PostData(
    00588       const PURL & url,
    00589       PMIMEInfo & outMIME,
    00590       const PString & data,
    00591       PMIMEInfo & replyMIME,
    00592       PString & replyBody
    00593     );
    00594
    00600     bool PutTextDocument(
    00601       const PURL & url,
    00602       const PString & document,
    00603       const PString & contentType = PMIMEInfo::TextPlain()
    00604     );
    00605
    00611     bool PutDocument(
    00612       const PURL & url,
    00613       PMIMEInfo & outMIME,
    00614       PMIMEInfo & replyMIME
    00615     );
    00616
    00622     bool DeleteDocument(
    00623       const PURL & url
    00624     );
    00625
    00628     void SetAuthenticationInfo(
    00629       const PString & userName,
    00630       const PString & password
    00631     );
    00632
    00634     void SetPersistent(
    00635       bool persist = true
    00636     ) { m_persist = persist; }
    00637
    00639     bool GetPersistent() const { return m_persist; }
    00640
    00641   protected:
    00642     bool AssureConnect(const PURL & url, PMIMEInfo & outMIME);
    00643     bool InternalReadContentBody(
    00644       PMIMEInfo & replyMIME,
    00645       PAbstractArray * body
    00646     );
    00647
    00648     PString m_userAgentName;
    00649     bool    m_persist;
    00650     PString m_userName;
    00651     PString m_password;
    00652     PHTTPClientAuthentication * m_authentication;
    00653 };
    00654
    00655
    00657 // PHTTPConnectionInfo
    00658
    00659 class PHTTPServer;
    00660
    00665 class PHTTPConnectionInfo : public PObject
    00666 {
    00667   PCLASSINFO(PHTTPConnectionInfo, PObject)
    00668   public:
    00669     PHTTPConnectionInfo();
    00670
    00671     PHTTP::Commands GetCommandCode() const { return commandCode; }
    00672     const PString & GetCommandName() const { return commandName; }
    00673
    00674     const PURL & GetURL() const       { return url; }
    00675
    00676     const PMIMEInfo & GetMIME() const { return mimeInfo; }
    00677     void SetMIME(const PString & tag, const PString & value);
    00678
    00679     PBoolean IsCompatible(int major, int minor) const;
    00680
    00681     bool IsPersistent() const         { return isPersistent; }
    00682     bool WasPersistent() const        { return wasPersistent; }
    00683     bool IsProxyConnection() const    { return isProxyConnection; }
    00684     int  GetMajorVersion() const      { return majorVersion; }
    00685     int  GetMinorVersion() const      { return minorVersion; }
    00686
    00687     long GetEntityBodyLength() const  { return entityBodyLength; }
    00688
    00691     PTimeInterval GetPersistenceTimeout() const { return persistenceTimeout; }
    00692
    00695     void SetPersistenceTimeout(const PTimeInterval & t) { persistenceTimeout = t; }
    00696
    00700     unsigned GetPersistenceMaximumTransations() const { return persistenceMaximum; }
    00701
    00705     void SetPersistenceMaximumTransations(unsigned m) { persistenceMaximum = m; }
    00706
    00707     const PMultiPartList & GetMultipartFormInfo() const
    00708       { return m_multipartFormInfo; }
    00709
    00710     void ResetMultipartFormInfo()
    00711       { m_multipartFormInfo.RemoveAll(); }
    00712
    00713     PString GetEntityBody() const   { return entityBody; }
    00714
    00715   protected:
    00716     PBoolean Initialise(PHTTPServer & server, PString & args);
    00717     bool DecodeMultipartFormInfo() { return mimeInfo.DecodeMultiPartList(m_multipartFormInfo, entityBody); }
    00718
    00719     PHTTP::Commands commandCode;
    00720     PString         commandName;
    00721     PURL            url;
    00722     PMIMEInfo       mimeInfo;
    00723     bool            isPersistent;
    00724     bool            wasPersistent;
    00725     bool            isProxyConnection;
    00726     int             majorVersion;
    00727     int             minorVersion;
    00728     PString         entityBody;        // original entity body (POST only)
    00729     long            entityBodyLength;
    00730     PTimeInterval   persistenceTimeout;
    00731     unsigned        persistenceMaximum;
    00732     PMultiPartList  m_multipartFormInfo;
    00733
    00734   friend class PHTTPServer;
    00735 };
    00736
    00737
    00739 // PHTTPServer
    00740
    00762 class PHTTPServer : public PHTTP
    00763 {
    00764   PCLASSINFO(PHTTPServer, PHTTP)
    00765
    00766   public:
    00774     PHTTPServer();
    00775     PHTTPServer(
    00776      const PHTTPSpace & urlSpace
    00777     );
    00778
    00779
    00780   // New functions for class.
    00786     virtual PString GetServerName() const;
    00787
    00793     PHTTPSpace & GetURLSpace() { return urlSpace; }
    00794
    00796     void SetURLSpace(
    00797       const PHTTPSpace & space
    00798     );
    00799
    00800
    00810     virtual PBoolean ProcessCommand();
    00811
    00823     virtual PBoolean OnGET(
    00824       const PURL & url,
    00825       const PMIMEInfo & info,
    00826       const PHTTPConnectionInfo & conInfo
    00827     );
    00828
    00829
    00830
    00842     virtual PBoolean OnHEAD(
    00843       const PURL & url,
    00844       const PMIMEInfo & info,
    00845       const PHTTPConnectionInfo & conInfo
    00846     );
    00847
    00859     virtual PBoolean OnPOST(
    00860       const PURL & url,
    00861       const PMIMEInfo & info,
    00862       const PStringToString & data,
    00863       const PHTTPConnectionInfo & conInfo
    00864     );
    00865
    00878     virtual PBoolean OnProxy(
    00879       const PHTTPConnectionInfo & conInfo
    00880     );
    00881
    00882
    00889     virtual PString ReadEntityBody();
    00890
    00896     virtual PBoolean OnUnknown(
    00897       const PCaselessString & command,
    00898       const PHTTPConnectionInfo & connectInfo
    00899     );
    00900
    00919     PBoolean StartResponse(
    00920       StatusCode code,
    00921       PMIMEInfo & headers,
    00922       long bodySize
    00923     );
    00924
    00934     virtual PBoolean OnError(
    00935       StatusCode code,
    00936       const PCaselessString & extra,
    00937       const PHTTPConnectionInfo & connectInfo
    00938     );
    00939
    00942     void SetDefaultMIMEInfo(
    00943       PMIMEInfo & info,
    00944       const PHTTPConnectionInfo & connectInfo
    00945     );
    00946
    00949     PHTTPConnectionInfo & GetConnectionInfo() { return connectInfo; }
    00950
    00951   protected:
    00952     void Construct();
    00953
    00954     PHTTPSpace          urlSpace;
    00955     PHTTPConnectionInfo connectInfo;
    00956     unsigned            transactionCount;
    00957     PTimeInterval       nextTimeout;
    00958 };
    00959
    00960
    00962 // PHTTPRequest
    00963
    00968 class PHTTPRequest : public PObject
    00969 {
    00970   PCLASSINFO(PHTTPRequest, PObject)
    00971
    00972   public:
    00973     PHTTPRequest(
    00974       const PURL & url,
    00975       const PMIMEInfo & inMIME,
    00976       const PMultiPartList & multipartFormInfo,
    00977       PHTTPResource * resource,
    00978       PHTTPServer & server
    00979     );
    00980
    00981     PHTTPServer & server;
    00982     const PURL & url;
    00983     const PMIMEInfo & inMIME;
    00984     const PMultiPartList & multipartFormInfo;
    00985     PHTTP::StatusCode code;
    00986     PMIMEInfo outMIME;
    00987     PString entityBody;
    00988     PINDEX contentSize;
    00989     PIPSocket::Address origin;
    00990     PIPSocket::Address localAddr;
    00991     WORD               localPort;
    00992     PHTTPResource    * m_resource;
    00993 };
    00994
    00995
    00997 // PHTTPAuthority
    00998
    01002 class PHTTPAuthority : public PObject
    01003 {
    01004   PCLASSINFO(PHTTPAuthority, PObject)
    01005
    01006   public:
    01007   // New functions for class.
    01014     virtual PString GetRealm(
    01015       const PHTTPRequest & request
    01016     ) const = 0;
    01017
    01024     virtual PBoolean Validate(
    01025       const PHTTPRequest & request,
    01026       const PString & authInfo
    01027     ) const = 0;
    01028
    01038     virtual PBoolean IsActive() const;
    01039
    01040   protected:
    01041     static void DecodeBasicAuthority(
    01042       const PString & authInfo,
    01043       PString & username,
    01044       PString & password
    01045     );
    01046 };
    01047
    01048
    01050 // PHTTPSimpleAuth
    01051
    01055 class PHTTPSimpleAuth : public PHTTPAuthority
    01056 {
    01057   PCLASSINFO(PHTTPSimpleAuth, PHTTPAuthority)
    01058
    01059   public:
    01060     PHTTPSimpleAuth(
    01061       const PString & realm,
    01062       const PString & username,
    01063       const PString & password
    01064     );
    01065     // Construct the simple authorisation structure.
    01066
    01067
    01068   // Overrides from class PObject.
    01076     virtual PObject * Clone() const;
    01077
    01078
    01079   // Overrides from class PHTTPAuthority.
    01086     virtual PString GetRealm(
    01087       const PHTTPRequest & request
    01088     ) const;
    01089
    01096     virtual PBoolean Validate(
    01097       const PHTTPRequest & request,
    01098       const PString & authInfo
    01099     ) const;
    01100
    01110     virtual PBoolean IsActive() const;
    01111
    01117     const PString & GetUserName() const { return username; }
    01118
    01124     const PString & GetPassword() const { return password; }
    01125
    01126
    01127   protected:
    01128     PString realm;
    01129     PString username;
    01130     PString password;
    01131 };
    01132
    01133
    01135 // PHTTPMultiSimpAuth
    01136
    01140 class PHTTPMultiSimpAuth : public PHTTPAuthority
    01141 {
    01142   PCLASSINFO(PHTTPMultiSimpAuth, PHTTPAuthority)
    01143
    01144   public:
    01145     PHTTPMultiSimpAuth(
    01146       const PString & realm
    01147     );
    01148     PHTTPMultiSimpAuth(
    01149       const PString & realm,
    01150       const PStringToString & userList
    01151     );
    01152     // Construct the simple authorisation structure.
    01153
    01154
    01155   // Overrides from class PObject.
    01163     virtual PObject * Clone() const;
    01164
    01165
    01166   // Overrides from class PHTTPAuthority.
    01173     virtual PString GetRealm(
    01174       const PHTTPRequest & request
    01175     ) const;
    01176
    01183     virtual PBoolean Validate(
    01184       const PHTTPRequest & request,
    01185       const PString & authInfo
    01186     ) const;
    01187
    01197     virtual PBoolean IsActive() const;
    01198
    01204     void AddUser(
    01205       const PString & username,
    01206       const PString & password
    01207     );
    01208
    01209
    01210   protected:
    01211     PString realm;
    01212     PStringToString users;
    01213 };
    01214
    01215
    01217 // PHTTPResource
    01218
    01222 class PHTTPResource : public PObject
    01223 {
    01224   PCLASSINFO(PHTTPResource, PObject)
    01225
    01226   protected:
    01227     PHTTPResource(
    01228       const PURL & url
    01229     );
    01230     PHTTPResource(
    01231       const PURL & url,
    01232       const PHTTPAuthority & auth
    01233     );
    01234     PHTTPResource(
    01235       const PURL & url,
    01236       const PString & contentType
    01237     );
    01238     PHTTPResource(
    01239       const PURL & url,
    01240       const PString & contentType,
    01241       const PHTTPAuthority & auth
    01242     );
    01243     // Create a new HTTP Resource.
    01244
    01245
    01246   public:
    01247     virtual ~PHTTPResource();
    01248     // Destroy the HTTP Resource.
    01249
    01250
    01251   // New functions for class.
    01257     const PURL & GetURL() const { return baseURL; }
    01258
    01264     const PString & GetContentType() const { return contentType; }
    01265
    01272     PHTTPAuthority * GetAuthority() const { return authority; }
    01273
    01276     void SetAuthority(
    01277       const PHTTPAuthority & auth
    01278     );
    01279
    01282     void ClearAuthority();
    01283
    01290     DWORD GetHitCount() const { return hitCount; }
    01291
    01292     void ClearHitCount() { hitCount = 0; }
    01293     // Clear the hit count for the resource.
    01294
    01295
    01307     virtual PBoolean OnGET(
    01308       PHTTPServer & server,
    01309       const PURL & url,
    01310       const PMIMEInfo & info,
    01311       const PHTTPConnectionInfo & conInfo
    01312     );
    01313
    01323     virtual PBoolean OnGETData(
    01324       PHTTPServer & server,
    01325       const PURL & url,
    01326       const PHTTPConnectionInfo & connectInfo,
    01327       PHTTPRequest & request
    01328     );
    01329
    01341     virtual PBoolean OnHEAD(
    01342       PHTTPServer & server,
    01343       const PURL & url,
    01344       const PMIMEInfo & info,
    01345       const PHTTPConnectionInfo & conInfo
    01346     );
    01347
    01359     virtual PBoolean OnPOST(
    01360       PHTTPServer & server,
    01361       const PURL & url,
    01362       const PMIMEInfo & info,
    01363       const PStringToString & data,
    01364       const PHTTPConnectionInfo & conInfo
    01365     );
    01366
    01376     virtual PBoolean OnPOSTData(
    01377       PHTTPRequest & request,
    01378       const PStringToString & data
    01379     );
    01380
    01387     virtual PBoolean IsModifiedSince(
    01388       const PTime & when
    01389     );
    01390
    01396     virtual PBoolean GetExpirationDate(
    01397       PTime & when
    01398     );
    01399
    01407     virtual PHTTPRequest * CreateRequest(
    01408       const PURL & url,
    01409       const PMIMEInfo & inMIME,
    01410       const PMultiPartList & multipartFormInfo,
    01411       PHTTPServer & socket
    01412     );
    01413
    01421     virtual PBoolean LoadHeaders(
    01422       PHTTPRequest & request
    01423     ) = 0;
    01424
    01430     virtual void SendData(
    01431       PHTTPRequest & request
    01432     );
    01433
    01442     virtual PBoolean LoadData(
    01443       PHTTPRequest & request,
    01444       PCharArray & data
    01445     );
    01446
    01455     virtual PString LoadText(
    01456       PHTTPRequest & request
    01457     );
    01458
    01465     virtual void OnLoadedText(
    01466       PHTTPRequest & request,
    01467       PString & text
    01468     );
    01469
    01478     virtual PBoolean Post(
    01479       PHTTPRequest & request,
    01480       const PStringToString & data,
    01481       PHTML & replyMessage
    01482     );
    01483
    01484
    01485   protected:
    01488     virtual PBoolean CheckAuthority(
    01489       PHTTPServer & server,
    01490       const PHTTPRequest & request,
    01491       const PHTTPConnectionInfo & conInfo
    01492     );
    01493     static PBoolean CheckAuthority(
    01494                    PHTTPAuthority & authority,
    01495                       PHTTPServer & server,
    01496                const PHTTPRequest & request,
    01497         const PHTTPConnectionInfo & connectInfo
    01498     );
    01499
    01500
    01502     virtual PBoolean OnGETOrHEAD(
    01503       PHTTPServer & server,
    01504       const PURL & url,
    01505       const PMIMEInfo & info,
    01506       const PHTTPConnectionInfo & conInfo,
    01507       PBoolean isGet
    01508     );
    01509
    01510
    01511     PURL             baseURL;
    01512     PString          contentType;
    01513     PHTTPAuthority * authority;
    01514     volatile DWORD   hitCount;
    01515 };
    01516
    01517
    01519 // PHTTPString
    01520
    01525 class PHTTPString : public PHTTPResource
    01526 {
    01527   PCLASSINFO(PHTTPString, PHTTPResource)
    01528
    01529   public:
    01533     PHTTPString(
    01534       const PURL & url             // Name of the resource in URL space.
    01535     );
    01536     PHTTPString(
    01537       const PURL & url,            // Name of the resource in URL space.
    01538       const PHTTPAuthority & auth  // Authorisation for the resource.
    01539     );
    01540     PHTTPString(
    01541       const PURL & url,            // Name of the resource in URL space.
    01542       const PString & str          // String to return in this resource.
    01543     );
    01544     PHTTPString(
    01545       const PURL & url,            // Name of the resource in URL space.
    01546       const PString & str,         // String to return in this resource.
    01547       const PString & contentType  // MIME content type for the file.
    01548     );
    01549     PHTTPString(
    01550       const PURL & url,            // Name of the resource in URL space.
    01551       const PString & str,         // String to return in this resource.
    01552       const PHTTPAuthority & auth  // Authorisation for the resource.
    01553     );
    01554     PHTTPString(
    01555       const PURL & url,            // Name of the resource in URL space.
    01556       const PString & str,         // String to return in this resource.
    01557       const PString & contentType, // MIME content type for the file.
    01558       const PHTTPAuthority & auth  // Authorisation for the resource.
    01559     );
    01560
    01561
    01562   // Overrides from class PHTTPResource
    01570     virtual PBoolean LoadHeaders(
    01571       PHTTPRequest & request    // Information on this request.
    01572     );
    01573
    01582     virtual PString LoadText(
    01583       PHTTPRequest & request    // Information on this request.
    01584     );
    01585
    01586   // New functions for class.
    01592     const PString & GetString() { return string; }
    01593
    01596     void SetString(
    01597       const PString & str   // New string for the resource.
    01598     ) { string = str; }
    01599
    01600
    01601   protected:
    01602     PString string;
    01603 };
    01604
    01605
    01607 // PHTTPFile
    01608
    01614 class PHTTPFile : public PHTTPResource
    01615 {
    01616   PCLASSINFO(PHTTPFile, PHTTPResource)
    01617
    01618   public:
    01625     PHTTPFile(
    01626       const PString & filename     // file in file system and URL name.
    01627     );
    01628     PHTTPFile(
    01629       const PString & filename,    // file in file system and URL name.
    01630       const PHTTPAuthority & auth  // Authorisation for the resource.
    01631     );
    01632     PHTTPFile(
    01633       const PURL & url,            // Name of the resource in URL space.
    01634       const PFilePath & file       // Location of file in file system.
    01635     );
    01636     PHTTPFile(
    01637       const PURL & url,            // Name of the resource in URL space.
    01638       const PFilePath & file,      // Location of file in file system.
    01639       const PString & contentType  // MIME content type for the file.
    01640     );
    01641     PHTTPFile(
    01642       const PURL & url,            // Name of the resource in URL space.
    01643       const PFilePath & file,      // Location of file in file system.
    01644       const PHTTPAuthority & auth  // Authorisation for the resource.
    01645     );
    01646     PHTTPFile(
    01647       const PURL & url,            // Name of the resource in URL space.
    01648       const PFilePath & file,      // Location of file in file system.
    01649       const PString & contentType, // MIME content type for the file.
    01650       const PHTTPAuthority & auth  // Authorisation for the resource.
    01651     );
    01652
    01653
    01654   // Overrides from class PHTTPResource
    01660     virtual PHTTPRequest * CreateRequest(
    01661       const PURL & url,                  // Universal Resource Locator for document.
    01662       const PMIMEInfo & inMIME,          // Extra MIME information in command.
    01663       const PMultiPartList & multipartFormInfo,
    01664       PHTTPServer & socket
    01665     );
    01666
    01674     virtual PBoolean LoadHeaders(
    01675       PHTTPRequest & request    // Information on this request.
    01676     );
    01677
    01683     virtual PBoolean LoadData(
    01684       PHTTPRequest & request,    // Information on this request.
    01685       PCharArray & data          // Data used in reply.
    01686     );
    01687
    01696     virtual PString LoadText(
    01697       PHTTPRequest & request    // Information on this request.
    01698     );
    01699
    01700
    01701   protected:
    01702     PHTTPFile(
    01703       const PURL & url,       // Name of the resource in URL space.
    01704       int dummy
    01705     );
    01706     // Constructor used by PHTTPDirectory
    01707
    01708
    01709     PFilePath filePath;
    01710 };
    01711
    01712
    01713 class PHTTPFileRequest : public PHTTPRequest
    01714 {
    01715   PCLASSINFO(PHTTPFileRequest, PHTTPRequest)
    01716   public:
    01717     PHTTPFileRequest(
    01718       const PURL & url,             // Universal Resource Locator for document.
    01719       const PMIMEInfo & inMIME,     // Extra MIME information in command.
    01720       const PMultiPartList & multipartFormInfo,
    01721       PHTTPResource * resource,
    01722       PHTTPServer & server
    01723     );
    01724
    01725     PFile file;
    01726 };
    01727
    01728
    01730 // PHTTPTailFile
    01731
    01740 class PHTTPTailFile : public PHTTPFile
    01741 {
    01742   PCLASSINFO(PHTTPTailFile, PHTTPFile)
    01743
    01744   public:
    01751     PHTTPTailFile(
    01752       const PString & filename     // file in file system and URL name.
    01753     );
    01754     PHTTPTailFile(
    01755       const PString & filename,    // file in file system and URL name.
    01756       const PHTTPAuthority & auth  // Authorisation for the resource.
    01757     );
    01758     PHTTPTailFile(
    01759       const PURL & url,            // Name of the resource in URL space.
    01760       const PFilePath & file       // Location of file in file system.
    01761     );
    01762     PHTTPTailFile(
    01763       const PURL & url,            // Name of the resource in URL space.
    01764       const PFilePath & file,      // Location of file in file system.
    01765       const PString & contentType  // MIME content type for the file.
    01766     );
    01767     PHTTPTailFile(
    01768       const PURL & url,            // Name of the resource in URL space.
    01769       const PFilePath & file,      // Location of file in file system.
    01770       const PHTTPAuthority & auth  // Authorisation for the resource.
    01771     );
    01772     PHTTPTailFile(
    01773       const PURL & url,            // Name of the resource in URL space.
    01774       const PFilePath & file,      // Location of file in file system.
    01775       const PString & contentType, // MIME content type for the file.
    01776       const PHTTPAuthority & auth  // Authorisation for the resource.
    01777     );
    01778
    01779
    01780   // Overrides from class PHTTPResource
    01788     virtual PBoolean LoadHeaders(
    01789       PHTTPRequest & request    // Information on this request.
    01790     );
    01791
    01797     virtual PBoolean LoadData(
    01798       PHTTPRequest & request,    // Information on this request.
    01799       PCharArray & data          // Data used in reply.
    01800     );
    01801 };
    01802
    01803
    01805 // PHTTPDirectory
    01806
    01819 class PHTTPDirectory : public PHTTPFile
    01820 {
    01821   PCLASSINFO(PHTTPDirectory, PHTTPFile)
    01822
    01823   public:
    01824     PHTTPDirectory(
    01825       const PURL & url,
    01826       const PDirectory & dir
    01827     );
    01828     PHTTPDirectory(
    01829       const PURL & url,
    01830       const PDirectory & dir,
    01831       const PHTTPAuthority & auth
    01832     );
    01833     // Construct a new directory resource for HTTP.
    01834
    01835
    01836   // Overrides from class PHTTPResource
    01842     virtual PHTTPRequest * CreateRequest(
    01843       const PURL & url,                  // Universal Resource Locator for document.
    01844       const PMIMEInfo & inMIME,          // Extra MIME information in command.
    01845       const PMultiPartList & multipartFormInfo,
    01846       PHTTPServer & socket
    01847     );
    01848
    01856     virtual PBoolean LoadHeaders(
    01857       PHTTPRequest & request
    01858     );
    01859
    01868     virtual PString LoadText(
    01869       PHTTPRequest & request
    01870     );
    01871
    01880     void EnableAuthorisation(const PString & realm);
    01881
    01884     void AllowDirectories(PBoolean enable = true);
    01885
    01886   protected:
    01887     PBoolean CheckAuthority(
    01888       PHTTPServer & server,               // Server to send response to.
    01889       const PHTTPRequest & request,       // Information on this request.
    01890       const PHTTPConnectionInfo & conInfo // Information on the connection
    01891     );
    01892
    01893     PBoolean FindAuthorisations(const PDirectory & dir, PString & realm, PStringToString & authorisations);
    01894
    01895     PDirectory basePath;
    01896     PString authorisationRealm;
    01897     PBoolean allowDirectoryListing;
    01898 };
    01899
    01900
    01901 class PHTTPDirRequest : public PHTTPFileRequest
    01902 {
    01903   PCLASSINFO(PHTTPDirRequest, PHTTPFileRequest)
    01904   public:
    01905     PHTTPDirRequest(
    01906       const PURL & url,             // Universal Resource Locator for document.
    01907       const PMIMEInfo & inMIME,     // Extra MIME information in command.
    01908       const PMultiPartList & multipartFormInfo,
    01909       PHTTPResource * resource,
    01910       PHTTPServer & server
    01911     );
    01912
    01913     PString fakeIndex;
    01914     PFilePath realPath;
    01915 };
    01916
    01917
    01918 PFACTORY_LOAD(PURL_HttpLoader);
    01919
    01920
    01921 #endif // P_HTTP
    01922
    01923 #endif // PTLIB_HTTP_H
    01924
    01925
    01926 // End Of File ///////////////////////////////////////////////////////////////