注意:
1. 需要在GetFilterVersion中手工添加你所感兴趣的事件,事件发生时IIS才会通知filter,然后你才能在相关的事件处理函数中进行操作
pVer->dwFlags |= SF_NOTIFY_SECURE_PORT | SF_NOTIFY_NONSECURE_PORT | SF_NOTIFY_PREPROC_HEADERS;
2. GetHeader和SetHeader时注意部分头是需要冒号
char *pHeader = new char[BUF_SIZE + 1];
std::auto_ptr<char> pcHeader(pHeader);
DWORD dwBufSize = BUF_SIZE;
pcHeader[0]=0;
pHeaders->GetHeader(pfc->m_pFC, “User-Agent:”, pcHeader, &dwBufSize);
pHeaders->SetHeader(pfc->m_pFC, "Accept-Encoding:", "gzip");
头“URL”是没有冒号的
3.设置COOKIE
pFC->AddResponseHeaders(pFC, "Set-Cookie: Cookie1=Value1; path=/;/r/n",0);
(持久COOKIE):
pFC->AddResponseHeaders(pFC,"Set-Cookie: Cookie1=Value1;
expires=Fri 22-May-1998 13:00:00 GMT; path=/;/r/n", 0);
4.获取URL
std::auto_ptr<char> pcHeaderWrap(pcHeader);
pHeaders->GetHeader(pfc->m_pFC, "URL", pcHeader, &dwBufSize);
CString url = pcHeader;
url.Trim().MakeLower();
if (url.Find(m_restartUrl) == 0)
{
直接返回:
DWORD CfilterEntryManager::FilterHeader(CHttpFilterContext * pfc, PHTTP_FILTER_PREPROC_HEADERS pHeaders)
{
.....
.....
static char* s_szStatus = "HTTP/1.1 200 OK";
static char* s_szContent = "Content-Type: text/html";
static char* s_szContentSplit = " ";
DWORD dwInfoSize = strlen(s_szStatus);
pfc->ServerSupportFunction(SF_REQ_SEND_RESPONSE_HEADER, s_szStatus, &dwInfoSize, NULL);
dwInfoSize = strlen(s_szContent);
pfc->ServerSupportFunction(SF_REQ_SEND_RESPONSE_HEADER, s_szContent, &dwInfoSize, NULL);
dwInfoSize = strlen(s_szContentSplit);
pfc->WriteClient(s_szContentSplit, &dwInfoSize);
dwInfoSize = logInfo.length();
pfc->WriteClient(const_cast<char*>(logInfo.c_str()), &dwInfoSize);
return SF_STATUS_REQ_FINISHED;
}
//增加后续操作:
{
// TODO: Add your specialized code here and/or call the base class
DWORD res = CfilterEntryManager::Instance().FilterHeader(pfc, pHeaders);
if (res != SF_STATUS_REQ_NEXT_NOTIFICATION)
{
return res;
}
//如果状态没有改变,继续流入下一个fiter
return CHttpFilter::OnPreprocHeaders(pfc, pHeaders);
}
遗留问题:
log4cpp在Fiter中无法正常工作!相同的代码编译成LIB,放到测试类中可以工作,但是放到FILTER中,在初始化appender时,总是在获取lock直接退出当前堆栈,连异常都没有
void Appender::_addAppender(Appender* appender) {
threading::ScopedLock lock(_appenderMapMutex);// 进入临界区失败EnterCriticalSection(_criticalSection);
_getAllAppenders()[appender->getName()] = appender;
}
------------------------------------------------
根据断点跟踪发现,Appender的静态变量_appenderMapMutex在被使用时其构造函数竟然没有调用??
(给其增加成员,并在构造函数中初始化成员,结果那些测试的成员并没有初始化);后来增加了自定义的静态成员也没有初始化?
同时,在filter模块中的一切静态成员工作正常。SO 迷了!!!!
相关代码如下,一切正常:
定义 static threading::Mutex _appenderMapMutex; //Appender.hh
初始化和使用//Appender.cpp
namespace log4cpp {
threading::Mutex Appender::_appenderMapMutex; //初始化
void Appender::_addAppender(Appender* appender) {
threading::ScopedLock lock(_appenderMapMutex);
_getAllAppenders()[appender->getName()] = appender;
}