webRequest.filterResponseData()
使用此函数为请求创建一个 webRequest.StreamFilter
对象。流过滤器为 Web 扩展提供了对流的完全控制,能够监控和修改响应。扩展需要负责写入并关闭或断开流,因为默认行为是保持请求打开而没有响应。
你通常在 webRequest
事件监听器中调用此函数。
Firefox 对脚本请求使用了优化的字节缓存。此优化的字节缓存会覆盖正常的请求缓存。扩展无法以对其有用的形式访问此缓存中的数据。如果你的扩展需要过滤脚本,请在 webRequest.onBeforeRequest
中创建过滤器。这样可以确保在尝试从缓存加载之前创建过滤器,从而避免使用优化缓存。
权限
语法
js
let filter = browser.webRequest.filterResponseData(
requestId // string
)
参数
requestId
-
string
。要过滤的请求的 ID。可以从传递到任何webRequest
事件监听器的details
对象中获取。
返回值
可用于监控和修改响应的 webRequest.StreamFilter
对象。
示例
该示例展示了一个最小实现,它通过流数据并在流完成接收数据时关闭流过滤器。代码将从 webRequest
事件监听器中调用,并且事件监听器提供 details
。
js
let filter = browser.webRequest.filterResponseData(details.requestId);
filter.ondata = (event) => {
console.log(`filter.ondata 接收了 ${event.data.byteLength} 字节`);
filter.write(event.data);
};
filter.onstop = (event) => {
// 扩展在创建 StreamFilter 后应始终调用 filter.close() 或 filter.disconnect(),否则响应将永远保持活动状态。
// 如果响应数据的处理已完成,请使用 close。如果任何剩余的响应数据应由 Firefox 处理,请使用 disconnect。
filter.close();
};
该示例截取自 http-response 扩展示例,在 webRequest.onBeforeRequest
中创建过滤器并使用它来修改响应的第一个块:
js
function listener(details) {
let filter = browser.webRequest.filterResponseData(details.requestId);
let decoder = new TextDecoder("utf-8");
let encoder = new TextEncoder();
filter.ondata = (event) => {
let str = decoder.decode(event.data, { stream: true });
// 仅将 HTTP 响应中的“示例”替换为“WebExtension 示例”。
str = str.replaceAll("示例", "WebExtension 示例");
filter.write(encoder.encode(str));
filter.disconnect();
};
return {};
}
browser.webRequest.onBeforeRequest.addListener(
listener,
{ urls: ["https://example.com/*"], types: ["main_frame"] },
["blocking"],
);
示例扩展
备注:
上述示例仅适用于未分块或流式传输的小型请求。更高级的示例记录在 webRequest.StreamFilter.ondata
中。