637 lines
19 KiB
C++
637 lines
19 KiB
C++
// This is a part of the Microsoft Foundation Classes C++ library.
|
|
// Copyright (C) 1992-1998 Microsoft Corporation
|
|
// All rights reserved.
|
|
|
|
// This source code is only intended as a supplement to the
|
|
// Microsoft Foundation Classes Reference and related
|
|
// electronic documentation provided with the library.
|
|
// See these sources for detailed information regarding the
|
|
// Microsoft Foundation Classes product.
|
|
|
|
#ifndef __AFXISAPI_H_
|
|
#define __AFXISAPI_H_
|
|
|
|
#ifdef _UNICODE
|
|
#error ERROR: ISAPI does not yet support Unicode.
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Turn off warnings for /W4
|
|
// To resume any of these warning: #pragma warning(default: 4xxx)
|
|
// which should be placed after the AFX include files
|
|
#ifndef ALL_WARNINGS
|
|
// warnings generated with common MFC/Windows code
|
|
#pragma warning(disable: 4127) // constant expression for TRACE/ASSERT
|
|
#pragma warning(disable: 4134) // message map member fxn casts
|
|
#pragma warning(disable: 4201) // nameless unions are part of C++
|
|
#pragma warning(disable: 4511) // private copy constructors are good to have
|
|
#pragma warning(disable: 4512) // private operator= are good to have
|
|
#pragma warning(disable: 4514) // unreferenced inlines are common
|
|
#pragma warning(disable: 4710) // private constructors are disallowed
|
|
#pragma warning(disable: 4705) // statement has no effect in optimized code
|
|
#pragma warning(disable: 4191) // pointer-to-function casting
|
|
// warnings caused by normal optimizations
|
|
#ifndef _DEBUG
|
|
#pragma warning(disable: 4701) // local variable *may* be used without init
|
|
#pragma warning(disable: 4702) // unreachable code caused by optimizations
|
|
#pragma warning(disable: 4791) // loss of debugging info in retail version
|
|
#pragma warning(disable: 4189) // initialized but unused variable
|
|
#pragma warning(disable: 4390) // empty controlled statement
|
|
#endif
|
|
// warnings specific to _AFXDLL version
|
|
#ifdef _AFXDLL
|
|
#pragma warning(disable: 4204) // non-constant aggregate initializer
|
|
#endif
|
|
#ifdef _AFXDLL
|
|
#pragma warning(disable: 4275) // deriving exported class from non-exported
|
|
#pragma warning(disable: 4251) // using non-exported as public in exported
|
|
#endif
|
|
#endif //!ALL_WARNINGS
|
|
|
|
#define STRICT 1
|
|
|
|
#ifndef _DEBUG
|
|
#ifndef _AFX_ENABLE_INLINES
|
|
#define _AFX_ENABLE_INLINES
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef _AFX
|
|
#include <afxv_cpu.h>
|
|
#endif
|
|
#include <httpext.h>
|
|
#include <httpfilt.h>
|
|
|
|
#ifndef _INC_STDLIB
|
|
#include <stdlib.h>
|
|
#endif
|
|
#ifndef _INC_TCHAR
|
|
#include <tchar.h>
|
|
#endif
|
|
|
|
#ifndef UNUSED
|
|
#ifdef _DEBUG
|
|
#define UNUSED(x)
|
|
#else
|
|
#define UNUSED(x) x
|
|
#endif
|
|
#endif
|
|
|
|
#define AFXISAPI __stdcall
|
|
#define AFXIS_DATADEF
|
|
#define AFXISAPI_CDECL __cdecl
|
|
|
|
#ifndef AFX_INLINE
|
|
#if _MSC_VER >= 0x1200
|
|
#define AFX_INLINE __forceinline
|
|
#else
|
|
#define AFX_INLINE inline
|
|
#endif
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Internet Server API Library
|
|
|
|
#ifndef _AFX_NOFORCE_LIBS
|
|
|
|
#ifdef _AFXDLL
|
|
#ifdef _DEBUG
|
|
#ifdef _UNICODE
|
|
#pragma comment(lib, "MFCISUD.lib")
|
|
#else
|
|
#pragma comment(lib, "EAFXISD.lib")
|
|
#endif
|
|
#else
|
|
#ifdef _UNICODE
|
|
#pragma comment(lib, "MFCISU.lib")
|
|
#else
|
|
#pragma comment(lib, "EAFXIS.lib")
|
|
#endif // _UNICODE
|
|
#endif // _DEBUG
|
|
#else
|
|
#ifdef _DEBUG
|
|
#ifdef _UNICODE
|
|
#pragma comment(lib, "UAFXISD.lib")
|
|
#else
|
|
#pragma comment(lib, "NAFXISD.lib")
|
|
#endif
|
|
#else
|
|
#ifdef _UNICODE
|
|
#pragma comment(lib, "UAFXIS.lib")
|
|
#else
|
|
#pragma comment(lib, "NAFXIS.lib")
|
|
#endif // _UNICODE
|
|
#endif // _DEBUG
|
|
#endif // _AFXDLL
|
|
|
|
#pragma comment(lib, "kernel32.lib")
|
|
#pragma comment(lib, "user32.lib")
|
|
#pragma comment(lib, "winspool.lib")
|
|
#pragma comment(lib, "advapi32.lib")
|
|
|
|
#endif // _AFX_NOFORCE_LIBS
|
|
|
|
extern HINSTANCE AFXISAPI AfxGetResourceHandle();
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// AFXIASPI - MFC Internet Server API support
|
|
|
|
// Classes declared in this file
|
|
|
|
class CHtmlStream;
|
|
class CHttpServerContext;
|
|
class CHttpServer;
|
|
class CHttpFilterContext;
|
|
class CHttpFilter;
|
|
|
|
// Classes this file uses from elsewhere, sometimes
|
|
|
|
#ifdef _AFX
|
|
class CLongBinary;
|
|
class CByteArray;
|
|
#endif
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
// CHtmlStream -- manages in-memory HTML
|
|
|
|
class CHtmlStream
|
|
{
|
|
public:
|
|
// Constructors
|
|
CHtmlStream(UINT nGrowBytes = 4096);
|
|
CHtmlStream(BYTE* lpBuffer, UINT nBufferSize, UINT nGrowBytes = 0);
|
|
|
|
// Operations
|
|
void Attach(BYTE* lpBuffer, UINT nBufferSize, UINT nGrowBytes = 0);
|
|
BYTE* Detach();
|
|
DWORD GetStreamSize() const;
|
|
|
|
virtual void Abort();
|
|
virtual void Close();
|
|
virtual void InitStream();
|
|
virtual void Reset();
|
|
|
|
virtual void Write(const void* lpBuf, UINT nCount);
|
|
|
|
CHtmlStream& operator<<(LPCTSTR psz);
|
|
CHtmlStream& operator<<(short int w);
|
|
CHtmlStream& operator<<(long int dw);
|
|
CHtmlStream& operator<<(const CHtmlStream& stream);
|
|
CHtmlStream& operator<<(double d);
|
|
CHtmlStream& operator<<(float f);
|
|
|
|
#ifdef _AFX
|
|
CHtmlStream& operator<<(const CByteArray& array);
|
|
CHtmlStream& operator<<(const CLongBinary& blob);
|
|
#endif
|
|
|
|
// Advanced Overridables
|
|
protected:
|
|
virtual BYTE* Alloc(DWORD nBytes);
|
|
virtual BYTE* Realloc(BYTE* lpMem, DWORD nBytes);
|
|
virtual BYTE* Memcpy(BYTE* lpMemTarget, const BYTE* lpMemSource, UINT nBytes);
|
|
virtual void GrowStream(DWORD dwNewLen);
|
|
|
|
DWORD m_nStreamSize;
|
|
|
|
public:
|
|
virtual void Free(BYTE* lpMem);
|
|
|
|
// Implementation
|
|
protected:
|
|
UINT m_nGrowBytes;
|
|
DWORD m_nPosition;
|
|
DWORD m_nBufferSize;
|
|
BYTE* m_lpBuffer;
|
|
BOOL m_bAutoDelete;
|
|
|
|
public:
|
|
virtual ~CHtmlStream();
|
|
};
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
// Status codes for HTTP transactions
|
|
|
|
#ifndef _WININET_ // these symbols may come from WININET.H
|
|
|
|
#define HTTP_STATUS_OK 200 // OK
|
|
#define HTTP_STATUS_CREATED 201 // created
|
|
#define HTTP_STATUS_ACCEPTED 202 // accepted
|
|
#define HTTP_STATUS_NO_CONTENT 204 // no content
|
|
#define HTTP_STATUS_REDIRECT 301 // moved permanently
|
|
#define HTTP_STATUS_TEMP_REDIRECT 302 // moved temporarily
|
|
#define HTTP_STATUS_NOT_MODIFIED 304 // not modified
|
|
#define HTTP_STATUS_BAD_REQUEST 400 // bad request
|
|
#define HTTP_STATUS_AUTH_REQUIRED 401 // unauthorized
|
|
#define HTTP_STATUS_FORBIDDEN 403 // forbidden
|
|
#define HTTP_STATUS_NOT_FOUND 404 // not found
|
|
#define HTTP_STATUS_SERVER_ERROR 500 // internal server error
|
|
#define HTTP_STATUS_NOT_IMPLEMENTED 501 // not implemented
|
|
#define HTTP_STATUS_BAD_GATEWAY 502 // bad gateway
|
|
#define HTTP_STATUS_SERVICE_NA 503 // service unavailable
|
|
|
|
#endif
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
// Parse Map macros
|
|
|
|
#ifndef AFX_PARSE_CALL
|
|
#define AFX_PARSE_CALL
|
|
#endif
|
|
|
|
typedef void (AFX_PARSE_CALL CHttpServer::*AFX_PISAPICMD)(CHttpServerContext* pCtxt);
|
|
|
|
struct AFX_PARSEMAP_ENTRY; // declared after CHttpServer, below
|
|
|
|
struct AFX_PARSEMAP
|
|
{
|
|
UINT (PASCAL* pfnGetNumMapEntries)();
|
|
#ifdef _AFXDLL
|
|
const AFX_PARSEMAP* (PASCAL* pfnGetBaseMap)();
|
|
#else
|
|
const AFX_PARSEMAP* pBaseMap;
|
|
#endif
|
|
const AFX_PARSEMAP_ENTRY* lpEntries;
|
|
~AFX_PARSEMAP();
|
|
};
|
|
|
|
struct AFX_PARSEMAP_ENTRY_PARAMS
|
|
{
|
|
int nParams; // number of parameters
|
|
int nRequired; // number of parameters without defaults
|
|
// all of these are arrays!
|
|
LPTSTR* ppszInfo; // pointers to name[2n], pointer to default[2n+1]
|
|
BYTE* ppszDefaults; // pointers to coerced default values
|
|
BYTE* ppszValues; // pointers to coerced actual values
|
|
~AFX_PARSEMAP_ENTRY_PARAMS();
|
|
};
|
|
|
|
#ifdef _AFXDLL
|
|
#define DECLARE_PARSE_MAP() \
|
|
private: \
|
|
static AFX_PARSEMAP_ENTRY _parseEntries[]; \
|
|
public: \
|
|
static const AFX_PARSEMAP parseMap; \
|
|
static const AFX_PARSEMAP* PASCAL _GetBaseParseMap(); \
|
|
static UINT PASCAL GetNumMapEntries(); \
|
|
virtual const AFX_PARSEMAP* GetParseMap() const; \
|
|
|
|
#else
|
|
#define DECLARE_PARSE_MAP() \
|
|
private: \
|
|
static AFX_PARSEMAP_ENTRY _parseEntries[]; \
|
|
public: \
|
|
static const AFX_PARSEMAP parseMap; \
|
|
static UINT PASCAL GetNumMapEntries(); \
|
|
virtual const AFX_PARSEMAP* GetParseMap() const; \
|
|
|
|
#endif // _AFXDLL
|
|
|
|
#ifdef _AFXDLL
|
|
#define BEGIN_PARSE_MAP(theClass, baseClass) \
|
|
const AFX_PARSEMAP* PASCAL theClass::_GetBaseParseMap() \
|
|
{ return &baseClass::parseMap; } \
|
|
typedef void (AFX_PARSE_CALL theClass::*theClass##CALL)(CHttpServerContext*); \
|
|
const AFX_PARSEMAP* theClass::GetParseMap() const \
|
|
{ return &theClass::parseMap; } \
|
|
AFXIS_DATADEF const AFX_PARSEMAP theClass::parseMap = \
|
|
{ &theClass::GetNumMapEntries, &theClass::_GetBaseParseMap, &theClass::_parseEntries[0] }; \
|
|
AFX_PARSEMAP_ENTRY theClass::_parseEntries[] = \
|
|
{ \
|
|
|
|
#else
|
|
#define BEGIN_PARSE_MAP(theClass, baseClass) \
|
|
typedef void (AFX_PARSE_CALL theClass::*theClass##CALL)(CHttpServerContext*); \
|
|
const AFX_PARSEMAP* theClass::GetParseMap() const \
|
|
{ return &theClass::parseMap; } \
|
|
AFXIS_DATADEF const AFX_PARSEMAP theClass::parseMap = \
|
|
{ &theClass::GetNumMapEntries, &baseClass::parseMap, &theClass::_parseEntries[0] }; \
|
|
AFX_PARSEMAP_ENTRY theClass::_parseEntries[] = \
|
|
{ \
|
|
|
|
#endif
|
|
|
|
#define ON_PARSE_COMMAND(FnName, mapClass, Args) \
|
|
{ _T(#FnName), (AFX_PISAPICMD) (mapClass##CALL)mapClass::FnName,\
|
|
Args, NULL },
|
|
|
|
#define ON_PARSE_COMMAND_PARAMS(Params) \
|
|
{ NULL, (AFX_PISAPICMD) NULL, Params, NULL },
|
|
|
|
#define DEFAULT_PARSE_COMMAND(FnName, mapClass) \
|
|
{ _T(#FnName), (AFX_PISAPICMD) (mapClass##CALL)mapClass::FnName,\
|
|
NULL, NULL },
|
|
|
|
#define END_PARSE_MAP(theClass) \
|
|
}; \
|
|
UINT PASCAL theClass::GetNumMapEntries() { \
|
|
return sizeof(theClass::_parseEntries) /\
|
|
sizeof(AFX_PARSEMAP_ENTRY); } \
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
//
|
|
|
|
class CHttpServerContext
|
|
{
|
|
public:
|
|
CHttpServerContext(EXTENSION_CONTROL_BLOCK* pECB);
|
|
virtual ~CHttpServerContext();
|
|
|
|
// Operations
|
|
BOOL GetServerVariable(LPTSTR lpszVariableName,
|
|
LPVOID lpvBuffer, LPDWORD lpdwSize);
|
|
BOOL WriteClient(LPVOID lpvBuffer, LPDWORD lpdwBytes, DWORD dwReserved = 0);
|
|
BOOL ReadClient(LPVOID lpvBuffer, LPDWORD lpdwSize);
|
|
BOOL ServerSupportFunction(DWORD dwHSERRequest,
|
|
LPVOID lpvBuffer, LPDWORD lpdwSize, LPDWORD lpdwDataType);
|
|
|
|
#if _MFC_VER >= 0x0600
|
|
BOOL TransmitFile(HANDLE hFile,
|
|
DWORD dwFlags = HSE_IO_DISCONNECT_AFTER_SEND,
|
|
LPVOID pstrHeader = NULL, DWORD dwHeaderLen = 0,
|
|
LPVOID pstrTrailer = NULL, DWORD dwTrailerLen = 0);
|
|
#endif
|
|
|
|
CHttpServerContext& operator<<(LPCTSTR psz);
|
|
CHttpServerContext& operator<<(long int dw);
|
|
CHttpServerContext& operator<<(short int w);
|
|
CHttpServerContext& operator<<(const CHtmlStream& stream);
|
|
CHttpServerContext& operator<<(double d);
|
|
CHttpServerContext& operator<<(float f);
|
|
|
|
#ifdef _AFX
|
|
CHttpServerContext& operator<<(const CLongBinary& blob);
|
|
CHttpServerContext& operator<<(const CByteArray& array);
|
|
#endif
|
|
|
|
#if _MFC_VER >= 0x0600
|
|
DWORD SetChunkSize(DWORD dwNewSize);
|
|
DWORD GetChunkSize() const;
|
|
#endif
|
|
|
|
void Reset();
|
|
|
|
// Attributes
|
|
public:
|
|
BOOL m_bSendHeaders;
|
|
#if _MFC_VER >= 0x0600
|
|
DWORD m_dwStatusCode;
|
|
#endif
|
|
EXTENSION_CONTROL_BLOCK* const m_pECB;
|
|
CHtmlStream* m_pStream;
|
|
DWORD m_dwEndOfHeaders;
|
|
#ifdef _DEBUG
|
|
DWORD m_dwOldEndOfHeaders;
|
|
#endif
|
|
|
|
#if _MFC_VER >= 0x0600
|
|
// Implementation
|
|
DWORD m_dwBytesReceived;
|
|
DWORD m_dwChunkSize;
|
|
#endif
|
|
};
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
// Internet Information Server Extension Support
|
|
|
|
class CHttpServer
|
|
{
|
|
public:
|
|
CHttpServer(TCHAR cDelimiter = '&');
|
|
virtual ~CHttpServer();
|
|
|
|
enum errors {
|
|
callOK = 0, // everything is fine
|
|
callParamRequired, // a required parameter was missing
|
|
callBadParamCount, // there were too many or too few parameters
|
|
callBadCommand, // the command name was not found
|
|
callNoStackSpace, // no stack space was available
|
|
callNoStream, // no CHtmlStream was available
|
|
callMissingQuote, // a parameter had a bad format
|
|
callMissingParams, // no parameters were available
|
|
callBadParam, // a paremeter had a bad format (ie, only one quote)
|
|
};
|
|
|
|
// overridables
|
|
virtual int CallFunction(CHttpServerContext* pCtxt,
|
|
LPTSTR pszQuery, LPTSTR pszCommand);
|
|
virtual BOOL OnParseError(CHttpServerContext* pCtxt, int nCause);
|
|
#if _MFC_VER >= 0x0600
|
|
virtual BOOL OnWriteBody(CHttpServerContext* pCtxt, LPBYTE pbContent,
|
|
DWORD dwSize, DWORD dwReserved = 0);
|
|
#endif
|
|
|
|
// operations
|
|
virtual void EndContent(CHttpServerContext* pCtxt) const;
|
|
virtual void StartContent(CHttpServerContext* pCtxt) const;
|
|
virtual void WriteTitle(CHttpServerContext* pCtxt) const;
|
|
virtual LPCTSTR GetTitle() const;
|
|
void AddHeader(CHttpServerContext* pCtxt, LPCTSTR pszString) const;
|
|
|
|
#if _MFC_VER >= 0x0600
|
|
virtual BOOL TerminateExtension(DWORD dwFlags);
|
|
#endif
|
|
virtual DWORD HttpExtensionProc(EXTENSION_CONTROL_BLOCK *pECB);
|
|
virtual BOOL GetExtensionVersion(HSE_VERSION_INFO *pVer);
|
|
virtual CHtmlStream* ConstructStream();
|
|
|
|
virtual BOOL InitInstance(CHttpServerContext* pCtxt);
|
|
|
|
// implementation
|
|
protected:
|
|
UINT PASCAL GetStackSize(const BYTE* pbParams);
|
|
int CallMemberFunc(CHttpServerContext* pCtxt,
|
|
const AFX_PARSEMAP_ENTRY* pEntry,
|
|
AFX_PARSEMAP_ENTRY* pParams, LPTSTR szParams);
|
|
LPTSTR GetQuery(CHttpServerContext* pCtxt, LPTSTR lpszQuery);
|
|
const AFX_PARSEMAP_ENTRY* LookUp(LPCTSTR szMethod,
|
|
const AFX_PARSEMAP*& pMap, AFX_PARSEMAP_ENTRY*& pParams,
|
|
AFX_PISAPICMD pCmdDefault = NULL);
|
|
int CountParams(LPCTSTR pszCommandLine, int& nCount);
|
|
int ParseDefaultParams(AFX_PARSEMAP_ENTRY* pParams,
|
|
int nParams, AFX_PARSEMAP_ENTRY_PARAMS*& pBlock,
|
|
const BYTE* pbTypes);
|
|
LPVOID PreprocessString(LPTSTR psz);
|
|
void BuildStatusCode(LPTSTR szResponse, DWORD dwCode);
|
|
|
|
#ifdef _SHADOW_DOUBLES
|
|
int PushDefaultStackArgs(BYTE* pStack,
|
|
CHttpServerContext* pCtxt, const BYTE* pbParams,
|
|
LPTSTR lpszParams, AFX_PARSEMAP_ENTRY_PARAMS* pDefParams,
|
|
int nSizeArgs);
|
|
int PushStackArgs(BYTE* pStack, CHttpServerContext* pCtxt,
|
|
const BYTE* pbParams, LPTSTR lpszParams, UINT nSizeArgs);
|
|
BYTE* StoreStackParameter(BYTE* pStack, BYTE nType,
|
|
LPTSTR pszCurParam, UINT nSizeArgs, BOOL bDoShadow);
|
|
BYTE* StoreRawStackParameter(BYTE* pStack, BYTE nType,
|
|
BYTE* pRawParam, int nSizeArgs);
|
|
#else
|
|
int PushDefaultStackArgs(BYTE* pStack,
|
|
CHttpServerContext* pCtxt, const BYTE* pbParams,
|
|
LPTSTR lpszParams, AFX_PARSEMAP_ENTRY_PARAMS* pDefParams);
|
|
int PushStackArgs(BYTE* pStack, CHttpServerContext* pCtxt,
|
|
const BYTE* pbParams, LPTSTR lpszParams);
|
|
BYTE* StoreStackParameter(BYTE* pStack, BYTE nType, LPTSTR pszParam);
|
|
BYTE* StoreRawStackParameter(BYTE* pStack, BYTE nType, BYTE* pRawParam);
|
|
#endif
|
|
|
|
LPCRITICAL_SECTION m_pCritSec;
|
|
const TCHAR m_cTokenDelimiter; // can't EVER change
|
|
|
|
DECLARE_PARSE_MAP()
|
|
};
|
|
|
|
extern "C" BOOL WINAPI GetExtensionVersion(HSE_VERSION_INFO *pVer);
|
|
extern "C" DWORD WINAPI HttpExtensionProc(EXTENSION_CONTROL_BLOCK *pECB);
|
|
|
|
struct AFX_PARSEMAP_ENTRY
|
|
{
|
|
LPTSTR pszFnName; // if default param entry, ptr to AFX_PARSEMAP_ENTRY_PARAMS
|
|
AFX_PISAPICMD pfn; // NULL if default param entry
|
|
LPCSTR pszArgs; // NULL if default function entry
|
|
LPSTR pszParamInfo; // copy of pszArgs for parsing
|
|
};
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
// Constants to describe parameter types
|
|
|
|
#define ITS_EMPTY "\x06" // no parameters
|
|
#define ITS_I2 "\x01" // a 'short'
|
|
#define ITS_I4 "\x02" // a 'long'
|
|
#define ITS_R4 "\x03" // a 'float'
|
|
#define ITS_R8 "\x04" // a 'double'
|
|
#define ITS_PSTR "\x05" // a 'LPCTSTR'
|
|
#if _MFC_VER >= 0x0600
|
|
#define ITS_RAW "\x07" // exactly as received
|
|
#endif
|
|
|
|
enum INETVARENUM
|
|
{
|
|
IT_I2 = 1,
|
|
IT_I4 = 2,
|
|
IT_R4 = 3,
|
|
IT_R8 = 4,
|
|
IT_PSTR = 5,
|
|
IT_EMPTY = 6,
|
|
#if _MFC_VER >= 0x0600
|
|
IT_RAW = 7,
|
|
#endif
|
|
};
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
// Internet Information Server Entry Points
|
|
|
|
extern "C" DWORD WINAPI HttpFilterProc(PHTTP_FILTER_CONTEXT pfc,
|
|
DWORD dwNotificationType, LPVOID pvNotification);
|
|
|
|
extern "C" BOOL WINAPI GetFilterVersion(PHTTP_FILTER_VERSION pVer);
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
// Internet Information Server Filter Support
|
|
|
|
class CHttpFilterContext
|
|
{
|
|
public:
|
|
CHttpFilterContext(PHTTP_FILTER_CONTEXT pfc);
|
|
~CHttpFilterContext() { }
|
|
|
|
BOOL GetServerVariable(LPTSTR lpszVariableName, LPVOID lpvBuffer,
|
|
LPDWORD lpdwSize);
|
|
BOOL AddResponseHeaders(LPTSTR lpszHeaders, DWORD dwReserved = 0);
|
|
BOOL WriteClient(LPVOID lpvBuffer, LPDWORD lpdwBytes,
|
|
DWORD dwReserved = 0);
|
|
LPVOID AllocMem(DWORD cbSize, DWORD dwReserved = 0);
|
|
BOOL ServerSupportFunction(enum SF_REQ_TYPE sfReq,
|
|
LPVOID lpvBuffer, LPDWORD lpdwSize, LPDWORD lpdwDataType);
|
|
|
|
PHTTP_FILTER_CONTEXT const m_pFC;
|
|
};
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////
|
|
//
|
|
|
|
class CHttpFilter
|
|
{
|
|
public:
|
|
CHttpFilter();
|
|
~CHttpFilter();
|
|
|
|
protected:
|
|
|
|
public:
|
|
virtual DWORD HttpFilterProc(PHTTP_FILTER_CONTEXT pfc,
|
|
DWORD dwNotificationType, LPVOID pvNotification);
|
|
virtual BOOL GetFilterVersion(PHTTP_FILTER_VERSION pVer);
|
|
|
|
virtual DWORD OnReadRawData(CHttpFilterContext* pfc, PHTTP_FILTER_RAW_DATA pRawData);
|
|
virtual DWORD OnPreprocHeaders(CHttpFilterContext* pfc, PHTTP_FILTER_PREPROC_HEADERS pHeaders);
|
|
virtual DWORD OnAuthentication(CHttpFilterContext* pfc, PHTTP_FILTER_AUTHENT pAuthent);
|
|
virtual DWORD OnUrlMap(CHttpFilterContext* pfc, PHTTP_FILTER_URL_MAP pUrlMap);
|
|
virtual DWORD OnSendRawData(CHttpFilterContext* pfc, PHTTP_FILTER_RAW_DATA pRawData);
|
|
virtual DWORD OnLog(CHttpFilterContext* pfc, PHTTP_FILTER_LOG pLog);
|
|
virtual DWORD OnEndOfNetSession(CHttpFilterContext* pfc);
|
|
virtual DWORD OnEndOfRequest(CHttpFilterContext* pfc);
|
|
};
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Alternate debugging suppot
|
|
|
|
#include <crtdbg.h>
|
|
|
|
#ifdef _AFX
|
|
#define ISAPIASSERT(expr) ASSERT(expr)
|
|
#define ISAPITRACE TRACE
|
|
#define ISAPITRACE0(str) TRACE0(str)
|
|
#define ISAPITRACE1(str, arg1) TRACE1(str, arg1)
|
|
#define ISAPITRACE2(str, arg1, arg2) TRACE2(str, arg1, arg2)
|
|
#define ISAPITRACE3(str, arg1, arg2, arg3) TRACE3(str, arg1, arg2, arg3)
|
|
#ifdef _DEBUG
|
|
#define ISAPIVERIFY(f) ASSERT(f)
|
|
#else
|
|
#define ISAPIVERIFY(f) ((void)(f))
|
|
#endif // _DEBUG
|
|
#else // !_AFX
|
|
#define ISAPIASSERT(expr) _ASSERTE(expr)
|
|
#define ISAPITRACE0(str) _RPT0(_CRT_WARN, str)
|
|
#define ISAPITRACE1(str, arg1) _RPT1(_CRT_WARN, str, arg1)
|
|
#define ISAPITRACE2(str, arg1, arg2) _RPT2(_CRT_WARN, str, arg1, arg2)
|
|
#define ISAPITRACE3(str, arg1, arg2, arg3) _RPT3(_CRT_WARN, arg1, arg2, arg3)
|
|
#ifdef _DEBUG
|
|
void AFXISAPI_CDECL AfxISAPITrace(LPCTSTR lpszFormat, ...);
|
|
#define ISAPIVERIFY(expr) _ASSERTE(expr)
|
|
#define ISAPITRACE AfxISAPITrace
|
|
#else
|
|
AFX_INLINE void AfxISAPITrace(LPCTSTR, ...) { }
|
|
#define ISAPIVERIFY(expr) ((void)(expr))
|
|
#define ISAPITRACE AfxISAPITrace
|
|
#endif // _DEBUG
|
|
#endif // _AFX
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Inline function declarations
|
|
|
|
#ifdef _AFX_ENABLE_INLINES
|
|
#define _AFXISAPI_INLINE AFX_INLINE
|
|
#include <afxisapi.inl>
|
|
#endif
|
|
|
|
#undef AFX_DATA
|
|
#define AFX_DATA
|
|
|
|
#ifdef _AFX_MINREBUILD
|
|
#pragma component(minrebuild, on)
|
|
#endif
|
|
#ifndef _AFX_FULLTYPEINFO
|
|
#pragma component(mintypeinfo, off)
|
|
#endif
|
|
|
|
#endif // the whole file
|