webRequest.StreamFilter

StreamFilter 是一个用于监视和修改 HTTP 响应的对象。

要创建 StreamFilter,请调用 webRequest.filterResponseData(),并传入要过滤的 Web 请求的 ID。

您可以将流过滤器视为网络堆栈和浏览器渲染引擎之间的桥梁。过滤器在从网络接收 HTTP 响应数据时会传递这些数据。它可以在将数据传递到渲染引擎(在该引擎中数据会被解析和渲染)之前检查和修改数据。过滤器可以完全控制响应主体,并且在没有监听器或写入调用的情况下,默认行为是拥有一个没有内容且永远不会关闭的流。

过滤器会生成四个不同的事件

  • onstart,当过滤器即将开始接收响应数据时。
  • ondata,当过滤器接收到一些响应数据并且可以检查或修改这些数据时。
  • onstop,当过滤器完成接收响应数据时。
  • onerror,如果在初始化和操作过滤器时发生错误。

您可以通过为其属性分配监听器函数来监听每个事件

js
filter.onstart = (event) => {
  console.log("started");
};

请注意,在任何事件监听器的执行期间,请求都会被阻塞。

过滤器提供了一个 write() 函数。从 onstart 事件开始的任何时间,您都可以使用此函数将数据写入输出流。

如果您为过滤器的任何事件分配了监听器,则传递到渲染引擎的所有响应数据都将通过您对 write() 的调用来提供。因此,如果您添加了一个监听器并且没有调用 write(),则渲染的页面将为空白。

完成与响应的交互后,请调用以下任一操作

  • disconnect():这会断开过滤器与请求的连接,以便正常处理其余响应。
  • close():这会关闭请求,因此不会处理其他响应数据。

过滤器还提供函数来 suspend()resume() 请求。

方法

webRequest.StreamFilter.close()

关闭请求。

webRequest.StreamFilter.disconnect()

断开过滤器与请求的连接。

webRequest.StreamFilter.resume()

恢复请求的处理。

webRequest.StreamFilter.suspend()

暂停请求的处理。

webRequest.StreamFilter.write()

将一些数据写入输出流。

属性

webRequest.StreamFilter.ondata

当有传入数据可用时调用的事件处理程序。

webRequest.StreamFilter.onerror

发生错误时调用的事件处理程序。

webRequest.StreamFilter.onstart

流即将开始接收数据时调用的事件处理程序。

webRequest.StreamFilter.onstop

流没有更多数据要传递并已关闭时调用的事件处理程序。

webRequest.StreamFilter.error

webRequest.StreamFilter.onerror 被调用时,这将描述错误。

webRequest.StreamFilter.status

描述流的当前状态。

浏览器兼容性

BCD 表格仅在启用了 JavaScript 的浏览器中加载。

示例

此代码侦听 onstartondataonstop。它记录这些事件,以及响应数据本身作为 ArrayBuffer

js
function listener(details) {
  let filter = browser.webRequest.filterResponseData(details.requestId);

  filter.onstart = (event) => {
    console.log("started");
  };

  filter.ondata = (event) => {
    console.log(event.data);
    filter.write(event.data);
  };

  filter.onstop = (event) => {
    console.log("finished");
    filter.disconnect();
  };

  //return {}; // not needed
}

browser.webRequest.onBeforeRequest.addListener(
  listener,
  { urls: ["https://example.org/"], types: ["main_frame"] },
  ["blocking"],
);