【问题标题】:How to remove Headers in an ISAPI filter?如何删除 ISAPI 过滤器中的标头?
【发布时间】:2010-11-11 13:09:54
【问题描述】:

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

ISAPI 还具有AddResponseHeaders 以允许过滤器添加附加 标头以在响应中发送给客户端。

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

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

编辑:BUMP。

【问题讨论】:

    标签: c windows isapi


    【解决方案1】:

    我已经编写了几个 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。

    通过查看我的旧代码,这就是我所做的,它是专门删除一个标题(加上它还添加了一个),所以它肯定会执行你需要做的事情。我要说的唯一警告是,我记得与 RAW_DATA 相关的一些变化,从 IIS5(当我写这篇文章时)到 IIS6+,但我从来不需要更新这个特定的 ISAPI,所以我不知道是否有机会影响它是如何完成的或不是。希望这对您有所帮助,尽管您可能至少有一个风滚草来回答您的问题! :)

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2018-01-18
        • 2012-10-08
        • 2017-08-07
        • 1970-01-01
        • 2013-07-13
        • 1970-01-01
        • 2022-11-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多