如何在ISAPI过滤器中删除标头?

时间:2009-07-16 21:45:55

标签: c windows isapi

ISAPI过滤器文档说我可以调用SF_REQ_SEND_RESPONSE_HEADER来发送响应头,还附加额外的头。

ISAPI还有AddResponseHeaders,允许过滤器添加其他标头,以便在客户端的响应中发送。

在ISAPI中,有没有办法删除标题,否则这些标题会被发送到客户端?或者某种方式要求ISAPI运行时从响应中排除某些标头? ISAPI运行时似乎总是包含Server:标头,我想找到一种方法来删除它。

我知道我可以在IIS管理器中以管理方式设置或取消设置标头,但这不是我想要的。我希望在运行时在过滤器中,以编程方式和有条件方式执行此操作。

编辑:BUMP。

2 个答案:

答案 0 :(得分:2)

我写了几个ISAPI,包括一个具有你描述的功能的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变化到IIS6 +,但我从来不需要更新这个特定的ISAPI,所以我不知道是否有机会影响它是如何完成的或不。希望这可以帮助你,虽然你可能至少得到一个风滚草的问题! :)

答案 1 :(得分:1)

我使用此代码重写标题(Firefox不呈现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;
}