Leaked source code of windows server 2003
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

/*++
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");
}