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;
}