httpdownload.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:9k
源码类别:

模拟服务器

开发平台:

C/C++

  1. // HttpDownload.h: interface for the CHttpDownload class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #if !defined(AFX_HTTPDOWNLOAD_H__4E55FDB1_0DE8_4ACD_94F4_CD097B5EAED0__INCLUDED_)
  5. #define AFX_HTTPDOWNLOAD_H__4E55FDB1_0DE8_4ACD_94F4_CD097B5EAED0__INCLUDED_
  6. #if _MSC_VER > 1000
  7. #pragma once
  8. #endif // _MSC_VER > 1000
  9. #include "BufSocket.h"
  10. ////////////////////////////////////////////////////////////////////////////////
  11. // 结构定义
  12. #pragma pack(push, 1)
  13. typedef struct _tagHttpDownloadStatus
  14. {
  15. int nStatusType; // 状态类型
  16. DWORD dwFileSize; // 文件大小
  17. DWORD dwFileDownloadedSize; // 已经下载大小
  18. CString strFileName; // 文件名
  19. int nErrorCount; // 错误计数
  20. CString strError; // 错误原因
  21. DWORD dwErrorCode; // 错误代码
  22. } HTTPDOWNLOADSTATUS,*PHTTPDOWNLOADSTATUS;
  23. #pragma pack(pop)
  24. ////////////////////////////////////////////////////////////////////////////////
  25. // 常量定义
  26. ////////////////////////////////////////////////////////////////////////////////
  27. #undef IN
  28. #define IN // 输入参数
  29. #undef OUT
  30. #define OUT // 输出参数
  31. ////////////////////////////////////////////////////////////////////////////////
  32. // 外部公用
  33. ////////////////////////////////////////////////////////////////////////////////
  34. // 下载结果
  35. const int HTTP_RESULT_SUCCESS = 0; // 成功
  36. const int HTTP_RESULT_SAMEAS = 1; // 要下载的文件已经存在并且与远程文件一致,不用下载
  37. const int HTTP_RESULT_STOP = 2; // 中途停止(用户中断)
  38. const int HTTP_RESULT_FAIL = 3; // 下载失败
  39. const int HTTP_RESULT_REDIRECT_FTP = 4; // 重定向到FTP
  40. // Added by Linsuyi  2002/02/01
  41. const int   HTTP_RESULT_REDIRECT_HTTP   = 5;    // 重定向到HTTP
  42. // 消息
  43. const WPARAM MSG_HTTPDOWNLOAD_NETWORK = (WPARAM)1; // 网络状态
  44. const WPARAM MSG_HTTPDOWNLOAD_STATUS = (WPARAM)2; // 下载状态
  45. const WPARAM MSG_HTTPDOWNLOAD_MAX = (WPARAM)32; //保留最大可供扩充
  46. // 重试类别
  47. const int HTTP_RETRY_NONE = 0; // 不重试
  48. const int HTTP_RETRY_TIMES = 1; // 重试一定次数
  49. const int HTTP_RETRY_ALWAYS = 2; // 总是重试(有可能死循环)
  50. const int DEFAULT_HTTP_RETRY_MAX = 10; //缺省的重试次数
  51. // PROXY的类型
  52. const int HTTP_PROXY_NONE = 0; // 没有代理
  53. const int HTTP_PROXY_HTTPGET = 1; // 通常的HTTP的GET型代理
  54. const int HTTP_PROXY_HTTPCONNECT = 2; // HTTP CONNECT代理
  55. const int HTTP_PROXY_SOCKS4 = 3; // SOCKS4 代理
  56. const int HTTP_PROXY_SOCKS4A = 4; // SOCKS4A代理
  57. const int HTTP_PROXY_SOCKS5 = 5; // SOCKS 5代理
  58. const int HTTP_PROXY_USEIE = 6; // 使用IE配置的代理服务器设置
  59. //下载状态类型
  60. const int HTTP_STATUS_FILENAME = 1; // 文件名
  61. const int HTTP_STATUS_FILESIZE = 2; // 文件大小
  62. const int HTTP_STATUS_FILEDOWNLOADEDSIZE = 3; // 文件已经下载大小
  63. const int HTTP_STATUS_ERRORCOUNT = 4; // 发生错误次数
  64. const int HTTP_STATUS_ERRORCODE = 5; // 错误代码
  65. const int HTTP_STATUS_ERRORSTRING = 6; // 错误原因
  66. // HTTP支持的命令
  67. const int HTTP_VERB_MIN = 0;
  68. const int HTTP_VERB_POST      = 0;
  69. const int HTTP_VERB_GET       = 1;
  70. const int HTTP_VERB_HEAD      = 2;
  71. const int HTTP_VERB_PUT       = 3;
  72. const int HTTP_VERB_OPTIONS   = 4;
  73. const int HTTP_VERB_DELETE    = 5;
  74. const int HTTP_VERB_TRACE     = 6;
  75. const int HTTP_VERB_CONNECT   = 7;
  76. const int HTTP_VERB_MAX = 7;
  77. ////////////////////////////////////////////////////////////////////////////////
  78. // 内部私用
  79. ////////////////////////////////////////////////////////////////////////////////
  80. // 缺省超时参数
  81. static const DWORD HTTP_CONN_TIMEOUT = 60*1000; // 60秒
  82. static const DWORD HTTP_SEND_TIMEOUT = 60*1000; // 60秒
  83. static const DWORD HTTP_RECV_TIMEOUT = 60*1000; // 60秒
  84. // 发送请求的结果
  85. static const int HTTP_REQUEST_SUCCESS = 0; // 成功
  86. static const int HTTP_REQUEST_ERROR = 1; // 一般网络错误,可以重试
  87. static const int HTTP_REQUEST_STOP = 2; // 中途停止(用户中断) (不用重试)
  88. static const int HTTP_REQUEST_FAIL = 3; // 失败 (不用重试)
  89. static const int HTTP_REQUEST_REDIRECT_FTP = 4; // 重定向到FTP
  90. // HTTP STATUS CODE分类
  91. static const int HTTP_SUCCESS = 0; // 成功
  92. static const int HTTP_REDIRECT = 1; // 重定向
  93. static const int HTTP_FAIL = 2; // 失败
  94. static const int HTTP_REDIRECT_FTP = 3; // 重定向到FTP
  95. // 缺省端口号
  96. static const int DEFAULT_HTTP_PORT = 80;
  97. // HTTP命令
  98. static const char* HTTP_VERB_STR[] = 
  99. {
  100. _T("POST "),
  101. _T("GET "),
  102. _T("HEAD "),
  103. _T("PUT "),
  104. _T("OPTIONS "),
  105. _T("DELETE "),
  106. _T("TRACE "),
  107. _T("CONNECT ")
  108. };
  109. ////////////////////////////////////////////////////////////////////////////////
  110. // 类定义
  111. ////////////////////////////////////////////////////////////////////////////////
  112. class CHttpDownload  
  113. {
  114. public:
  115. CHttpDownload();
  116. virtual ~CHttpDownload();
  117. public:
  118. BOOL IsUserStop();
  119. // 静态函数,用于64编码、解码
  120. static int Base64Encode(IN LPCTSTR lpszEncoding,OUT CString& strEncoded );
  121. static int Base64Decode(IN LPCTSTR lpszDecoding,OUT CString& strDecoded );
  122. // 下载函数
  123. void SetCookie(LPCTSTR lpszCookie,BOOL bUseIECookie = FALSE);
  124. void SetAuthorization(LPCTSTR lpszUsername,LPCTSTR lpszPassword,BOOL bAuthorization = TRUE );
  125. void SetReferer(LPCTSTR lpszReferer);
  126. void SetUserAgent(LPCTSTR lpszUserAgent);
  127. void SetTimeout(DWORD dwSendTimeout,DWORD dwRecvTimeout,DWORD dwConnTimeout);
  128. void SetRetry(int nRetryType,int nRetryDelay=0,int nRetryMax = 0);
  129. void SetNotifyWnd(HWND hNotifyWnd,int nNotifyMsg,BOOL bNotify = TRUE );
  130. void SetProxy(LPCTSTR lpszProxyServer,int nProxyPort,BOOL bProxy=TRUE,BOOL bProxyAuthorization = FALSE,LPCTSTR lpszProxyUsername = NULL,LPCTSTR lpszProxyPassword = NULL,int nProxyType = HTTP_PROXY_HTTPGET);
  131. void StopDownload();
  132. BOOL ParseURL(IN LPCTSTR lpszURL,OUT CString& strServer,OUT CString& strObject,OUT int& nPort);
  133. BOOL GetDownloadFileStatus(IN LPCTSTR lpszDownloadUrl,OUT DWORD &dwFileSize,OUT CTime &FileTime);
  134. int  Download(LPCTSTR lpszDownloadUrl,LPCTSTR lpszSavePath = NULL,BOOL bForceDownload = FALSE,BOOL bSaveResponse = TRUE,int nVerb = HTTP_VERB_GET,LPCTSTR lpszData = NULL,LPTSTR lpszFtpURL = NULL );
  135. private:
  136. BOOL CreateSocket();
  137. void CloseSocket();
  138. int SendRequest(int nVerb = HTTP_VERB_GET,LPTSTR lpszFtpURL = NULL);
  139. int GetInfo(IN LPCTSTR lpszHeader,OUT DWORD& dwContentLength,OUT DWORD& dwStatusCode,OUT CTime& TimeLastModified,OUT CString& strCookie,LPTSTR lpszFtpURL);
  140. CTime GetTime(LPCTSTR lpszTime);
  141. void GetFileName();
  142. int MakeConnection(CBufSocket* pBufSocket,CString strServer,int nPort);
  143. BOOL GetIEProxy(CString& strProxyServer,int& nProxyPort,int& nProxyType);
  144. BOOL GetIECookie(CString& strCookie,LPCTSTR lpszURL);
  145. BOOL IsValidFileName(LPCTSTR lpszFileName);
  146. private:
  147. // 下载参数
  148. // 待下载URL和本地保存路径
  149. CString m_strDownloadUrl;
  150. CString m_strSavePath; // 可以是全路径或保存目录
  151. CString m_strTempSavePath; //临时文件的路径
  152. BOOL m_bSaveResponse;
  153. // 停止下载
  154. BOOL m_bStopDownload; // 停止下载
  155. HANDLE m_hStopEvent; // 停止下载事件
  156. // 强制重新下载(不管已有的文件是否与远程文件相同)
  157. BOOL m_bForceDownload;
  158. // 是否支持断点续传
  159. BOOL m_bSupportResume;
  160. // 文件以及下载大小
  161. DWORD m_dwFileSize; // 文件总的大小
  162. DWORD m_dwFileDownloadedSize; // 文件总共已经下载的大小
  163. DWORD m_dwDownloadSize; // 本次需要下载的大小
  164. DWORD m_dwDownloadedSize; // 本次已经下载的大小
  165. DWORD m_dwHeaderSize; // 返回头的大小 (暂时没有作用)
  166. CString m_strHeader; // 保存头部信息 (暂时没有作用)
  167. // 文件日期(远程文件的信息)
  168. CTime m_TimeLastModified;
  169. // Referer
  170. CString m_strReferer;
  171. // UserAgent
  172. CString m_strUserAgent;
  173. // 超时TIMEOUT 连接超时、发送超时、接收超时(单位:毫秒)
  174. DWORD m_dwConnTimeout;
  175. DWORD m_dwRecvTimeout;
  176. DWORD m_dwSendTimeout;
  177. // 重试机制
  178. int m_nRetryType; //重试类型(0:不重试 1:重试一定次数 2:总是重试)
  179. int m_nRetryTimes; //重试次数
  180. int m_nRetryDelay; //重试延迟(单位:毫秒)
  181. int m_nRetryMax;    //重试的最大次数
  182. // 错误处理
  183. int m_nErrorCount; //错误次数 
  184. CString m_strError; //错误信息 
  185. DWORD m_dwErrorCode; //错误代码
  186. // 向其他窗口发送消息
  187. BOOL m_bNotify; // 是否向外发送通知消息
  188. HWND m_hNotifyWnd; // 被通知的窗口
  189. int m_nNotifyMessage; // 被通知的消息
  190. // 是否进行验证 : Request-Header: Authorization
  191. BOOL m_bAuthorization;
  192. CString m_strUsername;
  193. CString m_strPassword;
  194. // 是否使用代理 
  195. BOOL m_bProxy;
  196. CString m_strProxyServer;
  197. int m_nProxyPort;
  198. int m_nProxyType;
  199. // 代理是否需要验证: Request-Header: Proxy-Authorization
  200. BOOL m_bProxyAuthorization;
  201. CString m_strProxyUsername;
  202. CString m_strProxyPassword;
  203. // 下载过程中所用的变量
  204. CString m_strServer;
  205. CString m_strObject;
  206. CString m_strFileName;
  207. int m_nPort;
  208. int m_nVerb;
  209. CString m_strData;// 请求时发送的数据
  210. // 是否使用Cookie
  211. CString m_strCookie;
  212. BOOL m_bUseIECookie;
  213. CBufSocket m_cBufSocket;// 下载连接的SOCKET
  214. // 用于BASE64编码、解码
  215. static int m_nBase64Mask[];
  216. static CString m_strBase64TAB;
  217. };
  218. #endif // !defined(AFX_HTTPDOWNLOAD_H__4E55FDB1_0DE8_4ACD_94F4_CD097B5EAED0__INCLUDED_)