|
@@ -0,0 +1,944 @@
|
|
|
|
+#include "StdAfx.h"
|
|
|
|
+#include "HTTPHelper.h"
|
|
|
|
+
|
|
|
|
+HTTPHelper::HTTPHelper(void):m_hSession(NULL),m_hConnect(NULL),m_hRequest(NULL),m_nRetryTimes(3)
|
|
|
|
+{
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+HTTPHelper::~HTTPHelper(void)
|
|
|
|
+{
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+bool HTTPHelper::UrlParse(std::wstring strUrl)
|
|
|
|
+{
|
|
|
|
+ int nPos = 0;
|
|
|
|
+ std::wstring strSub;
|
|
|
|
+ if (strUrl.size()) m_strUrl = strUrl;
|
|
|
|
+ wchar_t* magic[] = { L"https://", L"http://", NULL };
|
|
|
|
+ if ( m_strUrl.find(magic[0]) != std::wstring::npos || m_strUrl.find(magic[1]) != std::wstring::npos ) {
|
|
|
|
+ if (m_strUrl.find(magic[0]) != std::wstring::npos) {
|
|
|
|
+ m_dwPort = 443;
|
|
|
|
+ m_nScheme=INTERNET_SCHEME_HTTPS;
|
|
|
|
+ strSub = m_strUrl.substr(8);
|
|
|
|
+ } else {
|
|
|
|
+ m_dwPort = 80;
|
|
|
|
+ m_nScheme=INTERNET_SCHEME_HTTP;
|
|
|
|
+ strSub = m_strUrl.substr(7);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ( (nPos = strSub.find(L"/")) != std::wstring::npos ) {
|
|
|
|
+ m_strDomain = strSub.substr(0, nPos);
|
|
|
|
+ m_strApiName = strSub.substr(nPos);
|
|
|
|
+ } else {
|
|
|
|
+ m_strDomain = strSub;
|
|
|
|
+ m_strApiName = L"/";
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ( (nPos = m_strDomain.find(L":")) != std::wstring::npos ) {
|
|
|
|
+ m_strHost = m_strDomain.substr(0, nPos);
|
|
|
|
+ m_dwPort = _wtol(m_strDomain.substr(nPos+1).c_str());
|
|
|
|
+ } else {
|
|
|
|
+ m_strHost = m_strDomain;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return TRUE;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return FALSE;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+bool HTTPHelper::GetHtml(HTTPITEM &item, HTTPRESULT &result)
|
|
|
|
+{
|
|
|
|
+ if ( !SendRequest(item,result) )
|
|
|
|
+ return false;
|
|
|
|
+
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+BOOL HTTPHelper::_OpenHTTP()
|
|
|
|
+{
|
|
|
|
+ DWORD dwError(0);
|
|
|
|
+ if ( m_hSession == NULL ) {
|
|
|
|
+ // 创建会话;
|
|
|
|
+ m_hSession = WinHttpOpen(
|
|
|
|
+ m_strUserAgent.c_str(),
|
|
|
|
+ WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
|
|
|
|
+ WINHTTP_NO_PROXY_NAME,
|
|
|
|
+ WINHTTP_NO_PROXY_BYPASS,
|
|
|
|
+ 0);
|
|
|
|
+
|
|
|
|
+ if ( m_hSession == NULL ) {
|
|
|
|
+ dwError = GetLastError();
|
|
|
|
+ return FALSE;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 设置超时值;
|
|
|
|
+ if ( !_SetTimeout() ) {
|
|
|
|
+ return FALSE;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 连接服务器;
|
|
|
|
+ m_hConnect = WinHttpConnect(m_hSession, m_strHost.c_str(), m_dwPort, 0);
|
|
|
|
+ if ( m_hConnect == NULL) {
|
|
|
|
+ dwError = GetLastError();
|
|
|
|
+ return FALSE;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ std::wstring strObjctName = m_strApiName;
|
|
|
|
+ if ( m_strQueryParams.size() ) {
|
|
|
|
+ strObjctName.append(L"?");
|
|
|
|
+ strObjctName.append(m_strQueryParams);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 请求类型:是否是https;
|
|
|
|
+ DWORD dwOpenRequestFlag = (m_nScheme == INTERNET_SCHEME_HTTPS) ? WINHTTP_FLAG_SECURE : 0;
|
|
|
|
+ m_hRequest = WinHttpOpenRequest(m_hConnect,
|
|
|
|
+ m_strMethod.c_str(),
|
|
|
|
+ strObjctName.c_str(),
|
|
|
|
+ NULL,
|
|
|
|
+ WINHTTP_NO_REFERER,
|
|
|
|
+ WINHTTP_DEFAULT_ACCEPT_TYPES,
|
|
|
|
+ dwOpenRequestFlag);
|
|
|
|
+
|
|
|
|
+ if ( m_hRequest == NULL ) {
|
|
|
|
+ dwError = GetLastError();
|
|
|
|
+ return FALSE;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 如果是https,那么客户端就很容易受到无效证书的影响,现在接受任何事情都是最容易的
|
|
|
|
+ if ( m_brequireValidSSL && m_nScheme == INTERNET_SCHEME_HTTPS ) {
|
|
|
|
+ DWORD dwOps = SECURITY_FLAG_IGNORE_CERT_CN_INVALID
|
|
|
|
+ | SECURITY_FLAG_IGNORE_CERT_DATE_INVALID
|
|
|
|
+ | SECURITY_FLAG_IGNORE_UNKNOWN_CA
|
|
|
|
+ | SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE;
|
|
|
|
+ WinHttpSetOption(m_hRequest, WINHTTP_OPTION_SECURITY_FLAGS, &dwOps, sizeof(DWORD));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return TRUE;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+BOOL HTTPHelper::_SendRequestData()
|
|
|
|
+{
|
|
|
|
+ DWORD dwError(0);
|
|
|
|
+ BOOL bGetResponseSucceed=FALSE;
|
|
|
|
+ while ( !bGetResponseSucceed && m_nRetryTimes-- > 0 )
|
|
|
|
+ {
|
|
|
|
+ // 是否有请求头;
|
|
|
|
+ if ( !_SetRequestHeaders() ) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 是否有Cookie;
|
|
|
|
+ if ( !_SetCookies() ) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 是否有代理服务器;
|
|
|
|
+ if ( !_SetProxy() ) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 是否关闭自动重定向;
|
|
|
|
+ if ( !_SetAutoRedirect() ) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 发送请求;
|
|
|
|
+ bool bSendRequestSucceed = false;
|
|
|
|
+ //if (::WinHttpSendRequest(m_hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, NULL, (LPVOID)m_strPostData.c_str(), m_strPostData.size()*sizeof(wchar_t), m_strPostData.size()*sizeof(wchar_t), NULL))
|
|
|
|
+ if (::WinHttpSendRequest(m_hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, NULL, WINHTTP_NO_REQUEST_DATA, 0, _GetSendRequestSize(), NULL))
|
|
|
|
+ {
|
|
|
|
+ bSendRequestSucceed = true;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ // 从IE设置中查询代理信息,如果有代理,设置代理;
|
|
|
|
+ WINHTTP_CURRENT_USER_IE_PROXY_CONFIG proxyConfig;
|
|
|
|
+ memset(&proxyConfig, 0, sizeof(proxyConfig));
|
|
|
|
+ if (::WinHttpGetIEProxyConfigForCurrentUser(&proxyConfig))
|
|
|
|
+ {
|
|
|
|
+ if (proxyConfig.lpszAutoConfigUrl != NULL)
|
|
|
|
+ {
|
|
|
|
+ WINHTTP_AUTOPROXY_OPTIONS autoProxyOptions;
|
|
|
|
+ memset(&autoProxyOptions, 0, sizeof(autoProxyOptions));
|
|
|
|
+ autoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_AUTO_DETECT | WINHTTP_AUTOPROXY_CONFIG_URL;
|
|
|
|
+ autoProxyOptions.dwAutoDetectFlags = WINHTTP_AUTO_DETECT_TYPE_DHCP;
|
|
|
|
+ autoProxyOptions.lpszAutoConfigUrl = proxyConfig.lpszAutoConfigUrl;
|
|
|
|
+ autoProxyOptions.fAutoLogonIfChallenged = TRUE;
|
|
|
|
+ autoProxyOptions.dwReserved = 0;
|
|
|
|
+ autoProxyOptions.lpvReserved = NULL;
|
|
|
|
+
|
|
|
|
+ WINHTTP_PROXY_INFO proxyInfo;
|
|
|
|
+ memset(&proxyInfo, 0, sizeof(proxyInfo));
|
|
|
|
+
|
|
|
|
+ if (::WinHttpGetProxyForUrl(m_hSession, m_strUrl.c_str(), &autoProxyOptions, &proxyInfo))
|
|
|
|
+ {
|
|
|
|
+ if (::WinHttpSetOption(m_hRequest, WINHTTP_OPTION_PROXY, &proxyInfo, sizeof(proxyInfo)))
|
|
|
|
+ {
|
|
|
|
+ if (::WinHttpSendRequest(m_hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, NULL))
|
|
|
|
+ {
|
|
|
|
+ bSendRequestSucceed = true;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (proxyInfo.lpszProxy != NULL)
|
|
|
|
+ {
|
|
|
|
+ ::GlobalFree(proxyInfo.lpszProxy);
|
|
|
|
+ }
|
|
|
|
+ if (proxyInfo.lpszProxyBypass != NULL)
|
|
|
|
+ {
|
|
|
|
+ ::GlobalFree(proxyInfo.lpszProxyBypass);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ dwError = ::GetLastError();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else if (proxyConfig.lpszProxy != NULL)
|
|
|
|
+ {
|
|
|
|
+ WINHTTP_PROXY_INFO proxyInfo;
|
|
|
|
+ memset(&proxyInfo, 0, sizeof(proxyInfo));
|
|
|
|
+ proxyInfo.dwAccessType = WINHTTP_ACCESS_TYPE_NAMED_PROXY;
|
|
|
|
+ wchar_t szProxy[MAX_PATH] = L"";
|
|
|
|
+ wcscpy_s(szProxy, MAX_PATH, proxyConfig.lpszProxy);
|
|
|
|
+ proxyInfo.lpszProxy = szProxy;
|
|
|
|
+
|
|
|
|
+ if (proxyConfig.lpszProxyBypass != NULL)
|
|
|
|
+ {
|
|
|
|
+ wchar_t szProxyBypass[MAX_PATH] = L"";
|
|
|
|
+ wcscpy_s(szProxyBypass, MAX_PATH, proxyConfig.lpszProxyBypass);
|
|
|
|
+ proxyInfo.lpszProxyBypass = szProxyBypass;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!::WinHttpSetOption(m_hRequest, WINHTTP_OPTION_PROXY, &proxyInfo, sizeof(proxyInfo)))
|
|
|
|
+ {
|
|
|
|
+ dwError = ::GetLastError();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (proxyConfig.lpszAutoConfigUrl != NULL)
|
|
|
|
+ {
|
|
|
|
+ ::GlobalFree(proxyConfig.lpszAutoConfigUrl);
|
|
|
|
+ }
|
|
|
|
+ if (proxyConfig.lpszProxy != NULL)
|
|
|
|
+ {
|
|
|
|
+ ::GlobalFree(proxyConfig.lpszProxy);
|
|
|
|
+ }
|
|
|
|
+ if (proxyConfig.lpszProxyBypass != NULL)
|
|
|
|
+ {
|
|
|
|
+ ::GlobalFree(proxyConfig.lpszProxyBypass);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ dwError = ::GetLastError();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (bSendRequestSucceed)
|
|
|
|
+ {
|
|
|
|
+ // 有FormData数据要上传;
|
|
|
|
+ if ( m_strFormData.size() != 0 )
|
|
|
|
+ {
|
|
|
|
+ DWORD dwWritten = 0;
|
|
|
|
+ if (!::WinHttpWriteData(m_hRequest, m_strFormData.c_str(), m_strFormData.size()*sizeof(wchar_t), &dwWritten))
|
|
|
|
+ {
|
|
|
|
+ dwError = ::GetLastError();
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 有PostData数据要上传;
|
|
|
|
+ if ( m_strPostData.size() != 0 )
|
|
|
|
+ {
|
|
|
|
+ DWORD dwWritten = 0;
|
|
|
|
+ if (!::WinHttpWriteData(m_hRequest, m_strPostData.c_str(), m_strPostData.size()*sizeof(wchar_t), &dwWritten))
|
|
|
|
+ {
|
|
|
|
+ dwError = ::GetLastError();
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ bGetResponseSucceed = TRUE;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return bGetResponseSucceed;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+BOOL HTTPHelper::_ReceiveResponse(std::wstring &strHeaer, DWORD &dwStatusCode, std::string &strResponseData)
|
|
|
|
+{
|
|
|
|
+ DWORD dwError(0);
|
|
|
|
+ if (::WinHttpReceiveResponse(m_hRequest, NULL))
|
|
|
|
+ {
|
|
|
|
+ DWORD dwSize = 0;
|
|
|
|
+ BOOL bResult = FALSE;
|
|
|
|
+ // 获取返回头;
|
|
|
|
+ bResult = ::WinHttpQueryHeaders(m_hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF, WINHTTP_HEADER_NAME_BY_INDEX, NULL, &dwSize, WINHTTP_NO_HEADER_INDEX);
|
|
|
|
+ if (bResult || (!bResult && (::GetLastError() == ERROR_INSUFFICIENT_BUFFER)))
|
|
|
|
+ {
|
|
|
|
+ if ( dwSize < K0 )
|
|
|
|
+ {
|
|
|
|
+ wchar_t szHeader[K0] = {0};
|
|
|
|
+ if (::WinHttpQueryHeaders(m_hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF, WINHTTP_HEADER_NAME_BY_INDEX, szHeader, &dwSize, WINHTTP_NO_HEADER_INDEX))
|
|
|
|
+ {
|
|
|
|
+ strHeaer.assign(szHeader);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else if ( dwSize < K1 )
|
|
|
|
+ {
|
|
|
|
+ wchar_t szHeader[K1] = {0};
|
|
|
|
+ if (::WinHttpQueryHeaders(m_hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF, WINHTTP_HEADER_NAME_BY_INDEX, szHeader, &dwSize, WINHTTP_NO_HEADER_INDEX))
|
|
|
|
+ {
|
|
|
|
+ strHeaer.assign(szHeader);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ dwSize = 0;
|
|
|
|
+ bResult = ::WinHttpQueryHeaders(m_hRequest, WINHTTP_QUERY_STATUS_CODE, WINHTTP_HEADER_NAME_BY_INDEX, NULL, &dwSize, WINHTTP_NO_HEADER_INDEX);
|
|
|
|
+ if (bResult || (!bResult && (::GetLastError() == ERROR_INSUFFICIENT_BUFFER)))
|
|
|
|
+ {
|
|
|
|
+ wchar_t szStatusCode[MAX_PATH] = {0};
|
|
|
|
+ if (::WinHttpQueryHeaders(m_hRequest, WINHTTP_QUERY_STATUS_CODE, WINHTTP_HEADER_NAME_BY_INDEX, szStatusCode, &dwSize, WINHTTP_NO_HEADER_INDEX))
|
|
|
|
+ {
|
|
|
|
+ dwStatusCode = _wtol(szStatusCode);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ do
|
|
|
|
+ {
|
|
|
|
+ dwSize = 0;
|
|
|
|
+ if (::WinHttpQueryDataAvailable(m_hRequest, &dwSize))
|
|
|
|
+ {
|
|
|
|
+ //SetProgress(iCurrentBufferSize);
|
|
|
|
+ DWORD dwRead = 0;
|
|
|
|
+ BYTE szReadData[K1] = {0}; // 每次读取1K;
|
|
|
|
+ if (::WinHttpReadData(m_hRequest, szReadData, K1, &dwRead))
|
|
|
|
+ {
|
|
|
|
+ strResponseData.append(szReadData, dwRead);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ dwError = ::GetLastError();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ while (dwSize > 0);
|
|
|
|
+ //SetProgress(iCurrentBufferSize);
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ dwError = ::GetLastError();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return TRUE;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+bool HTTPHelper::SendRequest(HTTPITEM &item,HTTPRESULT &httpResult)
|
|
|
|
+{
|
|
|
|
+ DWORD dwError = -1;
|
|
|
|
+ if ( m_hSession == NULL ) {
|
|
|
|
+ if (!_OpenHTTP())
|
|
|
|
+ return false;
|
|
|
|
+
|
|
|
|
+ bool bGetResponseSucceed=false;
|
|
|
|
+ while ( !bGetResponseSucceed && m_nRetryTimes-- > 0 )
|
|
|
|
+ {
|
|
|
|
+ // 是否有请求头;
|
|
|
|
+ if ( !_SetRequestHeaders() ) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 是否有Cookie;
|
|
|
|
+ if ( !_SetCookies() ) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 是否有代理服务器;
|
|
|
|
+ if ( !_SetProxy() ) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 是否关闭自动重定向;
|
|
|
|
+ if ( !_SetAutoRedirect() ) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 发送请求;
|
|
|
|
+ bool bSendRequestSucceed = false;
|
|
|
|
+ //if (::WinHttpSendRequest(m_hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, NULL, (LPVOID)m_strPostData.c_str(), m_strPostData.size()*sizeof(wchar_t), m_strPostData.size()*sizeof(wchar_t), NULL))
|
|
|
|
+ if (::WinHttpSendRequest(m_hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, NULL, WINHTTP_NO_REQUEST_DATA, 0, _GetSendRequestSize(), NULL))
|
|
|
|
+ {
|
|
|
|
+ bSendRequestSucceed = true;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ // 从IE设置中查询代理信息,如果有代理,设置代理;
|
|
|
|
+ WINHTTP_CURRENT_USER_IE_PROXY_CONFIG proxyConfig;
|
|
|
|
+ memset(&proxyConfig, 0, sizeof(proxyConfig));
|
|
|
|
+ if (::WinHttpGetIEProxyConfigForCurrentUser(&proxyConfig))
|
|
|
|
+ {
|
|
|
|
+ if (proxyConfig.lpszAutoConfigUrl != NULL)
|
|
|
|
+ {
|
|
|
|
+ WINHTTP_AUTOPROXY_OPTIONS autoProxyOptions;
|
|
|
|
+ memset(&autoProxyOptions, 0, sizeof(autoProxyOptions));
|
|
|
|
+ autoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_AUTO_DETECT | WINHTTP_AUTOPROXY_CONFIG_URL;
|
|
|
|
+ autoProxyOptions.dwAutoDetectFlags = WINHTTP_AUTO_DETECT_TYPE_DHCP;
|
|
|
|
+ autoProxyOptions.lpszAutoConfigUrl = proxyConfig.lpszAutoConfigUrl;
|
|
|
|
+ autoProxyOptions.fAutoLogonIfChallenged = TRUE;
|
|
|
|
+ autoProxyOptions.dwReserved = 0;
|
|
|
|
+ autoProxyOptions.lpvReserved = NULL;
|
|
|
|
+
|
|
|
|
+ WINHTTP_PROXY_INFO proxyInfo;
|
|
|
|
+ memset(&proxyInfo, 0, sizeof(proxyInfo));
|
|
|
|
+
|
|
|
|
+ if (::WinHttpGetProxyForUrl(m_hSession, m_strUrl.c_str(), &autoProxyOptions, &proxyInfo))
|
|
|
|
+ {
|
|
|
|
+ if (::WinHttpSetOption(m_hRequest, WINHTTP_OPTION_PROXY, &proxyInfo, sizeof(proxyInfo)))
|
|
|
|
+ {
|
|
|
|
+ if (::WinHttpSendRequest(m_hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, NULL))
|
|
|
|
+ {
|
|
|
|
+ bSendRequestSucceed = true;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (proxyInfo.lpszProxy != NULL)
|
|
|
|
+ {
|
|
|
|
+ ::GlobalFree(proxyInfo.lpszProxy);
|
|
|
|
+ }
|
|
|
|
+ if (proxyInfo.lpszProxyBypass != NULL)
|
|
|
|
+ {
|
|
|
|
+ ::GlobalFree(proxyInfo.lpszProxyBypass);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ dwError = ::GetLastError();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else if (proxyConfig.lpszProxy != NULL)
|
|
|
|
+ {
|
|
|
|
+ WINHTTP_PROXY_INFO proxyInfo;
|
|
|
|
+ memset(&proxyInfo, 0, sizeof(proxyInfo));
|
|
|
|
+ proxyInfo.dwAccessType = WINHTTP_ACCESS_TYPE_NAMED_PROXY;
|
|
|
|
+ wchar_t szProxy[MAX_PATH] = L"";
|
|
|
|
+ wcscpy_s(szProxy, MAX_PATH, proxyConfig.lpszProxy);
|
|
|
|
+ proxyInfo.lpszProxy = szProxy;
|
|
|
|
+
|
|
|
|
+ if (proxyConfig.lpszProxyBypass != NULL)
|
|
|
|
+ {
|
|
|
|
+ wchar_t szProxyBypass[MAX_PATH] = L"";
|
|
|
|
+ wcscpy_s(szProxyBypass, MAX_PATH, proxyConfig.lpszProxyBypass);
|
|
|
|
+ proxyInfo.lpszProxyBypass = szProxyBypass;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!::WinHttpSetOption(m_hRequest, WINHTTP_OPTION_PROXY, &proxyInfo, sizeof(proxyInfo)))
|
|
|
|
+ {
|
|
|
|
+ dwError = ::GetLastError();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (proxyConfig.lpszAutoConfigUrl != NULL)
|
|
|
|
+ {
|
|
|
|
+ ::GlobalFree(proxyConfig.lpszAutoConfigUrl);
|
|
|
|
+ }
|
|
|
|
+ if (proxyConfig.lpszProxy != NULL)
|
|
|
|
+ {
|
|
|
|
+ ::GlobalFree(proxyConfig.lpszProxy);
|
|
|
|
+ }
|
|
|
|
+ if (proxyConfig.lpszProxyBypass != NULL)
|
|
|
|
+ {
|
|
|
|
+ ::GlobalFree(proxyConfig.lpszProxyBypass);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ dwError = ::GetLastError();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (bSendRequestSucceed)
|
|
|
|
+ {
|
|
|
|
+ // 有FormData数据要上传;
|
|
|
|
+ if ( m_strFormData.size() != 0 )
|
|
|
|
+ {
|
|
|
|
+ DWORD dwWritten = 0;
|
|
|
|
+ if (!::WinHttpWriteData(m_hRequest, m_strFormData.c_str(), m_strFormData.size()*sizeof(wchar_t), &dwWritten))
|
|
|
|
+ {
|
|
|
|
+ dwError = ::GetLastError();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 有PostData数据要上传;
|
|
|
|
+ if ( m_strPostData.size() != 0 )
|
|
|
|
+ {
|
|
|
|
+ DWORD dwWritten = 0;
|
|
|
|
+ if (!::WinHttpWriteData(m_hRequest, m_strPostData.c_str(), m_strPostData.size()*sizeof(wchar_t), &dwWritten))
|
|
|
|
+ {
|
|
|
|
+ dwError = ::GetLastError();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (::WinHttpReceiveResponse(m_hRequest, NULL))
|
|
|
|
+ {
|
|
|
|
+ DWORD dwSize = 0;
|
|
|
|
+ BOOL bResult = FALSE;
|
|
|
|
+ // 获取返回头;
|
|
|
|
+ bResult = ::WinHttpQueryHeaders(m_hRequest,
|
|
|
|
+ WINHTTP_QUERY_RAW_HEADERS_CRLF,
|
|
|
|
+ WINHTTP_HEADER_NAME_BY_INDEX,
|
|
|
|
+ NULL,
|
|
|
|
+ &dwSize,
|
|
|
|
+ WINHTTP_NO_HEADER_INDEX);
|
|
|
|
+
|
|
|
|
+ if (bResult || (!bResult && (::GetLastError() == ERROR_INSUFFICIENT_BUFFER)))
|
|
|
|
+ {
|
|
|
|
+ wchar_t *szHeader = new wchar_t[dwSize];
|
|
|
|
+ if (szHeader != NULL)
|
|
|
|
+ {
|
|
|
|
+ memset(szHeader, 0, dwSize* sizeof(wchar_t));
|
|
|
|
+ if (::WinHttpQueryHeaders(m_hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF, WINHTTP_HEADER_NAME_BY_INDEX, szHeader, &dwSize, WINHTTP_NO_HEADER_INDEX))
|
|
|
|
+ {
|
|
|
|
+ httpResult.m_strHeader.assign(szHeader);
|
|
|
|
+ }
|
|
|
|
+ delete[] szHeader;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ dwSize = 0;
|
|
|
|
+ bResult = ::WinHttpQueryHeaders(m_hRequest,
|
|
|
|
+ WINHTTP_QUERY_STATUS_CODE,
|
|
|
|
+ WINHTTP_HEADER_NAME_BY_INDEX,
|
|
|
|
+ NULL,
|
|
|
|
+ &dwSize,
|
|
|
|
+ WINHTTP_NO_HEADER_INDEX);
|
|
|
|
+ if (bResult || (!bResult && (::GetLastError() == ERROR_INSUFFICIENT_BUFFER)))
|
|
|
|
+ {
|
|
|
|
+ wchar_t *szStatusCode = new wchar_t[dwSize];
|
|
|
|
+ if (szStatusCode != NULL)
|
|
|
|
+ {
|
|
|
|
+ memset(szStatusCode, 0, dwSize* sizeof(wchar_t));
|
|
|
|
+ if (::WinHttpQueryHeaders(m_hRequest,
|
|
|
|
+ WINHTTP_QUERY_STATUS_CODE,
|
|
|
|
+ WINHTTP_HEADER_NAME_BY_INDEX,
|
|
|
|
+ szStatusCode,
|
|
|
|
+ &dwSize,
|
|
|
|
+ WINHTTP_NO_HEADER_INDEX))
|
|
|
|
+ {
|
|
|
|
+ httpResult.m_dwStatusCode = _wtol(szStatusCode);
|
|
|
|
+ }
|
|
|
|
+ delete[] szStatusCode;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ unsigned int iMaxBufferSize = 8912;
|
|
|
|
+ unsigned int iCurrentBufferSize = 0;
|
|
|
|
+ if (httpResult.m_pResponseData != NULL)
|
|
|
|
+ {
|
|
|
|
+ delete[] httpResult.m_pResponseData;
|
|
|
|
+ httpResult.m_pResponseData = NULL;
|
|
|
|
+ }
|
|
|
|
+ httpResult.m_pResponseData = new BYTE[iMaxBufferSize];
|
|
|
|
+ if (httpResult.m_pResponseData == NULL)
|
|
|
|
+ {
|
|
|
|
+ //bRetVal = false;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ memset(httpResult.m_pResponseData, 0, iMaxBufferSize);
|
|
|
|
+ do
|
|
|
|
+ {
|
|
|
|
+ dwSize = 0;
|
|
|
|
+ if (::WinHttpQueryDataAvailable(m_hRequest, &dwSize))
|
|
|
|
+ {
|
|
|
|
+ //SetProgress(iCurrentBufferSize);
|
|
|
|
+ BYTE *pResponse = new BYTE[dwSize + 1];
|
|
|
|
+ if (pResponse != NULL)
|
|
|
|
+ {
|
|
|
|
+ memset(pResponse, 0, (dwSize + 1)*sizeof(BYTE));
|
|
|
|
+ DWORD dwRead = 0;
|
|
|
|
+ if (::WinHttpReadData(m_hRequest, pResponse, dwSize, &dwRead))
|
|
|
|
+ {
|
|
|
|
+ if (dwRead + iCurrentBufferSize > iMaxBufferSize)
|
|
|
|
+ {
|
|
|
|
+ BYTE *pOldBuffer = httpResult.m_pResponseData;
|
|
|
|
+ httpResult.m_pResponseData = new BYTE[iMaxBufferSize * 2];
|
|
|
|
+ if (httpResult.m_pResponseData == NULL)
|
|
|
|
+ {
|
|
|
|
+ httpResult.m_pResponseData = pOldBuffer;
|
|
|
|
+ //bRetVal = false;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ iMaxBufferSize *= 2;
|
|
|
|
+ memset(httpResult.m_pResponseData, 0, iMaxBufferSize);
|
|
|
|
+ memcpy(httpResult.m_pResponseData, pOldBuffer, iCurrentBufferSize);
|
|
|
|
+ delete[] pOldBuffer;
|
|
|
|
+ }
|
|
|
|
+ memcpy(httpResult.m_pResponseData + iCurrentBufferSize, pResponse, dwRead);
|
|
|
|
+ iCurrentBufferSize += dwRead;
|
|
|
|
+ }
|
|
|
|
+ delete[] pResponse;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ dwError = ::GetLastError();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ while (dwSize > 0);
|
|
|
|
+ //SetProgress(iCurrentBufferSize);
|
|
|
|
+ httpResult.m_dwResponseSize = iCurrentBufferSize;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ UINT codePage = CP_ACP;
|
|
|
|
+ DWORD dwFlag = MB_PRECOMPOSED;
|
|
|
|
+ if (_wcsnicmp(m_responseCharset.c_str(), L"utf-8", 5) == 0)
|
|
|
|
+ {
|
|
|
|
+ codePage = CP_UTF8;
|
|
|
|
+ dwFlag = 0;
|
|
|
|
+ }
|
|
|
|
+ int iLength = ::MultiByteToWideChar(codePage, dwFlag, (LPCSTR)m_pResponse, m_responseByteCountReceived + 1, NULL, 0);
|
|
|
|
+ if (iLength <= 0)
|
|
|
|
+ {
|
|
|
|
+ // Use CP_ACP if UTF-8 fail
|
|
|
|
+ codePage = CP_ACP;
|
|
|
|
+ dwFlag = MB_PRECOMPOSED;
|
|
|
|
+ iLength = ::MultiByteToWideChar(codePage, dwFlag, (LPCSTR)m_pResponse, m_responseByteCountReceived + 1, NULL, 0);
|
|
|
|
+ }
|
|
|
|
+ if (iLength > 0)
|
|
|
|
+ {
|
|
|
|
+ wchar_t *wideChar = new wchar_t[iLength];
|
|
|
|
+ if (wideChar != NULL)
|
|
|
|
+ {
|
|
|
|
+ memset(wideChar, 0, iLength * sizeof(wchar_t));
|
|
|
|
+ iLength = ::MultiByteToWideChar(codePage, dwFlag, (LPCSTR)m_pResponse, m_responseByteCountReceived + 1, wideChar, iLength);
|
|
|
|
+ if (iLength > 0)
|
|
|
|
+ {
|
|
|
|
+ m_responseContent = wideChar;
|
|
|
|
+ }
|
|
|
|
+ delete[] wideChar;
|
|
|
|
+ }
|
|
|
|
+ }*/
|
|
|
|
+ bGetResponseSucceed = true;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ // If the resposne html web page size is less than 200, retry.
|
|
|
|
+ if (verb == L"GET" && !disableAutoRedirect)
|
|
|
|
+ {
|
|
|
|
+ wstring regExp = L"{<html>}";
|
|
|
|
+ vector<wstring> result;
|
|
|
|
+ if (ParseRegExp(regExp, false, 1, m_responseContent, result) && result.size() > 0)
|
|
|
|
+ {
|
|
|
|
+ regExp = L"{</html>}";
|
|
|
|
+ if (!ParseRegExp(regExp, false, 1, m_responseContent, result) || result.size() <= 0)
|
|
|
|
+ {
|
|
|
|
+ m_dwLastError = ERROR_INVALID_DATA;
|
|
|
|
+ bGetReponseSucceed = false;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }*/
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ dwError = ::GetLastError();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+bool HTTPHelper::SetCer(HTTPITEM &item)
|
|
|
|
+{
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+BOOL HTTPHelper::_SetTimeout()
|
|
|
|
+{
|
|
|
|
+ if ( m_hSession == NULL )
|
|
|
|
+ return FALSE;
|
|
|
|
+
|
|
|
|
+ BOOL bRet = WinHttpSetTimeouts(m_hSession, m_nResolveTimeout, m_nConnectTimeout, m_nSendTimeout, m_nReceiveTimeout);
|
|
|
|
+ if ( !bRet ) {
|
|
|
|
+ DWORD dwError = GetLastError();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return bRet;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+BOOL HTTPHelper::_SetRequestHeaders()
|
|
|
|
+{
|
|
|
|
+ if ( m_hRequest == NULL )
|
|
|
|
+ return FALSE;
|
|
|
|
+
|
|
|
|
+ if ( m_strHeader.size() > 0 ) {
|
|
|
|
+ if ( !WinHttpAddRequestHeaders(m_hRequest, m_strHeader.c_str(), m_strHeader.size(), WINHTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON) ) {
|
|
|
|
+ DWORD dwError = GetLastError();
|
|
|
|
+ return FALSE;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return TRUE;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void HTTPHelper::_SetContentLength()
|
|
|
|
+{
|
|
|
|
+ int nPos = m_strHeader.find(CONTENT_LENGTH);
|
|
|
|
+ if ( nPos != std::wstring::npos) {
|
|
|
|
+ // 删除原有的请求头;
|
|
|
|
+ int nPos2 = m_strHeader.find(L"\r\n",nPos);
|
|
|
|
+ if ( nPos2 !=std::wstring::npos )
|
|
|
|
+ m_strHeader.erase(nPos, nPos2-nPos+2);
|
|
|
|
+ else
|
|
|
|
+ m_strHeader.erase(nPos);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ wchar_t szContentLenght[MAX_PATH] = {0};
|
|
|
|
+ swprintf_s(szContentLenght, L"%s%d", CONTENT_LENGTH, m_strFormData.size());
|
|
|
|
+
|
|
|
|
+ // 添加Form表单头;
|
|
|
|
+ m_strHeader.append(szContentLenght);
|
|
|
|
+ m_strHeader.append(CRLF);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+DWORD HTTPHelper::_GetSendRequestSize()
|
|
|
|
+{
|
|
|
|
+ DWORD dwSize(0);
|
|
|
|
+ if ( m_strPostData.size())
|
|
|
|
+ dwSize = m_strPostData.size()*sizeof(wchar_t);
|
|
|
|
+ else if ( m_strFormData.size())
|
|
|
|
+ dwSize = m_strFormData.size()*sizeof(wchar_t);
|
|
|
|
+
|
|
|
|
+ return dwSize;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+BOOL HTTPHelper::_SetCookies()
|
|
|
|
+{
|
|
|
|
+ if ( m_hRequest == NULL )
|
|
|
|
+ return FALSE;
|
|
|
|
+
|
|
|
|
+ if ( m_strCookies.size() > 0 ) {
|
|
|
|
+ std::wstring cookies = L"Cookie: ";
|
|
|
|
+ cookies += m_strCookies;
|
|
|
|
+ if (!::WinHttpAddRequestHeaders(m_hRequest, cookies.c_str(), cookies.size(), WINHTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON)) {
|
|
|
|
+ DWORD dwError = ::GetLastError();
|
|
|
|
+ return FALSE;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return TRUE;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+BOOL HTTPHelper::_SetProxy()
|
|
|
|
+{
|
|
|
|
+ if ( m_hRequest == NULL )
|
|
|
|
+ return FALSE;
|
|
|
|
+
|
|
|
|
+ if ( m_strProxyServerList.size() ) {
|
|
|
|
+ WINHTTP_PROXY_INFO proxyInfo;
|
|
|
|
+ memset(&proxyInfo, 0, sizeof(proxyInfo));
|
|
|
|
+
|
|
|
|
+ proxyInfo.dwAccessType = WINHTTP_ACCESS_TYPE_NAMED_PROXY;
|
|
|
|
+ wchar_t szProxy[MAX_PATH] = L"";
|
|
|
|
+ wcscpy_s(szProxy, MAX_PATH, m_strProxyServerList.c_str());
|
|
|
|
+ proxyInfo.lpszProxy = szProxy;
|
|
|
|
+
|
|
|
|
+ DWORD dwError(0);
|
|
|
|
+ if (!::WinHttpSetOption(m_hRequest, WINHTTP_OPTION_PROXY, &proxyInfo, sizeof(proxyInfo))) {
|
|
|
|
+ dwError = ::GetLastError();
|
|
|
|
+ return FALSE;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (m_strProxyUserName.size() > 0) {
|
|
|
|
+ if (!::WinHttpSetOption(m_hRequest, WINHTTP_OPTION_PROXY_USERNAME, (LPVOID)m_strProxyUserName.c_str(), m_strProxyUserName.size() * sizeof(wchar_t))) {
|
|
|
|
+ dwError = ::GetLastError();
|
|
|
|
+ return FALSE;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (m_strProxyPwd.size() > 0) {
|
|
|
|
+ if (!::WinHttpSetOption(m_hRequest, WINHTTP_OPTION_PROXY_PASSWORD, (LPVOID)m_strProxyPwd.c_str(), m_strProxyPwd.size() * sizeof(wchar_t))) {
|
|
|
|
+ dwError = ::GetLastError();
|
|
|
|
+ return FALSE;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return TRUE;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+BOOL HTTPHelper::_SetAutoRedirect()
|
|
|
|
+{
|
|
|
|
+ if ( !m_bAllowAutoRedirect ) {
|
|
|
|
+ DWORD dwDisableFeature = WINHTTP_DISABLE_REDIRECTS;
|
|
|
|
+ if (!::WinHttpSetOption(m_hRequest, WINHTTP_OPTION_DISABLE_FEATURE, &dwDisableFeature, sizeof(dwDisableFeature))) {
|
|
|
|
+ DWORD dwError = ::GetLastError();
|
|
|
|
+ return FALSE;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return TRUE;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void HTTPHelper::SetContentType(std::wstring strContentType)
|
|
|
|
+{
|
|
|
|
+ int nPos = m_strHeader.find(CONTENT_TYPE);
|
|
|
|
+ if ( nPos != std::wstring::npos) {
|
|
|
|
+ // 删除原有的请求头;
|
|
|
|
+ int nPos2 = m_strHeader.find(L"\r\n",nPos);
|
|
|
|
+ if ( nPos2 !=std::wstring::npos )
|
|
|
|
+ m_strHeader.erase(nPos, nPos2-nPos+2);
|
|
|
|
+ else
|
|
|
|
+ m_strHeader.erase(nPos);
|
|
|
|
+ }
|
|
|
|
+ // 添加Form表单头;
|
|
|
|
+ m_strHeader.append(strContentType);
|
|
|
|
+ m_strHeader.append(CRLF);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void HTTPHelper::AddQueryParams(std::wstring strName, std::wstring strValue)
|
|
|
|
+{
|
|
|
|
+ if ( m_strQueryParams.size() )
|
|
|
|
+ m_strQueryParams.append(L"&");
|
|
|
|
+
|
|
|
|
+ m_strQueryParams.append(strName);
|
|
|
|
+ m_strQueryParams.append(L"=");
|
|
|
|
+ m_strQueryParams.append(strValue);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void HTTPHelper::AddFormDataHeader()
|
|
|
|
+{
|
|
|
|
+ if ( m_strHeader.find(FORMDATAHEADER) == std::wstring::npos ) {
|
|
|
|
+ int nPos = m_strHeader.find(L"Content-Type:");
|
|
|
|
+ if ( nPos != std::wstring::npos) {
|
|
|
|
+ // 删除原有的请求头;
|
|
|
|
+ int nPos2 = m_strHeader.find(L"\r\n",nPos);
|
|
|
|
+ if ( nPos2 !=std::wstring::npos )
|
|
|
|
+ m_strHeader.erase(nPos, nPos2-nPos+2);
|
|
|
|
+ else
|
|
|
|
+ m_strHeader.erase(nPos);
|
|
|
|
+ }
|
|
|
|
+ // 添加Form表单头;
|
|
|
|
+ m_strHeader.append(FORMDATAHEADER);
|
|
|
|
+ m_strHeader.append(CRLF);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 清空FormatData;
|
|
|
|
+ m_strFormData.clear();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void HTTPHelper::AddFormUrlEncodedDataHeader()
|
|
|
|
+{
|
|
|
|
+ if ( m_strHeader.find(FORMURLENCODEDDATAHEADER) == std::wstring::npos ) {
|
|
|
|
+ int nPos = m_strHeader.find(L"Content-Type:");
|
|
|
|
+ if ( nPos != std::wstring::npos) {
|
|
|
|
+ // 删除原有的请求头;
|
|
|
|
+ int nPos2 = m_strHeader.find(L"\r\n",nPos);
|
|
|
|
+ if ( nPos2 !=std::wstring::npos )
|
|
|
|
+ m_strHeader.erase(nPos, nPos2-nPos+2);
|
|
|
|
+ else
|
|
|
|
+ m_strHeader.erase(nPos);
|
|
|
|
+ }
|
|
|
|
+ // 添加Form表单头;
|
|
|
|
+ m_strHeader.append(FORMURLENCODEDDATAHEADER);
|
|
|
|
+ m_strHeader.append(CRLF);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 清空FormatData;
|
|
|
|
+ m_strFormData.clear();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void HTTPHelper::AddBodyFormDataText(std::wstring strName, std::wstring strValue)
|
|
|
|
+{
|
|
|
|
+ AddFormDataHeader();//放到外头,只调用一次就好;
|
|
|
|
+ int nSize = wcslen(FORMDATA_TEXT_FORMAT) + strName.size() + strValue.size();
|
|
|
|
+ if ( nSize < K0 ) {
|
|
|
|
+ wchar_t szFormData[K0] = {0};
|
|
|
|
+ swprintf_s(szFormData, FORMDATA_TEXT_FORMAT, strName.c_str(), strName.c_str(), strValue.c_str());
|
|
|
|
+ m_strFormData.append(szFormData);
|
|
|
|
+ }
|
|
|
|
+ else if ( nSize < K1 ) {
|
|
|
|
+ wchar_t szFormData[K1] = {0};
|
|
|
|
+ swprintf_s(szFormData, FORMDATA_TEXT_FORMAT, strName.c_str(), strName.c_str(), strValue.c_str());
|
|
|
|
+ m_strFormData.append(szFormData);
|
|
|
|
+ }
|
|
|
|
+ else if ( nSize < K2 ) {
|
|
|
|
+ wchar_t szFormData[K2] = {0};
|
|
|
|
+ swprintf_s(szFormData, FORMDATA_TEXT_FORMAT, strName.c_str(), strName.c_str(), strValue.c_str());
|
|
|
|
+ m_strFormData.append(szFormData);
|
|
|
|
+ }
|
|
|
|
+ else if ( nSize < K4 ) {
|
|
|
|
+ wchar_t szFormData[K4] = {0};
|
|
|
|
+ swprintf_s(szFormData, FORMDATA_TEXT_FORMAT, strName.c_str(), strName.c_str(), strValue.c_str());
|
|
|
|
+ m_strFormData.append(szFormData);
|
|
|
|
+ }
|
|
|
|
+ else if ( nSize < K8 ) {
|
|
|
|
+ wchar_t szFormData[K8] = {0};
|
|
|
|
+ swprintf_s(szFormData, FORMDATA_TEXT_FORMAT, strName.c_str(), strName.c_str(), strValue.c_str());
|
|
|
|
+ m_strFormData.append(szFormData);
|
|
|
|
+ } else {
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void HTTPHelper::AddBodyFormDataFile(std::wstring strName, std::wstring strFilePath, std::wstring strContentType)
|
|
|
|
+{
|
|
|
|
+ AddFormDataHeader();//放到外头,只调用一次就好;
|
|
|
|
+ int nSize = wcslen(FORMDATA_FILE_FORMAT) + strName.size() + strFilePath.size() + strContentType.size();
|
|
|
|
+ if ( nSize < K0 ) {
|
|
|
|
+ wchar_t szFormData[K0] = {0};
|
|
|
|
+ swprintf_s(szFormData, FORMDATA_FILE_FORMAT, strName.c_str(), strName.c_str(), strFilePath.c_str(), strContentType.c_str());
|
|
|
|
+ m_strFormData.append(szFormData);
|
|
|
|
+ }
|
|
|
|
+ else if ( nSize < K1 ) {
|
|
|
|
+ wchar_t szFormData[K1] = {0};
|
|
|
|
+ swprintf_s(szFormData, FORMDATA_FILE_FORMAT, strName.c_str(), strName.c_str(), strFilePath.c_str(), strContentType.c_str());
|
|
|
|
+ m_strFormData.append(szFormData);
|
|
|
|
+ }
|
|
|
|
+ else if ( nSize < K2 ) {
|
|
|
|
+ wchar_t szFormData[K2] = {0};
|
|
|
|
+ swprintf_s(szFormData, FORMDATA_FILE_FORMAT, strName.c_str(), strName.c_str(), strFilePath.c_str(), strContentType.c_str());
|
|
|
|
+ m_strFormData.append(szFormData);
|
|
|
|
+ }
|
|
|
|
+ else if ( nSize < K4 ) {
|
|
|
|
+ wchar_t szFormData[K4] = {0};
|
|
|
|
+ swprintf_s(szFormData, FORMDATA_FILE_FORMAT, strName.c_str(), strName.c_str(), strFilePath.c_str(), strContentType.c_str());
|
|
|
|
+ m_strFormData.append(szFormData);
|
|
|
|
+ }
|
|
|
|
+ else if ( nSize < K8 ) {
|
|
|
|
+ wchar_t szFormData[K8] = {0};
|
|
|
|
+ swprintf_s(szFormData, FORMDATA_FILE_FORMAT, strName.c_str(), strName.c_str(), strFilePath.c_str(), strContentType.c_str());
|
|
|
|
+ m_strFormData.append(szFormData);
|
|
|
|
+ } else {
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void HTTPHelper::AddBodyFormUrlEncodedData(std::wstring strName, std::wstring strValue)
|
|
|
|
+{
|
|
|
|
+ AddFormUrlEncodedDataHeader();//放到外头,只调用一次就好;
|
|
|
|
+ if ( m_strFormData.size() )
|
|
|
|
+ m_strFormData.append(L"&");
|
|
|
|
+
|
|
|
|
+ m_strFormData.append(strName);
|
|
|
|
+ m_strFormData.append(L"=");
|
|
|
|
+ m_strFormData.append(strValue);
|
|
|
|
+ // 重新计算长度;
|
|
|
|
+ _SetContentLength();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void HTTPHelper::AddBodyRawData(std::wstring strRawData, std::wstring strContentType/* = */)
|
|
|
|
+{
|
|
|
|
+ m_strPostData = strRawData;
|
|
|
|
+ // 代替ContentType
|
|
|
|
+ strRawData = CONTENT_TYPE;
|
|
|
|
+ strRawData.append(strContentType);
|
|
|
|
+ strRawData.append(CRLF);
|
|
|
|
+ SetContentType(strRawData);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void HTTPHelper::AddBodyBinary(std::wstring strFilePath)
|
|
|
|
+{
|
|
|
|
+
|
|
|
|
+}
|