|
|
/*===================================================================
Microsoft Denali
Microsoft Confidential. Copyright 1996 Microsoft Corporation. All Rights Reserved.
Component: CIsapiReqInfo implementation....
File: IsapiReq.cpp
Owner: AndyMorr
===================================================================*/ #include "denpre.h"
#pragma hdrstop
// undef these here so that we can call the WXI and ECB functions with
// the same name and not be victims of the substituition.
#undef MapUrlToPath
#undef GetCustomError
#undef GetAspMDData
#undef GetAspMDAllData
#undef GetServerVariable
/*===================================================================
CIsapiReqInfo::QueryPszQueryString ===================================================================*/ LPSTR CIsapiReqInfo::QueryPszQueryString() { return m_pECB->lpszQueryString; }
/*===================================================================
CIsapiReqInfo::QueryCchQueryString ===================================================================*/ DWORD CIsapiReqInfo::QueryCchQueryString() { if (m_cchQueryString == -1) { m_cchQueryString = QueryPszQueryString() ? strlen(QueryPszQueryString()) : 0; }
return m_cchQueryString; }
/*===================================================================
CIsapiReqInfo::QueryPszApplnMDPathA ===================================================================*/ LPSTR CIsapiReqInfo::QueryPszApplnMDPathA() { if (m_fApplnMDPathAInited == FALSE) { *((LPSTR)m_ApplnMDPathA.QueryPtr()) = '\0'; m_fApplnMDPathAInited = InternalGetServerVariable("APPL_MD_PATH", &m_ApplnMDPathA); }
ASSERT(m_fApplnMDPathAInited);
return (LPSTR)m_ApplnMDPathA.QueryPtr(); }
/*===================================================================
CIsapiReqInfo::QueryCchApplnMDPathA ===================================================================*/ DWORD CIsapiReqInfo::QueryCchApplnMDPathA() { if (m_cchApplnMDPathA == -1) { m_cchApplnMDPathA = QueryPszApplnMDPathA() ? strlen(QueryPszApplnMDPathA()) : 0; } return(m_cchApplnMDPathA); }
/*===================================================================
CIsapiReqInfo::QueryPszApplnMDPathW ===================================================================*/ LPWSTR CIsapiReqInfo::QueryPszApplnMDPathW() { if (m_fApplnMDPathWInited == FALSE) { *((LPWSTR)m_ApplnMDPathW.QueryPtr()) = L'\0'; m_fApplnMDPathWInited = InternalGetServerVariable("UNICODE_APPL_MD_PATH", &m_ApplnMDPathW); }
ASSERT(m_fApplnMDPathWInited);
return (LPWSTR)m_ApplnMDPathW.QueryPtr(); }
/*===================================================================
CIsapiReqInfo::QueryCchApplnMDPathW ===================================================================*/ DWORD CIsapiReqInfo::QueryCchApplnMDPathW() { if (m_cchApplnMDPathW == -1) { m_cchApplnMDPathW = QueryPszApplnMDPathW() ? wcslen(QueryPszApplnMDPathW()) : 0; } return(m_cchApplnMDPathW); }
/*===================================================================
CIsapiReqInfo::QueryPszPathInfoA ===================================================================*/ LPSTR CIsapiReqInfo::QueryPszPathInfoA() { return m_pECB->lpszPathInfo; }
/*===================================================================
CIsapiReqInfo::QueryCchPathInfoA ===================================================================*/ DWORD CIsapiReqInfo::QueryCchPathInfoA() { if (m_cchPathInfoA == -1) { m_cchPathInfoA = QueryPszPathInfoA() ? strlen(QueryPszPathInfoA()) : 0; } return m_cchPathInfoA; }
/*===================================================================
CIsapiReqInfo::QueryPszPathInfoW ===================================================================*/ LPWSTR CIsapiReqInfo::QueryPszPathInfoW() { if (m_fPathInfoWInited == FALSE) { *((LPWSTR)m_PathInfoW.QueryPtr()) = L'\0'; m_fPathInfoWInited = InternalGetServerVariable("UNICODE_PATH_INFO", &m_PathInfoW); }
ASSERT(m_fPathInfoWInited);
return (LPWSTR)m_PathInfoW.QueryPtr(); }
/*===================================================================
CIsapiReqInfo::QueryCchPathInfoW ===================================================================*/ DWORD CIsapiReqInfo::QueryCchPathInfoW() { if (m_cchPathInfoW == -1) { m_cchPathInfoW = QueryPszPathInfoW() ? wcslen(QueryPszPathInfoW()) : 0; } return m_cchPathInfoW; }
/*===================================================================
CIsapiReqInfo::QueryPszPathTranslatedA ===================================================================*/ LPSTR CIsapiReqInfo::QueryPszPathTranslatedA() { return m_pECB->lpszPathTranslated; }
/*===================================================================
CIsapiReqInfo::QueryCchPathTranslatedA ===================================================================*/ DWORD CIsapiReqInfo::QueryCchPathTranslatedA() { if (m_cchPathTranslatedA == -1) { m_cchPathTranslatedA = QueryPszPathTranslatedA() ? strlen(QueryPszPathTranslatedA()) : 0; }
return m_cchPathTranslatedA; }
/*===================================================================
CIsapiReqInfo::QueryPszPathTranslatedW ===================================================================*/ LPWSTR CIsapiReqInfo::QueryPszPathTranslatedW() { if (m_fPathTranslatedWInited == FALSE) { *((LPWSTR)m_PathTranslatedW.QueryPtr()) = L'\0'; m_fPathTranslatedWInited = InternalGetServerVariable("UNICODE_PATH_TRANSLATED", &m_PathTranslatedW); }
ASSERT(m_fPathTranslatedWInited);
return (LPWSTR)m_PathTranslatedW.QueryPtr(); }
/*===================================================================
CIsapiReqInfo::QueryCchPathTranslatedW ===================================================================*/ DWORD CIsapiReqInfo::QueryCchPathTranslatedW() { if (m_cchPathTranslatedW == -1) { m_cchPathTranslatedW = QueryPszPathTranslatedW() ? wcslen(QueryPszPathTranslatedW()) : 0; }
return m_cchPathTranslatedW; }
/*===================================================================
CIsapiReqInfo::QueryPszCookie ===================================================================*/ LPSTR CIsapiReqInfo::QueryPszCookie() { if (m_fCookieInited == FALSE) { *((LPSTR)m_Cookie.QueryPtr()) = '\0'; InternalGetServerVariable("HTTP_COOKIE", &m_Cookie); m_fCookieInited = TRUE; }
return (LPSTR)m_Cookie.QueryPtr(); }
/*===================================================================
CIsapiReqInfo::SetDwHttpStatusCode ===================================================================*/ VOID CIsapiReqInfo::SetDwHttpStatusCode(DWORD dwStatus) { m_pECB->dwHttpStatusCode = dwStatus; }
/*===================================================================
CIsapiReqInfo::QueryPbData ===================================================================*/ LPBYTE CIsapiReqInfo::QueryPbData() { return m_pECB->lpbData; }
/*===================================================================
CIsapiReqInfo::QueryCbAvailable ===================================================================*/ DWORD CIsapiReqInfo::QueryCbAvailable() { return m_pECB->cbAvailable; }
/*===================================================================
CIsapiReqInfo::QueryCbTotalBytes ===================================================================*/ DWORD CIsapiReqInfo::QueryCbTotalBytes() { return m_pECB->cbTotalBytes; }
/*===================================================================
CIsapiReqInfo::QueryPszContentType ===================================================================*/ LPSTR CIsapiReqInfo::QueryPszContentType() { return m_pECB->lpszContentType; }
/*===================================================================
CIsapiReqInfo::QueryPszMethod ===================================================================*/ LPSTR CIsapiReqInfo::QueryPszMethod() { return m_pECB->lpszMethod; }
/*===================================================================
CIsapiReqInfo::QueryPszUserAgent ===================================================================*/ LPSTR CIsapiReqInfo::QueryPszUserAgent() { if (m_fUserAgentInited == FALSE) { *((LPSTR)m_UserAgent.QueryPtr()) = '\0'; InternalGetServerVariable("HTTP_USER_AGENT", &m_UserAgent); }
return (LPSTR)m_UserAgent.QueryPtr(); }
/*===================================================================
CIsapiReqInfo::QueryInstanceId ===================================================================*/ DWORD CIsapiReqInfo::QueryInstanceId() { if (m_fInstanceIDInited == FALSE) { BUFFER instanceID; m_fInstanceIDInited = InternalGetServerVariable("INSTANCE_ID", &instanceID); if (m_fInstanceIDInited == TRUE) { m_dwInstanceID = atoi((char *)instanceID.QueryPtr()); } else { m_dwInstanceID = 1; } }
return m_dwInstanceID; }
/*===================================================================
CIsapiReqInfo::IsChild ===================================================================*/ BOOL CIsapiReqInfo::IsChild() {
#if _IIS_5_1
return m_pWXI->IsChild(); #else
// BUGBUG: This needs to be implemented
#endif
return FALSE; }
/*===================================================================
CIsapiReqInfo::FInPool ===================================================================*/ BOOL CIsapiReqInfo::FInPool() { #if _IIS_5_1
return m_pWXI->FInPool(); #else
DWORD dwAppFlag;
if (ServerSupportFunction(HSE_REQ_IS_IN_PROCESS, &dwAppFlag, NULL, NULL) == FALSE) {
// BUGBUG: Need to enable this Assert in future builds.
//Assert(0);
// if error, the best we can do is return TRUE here so
// that ASP picks up its settings from the service level
return TRUE; } return !(dwAppFlag == HSE_APP_FLAG_ISOLATED_OOP); #endif
}
/*===================================================================
CIsapiReqInfo::QueryHttpVersionMajor ===================================================================*/ DWORD CIsapiReqInfo::QueryHttpVersionMajor() { InitVersionInfo();
return m_dwVersionMajor; }
/*===================================================================
CIsapiReqInfo::QueryHttpVersionMinor ===================================================================*/ DWORD CIsapiReqInfo::QueryHttpVersionMinor() { InitVersionInfo();
return m_dwVersionMinor; }
/*===================================================================
CIsapiReqInfo::ISAThreadNotify ===================================================================*/ HRESULT CIsapiReqInfo::ISAThreadNotify(BOOL fStart) { #if _IIS_5_1
return m_pWXI->ISAThreadNotify(fStart); #else
//BUGBUG: Obsolete?
return S_OK; #endif
}
/*===================================================================
CIsapiReqInfo::GetAspMDData ===================================================================*/ HRESULT CIsapiReqInfo::GetAspMDDataA(CHAR * pszMDPath, DWORD dwMDIdentifier, DWORD dwMDAttributes, DWORD dwMDUserType, DWORD dwMDDataType, DWORD dwMDDataLen, DWORD dwMDDataTag, unsigned char * pbMDData, DWORD * pdwRequiredBufferSize) { #if _IIS_5_1
return m_pWXI->GetAspMDData((UCHAR *)pszMDPath, dwMDIdentifier, dwMDAttributes, dwMDUserType, dwMDDataType, dwMDDataLen, dwMDDataTag, pbMDData, pdwRequiredBufferSize); #else
return E_NOTIMPL; #endif
}
/*===================================================================
CIsapiReqInfo::GetAspMDData ===================================================================*/ HRESULT CIsapiReqInfo::GetAspMDDataW(WCHAR * pszMDPath, DWORD dwMDIdentifier, DWORD dwMDAttributes, DWORD dwMDUserType, DWORD dwMDDataType, DWORD dwMDDataLen, DWORD dwMDDataTag, unsigned char * pbMDData, DWORD * pdwRequiredBufferSize) { IMSAdminBase *pMetabase; METADATA_HANDLE hKey = NULL; METADATA_RECORD MetadataRecord; DWORD dwTimeout = 30000; HRESULT hr;
HANDLE hCurrentUser = INVALID_HANDLE_VALUE; AspDoRevertHack( &hCurrentUser );
pMetabase = GetMetabaseIF();
ASSERT(pMetabase);
hr = pMetabase->OpenKey( METADATA_MASTER_ROOT_HANDLE, pszMDPath, METADATA_PERMISSION_READ, dwTimeout, &hKey );
ASSERT(SUCCEEDED(hr));
if( SUCCEEDED(hr) ) { MetadataRecord.dwMDIdentifier = dwMDIdentifier; MetadataRecord.dwMDAttributes = dwMDAttributes; MetadataRecord.dwMDUserType = dwMDUserType; MetadataRecord.dwMDDataType = dwMDDataType; MetadataRecord.dwMDDataLen = dwMDDataLen; MetadataRecord.pbMDData = pbMDData; MetadataRecord.dwMDDataTag = dwMDDataTag;
hr = pMetabase->GetData( hKey, L"", &MetadataRecord, pdwRequiredBufferSize);
ASSERT(SUCCEEDED(hr));
pMetabase->CloseKey( hKey ); }
AspUndoRevertHack( &hCurrentUser );
return hr; }
/*===================================================================
CIsapiReqInfo::GetAspMDAllData ===================================================================*/ HRESULT CIsapiReqInfo::GetAspMDAllDataA(LPSTR pszMDPath, DWORD dwMDUserType, DWORD dwDefaultBufferSize, LPVOID pvBuffer, DWORD * pdwRequiredBufferSize, DWORD * pdwNumDataEntries) { #if _IIS_5_1
return m_pWXI->GetAspMDAllData(pszMDPath, dwMDUserType, dwDefaultBufferSize, pvBuffer, pdwRequiredBufferSize, pdwNumDataEntries); #else
return E_NOTIMPL; #endif
} /*===================================================================
CIsapiReqInfo::GetAspMDAllData ===================================================================*/ HRESULT CIsapiReqInfo::GetAspMDAllDataW(LPWSTR pwszMDPath, DWORD dwMDUserType, DWORD dwDefaultBufferSize, LPVOID pvBuffer, DWORD * pdwRequiredBufferSize, DWORD * pdwNumDataEntries) { HRESULT hr = S_OK; IMSAdminBase *pMetabase; METADATA_HANDLE hKey = NULL; DWORD dwTimeout = 30000; DWORD dwDataSet;
HANDLE hCurrentUser = INVALID_HANDLE_VALUE; AspDoRevertHack( &hCurrentUser );
//
// Wide-ize the metabase path
//
pMetabase = GetMetabaseIF();
ASSERT(pMetabase);
hr = pMetabase->OpenKey( METADATA_MASTER_ROOT_HANDLE, pwszMDPath, METADATA_PERMISSION_READ, dwTimeout, &hKey);
if( SUCCEEDED(hr) ) { hr = pMetabase->GetAllData( hKey, L"", METADATA_INHERIT, dwMDUserType, ALL_METADATA, pdwNumDataEntries, &dwDataSet, dwDefaultBufferSize, (UCHAR *)pvBuffer, pdwRequiredBufferSize); ASSERT(SUCCEEDED(hr));
pMetabase->CloseKey( hKey ); }
AspUndoRevertHack( &hCurrentUser );
return hr; }
/*===================================================================
CIsapiReqInfo::GetCustomErrorA ===================================================================*/ BOOL CIsapiReqInfo::GetCustomErrorA(DWORD dwError, DWORD dwSubError, DWORD dwBufferSize, CHAR *pvBuffer, DWORD *pdwRequiredBufferSize, BOOL *pfIsFileError) { #if _IIS_5_1
return m_pWXI->GetCustomError(dwError, dwSubError, dwBufferSize, pvBuffer, pdwRequiredBufferSize, pfIsFileError); #else
SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); return FALSE; #endif
}
/*===================================================================
CIsapiReqInfo::GetCustomErrorW ===================================================================*/ BOOL CIsapiReqInfo::GetCustomErrorW(DWORD dwError, DWORD dwSubError, DWORD dwBufferSize, WCHAR *pvBuffer, DWORD *pdwRequiredBufferSize, BOOL *pfIsFileError) { #if _IIS_5_1
SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); return FALSE; #else
BOOL fRet; HSE_CUSTOM_ERROR_PAGE_INFO cei;
STACK_BUFFER(ansiBuf, 1024);
cei.dwError = dwError; cei.dwSubError = dwSubError; cei.dwBufferSize = ansiBuf.QuerySize(); cei.pBuffer = (CHAR *)ansiBuf.QueryPtr(); cei.pdwBufferRequired = pdwRequiredBufferSize; cei.pfIsFileError = pfIsFileError;
fRet = ServerSupportFunction(HSE_REQ_GET_CUSTOM_ERROR_PAGE, &cei, NULL, NULL);
if (!fRet) { DWORD dwErr = GetLastError();
if (dwErr == ERROR_INSUFFICIENT_BUFFER) {
if (ansiBuf.Resize(*pdwRequiredBufferSize) == FALSE) { SetLastError(ERROR_OUTOFMEMORY); return FALSE; }
cei.dwBufferSize = ansiBuf.QuerySize(); cei.pBuffer = (CHAR *)ansiBuf.QueryPtr();
fRet = ServerSupportFunction(HSE_REQ_GET_CUSTOM_ERROR_PAGE, &cei, NULL, NULL); }
if (!fRet) { SetLastError(ERROR_OUTOFMEMORY); return FALSE; } }
CMBCSToWChar convError;
if (FAILED(convError.Init((LPCSTR)ansiBuf.QueryPtr()))) { SetLastError(ERROR_OUTOFMEMORY); return FALSE; }
*pdwRequiredBufferSize = (convError.GetStringLen()+1)*sizeof(WCHAR); if (*pdwRequiredBufferSize > dwBufferSize) { SetLastError(ERROR_INSUFFICIENT_BUFFER); return FALSE; }
memcpy(pvBuffer, convError.GetString(), *pdwRequiredBufferSize);
if (*pfIsFileError) {
CMBCSToWChar convMime; DWORD fileNameLen = *pdwRequiredBufferSize;
if (FAILED(convMime.Init((LPCSTR)ansiBuf.QueryPtr()+strlen((LPCSTR)ansiBuf.QueryPtr())+1))) { SetLastError(ERROR_OUTOFMEMORY); return FALSE; }
*pdwRequiredBufferSize += (convMime.GetStringLen()+1)*sizeof(WCHAR);
if (*pdwRequiredBufferSize > dwBufferSize) { SetLastError(ERROR_INSUFFICIENT_BUFFER); return FALSE; }
memcpy(&((BYTE *)pvBuffer)[fileNameLen], convMime.GetString(), (convMime.GetStringLen()+1)*sizeof(WCHAR)); }
return TRUE;
#endif // _IIS_5_1
}
/*===================================================================
CIsapiReqInfo::QueryImpersonationToken ===================================================================*/ HANDLE CIsapiReqInfo::QueryImpersonationToken() { HANDLE hToken = INVALID_HANDLE_VALUE;
ServerSupportFunction(HSE_REQ_GET_IMPERSONATION_TOKEN, &hToken, NULL, NULL);
return hToken;
}
/*===================================================================
CIsapiReqInfo::AppendLogParameter ===================================================================*/ HRESULT CIsapiReqInfo::AppendLogParameter(LPSTR extraParam) { if (ServerSupportFunction(HSE_APPEND_LOG_PARAMETER, extraParam, NULL, NULL) == FALSE) {
return HRESULT_FROM_WIN32(GetLastError()); } return S_OK; }
/*===================================================================
CIsapiReqInfo::SendHeader ===================================================================*/ BOOL CIsapiReqInfo::SendHeader(LPVOID pvStatus, DWORD cchStatus, LPVOID pvHeader, DWORD cchHeader, BOOL fIsaKeepConn) { HSE_SEND_HEADER_EX_INFO HeaderInfo;
HeaderInfo.pszStatus = (LPCSTR)pvStatus; HeaderInfo.cchStatus = cchStatus; HeaderInfo.pszHeader = (LPCSTR) pvHeader; HeaderInfo.cchHeader = cchHeader; HeaderInfo.fKeepConn = fIsaKeepConn;
return ServerSupportFunction( HSE_REQ_SEND_RESPONSE_HEADER_EX, &HeaderInfo, NULL, NULL ); }
/*===================================================================
CIsapiReqInfo::GetServerVariableA ===================================================================*/ BOOL CIsapiReqInfo::GetServerVariableA(LPSTR szVarName, LPSTR pBuffer, LPDWORD pdwSize ) { return m_pECB->GetServerVariable( (HCONN)m_pECB->ConnID, szVarName, pBuffer, pdwSize ); }
/*===================================================================
CIsapiReqInfo::GetServerVariableW ===================================================================*/ BOOL CIsapiReqInfo::GetServerVariableW(LPSTR szVarName, LPWSTR pBuffer, LPDWORD pdwSize ) { return m_pECB->GetServerVariable( (HCONN)m_pECB->ConnID, szVarName, pBuffer, pdwSize ); }
/*===================================================================
CIsapiReqInfo::ServerSupportFunction ===================================================================*/ BOOL CIsapiReqInfo::ServerSupportFunction(DWORD dwHSERequest, LPVOID pvData, LPDWORD pdwSize, LPDWORD pdwDataType) { return m_pECB->ServerSupportFunction( (HCONN)m_pECB->ConnID, dwHSERequest, pvData, pdwSize, pdwDataType ); }
/*===================================================================
CIsapiReqInfo::SendEntireResponseOop ===================================================================*/ BOOL CIsapiReqInfo::SendEntireResponseOop(IN HSE_SEND_ENTIRE_RESPONSE_INFO * pHseResponseInfo) { #if _IIS_5_1
return m_pWXI->SendEntireResponseOop(pHseResponseInfo); #elif _IIS_6_0
return SendEntireResponse(pHseResponseInfo); #else
#error "Neither _IIS_5_1 nor _IIS_6_0 is defined"
#endif
}
/*===================================================================
CIsapiReqInfo::SendEntireResponse ===================================================================*/ BOOL CIsapiReqInfo::SendEntireResponse(IN HSE_SEND_ENTIRE_RESPONSE_INFO * pResponseInfo) { #if _IIS_5_1
return m_pWXI->SendEntireResponse(pResponseInfo); #elif _IIS_6_0
HRESULT hr = S_OK; DWORD nElementCount; HSE_VECTOR_ELEMENT *pVectorElement = NULL; HSE_RESPONSE_VECTOR respVector; HANDLE hCurrentUser = INVALID_HANDLE_VALUE; BOOL fKeepConn;
STACK_BUFFER ( buffResp, 512);
//
// Set the keep connection flag. It can only be TRUE if the
// ISAPI and the client both want keep alive.
//
fKeepConn = FKeepConn() && pResponseInfo->HeaderInfo.fKeepConn;
//
// Munge the input structure into something that IIsapiCore can
// understand. Note that ASP sets the number of buffer to be one more
// than actual and the first buffer is not valid
//
nElementCount = pResponseInfo->cWsaBuf - 1; if (!buffResp.Resize(nElementCount * sizeof(HSE_VECTOR_ELEMENT))) { hr = HRESULT_FROM_WIN32( ERROR_NOT_ENOUGH_MEMORY ); goto Exit; } ZeroMemory(buffResp.QueryPtr(), nElementCount * sizeof(HSE_VECTOR_ELEMENT));
pVectorElement = (HSE_VECTOR_ELEMENT *)buffResp.QueryPtr();
for (DWORD i = 0; i < nElementCount; i++) { pVectorElement[i].pBuffer = (LPBYTE)pResponseInfo->rgWsaBuf[i+1].buf; pVectorElement[i].cbSize = pResponseInfo->rgWsaBuf[i+1].len; }
respVector.dwFlags = HSE_IO_SYNC | (!fKeepConn ? HSE_IO_DISCONNECT_AFTER_SEND : 0) | HSE_IO_SEND_HEADERS; respVector.pszStatus = (LPSTR)pResponseInfo->HeaderInfo.pszStatus; respVector.pszHeaders = (LPSTR)pResponseInfo->HeaderInfo.pszHeader; respVector.nElementCount = nElementCount; respVector.lpElementArray = pVectorElement;
//
// Send it
//
if (ServerSupportFunction(HSE_REQ_VECTOR_SEND, &respVector, NULL, NULL) == FALSE) { hr = HRESULT_FROM_WIN32(GetLastError()); }
Exit:
if (FAILED(hr)) { SetLastError((HRESULT_FACILITY(hr) == (HRESULT)FACILITY_WIN32) ? HRESULT_CODE(hr) : ERROR_INVALID_PARAMETER); return FALSE; }
return TRUE; #else
#error "Neither _IIS_5_1 nor _IIS_6_0 is defined"
#endif
}
/*===================================================================
CIsapiReqInfo::TestConnection ===================================================================*/ BOOL CIsapiReqInfo::TestConnection(BOOL *pfIsConnected) { BOOL bRet = TRUE;
ServerSupportFunction(HSE_REQ_IS_CONNECTED, &bRet, NULL, NULL); return bRet; }
/*===================================================================
CIsapiReqInfo::MapUrlToPathA ===================================================================*/ BOOL CIsapiReqInfo::MapUrlToPathA(LPSTR pBuffer, LPDWORD pdwBytes) { return ServerSupportFunction( HSE_REQ_MAP_URL_TO_PATH, pBuffer, pdwBytes, NULL ); }
/*===================================================================
CIsapiReqInfo::MapUrlToPathW ===================================================================*/ BOOL CIsapiReqInfo::MapUrlToPathW(LPWSTR pBuffer, LPDWORD pdwBytes) { return ServerSupportFunction( HSE_REQ_MAP_UNICODE_URL_TO_PATH, pBuffer, pdwBytes, NULL ); }
/*===================================================================
CIsapiReqInfo::SyncReadClient ===================================================================*/ BOOL CIsapiReqInfo::SyncReadClient(LPVOID pvBuffer, LPDWORD pdwBytes ) { return m_pECB->ReadClient(m_pECB->ConnID, pvBuffer, pdwBytes); }
/*===================================================================
CIsapiReqInfo::SyncWriteClient ===================================================================*/ BOOL CIsapiReqInfo::SyncWriteClient(LPVOID pvBuffer, LPDWORD pdwBytes) { return m_pECB->WriteClient(m_pECB->ConnID, pvBuffer, pdwBytes, HSE_IO_SYNC); }
/*********************************************************************
PRIVATE FUNCTIONS *********************************************************************/
/*===================================================================
CIsapiReqInfo::InitVersionInfo ===================================================================*/ void CIsapiReqInfo::InitVersionInfo() { if (m_fVersionInited == FALSE) {
BUFFER version;
m_fVersionInited = TRUE; m_dwVersionMajor = 1; m_dwVersionMinor = 0;
if (InternalGetServerVariable("SERVER_PROTOCOL", &version)) {
char *pVersionStr = (char *)version.QueryPtr();
if ((strlen(pVersionStr) >= 8) && (isdigit((UCHAR)pVersionStr[5])) && (isdigit((UCHAR)pVersionStr[7]))) {
m_dwVersionMajor = pVersionStr[5] - '0'; m_dwVersionMinor = pVersionStr[7] - '0'; } } } }
/*===================================================================
CIsapiReqInfo::InternalGetServerVariable ===================================================================*/ BOOL CIsapiReqInfo::InternalGetServerVariable(LPSTR pszVarName, BUFFER *pBuf) { BOOL bRet; DWORD dwRequiredBufSize = pBuf->QuerySize();
bRet = m_pECB->GetServerVariable(m_pECB->ConnID, pszVarName, pBuf->QueryPtr(), &dwRequiredBufSize);
if ((bRet == FALSE) && (GetLastError() == ERROR_INSUFFICIENT_BUFFER)) { if (!pBuf->Resize(dwRequiredBufSize)) { SetLastError(ERROR_OUTOFMEMORY); return FALSE; }
bRet = m_pECB->GetServerVariable(m_pECB->ConnID, pszVarName, pBuf->QueryPtr(), &dwRequiredBufSize); }
return(bRet); }
/*===================================================================
CIsapiReqInfo::FKeepConn ===================================================================*/ BOOL CIsapiReqInfo::FKeepConn() { if (m_fFKeepConnInited == FALSE) {
m_fFKeepConnInited = TRUE; m_fKeepConn = FALSE;
InitVersionInfo();
if (m_dwVersionMajor == 1) {
if (m_dwVersionMinor == 1) { m_fKeepConn = TRUE; }
BUFFER connectStr;
if (InternalGetServerVariable("HTTP_CONNECTION", &connectStr)) {
if (m_dwVersionMinor == 0) {
m_fKeepConn = !(_stricmp((char *)connectStr.QueryPtr(), "keep-alive")); } else if (m_dwVersionMinor == 1) {
m_fKeepConn = !!(_stricmp((char *)connectStr.QueryPtr(), "close")); } } } }
return m_fKeepConn; }
/*===================================================================
CIsapiReqInfo::GetMetabaseIF ===================================================================*/ IMSAdminBase *CIsapiReqInfo::GetMetabaseIF() { if (m_pIAdminBase == NULL) { HRESULT hr = CoCreateInstance(CLSID_MSAdminBase, NULL, CLSCTX_ALL, IID_IMSAdminBase, (void**)&m_pIAdminBase);
ASSERT(SUCCEEDED(hr)); } return m_pIAdminBase; }
|