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.
 
 
 
 
 
 

222 lines
7.0 KiB

#ifndef _SERVERVAR_HXX_
#define _SERVERVAR_HXX_
//
// Function used to retrieve a server variable
//
typedef HRESULT
(SERVER_VARIABLE_ROUTINE)
(
W3_CONTEXT *pW3Context,
STRA *pstrValue
);
typedef HRESULT
(SERVER_VARIABLE_ROUTINE_W)
(
W3_CONTEXT *pW3Context,
STRU *pstrValue
);
typedef SERVER_VARIABLE_ROUTINE *PFN_SERVER_VARIABLE_ROUTINE;
typedef SERVER_VARIABLE_ROUTINE_W *PFN_SERVER_VARIABLE_ROUTINE_W;
//
// Forward declaration for each server variable function
//
extern SERVER_VARIABLE_ROUTINE GetServerVariableQueryString;
extern SERVER_VARIABLE_ROUTINE GetServerVariableAllHttp;
extern SERVER_VARIABLE_ROUTINE GetServerVariableAllRaw;
extern SERVER_VARIABLE_ROUTINE GetServerVariableContentLength;
extern SERVER_VARIABLE_ROUTINE GetServerVariableContentType;
extern SERVER_VARIABLE_ROUTINE GetServerVariablePathInfo;
extern SERVER_VARIABLE_ROUTINE GetServerVariablePathTranslated;
extern SERVER_VARIABLE_ROUTINE GetServerVariableRequestMethod;
extern SERVER_VARIABLE_ROUTINE GetServerVariableInstanceId;
extern SERVER_VARIABLE_ROUTINE GetServerVariableRemoteAddr;
extern SERVER_VARIABLE_ROUTINE GetServerVariableRemotePort;
extern SERVER_VARIABLE_ROUTINE GetServerVariableRemoteHost;
extern SERVER_VARIABLE_ROUTINE GetServerVariableServerName;
extern SERVER_VARIABLE_ROUTINE GetServerVariableServerPort;
extern SERVER_VARIABLE_ROUTINE GetServerVariableServerPortSecure;
extern SERVER_VARIABLE_ROUTINE GetServerVariableServerSoftware;
extern SERVER_VARIABLE_ROUTINE GetServerVariableUrl;
extern SERVER_VARIABLE_ROUTINE GetServerVariableInstanceMetaPath;
extern SERVER_VARIABLE_ROUTINE GetServerVariableRemoteUser;
extern SERVER_VARIABLE_ROUTINE GetServerVariableLogonUser;
extern SERVER_VARIABLE_ROUTINE GetServerVariableAuthType;
extern SERVER_VARIABLE_ROUTINE GetServerVariableAuthPassword;
extern SERVER_VARIABLE_ROUTINE GetServerVariableApplMdPath;
extern SERVER_VARIABLE_ROUTINE GetServerVariableApplPhysicalPath;
extern SERVER_VARIABLE_ROUTINE GetServerVariableGatewayInterface;
extern SERVER_VARIABLE_ROUTINE GetServerVariableHttps;
extern SERVER_VARIABLE_ROUTINE GetServerVariableLocalAddr;
extern SERVER_VARIABLE_ROUTINE GetServerVariableHttpsServerIssuer;
extern SERVER_VARIABLE_ROUTINE GetServerVariableHttpsServerSubject;
extern SERVER_VARIABLE_ROUTINE GetServerVariableHttpsSecretKeySize;
extern SERVER_VARIABLE_ROUTINE GetServerVariableHttpsKeySize;
extern SERVER_VARIABLE_ROUTINE GetServerVariableClientCertIssuer;
extern SERVER_VARIABLE_ROUTINE GetServerVariableClientCertSubject;
extern SERVER_VARIABLE_ROUTINE GetServerVariableClientCertCookie;
extern SERVER_VARIABLE_ROUTINE GetServerVariableClientCertSerialNumber;
extern SERVER_VARIABLE_ROUTINE GetServerVariableClientCertFlags;
extern SERVER_VARIABLE_ROUTINE GetServerVariableHttpUrl;
extern SERVER_VARIABLE_ROUTINE GetServerVariableHttpVersion;
extern SERVER_VARIABLE_ROUTINE GetServerVariableAppPoolId;
extern SERVER_VARIABLE_ROUTINE GetServerVariableScriptTranslated;
extern SERVER_VARIABLE_ROUTINE GetServerVariableUnencodedUrl;
extern SERVER_VARIABLE_ROUTINE GetServerVariableSsiExecDisabled;
extern SERVER_VARIABLE_ROUTINE GetServerVariableOriginalUrl;
extern SERVER_VARIABLE_ROUTINE_W GetServerVariablePathInfoW;
extern SERVER_VARIABLE_ROUTINE_W GetServerVariablePathTranslatedW;
extern SERVER_VARIABLE_ROUTINE_W GetServerVariableServerNameW;
extern SERVER_VARIABLE_ROUTINE_W GetServerVariableUrlW;
extern SERVER_VARIABLE_ROUTINE_W GetServerVariableRemoteUserW;
extern SERVER_VARIABLE_ROUTINE_W GetServerVariableLogonUserW;
extern SERVER_VARIABLE_ROUTINE_W GetServerVariableApplMdPathW;
extern SERVER_VARIABLE_ROUTINE_W GetServerVariableApplPhysicalPathW;
extern SERVER_VARIABLE_ROUTINE_W GetServerVariableAppPoolIdW;
extern SERVER_VARIABLE_ROUTINE_W GetServerVariableScriptTranslatedW;
extern SERVER_VARIABLE_ROUTINE_W GetServerVariableOriginalUrlW;
//
// Server variable hash table
//
struct SERVER_VARIABLE_RECORD
{
CHAR * _pszName;
PFN_SERVER_VARIABLE_ROUTINE _pfnRoutine;
PFN_SERVER_VARIABLE_ROUTINE_W _pfnRoutineW;
SERVER_VARIABLE_RECORD * _pNext;
};
#define SERVER_VARIABLE_BUCKETS 131
//
// SERVER_VARIABLE_HASH maps server variable string to routines to eval them
//
class SERVER_VARIABLE_HASH
{
public:
SERVER_VARIABLE_HASH()
{
ZeroMemory( &_rgBuckets, sizeof( _rgBuckets ) );
}
static
CHAR *
ExtractKey(
const SERVER_VARIABLE_RECORD * pRecord
)
{
DBG_ASSERT( pRecord != NULL );
return pRecord->_pszName;
}
VOID
InsertRecord(
SERVER_VARIABLE_RECORD * pRecord
)
{
DWORD dwIndex;
SERVER_VARIABLE_RECORD* pCursor;
dwIndex = HashString( pRecord->_pszName ) % SERVER_VARIABLE_BUCKETS;
pCursor = _rgBuckets[ dwIndex ];
pRecord->_pNext = pCursor;
_rgBuckets[ dwIndex ] = pRecord;
}
SERVER_VARIABLE_RECORD *
FindKey(
CHAR * pszName
)
{
DWORD dwIndex;
SERVER_VARIABLE_RECORD* pRecord;
DBG_ASSERT( pszName != NULL );
dwIndex = HashString( pszName ) % SERVER_VARIABLE_BUCKETS;
pRecord = _rgBuckets[ dwIndex ];
while ( pRecord != NULL )
{
if ( memcmp( pszName, pRecord->_pszName, strlen( pszName ) + 1 ) == 0 )
{
break;
}
pRecord = pRecord->_pNext;
}
return pRecord;
}
static
HRESULT
Initialize(
VOID
);
static
VOID
Terminate(
VOID
);
static
HRESULT
GetServerVariable(
W3_CONTEXT * pContext,
CHAR * pszVariableName,
CHAR * pszBuffer,
DWORD * pcbBuffer
);
static
HRESULT
GetServerVariable(
W3_CONTEXT * pContext,
CHAR * pszVariableName,
STRA * pstrVal
);
static
HRESULT
GetServerVariableW(
W3_CONTEXT * pContext,
CHAR * pszVariableName,
STRU * pstrVal
);
private:
static SERVER_VARIABLE_HASH * sm_pRequestHash;
static SERVER_VARIABLE_RECORD sm_rgServerRoutines[];
static
HRESULT
GetServerVariableRoutine(
CHAR * pszName,
PFN_SERVER_VARIABLE_ROUTINE * ppfnRoutine,
PFN_SERVER_VARIABLE_ROUTINE_W * ppfnRoutineW
);
SERVER_VARIABLE_RECORD * _rgBuckets[ SERVER_VARIABLE_BUCKETS ];
};
HRESULT
TranslateIpAddressToStr (
DWORD dwAddress,
STRA * pstraBuffer
);
#endif