📄 wininetconnector.cpp
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft shared
// source or premium shared source license agreement under which you licensed
// this source code. If you did not accept the terms of the license agreement,
// you are not authorized to use this source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the SOURCE.RTF on your install media or the root of your tools installation.
// THE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
//
//+----------------------------------------------------------------------------
//
//
// File:
// WinInetConnector.cpp
//
// Contents:
//
// CWinInetConnector class implementation
//
//-----------------------------------------------------------------------------
#include "Headers.h"
#include "strsafe.h"
#ifdef UNDER_CE
#include "WinCEUtils.h"
#endif
////////////////////////////////////////////////////////////////////////////////////////////////////
// static member initialization
////////////////////////////////////////////////////////////////////////////////////////////////////
const WCHAR CWinInetConnector::s_szSoapAction[] = L"SOAPAction: ";
const WCHAR CWinInetConnector::s_szNewLine[] = L"\r\n";
const WCHAR CWinInetConnector::s_Quote = '"';
////////////////////////////////////////////////////////////////////////////////////////////////////
// Error Map
////////////////////////////////////////////////////////////////////////////////////////////////////
#ifdef _DEBUG
#define WEE(wi, hr) { HRESULT_FROM_WIN32(wi), hr , __LINE__ },
#else
#define WEE(wi, hr) { HRESULT_FROM_WIN32(wi), hr },
#endif
static HResultMapEntry g_WinInetHResultMapEntries[] =
{
WEE(ERROR_INTERNET_OUT_OF_HANDLES, CONN_E_HTTP_OUTOFMEMORY)
WEE(ERROR_INTERNET_TIMEOUT, CONN_E_HTTP_TIMEOUT)
WEE(ERROR_INTERNET_EXTENDED_ERROR, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_INTERNAL_ERROR, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_INVALID_URL, CONN_E_HTTP_BAD_URL)
WEE(ERROR_INTERNET_UNRECOGNIZED_SCHEME, CONN_E_HTTP_BAD_URL)
WEE(ERROR_INTERNET_NAME_NOT_RESOLVED, CONN_E_HTTP_HOST_NOT_FOUND)
WEE(ERROR_INTERNET_PROTOCOL_NOT_FOUND, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_INVALID_OPTION, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_BAD_OPTION_LENGTH, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_OPTION_NOT_SETTABLE, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_SHUTDOWN, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_INCORRECT_USER_NAME, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_INCORRECT_PASSWORD, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_LOGIN_FAILURE, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_INVALID_OPERATION, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_OPERATION_CANCELLED, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_INCORRECT_HANDLE_TYPE, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_INCORRECT_HANDLE_STATE, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_NOT_PROXY_REQUEST, CONN_E_HTTP_CANNOT_USE_PROXY)
WEE(ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_BAD_REGISTRY_PARAMETER, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_NO_DIRECT_ACCESS, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_NO_CONTEXT, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_NO_CALLBACK, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_REQUEST_PENDING, CONN_E_HTTP_OVERLOADED)
WEE(ERROR_INTERNET_INCORRECT_FORMAT, CONN_E_HTTP_BAD_REQUEST)
WEE(ERROR_INTERNET_ITEM_NOT_FOUND, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_CANNOT_CONNECT, CONN_E_HTTP_CONNECT_FAILED)
WEE(ERROR_INTERNET_CONNECTION_ABORTED, CONN_E_HTTP_CONNECT_FAILED)
WEE(ERROR_INTERNET_CONNECTION_RESET, CONN_E_HTTP_CONNECT_FAILED)
WEE(ERROR_INTERNET_FORCE_RETRY, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_INVALID_PROXY_REQUEST, CONN_E_HTTP_BAD_REQUEST)
WEE(ERROR_INTERNET_NEED_UI, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_HANDLE_EXISTS, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_SEC_CERT_DATE_INVALID, CONN_E_HTTP_BAD_CERTIFICATE)
WEE(ERROR_INTERNET_SEC_CERT_CN_INVALID, CONN_E_HTTP_BAD_CERTIFICATE)
WEE(ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_MIXED_SECURITY, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_CHG_POST_IS_NON_SECURE, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_POST_IS_NON_SECURE, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED, CONN_E_HTTP_CLIENT_AUTH_CERT_NEEDED)
WEE(ERROR_INTERNET_INVALID_CA, CONN_E_HTTP_BAD_CERT_AUTHORITY)
WEE(ERROR_INTERNET_CLIENT_AUTH_NOT_SETUP, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_ASYNC_THREAD_FAILED, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_REDIRECT_SCHEME_CHANGE, CONN_E_HTTP_UNSPECIFIED)
#ifndef UNDER_CE
WEE(ERROR_INTERNET_DIALOG_PENDING, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_RETRY_DIALOG, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_HTTPS_HTTP_SUBMIT_REDIR, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_INSERT_CDROM, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_FORTEZZA_LOGIN_NEEDED, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_SEC_CERT_ERRORS, CONN_E_HTTP_BAD_CERTIFICATE)
WEE(ERROR_INTERNET_SEC_CERT_NO_REV, CONN_E_HTTP_BAD_CERTIFICATE)
WEE(ERROR_INTERNET_SEC_CERT_REV_FAILED, CONN_E_HTTP_BAD_CERTIFICATE)
#endif
WEE(ERROR_HTTP_HEADER_NOT_FOUND, CONN_E_HTTP_HOST_NOT_FOUND)
WEE(ERROR_HTTP_DOWNLEVEL_SERVER, CONN_E_HTTP_BAD_RESPONSE)
WEE(ERROR_HTTP_INVALID_SERVER_RESPONSE, CONN_E_HTTP_BAD_RESPONSE)
WEE(ERROR_HTTP_INVALID_HEADER, CONN_E_HTTP_PARSE_RESPONSE)
WEE(ERROR_HTTP_INVALID_QUERY_REQUEST, CONN_E_HTTP_BAD_REQUEST)
WEE(ERROR_HTTP_HEADER_ALREADY_EXISTS, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_HTTP_REDIRECT_FAILED, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_SECURITY_CHANNEL_ERROR, CONN_E_HTTP_SSL_ERROR)
WEE(ERROR_INTERNET_UNABLE_TO_CACHE_FILE, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_TCPIP_NOT_INSTALLED, CONN_E_HTTP_CONNECT_FAILED)
WEE(ERROR_HTTP_NOT_REDIRECTED, CONN_E_HTTP_UNSPECIFIED)
#ifndef UNDER_CE
WEE(ERROR_HTTP_COOKIE_NEEDS_CONFIRMATION, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_HTTP_COOKIE_DECLINED, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_DISCONNECTED, CONN_E_HTTP_CONNECT_FAILED)
WEE(ERROR_INTERNET_SERVER_UNREACHABLE, CONN_E_HTTP_CONNECT_FAILED)
WEE(ERROR_INTERNET_PROXY_SERVER_UNREACHABLE, CONN_E_HTTP_CONNECT_FAILED)
WEE(ERROR_INTERNET_BAD_AUTO_PROXY_SCRIPT, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_UNABLE_TO_DOWNLOAD_SCRIPT, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_HTTP_REDIRECT_NEEDS_CONFIRMATION, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_SEC_INVALID_CERT, CONN_E_HTTP_BAD_CERTIFICATE)
WEE(ERROR_INTERNET_SEC_CERT_REVOKED, CONN_E_HTTP_BAD_CERTIFICATE)
WEE(ERROR_INTERNET_FAILED_DUETOSECURITYCHECK, CONN_E_ACCESS_DENIED)
WEE(ERROR_INTERNET_NOT_INITIALIZED, CONN_E_HTTP_CONNECT_FAILED)
WEE(ERROR_INTERNET_NEED_MSN_SSPI_PKG, CONN_E_HTTP_UNSPECIFIED)
WEE(ERROR_INTERNET_LOGIN_FAILURE_DISPLAY_ENTITY_BODY, CONN_E_HTTP_UNSPECIFIED)
#else
WEE(0, S_OK)
#endif
};
static HResultMap g_WinInetHResultMap =
{
countof(g_WinInetHResultMapEntries),
g_WinInetHResultMapEntries,
CONN_E_HTTP_UNSPECIFIED
#ifdef _DEBUG
, __FILE__
#endif
};
////////////////////////////////////////////////////////////////////////////////////////////////////
// Interface Map
////////////////////////////////////////////////////////////////////////////////////////////////////
TYPEINFOIDSFORCLASS(CHttpConnBase, ISoapConnector, MSSOAPLib)
BEGIN_INTERFACE_MAP(CWinInetConnector)
ADD_IUNKNOWN(CWinInetConnector, ISoapConnector)
ADD_INTERFACE(CWinInetConnector, ISoapConnector)
ADD_INTERFACE(CWinInetConnector, IDispatch)
END_INTERFACE_MAP(CWinInetConnector)
////////////////////////////////////////////////////////////////////////////////////////////////////
// function: CWinInetConnector::CWinInetConnector
//
// parameters:
//
// description:
//
// returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
CWinInetConnector::CWinInetConnector()
: m_hInternet(0),
#ifndef UNDER_CE
m_hConnect(0),
m_hRequest(0),
#endif
m_pRequest(0),
m_pResponse(0)
{
#ifdef UNDER_CE
m_hConnect = 0;
m_hRequest = 0;
#endif /* UNDER_CE */
#ifdef _DEBUG
m_dwTimeout = 0x1FFFFFFF; // is int, not DWORD in WinInet
#endif
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
// function: CWinInetConnector::~CWinInetConnector
//
// parameters:
//
// description:
//
// returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
CWinInetConnector::~CWinInetConnector()
{
::ReleaseInterface((const CWinInetRequestStream*&)m_pRequest);
::ReleaseInterface((const CWinInetResponseStream*&)m_pResponse);
CWinInetConnector::ShutdownConnection();
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
// function: STDMETHODIMP CWinInetConnector::get_InputStream(IStream **pVal)
//
// parameters:
//
// description:
//
// returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CWinInetConnector::get_InputStream(IStream **pVal)
{
if (! pVal)
return E_INVALIDARG;
HRESULT hr = S_OK;
*pVal = 0;
if (! m_pRequest)
{
m_pRequest = new CSoapOwnedObject<CWinInetRequestStream>(INITIAL_REFERENCE);
if (! m_pRequest)
{
hr = E_OUTOFMEMORY;
goto Cleanup;
}
hr = m_pRequest->set_Owner(this);
}
m_pRequest->AddRef();
*pVal = m_pRequest;
Cleanup:
return hr;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
// function: STDMETHODIMP CWinInetConnector::get_OutputStream(IStream **pVal)
//
// parameters:
//
// description:
//
// returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CWinInetConnector::get_OutputStream(IStream **pVal)
{
if (! pVal)
return E_INVALIDARG;
HRESULT hr = S_OK;
*pVal = 0;
if (! m_pResponse)
{
m_pResponse = new CSoapOwnedObject<CWinInetResponseStream>(INITIAL_REFERENCE);
if (! m_pResponse)
{
hr = E_OUTOFMEMORY;
goto Cleanup;
}
hr = m_pResponse->set_Owner(this);
}
m_pResponse->AddRef();
*pVal = m_pResponse;
Cleanup:
return hr;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
// function: STDMETHODIMP CWinInetConnector::EstablishConnection()
//
// parameters:
//
// description:
//
// returns:
//
////////////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CWinInetConnector::EstablishConnection()
{
HINTERNET hInternet = 0;
#ifndef UNDER_CE
HINTERNET hConnect = 0;
#endif
HRESULT hr = S_OK;
HINTERNET hTemp = NULL;
BSTR pProxyUrl = 0;
#ifndef UNDER_CE
INTERNET_PROXY_INFO proxy;
#endif
#ifdef DEBUG
DWORD dbg_dwError;
WCHAR dbg_pszError[1000];
DWORD dbg_bufLen = 1000;
#endif
if (!m_Url.HostName())
{
hr = E_INVALIDARG;
goto Cleanup;
}
CHK(GetProxyURL(&pProxyUrl));
if (m_bUseProxy)
{
#ifndef UNDER_CE
if (pProxyUrl)
hInternet = ::InternetOpenW(0, INTERNET_OPEN_TYPE_PROXY, pProxyUrl, 0, 0);
else
hInternet = ::InternetOpenW(0, INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0);
#else
if (pProxyUrl)
hInternet = ::InternetOpenW(L"", INTERNET_OPEN_TYPE_PROXY, pProxyUrl, 0, INTERNET_FLAG_ASYNC);
else
hInternet = ::InternetOpenW(L"", INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, INTERNET_FLAG_ASYNC);
#endif
}
else
{
#ifndef UNDER_CE
hInternet = ::InternetOpenW(0, INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0);
#else
hInternet = ::InternetOpenW(L"", INTERNET_OPEN_TYPE_DIRECT, 0, 0, INTERNET_FLAG_ASYNC);
#endif
}
CHK_BOOL(hInternet != 0, MAP_WININET_ERROR());
TRACE(("InternetOpen ==> hInternet == (0x%08X)\n", hInternet));
#ifndef UNDER_CE
hConnect = ::InternetConnectW(hInternet, m_Url.HostName(), m_Url.Port(), 0, 0, INTERNET_SERVICE_HTTP, 0, 0);
CHK_BOOL(hConnect, MAP_WININET_ERROR());
TRACE(("InternetConnect ==> hConnect == (0x%08X)\n", hConnect));
#else
hTemp = ::InternetConnectW(hInternet, m_Url.HostName(), m_Url.Port(), 0, 0, INTERNET_SERVICE_HTTP, 0, reinterpret_cast<DWORD>(&m_hConnect));
#if DEBUG
if(NULL == hTemp && InternetGetLastResponseInfo(&dbg_dwError, dbg_pszError, &dbg_bufLen))
{
OutputDebugString(L"ERROR!! -- InternetConnectW FAILED!");
OutputDebugString(dbg_pszError);
}
#endif
CHK_BOOL(hTemp, MAP_WININET_ERROR());
m_hConnect = hTemp;
TRACE(("InternetConnect ==> hConnect == (0x%08X)\n", m_hConnect));
#endif
m_hInternet = hInternet; hInternet = 0;
#ifndef UNDER_CE
m_hConnect = hConnect; hConnect = 0;
#endif
ASSERT(m_hRequest == 0);
m_hRequest = 0;
Cleanup:
if (hInternet)
{
::InternetCloseHandle(hInternet);
}
#ifndef UNDER_CE
if (hConnect)
{
::InternetCloseHandle(hInternet);
}
::SysFreeString(pProxyUrl);
#endif
return hr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -