代码之家  ›  专栏  ›  技术社区  ›  Cheeso

如何删除ISAPI筛选器中的头?

  •  3
  • Cheeso  · 技术社区  · 16 年前

    isapi过滤器文档说我可以调用 SF_REQ_SEND_RESPONSE_HEADER 发送响应头,并附加其他头。

    ISAPI也有 AddResponseHeaders 允许添加筛选器 额外的 要在对客户端的响应中发送的头。

    在伊莎皮有没有办法 去除 否则会发送到客户端的头文件?或者通过某种方式要求isapi运行时从响应中排除某些头文件? isapi运行时似乎总是包含一个server:header,我想找到一种删除它的方法。

    我知道我可以在IIS管理器中以管理方式设置或取消设置头,但这并不是我想要的。我想在运行时在过滤器中以编程方式和条件进行。

    编辑:颠簸。

    2 回复  |  直到 12 年前
        1
  •  2
  •   Mark    15 年前

    我已经写了几个ISAPI,包括一个具有您描述的功能的ISAPI。我使用了sf_notify_send_raw_data-我相信第一个调用将是头,因此您可以使用:

    filterContext->服务器支持函数(filterContext,sf_req_disable_notifications,0,sf_notify_send_raw_data,0);

    为将来的原始数据禁用通知。然后,在http_filter_raw_数据结构中,您得到了pvindata,它是当前的头,我读取它,然后将其写入到一个新的http_filter_raw_数据(请记住,对结构和pvindata都使用filtercontext->allocem)。完成后,将新的头写出filterContext->writeclient并返回sf_status_req_read_next。

    另外,在初始化时,确保设置sf_notify_order_high和sf_notify_send_raw_data。

    通过查看我的旧代码,这就是我所做的,并且它专门删除了一个头(加上它还添加了一个头),所以它肯定会执行您需要执行的操作。我要说的唯一警告是,我记得一些与从iis5(当我写这篇文章时)到iis6+的原始数据相关的变化,但我从来没有必要更新这个特定的isapi,所以我不知道是不是有机会影响它是如何完成的。希望这能帮到你,尽管你可能至少有一个风滚草的问题!:)

        2
  •  1
  •   Uwe Keim    12 年前

    我用这段代码重写了头文件(firefor not rendring 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;
    }