You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
754 lines
20 KiB
754 lines
20 KiB
/*++
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
InetSess.cpp
|
|
|
|
Abstract:
|
|
|
|
Implements the Passport Session that uses WinInet as the underlying transport.
|
|
|
|
Author:
|
|
|
|
Biao Wang (biaow) 01-Oct-2000
|
|
|
|
--*/
|
|
|
|
#include "PPdefs.h"
|
|
#include "session.h"
|
|
|
|
// #include "inetsess.tmh"
|
|
|
|
//
|
|
// func pointer decl for WinHttp
|
|
//
|
|
|
|
typedef
|
|
VOID
|
|
(CALLBACK * WINHTTP_STATUS_CALLBACK)(
|
|
IN HINTERNET hInternet,
|
|
IN DWORD_PTR dwContext,
|
|
IN DWORD dwInternetStatus,
|
|
IN LPVOID lpvStatusInformation OPTIONAL,
|
|
IN DWORD dwStatusInformationLength
|
|
);
|
|
|
|
typedef HINTERNET
|
|
(WINAPI * PFN_INTERNET_OPEN)(
|
|
IN LPCWSTR lpwszAgent,
|
|
IN DWORD dwAccessType,
|
|
IN LPCWSTR lpwszProxy OPTIONAL,
|
|
IN LPCWSTR lpwszProxyBypass OPTIONAL,
|
|
IN DWORD dwFlags
|
|
);
|
|
|
|
typedef HINTERNET
|
|
(WINAPI * PFN_INTERNET_CONNECT)(
|
|
IN HINTERNET hInternet,
|
|
IN LPCWSTR lpwszServerName,
|
|
IN INTERNET_PORT nServerPort,
|
|
IN DWORD dwFlags
|
|
);
|
|
|
|
typedef HINTERNET
|
|
(WINAPI * PFN_OPEN_REQUEST)(
|
|
IN HINTERNET hConnect,
|
|
IN LPCWSTR lpwszVerb,
|
|
IN LPCWSTR lpwszObjectName,
|
|
IN LPCWSTR lpwszVersion,
|
|
IN LPCWSTR lpwszReferrer OPTIONAL,
|
|
IN LPCWSTR FAR * lplpwszAcceptTypes OPTIONAL,
|
|
IN DWORD dwFlags
|
|
);
|
|
|
|
typedef BOOL
|
|
(WINAPI * PFN_SEND_REQUEST)(
|
|
IN HINTERNET hRequest,
|
|
IN LPCWSTR lpwszHeaders OPTIONAL,
|
|
IN DWORD dwHeadersLength,
|
|
IN LPVOID lpOptional OPTIONAL,
|
|
IN DWORD dwOptionalLength,
|
|
IN DWORD dwTotalLength,
|
|
IN DWORD_PTR dwContext
|
|
);
|
|
|
|
typedef BOOL
|
|
(WINAPI * PFN_RECEIVE_RESPONSE)(
|
|
IN HINTERNET hRequest,
|
|
IN LPVOID lpReserved
|
|
);
|
|
|
|
typedef BOOL
|
|
(WINAPI * PFN_QUERY_INFO)(
|
|
IN HINTERNET hRequest,
|
|
IN DWORD dwInfoLevel,
|
|
IN LPCWSTR lpszName OPTIONAL,
|
|
IN LPVOID lpvBuffer,
|
|
IN LPDWORD lpdwBufferLength,
|
|
IN OUT LPDWORD lpdwIndex
|
|
);
|
|
|
|
typedef BOOL
|
|
(WINAPI* PFN_CLOSE_HANDLE)(
|
|
IN HINTERNET hInternet
|
|
);
|
|
|
|
typedef BOOL
|
|
(WINAPI* PFN_SET_OPTION)(
|
|
IN HINTERNET hInternet,
|
|
IN DWORD dwOption,
|
|
IN LPVOID lpBuffer,
|
|
IN DWORD dwBufferLength
|
|
);
|
|
|
|
typedef BOOL
|
|
(WINAPI* PFN_QUERY_OPTION)(
|
|
IN HINTERNET hInternet,
|
|
IN DWORD dwOption,
|
|
OUT LPVOID lpBuffer,
|
|
IN OUT LPDWORD lpdwBufferLength
|
|
);
|
|
|
|
typedef HINTERNET
|
|
(WINAPI* PFN_OPEN_URL)(
|
|
IN HINTERNET hInternet,
|
|
IN LPCWSTR lpwszUrl,
|
|
IN LPCWSTR lpwszHeaders,
|
|
IN DWORD dwHeadersLength,
|
|
IN DWORD dwFlags,
|
|
IN DWORD_PTR dwContext
|
|
);
|
|
|
|
typedef BOOL
|
|
(WINAPI* PFN_CRACK_URL)(
|
|
IN LPCWSTR lpszUrl,
|
|
IN DWORD dwUrlLength,
|
|
IN DWORD dwFlags,
|
|
IN OUT LPURL_COMPONENTSW lpUrlComponents
|
|
);
|
|
|
|
typedef BOOL
|
|
(WINAPI* PFN_READ_FILE)(
|
|
IN HINTERNET hFile,
|
|
IN LPVOID lpBuffer,
|
|
IN DWORD dwNumberOfBytesToRead,
|
|
OUT LPDWORD lpdwNumberOfBytesRead
|
|
);
|
|
|
|
typedef WINHTTP_STATUS_CALLBACK
|
|
(WINAPI* PFN_STATUS_CALLBACK)(
|
|
IN HINTERNET hInternet,
|
|
IN WINHTTP_STATUS_CALLBACK lpfnInternetCallback,
|
|
IN DWORD dwNotificationFlags,
|
|
IN DWORD_PTR dwReserved
|
|
);
|
|
|
|
typedef BOOL
|
|
(WINAPI* PFN_ADD_HEADERS)(
|
|
IN HINTERNET hConnect,
|
|
IN LPCWSTR lpszHeaders,
|
|
IN DWORD dwHeadersLength,
|
|
IN DWORD dwModifiers
|
|
);
|
|
|
|
|
|
class WINHTTP_SESSION : public SESSION
|
|
{
|
|
protected:
|
|
WINHTTP_SESSION(void);
|
|
virtual ~WINHTTP_SESSION(void);
|
|
|
|
virtual BOOL Open(PCWSTR pwszHttpStack, HINTERNET);
|
|
virtual void Close(void);
|
|
|
|
protected:
|
|
virtual HINTERNET Connect(
|
|
LPCWSTR lpwszServerName,
|
|
INTERNET_PORT);
|
|
|
|
virtual HINTERNET OpenRequest(
|
|
HINTERNET hConnect,
|
|
LPCWSTR lpwszVerb,
|
|
LPCWSTR lpwszObjectName,
|
|
DWORD dwFlags,
|
|
DWORD_PTR dwContext = 0);
|
|
|
|
virtual BOOL SendRequest(
|
|
HINTERNET hRequest,
|
|
LPCWSTR lpwszHeaders,
|
|
DWORD dwHeadersLength,
|
|
DWORD_PTR dwContext = 0);
|
|
|
|
virtual BOOL ReceiveResponse(
|
|
HINTERNET hRequest);
|
|
|
|
virtual BOOL QueryHeaders(
|
|
HINTERNET hRequest,
|
|
DWORD dwInfoLevel,
|
|
LPVOID lpvBuffer,
|
|
LPDWORD lpdwBufferLength,
|
|
LPDWORD lpdwIndex = NULL);
|
|
|
|
virtual BOOL CloseHandle(
|
|
IN HINTERNET hInternet);
|
|
|
|
virtual BOOL QueryOption(
|
|
HINTERNET hInternet,
|
|
DWORD dwOption,
|
|
LPVOID lpBuffer,
|
|
LPDWORD lpdwBufferLength);
|
|
|
|
virtual BOOL SetOption(
|
|
HINTERNET hInternet,
|
|
DWORD dwOption,
|
|
LPVOID lpBuffer,
|
|
DWORD dwBufferLength);
|
|
|
|
virtual HINTERNET OpenUrl(
|
|
LPCWSTR lpwszUrl,
|
|
LPCWSTR lpwszHeaders,
|
|
DWORD dwHeadersLength,
|
|
DWORD dwFlags);
|
|
|
|
virtual BOOL ReadFile(
|
|
HINTERNET hFile,
|
|
LPVOID lpBuffer,
|
|
DWORD dwNumberOfBytesToRead,
|
|
LPDWORD lpdwNumberOfBytesRead);
|
|
|
|
virtual BOOL CrackUrl(
|
|
LPCWSTR lpszUrl,
|
|
DWORD dwUrlLength,
|
|
DWORD dwFlags,
|
|
LPURL_COMPONENTSW lpUrlComponents);
|
|
|
|
virtual PVOID SetStatusCallback(
|
|
HINTERNET hInternet,
|
|
PVOID lpfnCallback
|
|
);
|
|
|
|
virtual BOOL AddHeaders(
|
|
HINTERNET hConnect,
|
|
LPCWSTR lpszHeaders,
|
|
DWORD dwHeadersLength,
|
|
DWORD dwModifiers
|
|
);
|
|
|
|
BOOL InitHttpApi(PFN_INTERNET_OPEN*);
|
|
|
|
protected:
|
|
// HINTERNET m_hInternet;
|
|
|
|
PFN_INTERNET_CONNECT m_pfnConnect;
|
|
PFN_OPEN_REQUEST m_pfnOpenRequest;
|
|
PFN_SEND_REQUEST m_pfnSendRequest;
|
|
PFN_RECEIVE_RESPONSE m_pfnReceiveResponse;
|
|
PFN_QUERY_INFO m_pfnQueryInfo;
|
|
PFN_CLOSE_HANDLE m_pfnCloseHandle;
|
|
PFN_SET_OPTION m_pfnSetOption;
|
|
PFN_OPEN_URL m_pfnOpenUrl;
|
|
PFN_QUERY_OPTION m_pfnQueryOption;
|
|
PFN_CRACK_URL m_pfnCrack;
|
|
PFN_READ_FILE m_pfnReadFile;
|
|
PFN_STATUS_CALLBACK m_pfnStatusCallback;
|
|
PFN_ADD_HEADERS m_pfnAddHeaders;
|
|
|
|
friend class SESSION;
|
|
friend SESSION* CreateWinHttpSession(void);
|
|
};
|
|
|
|
SESSION* CreateWinHttpSession(void)
|
|
{
|
|
return new WINHTTP_SESSION();
|
|
}
|
|
|
|
//
|
|
// Implementation for WINHTTP_SESSION
|
|
//
|
|
|
|
// -----------------------------------------------------------------------------
|
|
WINHTTP_SESSION::WINHTTP_SESSION(void)
|
|
{
|
|
m_hInternet = NULL;
|
|
|
|
m_pfnConnect = NULL;
|
|
m_pfnOpenRequest = NULL;
|
|
m_pfnSendRequest = NULL;
|
|
m_pfnReceiveResponse = NULL;
|
|
m_pfnQueryInfo = NULL;
|
|
m_pfnCloseHandle = NULL;
|
|
m_pfnSetOption = NULL;
|
|
m_pfnOpenUrl = NULL;
|
|
m_pfnQueryOption = NULL;
|
|
m_pfnCrack = NULL;
|
|
m_pfnReadFile = NULL;
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
WINHTTP_SESSION::~WINHTTP_SESSION(void)
|
|
{
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
HINTERNET WINHTTP_SESSION::Connect(
|
|
LPCWSTR lpwszServerName,
|
|
INTERNET_PORT nPort)
|
|
{
|
|
PP_ASSERT(m_pfnConnect != NULL);
|
|
|
|
return (*m_pfnConnect)(m_hInternet,
|
|
lpwszServerName,
|
|
nPort,
|
|
0);
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
HINTERNET WINHTTP_SESSION::OpenRequest(
|
|
HINTERNET hConnect,
|
|
LPCWSTR lpwszVerb,
|
|
LPCWSTR lpwszObjectName,
|
|
DWORD dwFlags,
|
|
DWORD_PTR dwContext)
|
|
{
|
|
UNREFERENCED_PARAMETER(dwContext);
|
|
|
|
PP_ASSERT(m_pfnOpenRequest != NULL);
|
|
|
|
return (*m_pfnOpenRequest)(hConnect,
|
|
lpwszVerb,
|
|
lpwszObjectName,
|
|
L"HTTP/1.1",
|
|
NULL,
|
|
NULL,
|
|
dwFlags);
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
BOOL WINHTTP_SESSION::SendRequest(
|
|
HINTERNET hRequest,
|
|
LPCWSTR lpwszHeaders,
|
|
DWORD dwHeadersLength,
|
|
DWORD_PTR dwContext)
|
|
{
|
|
|
|
PP_ASSERT(m_pfnSendRequest != NULL);
|
|
|
|
return (*m_pfnSendRequest)(hRequest,
|
|
lpwszHeaders,
|
|
dwHeadersLength,
|
|
NULL,
|
|
0,
|
|
0, // optional total length
|
|
dwContext);
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
BOOL WINHTTP_SESSION::ReceiveResponse(
|
|
HINTERNET hRequest)
|
|
{
|
|
|
|
PP_ASSERT(m_pfnReceiveResponse != NULL);
|
|
|
|
return (*m_pfnReceiveResponse)(hRequest,
|
|
0);
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
BOOL WINHTTP_SESSION::QueryHeaders(
|
|
HINTERNET hRequest,
|
|
DWORD dwInfoLevel,
|
|
LPVOID lpvBuffer,
|
|
LPDWORD lpdwBufferLength,
|
|
LPDWORD lpdwIndex)
|
|
{
|
|
PP_ASSERT(m_pfnQueryInfo != NULL);
|
|
|
|
return (*m_pfnQueryInfo)(hRequest,
|
|
dwInfoLevel,
|
|
WINHTTP_HEADER_NAME_BY_INDEX,
|
|
lpvBuffer,
|
|
lpdwBufferLength,
|
|
lpdwIndex);
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
BOOL WINHTTP_SESSION::CloseHandle(
|
|
IN HINTERNET hInternet)
|
|
{
|
|
PP_ASSERT(m_pfnCloseHandle != NULL);
|
|
|
|
return (*m_pfnCloseHandle)(hInternet);
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
BOOL WINHTTP_SESSION::QueryOption(
|
|
HINTERNET hInternet,
|
|
DWORD dwOption,
|
|
LPVOID lpBuffer,
|
|
LPDWORD lpdwBufferLength)
|
|
{
|
|
PP_ASSERT(m_pfnQueryOption != NULL);
|
|
|
|
return (*m_pfnQueryOption)(hInternet,
|
|
dwOption,
|
|
lpBuffer,
|
|
lpdwBufferLength
|
|
);
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
BOOL WINHTTP_SESSION::SetOption(
|
|
HINTERNET hInternet,
|
|
DWORD dwOption,
|
|
LPVOID lpBuffer,
|
|
DWORD dwBufferLength)
|
|
{
|
|
PP_ASSERT(m_pfnSetOption != NULL);
|
|
|
|
return (*m_pfnSetOption)(hInternet,
|
|
dwOption,
|
|
lpBuffer,
|
|
dwBufferLength);
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
HINTERNET WINHTTP_SESSION::OpenUrl(
|
|
LPCWSTR lpwszUrl,
|
|
LPCWSTR lpwszHeaders,
|
|
DWORD dwHeadersLength,
|
|
DWORD dwFlags)
|
|
{
|
|
UNREFERENCED_PARAMETER(lpwszUrl);
|
|
UNREFERENCED_PARAMETER(lpwszHeaders);
|
|
UNREFERENCED_PARAMETER(dwHeadersLength);
|
|
UNREFERENCED_PARAMETER(dwFlags);
|
|
return NULL;
|
|
/*
|
|
PP_ASSERT(m_pfnOpenUrl != NULL);
|
|
|
|
return (*m_pfnOpenUrl)(m_hInternet,
|
|
lpwszUrl,
|
|
lpwszHeaders,
|
|
dwHeadersLength,
|
|
dwFlags,
|
|
0);
|
|
*/
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
BOOL WINHTTP_SESSION::ReadFile(
|
|
HINTERNET hFile,
|
|
LPVOID lpBuffer,
|
|
DWORD dwNumberOfBytesToRead,
|
|
LPDWORD lpdwNumberOfBytesRead)
|
|
{
|
|
PP_ASSERT(m_pfnReadFile != NULL);
|
|
|
|
return (*m_pfnReadFile)(
|
|
hFile,
|
|
lpBuffer,
|
|
dwNumberOfBytesToRead,
|
|
lpdwNumberOfBytesRead);
|
|
}
|
|
|
|
BOOL WINHTTP_SESSION::CrackUrl(
|
|
LPCWSTR lpszUrl,
|
|
DWORD dwUrlLength,
|
|
DWORD dwFlags,
|
|
LPURL_COMPONENTSW lpUrlComponents)
|
|
{
|
|
PP_ASSERT (m_pfnCrack != NULL);
|
|
|
|
return (*m_pfnCrack)(lpszUrl,
|
|
dwUrlLength,
|
|
dwFlags,
|
|
lpUrlComponents);
|
|
}
|
|
|
|
PVOID WINHTTP_SESSION::SetStatusCallback(
|
|
HINTERNET hInternet,
|
|
PVOID lpfnCallback
|
|
)
|
|
{
|
|
return (*m_pfnStatusCallback)(hInternet,
|
|
(WINHTTP_STATUS_CALLBACK)lpfnCallback,
|
|
WINHTTP_CALLBACK_FLAG_REDIRECT,
|
|
0);
|
|
|
|
}
|
|
|
|
BOOL WINHTTP_SESSION::AddHeaders(
|
|
HINTERNET hConnect,
|
|
LPCWSTR lpszHeaders,
|
|
DWORD dwHeadersLength,
|
|
DWORD dwModifiers
|
|
)
|
|
{
|
|
PP_ASSERT(m_pfnAddHeaders != NULL);
|
|
|
|
return (*m_pfnAddHeaders)(hConnect,
|
|
lpszHeaders,
|
|
dwHeadersLength,
|
|
dwModifiers
|
|
);
|
|
}
|
|
|
|
BOOL WINHTTP_SESSION::InitHttpApi(PFN_INTERNET_OPEN* ppfnInternetOpen)
|
|
{
|
|
BOOL fRet = FALSE;
|
|
|
|
m_pfnCloseHandle =
|
|
reinterpret_cast<PFN_CLOSE_HANDLE>(::GetProcAddress(m_hHttpStack, "WinHttpCloseHandle"));
|
|
if (m_pfnCloseHandle == NULL)
|
|
{
|
|
DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpCloseHandle not found");
|
|
goto exit;
|
|
}
|
|
|
|
*ppfnInternetOpen =
|
|
reinterpret_cast<PFN_INTERNET_OPEN>(::GetProcAddress(m_hHttpStack, "WinHttpOpen"));
|
|
if (*ppfnInternetOpen == NULL)
|
|
{
|
|
DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpOpen not found");
|
|
goto exit;
|
|
}
|
|
|
|
m_pfnConnect =
|
|
reinterpret_cast<PFN_INTERNET_CONNECT>(::GetProcAddress(m_hHttpStack, "WinHttpConnect"));
|
|
if (m_pfnConnect == NULL)
|
|
{
|
|
DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpConnect not found");
|
|
goto exit;
|
|
}
|
|
|
|
m_pfnOpenRequest =
|
|
reinterpret_cast<PFN_OPEN_REQUEST>(::GetProcAddress(m_hHttpStack, "WinHttpOpenRequest"));
|
|
if (m_pfnOpenRequest == NULL)
|
|
{
|
|
DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpOpenRequest not found");
|
|
goto exit;
|
|
}
|
|
|
|
m_pfnSendRequest =
|
|
reinterpret_cast<PFN_SEND_REQUEST>(::GetProcAddress(m_hHttpStack, "WinHttpSendRequest"));
|
|
if (m_pfnSendRequest == NULL)
|
|
{
|
|
DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpSendRequest not found");
|
|
goto exit;
|
|
}
|
|
|
|
|
|
m_pfnReceiveResponse = reinterpret_cast<PFN_RECEIVE_RESPONSE>(::GetProcAddress(m_hHttpStack, "WinHttpReceiveResponse"));
|
|
if (m_pfnReceiveResponse == NULL)
|
|
{
|
|
DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpReceiveResponse not found");
|
|
goto exit;
|
|
}
|
|
|
|
m_pfnQueryInfo =
|
|
reinterpret_cast<PFN_QUERY_INFO>(::GetProcAddress(m_hHttpStack, "WinHttpQueryHeaders"));
|
|
if (m_pfnQueryInfo == NULL)
|
|
{
|
|
DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpQueryHeaders not found");
|
|
goto exit;
|
|
}
|
|
|
|
m_pfnSetOption =
|
|
reinterpret_cast<PFN_SET_OPTION>(::GetProcAddress(m_hHttpStack, "WinHttpSetOption"));
|
|
if (m_pfnSetOption == NULL)
|
|
{
|
|
DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpSetOption not found");
|
|
goto exit;
|
|
}
|
|
|
|
/*
|
|
m_pfnOpenUrl =
|
|
reinterpret_cast<PFN_OPEN_URL>(::GetProcAddress(m_hHttpStack, "WinHttpOpenUrl"));
|
|
if (m_pfnOpenUrl == NULL)
|
|
{
|
|
DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpOpenUrl not found");
|
|
goto exit;
|
|
}
|
|
*/
|
|
|
|
m_pfnQueryOption =
|
|
reinterpret_cast<PFN_QUERY_OPTION>(::GetProcAddress(m_hHttpStack, "WinHttpQueryOption"));
|
|
if (m_pfnQueryOption == NULL)
|
|
{
|
|
DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpQueryOption not found");
|
|
goto exit;
|
|
}
|
|
|
|
m_pfnCrack =
|
|
reinterpret_cast<PFN_CRACK_URL>(::GetProcAddress(m_hHttpStack, "WinHttpCrackUrl"));
|
|
if (m_pfnCrack == NULL)
|
|
{
|
|
DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpCrackUrl not found");
|
|
goto exit;
|
|
}
|
|
|
|
m_pfnReadFile =
|
|
reinterpret_cast<PFN_READ_FILE>(::GetProcAddress(m_hHttpStack, "WinHttpReadData"));
|
|
if (m_pfnReadFile == NULL)
|
|
{
|
|
DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpReadData not found");
|
|
goto exit;
|
|
}
|
|
|
|
m_pfnStatusCallback =
|
|
reinterpret_cast<PFN_STATUS_CALLBACK>(::GetProcAddress(m_hHttpStack, "WinHttpSetStatusCallback"));
|
|
if (m_pfnStatusCallback == NULL)
|
|
{
|
|
DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpSetStatusCallback not found");
|
|
goto exit;
|
|
}
|
|
|
|
m_pfnAddHeaders =
|
|
reinterpret_cast<PFN_ADD_HEADERS>(::GetProcAddress(m_hHttpStack, "WinHttpAddRequestHeaders"));
|
|
if (m_pfnAddHeaders == NULL)
|
|
{
|
|
DoTraceMessage(PP_LOG_ERROR, "function entry point WinHttpAddRequestHeaders not found");
|
|
goto exit;
|
|
}
|
|
|
|
fRet = TRUE;
|
|
|
|
exit:
|
|
return fRet;
|
|
}
|
|
|
|
BOOL WINHTTP_SESSION::Open(
|
|
PCWSTR pwszHttpStack,
|
|
HINTERNET hInternet
|
|
)
|
|
{
|
|
PP_ASSERT(pwszHttpStack != NULL);
|
|
|
|
DWORD dwErrorCode;
|
|
BOOL fRet = FALSE;
|
|
PFN_INTERNET_OPEN pfnInternetOpen = NULL;
|
|
|
|
PP_ASSERT(m_hHttpStack == 0);
|
|
m_hHttpStack = ::LoadLibraryW(pwszHttpStack);
|
|
if (m_hHttpStack == NULL)
|
|
{
|
|
dwErrorCode = ::GetLastError();
|
|
DoTraceMessage(PP_LOG_ERROR, "failed to load library %ws; error = %d", pwszHttpStack, dwErrorCode);
|
|
goto exit;
|
|
}
|
|
|
|
if (InitHttpApi(&pfnInternetOpen) == FALSE)
|
|
{
|
|
goto exit;
|
|
}
|
|
|
|
// if (hInternet)
|
|
// {
|
|
// m_hInternet = hInternet;
|
|
// m_fOwnedSession = FALSE;
|
|
// }
|
|
// else
|
|
// {
|
|
|
|
WINHTTP_PROXY_INFOW ProxyInfo;
|
|
ProxyInfo.dwAccessType = 0;
|
|
ProxyInfo.lpszProxy = NULL;
|
|
ProxyInfo.lpszProxyBypass = NULL;
|
|
|
|
DWORD dwProxyInfoSize = sizeof(WINHTTP_PROXY_INFOW);
|
|
BOOL dwResult;
|
|
|
|
__try
|
|
{
|
|
dwResult = QueryOption(hInternet, WINHTTP_OPTION_PROXY, &ProxyInfo, &dwProxyInfoSize);
|
|
}
|
|
__except(EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
dwResult = FALSE;
|
|
}
|
|
|
|
if (dwResult == FALSE)
|
|
{
|
|
m_hInternet = (*pfnInternetOpen)(
|
|
L"Microsoft-WinHttp-Passport-Authentication-Service/1.4",
|
|
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, // ? name didn't get changed yet
|
|
NULL,
|
|
NULL,
|
|
0 /*WINHTTP_FLAG_ASYNC*/ // biaow-todo: use async
|
|
);
|
|
}
|
|
else
|
|
{
|
|
m_hInternet = (*pfnInternetOpen)(
|
|
L"Microsoft-WinHttp-Passport-Authentication-Service/1.4",
|
|
ProxyInfo.dwAccessType, // ? name didn't get changed yet
|
|
ProxyInfo.lpszProxy,
|
|
NULL,
|
|
0 /*WINHTTP_FLAG_ASYNC*/ // biaow-todo: use async
|
|
);
|
|
}
|
|
|
|
GlobalFree(ProxyInfo.lpszProxy);
|
|
GlobalFree(ProxyInfo.lpszProxyBypass);
|
|
|
|
m_fOwnedSession = TRUE;
|
|
// }
|
|
|
|
if (m_hInternet == NULL)
|
|
{
|
|
dwErrorCode = ::GetLastError();
|
|
DoTraceMessage(PP_LOG_ERROR, "failed to open an HTTP session through %ws; error = %d",
|
|
pwszHttpStack, dwErrorCode);
|
|
goto exit;
|
|
}
|
|
|
|
if (SESSION::Open(pwszHttpStack, hInternet) == FALSE)
|
|
{
|
|
goto exit;
|
|
}
|
|
|
|
fRet = TRUE;
|
|
|
|
DoTraceMessage(PP_LOG_INFO, "WinInet Http Session opened");
|
|
|
|
exit:
|
|
if (!fRet)
|
|
{
|
|
if (m_hInternet && m_fOwnedSession)
|
|
{
|
|
(*m_pfnCloseHandle)(m_hInternet);
|
|
m_hInternet = NULL;
|
|
}
|
|
if (m_hHttpStack)
|
|
{
|
|
::FreeLibrary(m_hHttpStack);
|
|
m_hHttpStack = NULL;
|
|
}
|
|
|
|
DoTraceMessage(PP_LOG_ERROR, "WinInet Http Session failed");
|
|
}
|
|
|
|
return fRet;
|
|
}
|
|
|
|
void WINHTTP_SESSION::Close(void)
|
|
{
|
|
PP_ASSERT(m_pfnCloseHandle);
|
|
if (m_hInternet && m_fOwnedSession)
|
|
{
|
|
(*m_pfnCloseHandle)(m_hInternet);
|
|
m_pfnCloseHandle = NULL;
|
|
}
|
|
|
|
if (m_hHttpStack)
|
|
{
|
|
::FreeLibrary(m_hHttpStack);
|
|
m_hHttpStack = NULL;
|
|
}
|
|
|
|
SESSION::Close();
|
|
|
|
DoTraceMessage(PP_LOG_INFO, "WinInet Http Session closed");
|
|
}
|