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.
 
 
 
 
 
 

132 lines
3.9 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: bgihttp.cxx
//
//--------------------------------------------------------------------------
#include <windows.h>
#include <tchar.h>
#include <assert.h>
#include <stdio.h>
#include "httpext.h"
#include "gttran.h"
typedef struct _GPT {
HINSTANCE hLib;
PFNGTRecSend PfnRecSend;
PFNGTFree PfnFree;
} GPT;
static GPT gpt;
BOOL WINAPI GetExtensionVersion( HSE_VERSION_INFO *pVer )
{
pVer->dwExtensionVersion = MAKELONG( HSE_VERSION_MINOR,
HSE_VERSION_MAJOR );
lstrcpyn( pVer->lpszExtensionDesc,
"This is a sample Web Server Application",
HSE_MAX_EXT_DLL_NAME_LEN );
return TRUE;
}
DWORD WINAPI HttpExtensionProc(EXTENSION_CONTROL_BLOCK *pECB) {
DWORD cb = 0;
BYTE * pb = NULL;
TCHAR tszBuff[1024];
DWORD cbBuff;
DWORD dwEncodingType;
TCHAR * tszContentType;
// assume an error
pECB->dwHttpStatusCode = 500;
if(!_tcscmp(TEXT("application/x-octet-stream-asn"), pECB->lpszContentType))
dwEncodingType = ASN_ENCODING;
else if(!_tcscmp(TEXT("application/x-octet-stream-idl"), pECB->lpszContentType))
dwEncodingType = IDL_ENCODING;
else if(!_tcscmp(TEXT("application/x-octet-stream-tlv"), pECB->lpszContentType))
dwEncodingType = TLV_ENCODING;
else if(!_tcscmp(TEXT("application/octet-stream"), pECB->lpszContentType))
dwEncodingType = OCTET_ENCODING;
else
dwEncodingType = ASCII_ENCODING;
if(dwEncodingType == ASCII_ENCODING)
tszContentType = TEXT("text/html");
else
tszContentType = pECB->lpszContentType;
// only do it if we can.
if(gpt.PfnRecSend == NULL || gpt.PfnFree == NULL)
return(HSE_STATUS_ERROR);
// call the user dlls with the data
if( gpt.PfnRecSend(dwEncodingType, pECB->cbTotalBytes, pECB->lpbData, &cb, &pb) != ERROR_SUCCESS)
return(HSE_STATUS_ERROR);
// we are ok now
pECB->dwHttpStatusCode = 200;
// write any return data
if( cb > 0 ) {
assert( pb != NULL);
// write headers
// we assume the only type of content type we support
_stprintf(tszBuff, TEXT("Content-Length: %d\r\nContent-Type: %s\r\n\r\n"), cb, tszContentType);
cbBuff = _tcslen(tszBuff);
pECB->ServerSupportFunction(pECB->ConnID, HSE_REQ_SEND_RESPONSE_HEADER, NULL, &cbBuff, (LPDWORD) tszBuff);
// write users data
pECB->WriteClient(pECB->ConnID, pb, &cb, 0);
// free the users data
gpt.PfnFree(pb);
}
// just write out the headers if no data returned
else {
// write headers
pECB->ServerSupportFunction(pECB->ConnID, HSE_REQ_SEND_RESPONSE_HEADER, NULL, NULL, NULL);
}
return(HSE_STATUS_SUCCESS);
}
// SHOULD ONLY BE CALLED DURING PROCESS ATTACH
DWORD __stdcall GTInitSrv(TCHAR * tszLibrary) {
// this is only called on process attach
// there is only one process attach
assert(gpt.hLib == NULL);
memset(&gpt, 0, sizeof(gpt));
if( (gpt.hLib = LoadLibrary(tszLibrary)) == NULL )
return(ERROR_DLL_NOT_FOUND);
gpt.PfnRecSend = (PFNGTRecSend) GetProcAddress(gpt.hLib, TEXT("GTRecSend"));
gpt.PfnFree = (PFNGTFree) GetProcAddress(gpt.hLib, TEXT("GTFree"));
if( gpt.PfnRecSend == NULL || gpt.PfnFree == NULL ) {
FreeLibrary(gpt.hLib);
memset(&gpt, 0, sizeof(GPT));
return(ERROR_PROC_NOT_FOUND);
}
return(ERROR_SUCCESS);
}
// SHOULD ONLY BE CALLED DURING PROCESS DETACH
DWORD __stdcall GTUnInitSrv(void) {
if(gpt.hLib != NULL)
FreeLibrary(gpt.hLib);
return(ERROR_SUCCESS);
}