KEEPALIVE.C

/*++ 

Copyright (c) 1997 Microsoft Corporation

Module Name: KeepAlive.c

Abstract:

Sample ISAPI Extension demonstrating Keep-Alive.

--*/

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <httpext.h>
#include <stdio.h>


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

strncpy(
pVer->lpszExtensionDesc,
"ISAPI Keep-Alive Extension Sample",
HSE_MAX_EXT_DLL_NAME_LEN
);

return TRUE;
}


DWORD WINAPI
HttpExtensionProc(
IN EXTENSION_CONTROL_BLOCK * pECB
)
/*++

Purpose:
Demonstrate persistent connection from ISAPI extension DLL.

Arguments:

pECB - pointer to the extenstion control block

Returns:

HSE_STATUS_SUCCESS_AND_KEEP_CONN

--*/
{
//
// Use the "Connection: Keep-Alive" header to keep the connection open;
// also, the "Content-Length:" header is required, so that the client knows when
// the server has finished.
//

char szHeader[] =
"Connection: Keep-Alive\r\n"
"Content-Length: %lu\r\n"
"Content-type: text/html\r\n\r\n";

char szContent[] =
"<html> <form method=get action=\\scripts\\KeepAlive.dll>"
"<h1>Keep-Alive Sample</h1><hr>"
"<input type=submit value=\"Send Request\"></form></html>";

char szBuffer[4096];
HSE_SEND_HEADER_EX_INFO HeaderExInfo;
DWORD dwSize;

//
// Send outgoing header with exact content length
//

sprintf( szBuffer, szHeader, strlen( szContent ) );
HeaderExInfo.pszHeader = szBuffer;
HeaderExInfo.cchHeader = strlen( szBuffer );
HeaderExInfo.pszStatus = "200 OK";
HeaderExInfo.cchStatus = strlen( HeaderExInfo.pszStatus );
HeaderExInfo.fKeepConn = TRUE;

pECB->ServerSupportFunction(
pECB,
HSE_REQ_SEND_RESPONSE_HEADER_EX,
&HeaderExInfo,
NULL,
NULL
);


//
// Send content
//

dwSize = strlen( szContent );

pECB->WriteClient( pECB, szContent, &dwSize, HSE_IO_SYNC );


//
// This return code tells IIS not to close the socket connection.
//

return HSE_STATUS_SUCCESS_AND_KEEP_CONN;
}


BOOL WINAPI
TerminateExtension(
IN DWORD dwFlags
)
/*++

Purpose:

This is optional ISAPI extension DLL entry point.
If present, it will be called before unloading the DLL,
giving it a chance to perform any shutdown procedures.

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