00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef _PHTTP_H
00032 #define _PHTTP_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
00045
00046 #include <ptclib/html.h>
00047
00049
00050
00051 class PHTTPResource;
00052
00057 class PHTTPSpace : public PContainer
00058 {
00059 PCONTAINERINFO(PHTTPSpace, PContainer)
00060 public:
00062 PHTTPSpace();
00063
00064
00065
00066 enum AddOptions {
00068 ErrorOnExist,
00070 Overwrite
00071 };
00072
00073
00085 PBoolean AddResource(
00086 PHTTPResource * resource,
00087 AddOptions overwrite = ErrorOnExist
00089 );
00090
00098 PBoolean DelResource(
00099 const PURL & url
00100 );
00101
00107 PHTTPResource * FindResource(
00108 const PURL & url
00109 );
00110
00113 void StartRead() const
00114 { mutex->StartRead(); }
00115
00118 void EndRead() const
00119 { mutex->EndRead(); }
00120
00123 void StartWrite() const
00124 { mutex->StartWrite(); }
00125
00128 void EndWrite() const
00129 { mutex->EndWrite(); }
00130
00131
00132 protected:
00133 PReadWriteMutex * mutex;
00134
00135 class Node;
00136 PSORTED_LIST(ChildList, Node);
00137 class Node : public PString
00138 {
00139 PCLASSINFO(Node, PString)
00140 public:
00141 Node(const PString & name, Node * parentNode);
00142 ~Node();
00143
00144 Node * parent;
00145 ChildList children;
00146 PHTTPResource * resource;
00147 } * root;
00148
00149 private:
00150 PBoolean SetSize(PINDEX) { return PFalse; }
00151 };
00152
00153 #ifdef _WIN32_WCE
00154 #undef TRACE
00155 #endif
00156
00158
00159
00163 class PHTTP : public PInternetProtocol
00164 {
00165 PCLASSINFO(PHTTP, PInternetProtocol)
00166
00167 public:
00168
00169 enum Commands {
00170
00171 GET, HEAD, POST,
00172
00173 PUT, DELETE, TRACE, OPTIONS,
00174
00175 CONNECT,
00176 NumCommands
00177 };
00178
00179 enum StatusCode {
00180 Continue = 100,
00181 SwitchingProtocols,
00182 RequestOK = 200,
00183 Created,
00184 Accepted,
00185 NonAuthoritativeInformation,
00186 NoContent,
00187 ResetContent,
00188 PartialContent,
00189 MultipleChoices = 300,
00190 MovedPermanently,
00191 MovedTemporarily,
00192 SeeOther,
00193 NotModified,
00194 UseProxy,
00195 BadRequest = 400,
00196 UnAuthorised,
00197 PaymentRequired,
00198 Forbidden,
00199 NotFound,
00200 MethodNotAllowed,
00201 NoneAcceptable,
00202 ProxyAuthenticationRequired,
00203 RequestTimeout,
00204 Conflict,
00205 Gone,
00206 LengthRequired,
00207 UnlessTrue,
00208 InternalServerError = 500,
00209 NotImplemented,
00210 BadGateway,
00211 ServiceUnavailable,
00212 GatewayTimeout
00213 };
00214
00215
00216 static const PString & AllowTag();
00217 static const PString & AuthorizationTag();
00218 static const PString & ContentEncodingTag();
00219 static const PString & ContentLengthTag();
00220 static const PString & ContentTypeTag();
00221 static const PString & DateTag();
00222 static const PString & ExpiresTag();
00223 static const PString & FromTag();
00224 static const PString & IfModifiedSinceTag();
00225 static const PString & LastModifiedTag();
00226 static const PString & LocationTag();
00227 static const PString & PragmaTag();
00228 static const PString & PragmaNoCacheTag();
00229 static const PString & RefererTag();
00230 static const PString & ServerTag();
00231 static const PString & UserAgentTag();
00232 static const PString & WWWAuthenticateTag();
00233 static const PString & MIMEVersionTag();
00234 static const PString & ConnectionTag();
00235 static const PString & KeepAliveTag();
00236 static const PString & TransferEncodingTag();
00237 static const PString & ChunkedTag();
00238 static const PString & ProxyConnectionTag();
00239 static const PString & ProxyAuthorizationTag();
00240 static const PString & ProxyAuthenticateTag();
00241 static const PString & ForwardedTag();
00242 static const PString & SetCookieTag();
00243 static const PString & CookieTag();
00244
00245 protected:
00248 PHTTP();
00249
00261 virtual PINDEX ParseResponse(
00262 const PString & line
00263 );
00264 };
00265
00266
00268
00269
00290 class PHTTPClient : public PHTTP
00291 {
00292 PCLASSINFO(PHTTPClient, PHTTP)
00293
00294 public:
00296 PHTTPClient();
00297 PHTTPClient(
00298 const PString & userAgentName
00299 );
00300
00301
00302
00310 int ExecuteCommand(
00311 Commands cmd,
00312 const PURL & url,
00313 PMIMEInfo & outMIME,
00314 const PString & dataBody,
00315 PMIMEInfo & replyMime,
00316 PBoolean persist = PTrue
00317 );
00318 int ExecuteCommand(
00319 const PString & cmdName,
00320 const PURL & url,
00321 PMIMEInfo & outMIME,
00322 const PString & dataBody,
00323 PMIMEInfo & replyMime,
00324 PBoolean persist = PTrue
00325 );
00326
00328 PBoolean WriteCommand(
00329 Commands cmd,
00330 const PString & url,
00331 PMIMEInfo & outMIME,
00332 const PString & dataBody
00333 );
00334 PBoolean WriteCommand(
00335 const PString & cmdName,
00336 const PString & url,
00337 PMIMEInfo & outMIME,
00338 const PString & dataBody
00339 );
00340
00342 PBoolean ReadResponse(
00343 PMIMEInfo & replyMIME
00344 );
00345
00347 PBoolean ReadContentBody(
00348 PMIMEInfo & replyMIME,
00349 PBYTEArray & body
00350 );
00351 PBoolean ReadContentBody(
00352 PMIMEInfo & replyMIME,
00353 PString & body
00354 );
00355
00356
00362 PBoolean GetTextDocument(
00363 const PURL & url,
00364 PString & document,
00365 PBoolean persist = PTrue
00366 );
00367
00373 PBoolean GetDocument(
00374 const PURL & url,
00375 PMIMEInfo & outMIME,
00376 PMIMEInfo & replyMIME,
00377 PBoolean persist = PTrue
00378 );
00379
00385 PBoolean GetHeader(
00386 const PURL & url,
00387 PMIMEInfo & outMIME,
00388 PMIMEInfo & replyMIME,
00389 PBoolean persist = PTrue
00390 );
00391
00392
00398 PBoolean PostData(
00399 const PURL & url,
00400 PMIMEInfo & outMIME,
00401 const PString & data,
00402 PMIMEInfo & replyMIME,
00403 PBoolean persist = PTrue
00404 );
00405
00411 PBoolean PostData(
00412 const PURL & url,
00413 PMIMEInfo & outMIME,
00414 const PString & data,
00415 PMIMEInfo & replyMIME,
00416 PString & replyBody,
00417 PBoolean persist = PTrue
00418 );
00419
00420 protected:
00421 PBoolean AssureConnect(const PURL & url, PMIMEInfo & outMIME);
00422 PBoolean InternalReadContentBody(
00423 PMIMEInfo & replyMIME,
00424 PAbstractArray & body
00425 );
00426
00427 PString userAgentName;
00428 };
00429
00431
00432
00437 class PMultipartFormInfo : public PObject
00438 {
00439 PCLASSINFO(PMultipartFormInfo, PObject);
00440 public:
00441 PMIMEInfo mime;
00442 PString body;
00443 };
00444
00445 PARRAY(PMultipartFormInfoArray, PMultipartFormInfo);
00446
00448
00449
00450 class PHTTPServer;
00451
00456 class PHTTPConnectionInfo : public PObject
00457 {
00458 PCLASSINFO(PHTTPConnectionInfo, PObject)
00459 public:
00460 PHTTPConnectionInfo();
00461
00462 PHTTP::Commands GetCommandCode() const { return commandCode; }
00463 const PString & GetCommandName() const { return commandName; }
00464
00465 const PURL & GetURL() const { return url; }
00466
00467 const PMIMEInfo & GetMIME() const { return mimeInfo; }
00468 void SetMIME(const PString & tag, const PString & value);
00469
00470 PBoolean IsCompatible(int major, int minor) const;
00471
00472 PBoolean IsPersistant() const { return isPersistant; }
00473 PBoolean WasPersistant() const { return wasPersistant; }
00474 PBoolean IsProxyConnection() const { return isProxyConnection; }
00475 int GetMajorVersion() const { return majorVersion; }
00476 int GetMinorVersion() const { return minorVersion; }
00477
00478 long GetEntityBodyLength() const { return entityBodyLength; }
00479
00482 PTimeInterval GetPersistenceTimeout() const { return persistenceTimeout; }
00483
00486 void SetPersistenceTimeout(const PTimeInterval & t) { persistenceTimeout = t; }
00487
00491 unsigned GetPersistenceMaximumTransations() const { return persistenceMaximum; }
00492
00496 void SetPersistenceMaximumTransations(unsigned m) { persistenceMaximum = m; }
00497
00498 const PMultipartFormInfoArray & GetMultipartFormInfo() const
00499 { return multipartFormInfoArray; }
00500
00501 void ResetMultipartFormInfo()
00502 { multipartFormInfoArray.RemoveAll(); }
00503
00504 PString GetEntityBody() const { return entityBody; }
00505
00506 protected:
00507 PBoolean Initialise(PHTTPServer & server, PString & args);
00508 void DecodeMultipartFormInfo(const PString & type, const PString & entityBody);
00509
00510 PHTTP::Commands commandCode;
00511 PString commandName;
00512 PURL url;
00513 PMIMEInfo mimeInfo;
00514 PBoolean isPersistant;
00515 PBoolean wasPersistant;
00516 PBoolean isProxyConnection;
00517 int majorVersion;
00518 int minorVersion;
00519 PString entityBody;
00520 long entityBodyLength;
00521 PTimeInterval persistenceTimeout;
00522 unsigned persistenceMaximum;
00523 PMultipartFormInfoArray multipartFormInfoArray;
00524
00525 friend class PHTTPServer;
00526 };
00527
00528
00530
00531
00544 class PHTTPServer : public PHTTP
00545 {
00546 PCLASSINFO(PHTTPServer, PHTTP)
00547
00548 public:
00556 PHTTPServer();
00557 PHTTPServer(
00558 const PHTTPSpace & urlSpace
00559 );
00560
00561
00562
00568 virtual PString GetServerName() const;
00569
00575 PHTTPSpace & GetURLSpace() { return urlSpace; }
00576
00578 void SetURLSpace(
00579 const PHTTPSpace & space
00580 );
00581
00582
00592 virtual PBoolean ProcessCommand();
00593
00605 virtual PBoolean OnGET(
00606 const PURL & url,
00607 const PMIMEInfo & info,
00608 const PHTTPConnectionInfo & conInfo
00609 );
00610
00611
00612
00624 virtual PBoolean OnHEAD(
00625 const PURL & url,
00626 const PMIMEInfo & info,
00627 const PHTTPConnectionInfo & conInfo
00628 );
00629
00641 virtual PBoolean OnPOST(
00642 const PURL & url,
00643 const PMIMEInfo & info,
00644 const PStringToString & data,
00645 const PHTTPConnectionInfo & conInfo
00646 );
00647
00660 virtual PBoolean OnProxy(
00661 const PHTTPConnectionInfo & conInfo
00662 );
00663
00664
00671 virtual PString ReadEntityBody();
00672
00678 virtual PBoolean OnUnknown(
00679 const PCaselessString & command,
00680 const PHTTPConnectionInfo & connectInfo
00681 );
00682
00701 PBoolean StartResponse(
00702 StatusCode code,
00703 PMIMEInfo & headers,
00704 long bodySize
00705 );
00706
00716 virtual PBoolean OnError(
00717 StatusCode code,
00718 const PCaselessString & extra,
00719 const PHTTPConnectionInfo & connectInfo
00720 );
00721
00724 void SetDefaultMIMEInfo(
00725 PMIMEInfo & info,
00726 const PHTTPConnectionInfo & connectInfo
00727 );
00728
00731 PHTTPConnectionInfo & GetConnectionInfo() { return connectInfo; }
00732
00733 protected:
00734 void Construct();
00735
00736 PHTTPSpace urlSpace;
00737 PHTTPConnectionInfo connectInfo;
00738 unsigned transactionCount;
00739 PTimeInterval nextTimeout;
00740 };
00741
00742
00744
00745
00750 class PHTTPRequest : public PObject
00751 {
00752 PCLASSINFO(PHTTPRequest, PObject)
00753
00754 public:
00755 PHTTPRequest(
00756 const PURL & url,
00757 const PMIMEInfo & inMIME,
00758 const PMultipartFormInfoArray & multipartFormInfo,
00759 PHTTPServer & server
00760 );
00761
00762 PHTTPServer & server;
00763 const PURL & url;
00764 const PMIMEInfo & inMIME;
00765 const PMultipartFormInfoArray & multipartFormInfo;
00766 PHTTP::StatusCode code;
00767 PMIMEInfo outMIME;
00768 PString entityBody;
00769 PINDEX contentSize;
00770 PIPSocket::Address origin;
00771 PIPSocket::Address localAddr;
00772 WORD localPort;
00773 };
00774
00775
00777
00778
00782 class PHTTPAuthority : public PObject
00783 {
00784 PCLASSINFO(PHTTPAuthority, PObject)
00785
00786 public:
00787
00794 virtual PString GetRealm(
00795 const PHTTPRequest & request
00796 ) const = 0;
00797
00804 virtual PBoolean Validate(
00805 const PHTTPRequest & request,
00806 const PString & authInfo
00807 ) const = 0;
00808
00818 virtual PBoolean IsActive() const;
00819
00820 protected:
00821 static void DecodeBasicAuthority(
00822 const PString & authInfo,
00823 PString & username,
00824 PString & password
00825 );
00826 };
00827
00828
00830
00831
00835 class PHTTPSimpleAuth : public PHTTPAuthority
00836 {
00837 PCLASSINFO(PHTTPSimpleAuth, PHTTPAuthority)
00838
00839 public:
00840 PHTTPSimpleAuth(
00841 const PString & realm,
00842 const PString & username,
00843 const PString & password
00844 );
00845
00846
00847
00848
00856 virtual PObject * Clone() const;
00857
00858
00859
00866 virtual PString GetRealm(
00867 const PHTTPRequest & request
00868 ) const;
00869
00876 virtual PBoolean Validate(
00877 const PHTTPRequest & request,
00878 const PString & authInfo
00879 ) const;
00880
00890 virtual PBoolean IsActive() const;
00891
00897 const PString & GetUserName() const { return username; }
00898
00904 const PString & GetPassword() const { return password; }
00905
00906
00907 protected:
00908 PString realm;
00909 PString username;
00910 PString password;
00911 };
00912
00913
00915
00916
00920 class PHTTPMultiSimpAuth : public PHTTPAuthority
00921 {
00922 PCLASSINFO(PHTTPMultiSimpAuth, PHTTPAuthority)
00923
00924 public:
00925 PHTTPMultiSimpAuth(
00926 const PString & realm
00927 );
00928 PHTTPMultiSimpAuth(
00929 const PString & realm,
00930 const PStringToString & userList
00931 );
00932
00933
00934
00935
00943 virtual PObject * Clone() const;
00944
00945
00946
00953 virtual PString GetRealm(
00954 const PHTTPRequest & request
00955 ) const;
00956
00963 virtual PBoolean Validate(
00964 const PHTTPRequest & request,
00965 const PString & authInfo
00966 ) const;
00967
00977 virtual PBoolean IsActive() const;
00978
00984 void AddUser(
00985 const PString & username,
00986 const PString & password
00987 );
00988
00989
00990 protected:
00991 PString realm;
00992 PStringToString users;
00993 };
00994
00995
00997
00998
01002 class PHTTPResource : public PObject
01003 {
01004 PCLASSINFO(PHTTPResource, PObject)
01005
01006 protected:
01007 PHTTPResource(
01008 const PURL & url
01009 );
01010 PHTTPResource(
01011 const PURL & url,
01012 const PHTTPAuthority & auth
01013 );
01014 PHTTPResource(
01015 const PURL & url,
01016 const PString & contentType
01017 );
01018 PHTTPResource(
01019 const PURL & url,
01020 const PString & contentType,
01021 const PHTTPAuthority & auth
01022 );
01023
01024
01025
01026 public:
01027 virtual ~PHTTPResource();
01028
01029
01030
01031
01037 const PURL & GetURL() const { return baseURL; }
01038
01044 const PString & GetContentType() const { return contentType; }
01045
01052 PHTTPAuthority * GetAuthority() const { return authority; }
01053
01056 void SetAuthority(
01057 const PHTTPAuthority & auth
01058 );
01059
01062 void ClearAuthority();
01063
01070 DWORD GetHitCount() const { return hitCount; }
01071
01072 void ClearHitCount() { hitCount = 0; }
01073
01074
01075
01087 virtual PBoolean OnGET(
01088 PHTTPServer & server,
01089 const PURL & url,
01090 const PMIMEInfo & info,
01091 const PHTTPConnectionInfo & conInfo
01092 );
01093
01103 virtual PBoolean OnGETData(
01104 PHTTPServer & server,
01105 const PURL & url,
01106 const PHTTPConnectionInfo & connectInfo,
01107 PHTTPRequest & request
01108 );
01109
01121 virtual PBoolean OnHEAD(
01122 PHTTPServer & server,
01123 const PURL & url,
01124 const PMIMEInfo & info,
01125 const PHTTPConnectionInfo & conInfo
01126 );
01127
01139 virtual PBoolean OnPOST(
01140 PHTTPServer & server,
01141 const PURL & url,
01142 const PMIMEInfo & info,
01143 const PStringToString & data,
01144 const PHTTPConnectionInfo & conInfo
01145 );
01146
01156 virtual PBoolean OnPOSTData(
01157 PHTTPRequest & request,
01158 const PStringToString & data
01159 );
01160
01167 virtual PBoolean IsModifiedSince(
01168 const PTime & when
01169 );
01170
01176 virtual PBoolean GetExpirationDate(
01177 PTime & when
01178 );
01179
01187 virtual PHTTPRequest * CreateRequest(
01188 const PURL & url,
01189 const PMIMEInfo & inMIME,
01190 const PMultipartFormInfoArray & multipartFormInfo,
01191 PHTTPServer & socket
01192 );
01193
01201 virtual PBoolean LoadHeaders(
01202 PHTTPRequest & request
01203 ) = 0;
01204
01210 virtual void SendData(
01211 PHTTPRequest & request
01212 );
01213
01222 virtual PBoolean LoadData(
01223 PHTTPRequest & request,
01224 PCharArray & data
01225 );
01226
01235 virtual PString LoadText(
01236 PHTTPRequest & request
01237 );
01238
01245 virtual void OnLoadedText(
01246 PHTTPRequest & request,
01247 PString & text
01248 );
01249
01258 virtual PBoolean Post(
01259 PHTTPRequest & request,
01260 const PStringToString & data,
01261 PHTML & replyMessage
01262 );
01263
01264
01265 protected:
01268 virtual PBoolean CheckAuthority(
01269 PHTTPServer & server,
01270 const PHTTPRequest & request,
01271 const PHTTPConnectionInfo & conInfo
01272 );
01273 static PBoolean CheckAuthority(
01274 PHTTPAuthority & authority,
01275 PHTTPServer & server,
01276 const PHTTPRequest & request,
01277 const PHTTPConnectionInfo & connectInfo
01278 );
01279
01280
01282 virtual PBoolean OnGETOrHEAD(
01283 PHTTPServer & server,
01284 const PURL & url,
01285 const PMIMEInfo & info,
01286 const PHTTPConnectionInfo & conInfo,
01287 PBoolean IsGet
01288 );
01289
01291 PURL baseURL;
01293 PString contentType;
01295 PHTTPAuthority * authority;
01297 volatile DWORD hitCount;
01298 };
01299
01300
01302
01303
01308 class PHTTPString : public PHTTPResource
01309 {
01310 PCLASSINFO(PHTTPString, PHTTPResource)
01311
01312 public:
01316 PHTTPString(
01317 const PURL & url
01318 );
01319 PHTTPString(
01320 const PURL & url,
01321 const PHTTPAuthority & auth
01322 );
01323 PHTTPString(
01324 const PURL & url,
01325 const PString & str
01326 );
01327 PHTTPString(
01328 const PURL & url,
01329 const PString & str,
01330 const PString & contentType
01331 );
01332 PHTTPString(
01333 const PURL & url,
01334 const PString & str,
01335 const PHTTPAuthority & auth
01336 );
01337 PHTTPString(
01338 const PURL & url,
01339 const PString & str,
01340 const PString & contentType,
01341 const PHTTPAuthority & auth
01342 );
01343
01344
01345
01353 virtual PBoolean LoadHeaders(
01354 PHTTPRequest & request
01355 );
01356
01365 virtual PString LoadText(
01366 PHTTPRequest & request
01367 );
01368
01369
01375 const PString & GetString() { return string; }
01376
01379 void SetString(
01380 const PString & str
01381 ) { string = str; }
01382
01383
01384 protected:
01385 PString string;
01386 };
01387
01388
01390
01391
01397 class PHTTPFile : public PHTTPResource
01398 {
01399 PCLASSINFO(PHTTPFile, PHTTPResource)
01400
01401 public:
01408 PHTTPFile(
01409 const PString & filename
01410 );
01411 PHTTPFile(
01412 const PString & filename,
01413 const PHTTPAuthority & auth
01414 );
01415 PHTTPFile(
01416 const PURL & url,
01417 const PFilePath & file
01418 );
01419 PHTTPFile(
01420 const PURL & url,
01421 const PFilePath & file,
01422 const PString & contentType
01423 );
01424 PHTTPFile(
01425 const PURL & url,
01426 const PFilePath & file,
01427 const PHTTPAuthority & auth
01428 );
01429 PHTTPFile(
01430 const PURL & url,
01431 const PFilePath & file,
01432 const PString & contentType,
01433 const PHTTPAuthority & auth
01434 );
01435
01436
01437
01443 virtual PHTTPRequest * CreateRequest(
01444 const PURL & url,
01445 const PMIMEInfo & inMIME,
01446 const PMultipartFormInfoArray & multipartFormInfo,
01447 PHTTPServer & socket
01448 );
01449
01457 virtual PBoolean LoadHeaders(
01458 PHTTPRequest & request
01459 );
01460
01466 virtual PBoolean LoadData(
01467 PHTTPRequest & request,
01468 PCharArray & data
01469 );
01470
01479 virtual PString LoadText(
01480 PHTTPRequest & request
01481 );
01482
01483
01484 protected:
01485 PHTTPFile(
01486 const PURL & url,
01487 int dummy
01488 );
01489
01490
01491
01492 PFilePath filePath;
01493 };
01494
01495
01496 class PHTTPFileRequest : public PHTTPRequest
01497 {
01498 PCLASSINFO(PHTTPFileRequest, PHTTPRequest)
01499 public:
01500 PHTTPFileRequest(
01501 const PURL & url,
01502 const PMIMEInfo & inMIME,
01503 const PMultipartFormInfoArray & multipartFormInfo,
01504 PHTTPServer & server
01505 );
01506
01507 PFile file;
01508 };
01509
01510
01512
01513
01522 class PHTTPTailFile : public PHTTPFile
01523 {
01524 PCLASSINFO(PHTTPTailFile, PHTTPFile)
01525
01526 public:
01533 PHTTPTailFile(
01534 const PString & filename
01535 );
01536 PHTTPTailFile(
01537 const PString & filename,
01538 const PHTTPAuthority & auth
01539 );
01540 PHTTPTailFile(
01541 const PURL & url,
01542 const PFilePath & file
01543 );
01544 PHTTPTailFile(
01545 const PURL & url,
01546 const PFilePath & file,
01547 const PString & contentType
01548 );
01549 PHTTPTailFile(
01550 const PURL & url,
01551 const PFilePath & file,
01552 const PHTTPAuthority & auth
01553 );
01554 PHTTPTailFile(
01555 const PURL & url,
01556 const PFilePath & file,
01557 const PString & contentType,
01558 const PHTTPAuthority & auth
01559 );
01560
01561
01562
01570 virtual PBoolean LoadHeaders(
01571 PHTTPRequest & request
01572 );
01573
01579 virtual PBoolean LoadData(
01580 PHTTPRequest & request,
01581 PCharArray & data
01582 );
01583 };
01584
01585
01587
01588
01601 class PHTTPDirectory : public PHTTPFile
01602 {
01603 PCLASSINFO(PHTTPDirectory, PHTTPFile)
01604
01605 public:
01606 PHTTPDirectory(
01607 const PURL & url,
01608 const PDirectory & dir
01609 );
01610 PHTTPDirectory(
01611 const PURL & url,
01612 const PDirectory & dir,
01613 const PHTTPAuthority & auth
01614 );
01615
01616
01617
01618
01624 virtual PHTTPRequest * CreateRequest(
01625 const PURL & url,
01626 const PMIMEInfo & inMIME,
01627 const PMultipartFormInfoArray & multipartFormInfo,
01628 PHTTPServer & socket
01629 );
01630
01638 virtual PBoolean LoadHeaders(
01639 PHTTPRequest & request
01640 );
01641
01650 virtual PString LoadText(
01651 PHTTPRequest & request
01652 );
01653
01662 void EnableAuthorisation(const PString & realm);
01663
01666 void AllowDirectories(PBoolean enable = PTrue);
01667
01668 protected:
01669 PBoolean CheckAuthority(
01670 PHTTPServer & server,
01671 const PHTTPRequest & request,
01672 const PHTTPConnectionInfo & conInfo
01673 );
01674
01675 PBoolean FindAuthorisations(const PDirectory & dir, PString & realm, PStringToString & authorisations);
01676
01677 PDirectory basePath;
01678 PString authorisationRealm;
01679 PBoolean allowDirectoryListing;
01680 };
01681
01682
01683 class PHTTPDirRequest : public PHTTPFileRequest
01684 {
01685 PCLASSINFO(PHTTPDirRequest, PHTTPFileRequest)
01686 public:
01687 PHTTPDirRequest(
01688 const PURL & url,
01689 const PMIMEInfo & inMIME,
01690 const PMultipartFormInfoArray & multipartFormInfo,
01691 PHTTPServer & server
01692 );
01693
01694 PString fakeIndex;
01695 PFilePath realPath;
01696 };
01697
01698 #endif // P_HTTP
01699
01700 #endif // _PHTTP_H
01701
01702
01703