ISAPI筛选器文档说我可以调用SF_REQ_SEND_RESPONSE_HEADER发送响应标头,还附加其他标头。
ISAPI也有AddResponseHeaders,以允许filter添加额外的头文件在客户端的响应中发送。
在ISAPI中,有没有办法删除否则会被发送到客户端的头文件? 或者有些方法要求ISAPI运行时从响应中排除某些标题? ISAPI运行时似乎总是包含一个Server:头,我想find一种方法来删除。
我知道我可以在IISpipe理器中以pipe理方式设置或取消设置标题,但这不是我想要的。 我想在运行时在filter中,以编程的方式,并有条件地做到这一点。
编辑:BUMP。
我写了几个ISAPI,其中一个具有你所描述的功能。 我使用SF_NOTIFY_SEND_RAW_DATA – 我相信第一个电话将是头,所以你可以使用:
FilterContext-> serverSupportFunction(FilterContext,SF_REQ_DISABLE_NOTIFICATIONS,0,SF_NOTIFY_SEND_RAW_DATA,0);
禁用未来原始数据的通知。 然后在HTTP_FILTER_RAW_DATA结构中获得当前头文件pvInData,然后将其写入到我分配的新的HTTP_FILTER_RAW_DATA中(记得对结构和pvInData使用FilterContext-> AllocMem)。 完成后,将新的头文件写出FilterContext-> WriteClient并返回SF_STATUS_REQ_READ_NEXT。
此外,在初始化时确保设置SF_NOTIFY_ORDER_HIGH和SF_NOTIFY_SEND_RAW_DATA。
通过查看我的旧代码,这就是我所做的,它是专门删除标题(加上它也添加了一个),所以它肯定会执行你需要做的。 唯一需要注意的是,我记得IIS5(当我写这篇文章的时候)把RAW_DATA和IIS_DATA相关的东西改成了IIS6 +,但是我从来不需要更新这个特定的ISAPI,所以我不知道是否有机会影响它的完成。不。 希望这可以帮助你,尽管你可能至少有你的问题风滚草! 🙂
我使用这段代码来重写头(Firefor不能解开HTML b / c没有内容类型头)
DWORD CMyAuthFilterImpl::OnSendRawData(PHTTP_FILTER_CONTEXT pfc, DWORD NotoficationType, LPVOID pvNotification) { SF_STATUS_TYPE retStatus = SF_STATUS_REQ_NEXT_NOTIFICATION; if(m_bWriteHeader) { //rewriting response headers with correct information pfc->serverSupportFunction(pfc, SF_REQ_DISABLE_NOTIFICATIONS, 0, SF_NOTIFY_SEND_RAW_DATA, 0); PHTTP_FILTER_RAW_DATA pSD = (PHTTP_FILTER_RAW_DATA)pvNotification; DWORD dL = (DWORD)m_pszHeaders.length(); pSD->pvInData = pfc->AllocMem(pfc, dL, 0); memcpy(pSD->pvInData, (void*)m_pszHeaders.data(), dL); pSD->cbInData = dL; m_bWriteHeader=FALSE; m_dwordHeaderLength=0; m_pszHeaders.~basic_string(); retStatus = SF_STATUS_REQ_NEXT_NOTIFICATION; } return retStatus; }