HttpClient.h
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:7k
源码类别:

CA认证

开发平台:

Visual C++

  1. /*
  2. Module : HttpClient.h
  3. Purpose: Defines the interface for the CHttpClient classes
  4. Created: PJN / 22-04-1999
  5. Copyright (c) 1999 - 2005 by PJ Naughter.  
  6. All rights reserved.
  7. Copyright / Usage Details:
  8. You are allowed to include the source code in any product (commercial, shareware, freeware or otherwise) 
  9. when your product is released in binary form. You are allowed to modify the source code in any way you want 
  10. except you cannot modify the copyright details at the top of each module. If you want to distribute source 
  11. code with your application, then you are only allowed to distribute versions released by the author. This is 
  12. to maintain a single distribution point for the source code. 
  13. */
  14. /////////////////////////////// Defines ///////////////////////////////////////
  15. #ifndef __HTTPCLIENT_H__
  16. #define __HTTPCLIENT_H__
  17. #ifndef W3MFC_EXT_CLASS
  18. #define W3MFC_EXT_CLASS
  19. #endif
  20. /////////////////////////////// Includes //////////////////////////////////////
  21. #include "HttpSocket.h"
  22. #include "ThrdPool.h"
  23. #include "W3Mfc.h"
  24. #include "HttpResponseHeader.h"
  25. /////////////////////////////// Classes ///////////////////////////////////////
  26. //Class which represents the thread pool request
  27. class W3MFC_EXT_CLASS CHttpThreadPoolRequest
  28. {
  29. public:
  30.   sockaddr_in m_ClientAddress;
  31.   CHttpSocket m_ClientSocket;
  32. #ifdef W3MFC_SSL_SUPPORT
  33.   CSSLContext* m_pSSLContext;
  34. #endif
  35. };
  36. //forward declarations
  37. class CHttpServer;
  38. class CHttpClient;
  39. //Class which handles dynamically calling function which must be constructed at run time
  40. //since we do not want to depend on the MS extensions to Winsock in mswsock.dll. To avoid 
  41. //the loader bringing up a message such as "Failed to load due to missing export...", the
  42. //function is constructed using GetProcAddress. The W3MFC code then checks to see if these 
  43. //function pointers are NULL.
  44. class W3MFC_EXT_CLASS _W3MFC_DATA
  45. {
  46. public:
  47. //Constructors /Destructors
  48.   _W3MFC_DATA();
  49.   ~_W3MFC_DATA();
  50. //typedefs
  51.   typedef struct _TRANSMIT_FILE_BUFFERS 
  52.   {
  53.     LPVOID Head;
  54.     DWORD HeadLength;
  55.     LPVOID Tail;
  56.     DWORD TailLength;
  57.   } TRANSMIT_FILE_BUFFERS, *PTRANSMIT_FILE_BUFFERS, FAR *LPTRANSMIT_FILE_BUFFERS;
  58.   typedef BOOL (__stdcall TRANSMITFILE)(SOCKET, HANDLE, DWORD, DWORD, LPOVERLAPPED, LPTRANSMIT_FILE_BUFFERS, DWORD);
  59.   typedef TRANSMITFILE* LPTRANSMITFILE;
  60. #ifndef TP_ELEMENT_MEMORY
  61.   #define TP_ELEMENT_MEMORY   1
  62. #endif
  63.   typedef struct _TRANSMIT_PACKETS_ELEMENT 
  64.   { 
  65.     ULONG dwElFlags; 
  66.     ULONG cLength; 
  67.     union 
  68.     {
  69.       typedef struct _HDATA
  70.       {
  71.         LARGE_INTEGER nFileOffset;
  72.         HANDLE        hFile;
  73.       };
  74.       PVOID pBuffer;
  75.     };
  76.   } TRANSMIT_PACKETS_ELEMENT, *PTRANSMIT_PACKETS_ELEMENT, FAR *LPTRANSMIT_PACKETS_ELEMENT;
  77.   typedef BOOL (__stdcall TRANSMITPACKETS)(SOCKET, LPTRANSMIT_PACKETS_ELEMENT, DWORD, DWORD, LPOVERLAPPED, DWORD);
  78.   typedef TRANSMITPACKETS* LPTRANSMITPACKETS;
  79. //Defines
  80. #ifndef TF_USE_KERNEL_APC
  81.   #define TF_USE_KERNEL_APC     0x20
  82. #endif
  83. //Methods
  84.   BOOL TransmitFile(CHttpSocket& socket, CHttpResponseHeader& responseHdr, HANDLE hFile, DWORD dwSize);
  85.   BOOL TransmitBuffer(CHttpSocket& socket, CHttpResponseHeader& responseHdr, BYTE* byData, DWORD dwSize);
  86. #ifndef W3MFC_NO_ISAPI_SUPPORT
  87.   BOOL TransmitFile(CHttpSocket& socket, CHttpResponseHeader& responseHdr, HSE_TF_INFO* pInfo);
  88. #endif
  89. //Data
  90.   HINSTANCE         m_hMSWsock;
  91.   LPTRANSMITFILE    m_lpfnTransmitFile;
  92.   LPTRANSMITPACKETS m_lpfnTransmitPackets;
  93. };
  94. //Class which handles the HTTP client connection
  95. class W3MFC_EXT_CLASS CHttpClient : public CThreadPoolClient
  96. {
  97. public:
  98. //Constructors / Destructors
  99.   CHttpClient();
  100.   virtual ~CHttpClient();
  101. //Methods
  102.   virtual BOOL  Run(const CThreadPoolRequest& request);
  103.   virtual int   ExitInstance();
  104.   virtual DWORD ReturnErrorMessage(int nStatusCode);
  105.   virtual DWORD ReturnRedirectMessage(const CString& sURL);
  106.   virtual DWORD ReturnFileDeletedOkMessage(const CString& sFile);
  107.   virtual DWORD ReturnUnauthorizedMessage(const CString& sRealm);
  108.   virtual void  PostLog(int nHTTPStatusCode, DWORD dwBodyLength);
  109.   virtual BOOL  GetKeySizeServerVariable(int& nKeySize);
  110.   virtual BOOL  GetServerKeySizeServerVariable(int& nKeySize);
  111.   virtual BOOL  GetCertSerialNumberServerVariable(long& nSerialNumber);
  112.   virtual BOOL  GetCertIssuerServerVariable(char*& szIssuer);
  113.   virtual BOOL  GetCertSubjectServerVariable(char*& szSubject);
  114.   virtual BOOL  TransmitBuffer(CHttpSocket& socket, CHttpResponseHeader& responseHdr, BYTE* byData, DWORD dwSize, DWORD dwTimeout);
  115.   virtual BOOL  TransmitFile(CHttpSocket& socket, CHttpResponseHeader& responseHdr, HANDLE hFile, DWORD dwSize, DWORD dwTimeout);
  116. #ifndef W3MFC_NO_ISAPI_SUPPORT
  117.   virtual BOOL  TransmitFile(CHttpSocket& socket, CHttpResponseHeader& responseHdr, HSE_TF_INFO* pInfo);
  118. #endif
  119.   virtual BOOL  MapURLToLocalFilename(CString& sURL, CString& sLocalFile, CString& sPathInfo, BOOL& bDirectory, CHttpDirectory*& pDirectory, DWORD& dwMatchingURL, DWORD& dwMatchingPath);
  120.   virtual void  SetRequestToStop();
  121.   virtual BOOL  PreHandleGetPostHead();
  122. //Static Methods
  123.   static int     HexToInt(TCHAR ch);
  124.   static TCHAR   IntToHex(int Character);
  125.   static CString URLDecode(const CString& sURL);
  126.   static CString URLEncode(const CString& sURL);
  127.   static CString UTF8ToCString(const CString& sURL);
  128.   static BOOL    ParseDate(const CString& sField, SYSTEMTIME& time);
  129.   static BOOL    ParseWeekDay(char* pszToken, int& nWeekDay);
  130.   static BOOL    ParseMonth(char* pszToken, int& nMonth);
  131. //Member variables
  132.   CHttpServer* m_pServer;
  133.   CHttpRequest m_Request;
  134.   BOOL         m_bResponseKeepAlive;
  135.   CHttpSocket  m_Socket;
  136. #ifndef W3MFC_NO_ISAPI_SUPPORT
  137.   DWORD        m_dwDataSentViaWriteClient;
  138.   int          m_nHttpStatusCodeSent;
  139. #endif
  140. #ifdef W3MFC_SSL_SUPPORT
  141.   CSSLContext* m_pSSLContext;
  142.   CSSL m_SSL;
  143. #endif
  144. protected:
  145. //Methods
  146.   virtual BOOL            ParseRequest();
  147.   virtual BOOL            ParseSimpleRequestLine(const CString& sLine);
  148.   virtual BOOL            ParseAuthorizationLine(const CString& sLine);
  149.   virtual BOOL            ParseRequestLine(const CString& sCurrentLine, BOOL bFirstLine, const CString& sField, const CString& sValue);
  150.   virtual void            TransmitBuffer(BYTE* byData, DWORD dwSize, CHttpDirectory* pDirectory, BOOL bForceExpire);
  151.   virtual BOOL            AllowThisConnection();
  152.   virtual CHttpDirectory* GetVirtualDirectory(const CString& sDirectory);
  153.   virtual void            HandleClient();
  154.   virtual LPSTR           FindNextTerminatorFromRequest(LPSTR pszLine);
  155. #ifdef W3MFC_SSL_SUPPORT
  156.   virtual BOOL            DoSSLNegotiation();
  157.   virtual BOOL            InitializeSSLConnection();
  158. #endif
  159. //Member variables
  160.   CEvent m_StopEvent;
  161.   DECLARE_DYNCREATE(CHttpClient)
  162. };
  163. #endif //__HTTPCLIENT_H__