📄 isapiflt.cpp
字号:
((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 + -