DUMPVARS.CPP
/*++ 
 
Copyright (c) 1997  Microsoft Corporation 
 
Module Name:    DumpVars.cpp 
 
Abstract: 
 
    ISAPI Extension sample to dump server variables 
 
--*/ 
 
#define WIN32_LEAN_AND_MEAN 
#include <windows.h> 
#include <httpext.h> 
 
  
DWORD WINAPI  
HttpExtensionProc(  
    IN EXTENSION_CONTROL_BLOCK * pECB 
) 
/*++ 
 
Purpose: 
 
    Use WriteClient() function to dump the value of each  
    server variable in the table. 
 
Arguments: 
 
    pECB - pointer to the extenstion control block  
 
Returns: 
 
    HSE_STATUS_SUCCESS 
 
--*/ 
{ 
char * aszServerVariables[] = 
    {"APPL_MD_PATH", "APPL_PHYSICAL_PATH", "AUTH_PASSWORD", 
"AUTH_TYPE", "AUTH_USER", "CERT_COOKIE", "CERT_FLAGS", 
"CERT_ISSUER", "CERT_KEYSIZE", "CERT_SECRETKEYSIZE", 
"CERT_SERIALNUMBER", "CERT_SERVER_ISSUER", 
"CERT_SERVER_SUBJECT", "CERT_SUBJECT", "CONTENT_LENGTH", 
"CONTENT_TYPE", "HTTP_ACCEPT", "HTTPS", "HTTPS_KEYSIZE", 
"HTTPS_SECRETKEYSIZE", "HTTPS_SERVER_ISSUER", 
"HTTPS_SERVER_SUBJECT", "INSTANCE_ID", "INSTANCE_META_PATH", 
"PATH_INFO", "PATH_TRANSLATED", "QUERY_STRING", 
"REMOTE_ADDR", "REMOTE_HOST", "REMOTE_USER", 
"REQUEST_METHOD", "SCRIPT_NAME", "SERVER_NAME", 
"SERVER_PORT", "SERVER_PORT_SECURE", "SERVER_PROTOCOL", 
"SERVER_SOFTWARE", "URL"}; 
char szOutput[2048], szValue[1024]; 
DWORD dwBuffSize, dwNumVars, dwError, x; 
    HSE_SEND_HEADER_EX_INFO HeaderExInfo; 
 
    // 
// Send headers to the client 
    // 
    HeaderExInfo.pszStatus = "200 OK"; 
    HeaderExInfo.pszHeader = "Content-type: text/html\r\n\r\n"; 
    HeaderExInfo.cchStatus = strlen( HeaderExInfo.pszStatus ); 
    HeaderExInfo.cchHeader = strlen( HeaderExInfo.pszHeader ); 
    HeaderExInfo.fKeepConn = FALSE; 
     
    pECB->ServerSupportFunction(  
        pECB->ConnID, 
        HSE_REQ_SEND_RESPONSE_HEADER_EX, 
        &HeaderExInfo, 
        NULL, 
        NULL 
        ); 
 
 
    // 
// Begin sending back HTML to the client 
    // 
 
strcpy(  
        szOutput,  
        "<HTML>\r\n<BODY><h1>Server Variable Dump</h1>\r\n<hr>\r\n" 
        ); 
dwBuffSize = strlen( szOutput ); 
pECB->WriteClient( pECB->ConnID, szOutput, &dwBuffSize, 0 ); 
 
 
dwNumVars = ( sizeof aszServerVariables )/( sizeof aszServerVariables[0] ); 
 
    // 
// Get the server variables and send them 
    // 
 
for ( x = 0; x < dwNumVars; x++ ) { 
 
dwBuffSize = 1024; 
        szValue[0] = '\0'; 
if ( !pECB->GetServerVariable(  
                pECB->ConnID,  
                aszServerVariables[x],  
                szValue,  
                &dwBuffSize 
                ) ) { 
 
            // 
            // Analyze the problem and report result to user 
            // 
 
switch (dwError = GetLastError( )) { 
case ERROR_INVALID_PARAMETER: 
strcpy( szValue, "ERROR_INVALID_PARAMETER" ); 
break; 
 
case ERROR_INVALID_INDEX: 
strcpy( szValue, "ERROR_INVALID_INDEX" ); 
break; 
 
case ERROR_INSUFFICIENT_BUFFER: 
wsprintf(  
                    szValue,  
                    "ERROR_INSUFFICIENT_BUFFER - %d bytes required.",  
                    dwBuffSize 
                    ); 
break; 
 
case ERROR_MORE_DATA: 
strcpy( szValue, "ERROR_MORE_DATA" ); 
break; 
 
case ERROR_NO_DATA: 
strcpy( szValue, "ERROR_NO_DATA" ); 
break; 
 
default: 
wsprintf(  
                    szValue,  
                    "*** Error %d occured retrieving server variable ***", 
                    dwError 
                    ); 
} 
} 
 
        //  
        // Dump server variable name and value 
        // 
 
wsprintf( szOutput, "%s: %s<br>\r\n", aszServerVariables[x], szValue ); 
dwBuffSize = strlen( szOutput ); 
 
        // 
        // Send the line to client 
        // 
 
pECB->WriteClient( pECB->ConnID, szOutput, &dwBuffSize, 0 ); 
} 
 
// 
    // End HTML page 
    // 
 
strcpy( szOutput, "</BODY>\r\n</HTML>\r\n\r\n" ); 
dwBuffSize = strlen( szOutput ); 
pECB->WriteClient( pECB->ConnID, szOutput, &dwBuffSize, 0 ); 
 
return HSE_STATUS_SUCCESS; 
} 
 
  
BOOL WINAPI  
GetExtensionVersion(  
    OUT HSE_VERSION_INFO * pVer 
 ) 
/*++ 
 
Purpose: 
 
    This is required ISAPI Extension DLL entry point. 
 
Arguments: 
 
    pVer - poins to extension version info structure  
 
Returns: 
 
    always returns TRUE 
 
--*/ 
{ 
pVer->dwExtensionVersion =  
        MAKELONG( HSE_VERSION_MINOR, HSE_VERSION_MAJOR ); 
 
lstrcpyn(  
        pVer->lpszExtensionDesc,  
        "DumpVars ISAPI Sample",  
        HSE_MAX_EXT_DLL_NAME_LEN ); 
 
return TRUE; 
} 
 
  
BOOL WINAPI 
TerminateExtension(  
    IN DWORD dwFlags  
) 
/*++ 
 
Routine Description: 
 
    This function is called when the WWW service is shutdown 
 
Arguments: 
 
    dwFlags - HSE_TERM_ADVISORY_UNLOAD or HSE_TERM_MUST_UNLOAD 
 
Return Value: 
 
    TRUE if extension is ready to be unloaded, 
    FALSE otherwise 
 
--*/ 
{ 
    return TRUE; 
}