webRequest.filterResponseData()

使用此函式可建立一個 webRequest.StreamFilter 物件來處理請求。流過濾器將使 Web 擴充套件完全控制流,能夠監視和修改響應。擴充套件有責任寫入並關閉或斷開流的連線,因為預設行為是保持請求開啟而不響應。

通常,您會從 webRequest 事件偵聽器呼叫此函式。

Firefox 對指令碼請求使用最佳化的位元組快取。此最佳化位元組快取會覆蓋正常的請求快取。來自此快取的資料並非擴充套件可用的格式。如果您的擴充套件需要過濾指令碼,請在 webRequest.onBeforeRequest 中建立您的過濾器。這樣做可以確保在嘗試從快取載入之前建立過濾器,從而避免使用最佳化快取。

Permissions

要使用此 API,您必須擁有 "webRequest""webRequestBlocking" API 許可權,並且對於事件偵聽器,需要針對主機擁有 主機許可權。此外

  • 從 Firefox 95 開始,要使用此 API 攔截與載入 Service Worker 指令碼相關的請求,還需要 "webRequestFilterResponse.serviceWorkerScript" 許可權。
  • 從 Firefox 110 開始,Manifest V3 擴充套件還必須請求 "webRequestFilterResponse" 許可權才能使用此 API。

語法

js
let filter = browser.webRequest.filterResponseData(
  requestId       // string
)

引數

requestId

string。要過濾的請求的 ID。您可以從傳遞到任何 webRequest 事件偵聽器的 details 物件中獲取此 ID。

返回值

一個 webRequest.StreamFilter 物件,您可以使用它來監視和修改響應。

示例

此示例顯示了一個最小實現,它會傳遞流資料,並在流完成接收資料時關閉過濾器流。該程式碼將從 webRequest 事件偵聽器呼叫,並且事件偵聽器會提供 details

js
let filter = browser.webRequest.filterResponseData(details.requestId);
filter.ondata = (event) => {
  console.log(`filter.ondata received ${event.data.byteLength} bytes`);
  filter.write(event.data);
};
filter.onstop = (event) => {
  // The extension should always call filter.close() or filter.disconnect()
  // after creating the StreamFilter, otherwise the response is kept alive forever.
  // If processing of the response data is finished, use close. If any remaining
  // response data should be processed by Firefox, use 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 });
    // Just change any instance of Example in the HTTP response
    // to WebExtension Example.
    str = str.replaceAll("Example", "WebExtension Example");
    filter.write(encoder.encode(str));
    filter.disconnect();
  };

  return {};
}

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

擴充套件程式示例

注意: 上面的示例僅適用於未分塊或流式傳輸的小型請求。更高階的示例記錄在 webRequest.StreamFilter.ondata 中。

瀏覽器相容性