⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isapiflt.cpp

📁 mini http server,可以集成嵌入到程序中,实现简单的web功能
💻 CPP
📖 第 1 页 / 共 4 页
字号:
					((char *)lpvBuffer)[*lpdwSize] = '\0';	
					return 1;
					}
				}
			PIDBIterator_delete( pIter );

			*(char *)lpvBuffer = '\0';
			*lpdwSize = 0;
			::SetLastError( ERROR_INVALID_INDEX );
			return 0;
			}
		
		::SetLastError( ERROR_INVALID_INDEX );
		return 0;
	}
};


/*____________________________________________________________________________*\
 *
 Function:
 Synopsis:
 Description:
\*____________________________________________________________________________*/
BOOL WINAPI fnGetServerVariable( PHTTP_FILTER_CONTEXT pfc,
					LPSTR lpszVariableName,
					LPVOID  lpvBuffer,
					LPDWORD lpdwSize )
{
	ISAPIContext *pContext = (ISAPIContext *)pfc;
	BOOL iRet = pContext->pISAPIFLT->GetServerVariable( pContext->pPIHTTP,
		lpszVariableName, lpvBuffer, lpdwSize, pContext );
	if ( HTTPCore_debugEnabled() )
		{
		HTTPCore_logDebug( DBG_MED, "ISAPI20: Return code<%d>, variable<%s>, \
value<%x>, size<%d>.",
			iRet, lpszVariableName ? lpszVariableName : "",
			(void *)lpvBuffer, lpdwSize ? *lpdwSize : 0 );
		};
	return iRet;
}

/*____________________________________________________________________________*\
 *
 Function:
 Synopsis:
 Description:
\*____________________________________________________________________________*/
BOOL WINAPI fnWriteClient( PHTTP_FILTER_CONTEXT pfc,
					LPVOID  Buffer,
					LPDWORD lpdwBytes,
					DWORD   dwReserved )
{
	if ( !pfc || !pfc->ServerContext || !lpdwBytes || !Buffer )
		{
		::SetLastError( ERROR_INVALID_PARAMETER );
		return FALSE;
		};

	ISAPIContext *pContext = (ISAPIContext *)pfc->ServerContext;
	/*
	** This function does not yet exist!
	*/
//	pContext->pISAPIFLT->notifyWrite( Buffer, lpdwBytes );
	int iWritten = PIIOBuffer_write( pContext->pPIHTTP->pBuffer,
		(char *)Buffer, *lpdwBytes, PIIOBUF_NONE );
	if ( iWritten == -1 )
		{
		/*
		** Socket must have been closed
		*/
		::SetLastError( ERROR_INVALID_HANDLE );
		return FALSE;
		};
	*lpdwBytes = iWritten;
	return TRUE;
}

/*____________________________________________________________________________*\
 *
 Function:
 Synopsis:
 Description:
\*____________________________________________________________________________*/
VOID * WINAPI fnAllocMem ( struct _HTTP_FILTER_CONTEXT * pfc,
					DWORD    cbSize,
					DWORD    dwReserved )
{
	if ( !pfc || !pfc->ServerContext )
		{
		::SetLastError( ERROR_INVALID_PARAMETER );
		return NULL;
		};
	ISAPIContext *pContext = (ISAPIContext *)pfc->ServerContext;
	return PIHTTP_allocMem( pContext->pPIHTTP, cbSize ) ;
};

/*____________________________________________________________________________*\
 *
 Function:
 Synopsis:
 Description:
\*____________________________________________________________________________*/
BOOL WINAPI fnServerSupportFunction( PHTTP_FILTER_CONTEXT pfc,
					enum SF_REQ_TYPE sfReq,
					PVOID pData,
					DWORD ul1,
					DWORD ul2 )
{
	if ( !pfc || !pfc->ServerContext )
		{
		::SetLastError( ERROR_INVALID_PARAMETER );
		return FALSE;
		};

	ISAPIContext *pContext = (ISAPIContext *)pfc->ServerContext;
	PIHTTP *pPIHTTP = pContext->pPIHTTP;
	const char *pFKProxyProtocol = PIDB_getFastKey( KEY_HTTP_PROXYPROTOCOL,	PIDBTYPE_STRING );

	switch( sfReq )
		{
		case SF_REQ_ADD_HEADERS_ON_DENIAL:
			pContext->pszHeaders = (const char *)pData;
			return TRUE;

		/*
		** Not implemented in filter version 2.1
		*/
//		case SF_REQ_DISABLE_NOTIFICATIONS:
//			pContext->tVer.dwFlags &= (ul1 ^ 0xFFFFFFFF); 
//			return TRUE;

		case SF_REQ_SEND_RESPONSE_HEADER:
			{
			int iStatus = pData ? atoi( (char *)pData ) : ST_OK;	
			pPIHTTP->iStatus = iStatus;
			pContext->iRc = PIAPI_COMPLETED;

			/*
			** Send server specific headers
			*/
			HTTPCore_sendGeneralHeaders( pPIHTTP );
			if ( pData )
				{
				DWORD dwSize = strlen( (const char *)pData );
				PIIOBuffer_write( pPIHTTP->pBuffer, (const char *)pData,
					dwSize, PIIOBUF_NONE );
				};
			if ( ul1 )
				{
				DWORD dwSize = strlen( (const char *)ul1 );
				PIIOBuffer_write( pPIHTTP->pBuffer, (const char *)ul1,
					dwSize, PIIOBUF_NONE );
				};
			};
			return TRUE;

		/*
		** Not supported!
		*/
		case SF_REQ_SET_NEXT_READ_SIZE:
			ul1 = 0;
			return TRUE;

		case SF_REQ_SET_PROXY_INFO:
			ul1 = (DWORD)PIDB_lookup( pPIHTTP->pRequestDB, PIDBTYPE_STRING,
				pFKProxyProtocol, PIDBFLAG_FASTKEY );
			return TRUE;

		/*
		** Not supported!
		*/
		case SF_REQ_GET_CONNID:
			*(DWORD *)pData = 0;
			return TRUE;
		default:;
		};
	return FALSE;
}

/*____________________________________________________________________________*\
 *
 Function:
 Synopsis:
 Description:
\*____________________________________________________________________________*/
BOOL WINAPI fnAddResponseHeaders ( PHTTP_FILTER_CONTEXT pfc,
					LPSTR lpszHeaders,
					DWORD dwReserved )
{
	if ( !pfc || !pfc->ServerContext || !lpszHeaders )
		{
		::SetLastError( ERROR_INVALID_PARAMETER );
		return FALSE;
		};

	ISAPIContext *pContext = (ISAPIContext *)pfc->ServerContext;
	PIHTTP *pPIHTTP = pContext->pPIHTTP;

	StringTokenizer tHeaders( (char *)lpszHeaders, "\r\n" );
	for (int i = 0; i < tHeaders.NumTokens(); i++) 
		{
		StringTokenizer tHeaderLine( tHeaders.GetToken(i), ":" );
		if (tHeaderLine.NumTokens() != 2) 
			{
			if (tHeaders.GetToken(i).Len())
				{
				::SetLastError( ERROR_INVALID_PARAMETER );
				return FALSE;
				}

			// the trailing \r\n
			else
				{
				return TRUE;
				}
			};

		PIDB_replace( pPIHTTP->pResponseDB, PIDBTYPE_RFC822,
			(const char *)tHeaderLine.GetToken(0),
			(void *)(const char *)tHeaderLine.GetToken(1), 0 );
		};
	return TRUE;
};


/*____________________________________________________________________________*\
 *
 Function:
 Synopsis:
 Description:
\*____________________________________________________________________________*/
//
//  Retrieves the specified header value.  Header names should include
//  the trailing ':'.  The special values 'method', 'url' and 'version'
//  can be used to retrieve the individual portions of the request line
//
BOOL WINAPI fnGetHeader (	PHTTP_FILTER_CONTEXT pfc,
							LPSTR   lpszName,
							LPVOID  lpvBuffer,
							LPDWORD lpdwSize )
{

# define GET_STR( db, type, key )                                   \
	{																\
	const char *pValue = (const char *)PIDB_lookup(db,type,key,0);  \
	if ( !pValue ) { pValue = ""; };								\
	UINT iToCopy = strlen( pValue );								\
	if (( iToCopy > *lpdwSize ) || !lpvBuffer )						\
		{															\
		::SetLastError( ERROR_INSUFFICIENT_BUFFER );				\
		return FALSE;												\
		};															\
	*lpdwSize = iToCopy;											\
	strncpy( (char *)lpvBuffer, pValue, iToCopy + 1);				\
	return TRUE;													\
	}			

	if ( !pfc || !pfc->ServerContext || !lpszName )
		{
		::SetLastError( ERROR_INVALID_PARAMETER );
		return FALSE;
		};

	ISAPIContext *pContext = (ISAPIContext *)pfc->ServerContext;
	PIHTTP *pPIHTTP = pContext->pPIHTTP;

	int iLen = strrchr( lpszName, ':' ) ? strlen(lpszName) - 1 : strlen(lpszName);
	PIString name(lpszName, iLen);
	name.ConvertToUpperCase();

	if ( !strcmp(name, "METHOD" ))
		{
		GET_STR( pPIHTTP->pRequestDB, PIDBTYPE_STRING, KEY_HTTP_METHOD );
		}
	else if ( !strcmp( name, "URL" ))
		{
		const char *pUri = (const char *)PIDB_lookup( pPIHTTP->pRequestDB,
			PIDBTYPE_STRING, KEY_HTTP_URI, 0 );
	    if ( !pUri ) pUri = "";

		const char *pQuery = (const char *)PIDB_lookup( pPIHTTP->pRequestDB,
			PIDBTYPE_STRING, KEY_HTTP_QUERYSTRING, 0 );
	    if ( !pQuery ) pQuery = "";

		PIString sUrl(pUri);
		if (strlen(pQuery)) {
			sUrl.Concatenate('?');
			sUrl.Concatenate(pQuery);
		}

		if (((UINT)(sUrl.Len()) > *lpdwSize ) || !lpvBuffer )
			{
			::SetLastError( ERROR_INSUFFICIENT_BUFFER );
			return FALSE;
			};
		strncpy((char *)lpvBuffer, sUrl, sUrl.Len());
		*lpdwSize = sUrl.Len();
	    return TRUE;
		}
	else if ( !strcmp(name, "VERSION" ))
		{
		GET_STR( pPIHTTP->pRequestDB, PIDBTYPE_STRING, KEY_HTTP_PROTOCOL );
		}
	else 
		{
		GET_STR( pPIHTTP->pRequestDB, PIDBTYPE_RFC822, name );
		};

	return TRUE;
}

/*____________________________________________________________________________*\
 *
 Function:
 Synopsis:
 Description:
\*____________________________________________________________________________*/
//
//  Replaces this header value to the specified value.  To delete a header,
//  specified a value of '\0'.
//
BOOL WINAPI fnSetHeader (	PHTTP_FILTER_CONTEXT pfc,
							LPSTR  lpszName,
							LPSTR  lpszValue )
{
	if ( !pfc || !pfc->ServerContext || !lpszName )
		{
		::SetLastError( ERROR_INVALID_PARAMETER );
		return FALSE;
		};

	ISAPIContext *pContext = (ISAPIContext *)pfc->ServerContext;
	PIHTTP *pPIHTTP = pContext->pPIHTTP;

	int iLen = strrchr( lpszName, ':' ) ? strrchr( lpszName, ':' ) - lpszName : strlen(lpszName);
	PIString name(lpszName, iLen);
	name.ConvertToUpperCase();

	if ( !strcmp(name, "METHOD" ))
		{
		return !PIDB_replace( pPIHTTP->pRequestDB, PIDBTYPE_STRING, KEY_HTTP_METHOD, lpszValue, 0 );
		}
	else if ( !strcmp( name, "URL" ))
		{
		StringTokenizer tTokens( lpszValue, "?" );
		if (tTokens.NumTokens() > 0 &&
			!PIDB_replace( pPIHTTP->pRequestDB, PIDBTYPE_STRING,
				KEY_HTTP_URI, (void *)(const char *)tTokens.GetToken(0), 0 ))
			{
			if (tTokens.NumTokens() > 1)
				{
				return !PIDB_replace( pPIHTTP->pRequestDB, PIDBTYPE_STRING,
					KEY_HTTP_QUERYSTRING, (void *)(const char *)tTokens.GetToken(1), 0 );
				}
			else
				{
				return !PIDB_replace( pPIHTTP->pRequestDB, PIDBTYPE_STRING,
					KEY_HTTP_QUERYSTRING, "", 0 );
				}
			}
		else
			{
			::SetLastError( ERROR_INVALID_PARAMETER );
			return FALSE;
			}
		}
	else if ( !strcmp(name, "VERSION" ))
		{
		return !PIDB_replace( pPIHTTP->pRequestDB, PIDBTYPE_STRING, KEY_HTTP_PROTOCOL, lpszValue, 0 );
		}
	else 
		{
		return !PIDB_replace( pPIHTTP->pRequestDB, PIDBTYPE_RFC822, name, lpszValue, 0 );
		}
}


/*____________________________________________________________________________*\
 *
 Function:
 Synopsis:
 Description:
	Adds the specified header and value to the response
\*____________________________________________________________________________*/

BOOL WINAPI fnAddHeader (	PHTTP_FILTER_CONTEXT pfc,
							LPSTR  lpszName,
							LPSTR  lpszValue )
{
		if ( !pfc || !pfc->ServerContext || !lpszName )
		{
		::SetLastError( ERROR_INVALID_PARAMETER );
		return FALSE;
		};

	ISAPIContext *pContext = (ISAPIContext *)pfc->ServerContext;
	PIHTTP *pPIHTTP = pContext->pPIHTTP;

	int iLen = strrchr( lpszName, ':' ) ? strlen(lpszName) - 1 : strlen(lpszName);
	PIString name(lpszName, iLen);
	name.ConvertToUpperCase();
	return PIDB_add( pPIHTTP->pResponseDB, PIDBTYPE_RFC822, name, lpszValue, 0 );
}

#endif /* WIN32 */

/*____________________________________________________________________________*\
 *
 Function:
 Synopsis:
 Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int ISAPIFLT_constructor( PIObject *pObj,
	int iArgc, const char *ppArgv[] )
{
#if WIN32
	return HandlerBase_constructor( pObj, PI_NEW( ISAPIFLT( pObj,
		iArgc, ppArgv ) ) );
#elif POSIX
	(void)pObj;
	(void)iArgc;
	(void)ppArgv;
	return PIAPI_COMPLETED;
#endif
}


/*____________________________________________________________________________*\
 *
 Function:
 Synopsis:
 Description:
\*____________________________________________________________________________*/
PUBLIC_PIAPI int ISAPIFLT_destructor( PIObject *pObj, int,
	const char *[] )
{
#if WIN32
	delete (ISAPIFLT *)PIObject_getUserData( pObj );
#endif
	return PIAPI_COMPLETED;
}


#if 0
/*___+++CNF_BEGIN+++___*/
	<Class>
		Name ISAPIFLTClass
		Type LogicExtension
		Library ISAPIFLT
		OnClassLoad HandlerBaseISAPIFLT_onClassLoad
		Constructor ISAPIFLT_constructor
		CopyConstructor HandlerBaseISAPIFLT_copyConstructor
		Destructor ISAPIFLT_destructor
		Execute HandlerBaseISAPIFLT_execute
	</Class>

	<Object>
		Name ISAPIFLT
		Class ISAPIFLTClass
	</Object>

/*___+++CNF_END+++___*/
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -