webRequest.filterResponseData()
Используйте эту функцию для создания объекта webRequest.StreamFilter для запроса. Фильтр потока предоставляет расширению веб-приложения полный контроль над потоком, позволяя отслеживать и изменять ответ. Расширение отвечает за запись и закрытие или отключение потока, так как по умолчанию запрос остается открытым без ответа.
Обычно эту функцию вызывают из обработчика событий webRequest.
Firefox использует оптимизированный кэш байтов для запросов сценариев. Этот оптимизированный кэш байтов переопределяет обычное кэширование запросов. Данные из этого кэша недоступны в форме, полезной для расширений. Если вашему расширению необходимо фильтровать сценарии, создайте свой фильтр в webRequest.onBeforeRequest. Это гарантирует, что фильтр будет создан до попытки загрузки из кэша, тем самым избегая оптимизированного кэша.
Разрешения
Для использования этого API необходимо разрешение "webRequest" и "webRequestBlocking" разрешения API, а для обработчика событий — разрешение на хост host permission для хоста. Кроме того:
- С Firefox 95 для использования этого API для перехвата запросов, связанных с загрузкой сценариев service worker, также требуется разрешение
"webRequestFilterResponse.serviceWorkerScript". - С Firefox 110 расширения Manifest V3 также должны запросить разрешение
"webRequestFilterResponse"для использования этого API.
Синтаксис
let filter = browser.webRequest.filterResponseData( requestId // string )
Параметры
requestId-
string. Идентификатор запроса, который нужно отфильтровать. Его можно получить из объектаdetails, передаваемого в любые обработчики событийwebRequest.
Возвращаемое значение
Объект webRequest.StreamFilter, который можно использовать для отслеживания и изменения ответа.
Примеры
В этом примере показана минимальная реализация, которая пропускает данные потока и закрывает поток фильтра, когда поток закончит получение данных. Код вызывается из обработчика событий webRequest и обработчик событий предоставляет details.
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 и используется для изменения первого фрагмента ответа:
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.replace(/Example/g, '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.
Совместимость с браузерами
| Рабочий стол | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | WebView Android | Chrome Android | Firefox для Android | Opera Android | Safari на IOS | Samsung Internet | |
filterResponseData |
Нет | Нет | 57 | ? | Нет | Нет | ? | ? | 57 | ? | Нет | ? |
© 2005–2023 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/filterResponseData