webRequest.onHeadersReceived
Вызывается при получении HTTP-заголовков ответа запроса. Используйте это событие для изменения HTTP-заголовков ответа.
Чтобы заголовки ответа передавались в обработчик вместе с остальными данными запроса, передайте "responseHeaders" в массив extraInfoSpec.
Если вы используете "blocking", вам необходимо разрешение "webRequestBlocking" API в вашем файле manifest.json.
Расширения могут делать конфликтные запросы. Если два расширения прослушивают onHeadersReceived для одного и того же запроса и возвращают responseHeaders для установки одного и того же заголовка (например, Set-Cookie), не присутствующего в исходном ответе, только одно из изменений будет выполнено.
Однако, заголовок Content-Security-Policy обрабатывается по-другому; его значения комбинируются, чтобы применить все указанные политики. Но, если два расширения устанавливают значение CSP, которое конфликтует, служба CSP делает ограничение более строгим, чтобы разрешить конфликт. Например, если одно расширение устанавливает img-src: example.com, а другое — img-src: example.org, результатом будет img-src: 'none'. Объединённые изменения всегда стремятся к более строгому ограничению, хотя расширение может удалить исходный заголовок CSP.
Если вы хотите увидеть заголовки, которые обрабатываются системой, не рискуя тем, что другое расширение их изменит, используйте webRequest.onResponseStarted, хотя вы не можете изменять заголовки на этом событии.
Синтаксис
browser.webRequest.onHeadersReceived.addListener( listener, // function filter, // object extraInfoSpec // optional array of strings ) browser.webRequest.onHeadersReceived.removeListener(listener) browser.webRequest.onHeadersReceived.hasListener(listener)
События имеют три функции:
addListener(callback, filter, extraInfoSpec)-
Добавляет обработчик к этому событию.
removeListener(listener)-
Прекращает прослушивание этого события. Аргумент
listener— это обработчик для удаления. hasListener(listener)-
Проверяет, зарегистрирован ли
listenerдля этого события. Возвращаетtrue, если он прослушивает, иfalse, в противном случае.
Синтаксис addListener
Параметры
callback-
Функция, вызываемая при возникновении этого события. Функции передаются следующие аргументы:
details-
object. Сведения о запросе. Это включает заголовки ответа, если вы включили"responseHeaders"вextraInfoSpec.
Возвращает:
webRequest.BlockingResponse. Если"blocking"указано в параметреextraInfoSpec, обработчик события вернёт объектBlockingResponse, и сможет установить его свойствоresponseHeaders. В Firefox, возвращаемое значение может бытьPromise, который разрешается в объектBlockingResponse. filter-
webRequest.RequestFilter. Набор фильтров, которые ограничивают события, отправляемые этому обработчику. -
extraInfoSpecНеобязательно -
arraystring. Дополнительные параметры для события. Вы можете передать следующие значения:-
"blocking"для синхронного выполнения запроса, чтобы вы могли изменять заголовки запроса и ответа -
"responseHeaders"для включения заголовков ответа в объектdetails, переданный обработчику
-
Дополнительные объекты
Детали
-
string. Если запрос поступает из вкладки, открытой в контекстном идентитете, идентификатор хранилища cookie контекстного идентитета. documentUrl-
string. URL документа, в котором будет загружен ресурс. Например, если веб-страница по адресу "https://example.com" содержит изображение или iframe, тоdocumentUrlдля изображения или iframe будет "https://example.com". Для документа верхнего уровняdocumentUrlне определено. frameAncestors-
array. Информация для каждого документа в иерархии фреймов до документа верхнего уровня. Первый элемент массива содержит информацию об непосредственном родителе запрашиваемого документа, а последний — об документе верхнего уровня. Если загрузка выполняется для документа верхнего уровня, этот массив пуст.url-
string. URL, с которого загружен документ. frameId-
integer.frameIdдокумента.details.frameAncestors[0].frameIdсовпадает сdetails.parentFrameId.
frameId-
integer. Ноль, если запрос выполняется в главном фрейме; положительное значение — ID подфрейма, в котором происходит запрос. Если документ (под)фрейма загружается (typeравенmain_frameилиsub_frame),frameIdуказывает ID этого фрейма, а не внешнего фрейма. Идентификаторы фреймов уникальны в рамках вкладки. fromCache-
boolean. Является ли ответ полученным из кэша на диске. incognito-
boolean. Поступает ли запрос из окна приватного просмотра. ip-
string. IP-адрес сервера, к которому был отправлен запрос. Может быть литеральным IPv6-адресом. method-
string. Стандартный HTTP-метод: например, "GET" или "POST". originUrl-
string. URL ресурса, который спровоцировал запрос. Например, если "https://example.com" содержит ссылку, и пользователь нажимает на неё, тоoriginUrlдля получившегося запроса — "https://example.com".originUrlчасто, но не всегда, совпадает сdocumentUrl. Например, если страница содержит iframe, а iframe содержит ссылку, которая загружает новый документ в iframe, тоdocumentUrlдля получившегося запроса — родительский документ iframe, ноoriginUrl— URL документа в iframe, содержащего ссылку. parentFrameId-
integer. ID фрейма, содержащего фрейм, который отправил запрос. Установлено в -1, если родительского фрейма нет. proxyInfo-
object. Это свойство присутствует только если запрос проходит через прокси. Оно содержит следующие свойства:host-
string. Имя хоста сервера прокси. port-
integer. Номер порта сервера прокси. type-
string. Тип сервера прокси. Один из:- "http": HTTP прокси (или SSL CONNECT для HTTPS)
- "https": HTTP проксирование через TLS-соединение с прокси
- "socks": SOCKS v5 прокси
- "socks4": SOCKS v4 прокси
- "direct": без прокси
- "unknown": неизвестный прокси
username-
string. Имя пользователя для сервиса прокси. proxyDNS-
boolean. Истина, если прокси выполнит разрешение доменного имени на основе предоставленного имени хоста, что означает, что клиент не должен выполнять собственный поиск DNS. failoverTimeout-
integer. Таймаут переключения на резервный сервер в секундах. Если соединение с прокси прерывается, прокси не будет использоваться в течение этого периода.
requestId-
string. Идентификатор запроса. Идентификаторы запросов уникальны в рамках сессии браузера, поэтому их можно использовать для связи различных событий, связанных с одним и тем же запросом. -
responseHeadersНеобязательно -
webRequest.HttpHeaders. HTTP-заголовки ответа, полученные для этого запроса. statusCode-
integer. Стандартный HTTP-код состояния, возвращённый сервером. statusLine-
string. HTTP-строка состояния ответа или строка 'HTTP/0.9 200 OK' для ответов HTTP/0.9 (то есть для ответов, не имеющих строки состояния). tabId-
integer. Идентификатор вкладки, в которой происходит запрос. Установлено в -1, если запрос не связан с вкладкой. thirdParty-
boolean. Указывает, является ли запрос и его иерархия окон сторонней стороной. timeStamp-
number. Время срабатывания этого события в миллисекундах с момента эпохи. type-
webRequest.ResourceType. Тип запрашиваемого ресурса: например, "image", "script", "stylesheet". url-
string. Цель запроса. urlClassification-
object. Тип отслеживания, связанного с запросом, если он был классифицирован Firefox Tracking Protection. Это объект со следующими свойствами:firstParty-
arraystrings. Флаги классификации запроса для первой стороны. thirdParty-
arraystrings. Флаги классификации запроса или иерархии окон сторонних сторон.
Флаги классификации включают:
-
fingerprintingиfingerprinting_content: указывает, что запрос участвует в определении характеристик.fingerprinting_contentуказывает, что запрос загружается из источника, который был обнаружен в определении характеристик, но не считается участвующим в отслеживании, например, поставщик платежных услуг. -
cryptominingиcryptomining_content: аналогично категории определения характеристик, но для ресурсов криптомайнинга. -
tracking,tracking_ad,tracking_analytics,tracking_social, иtracking_content: указывает, что запрос участвует в отслеживании.tracking— любой универсальный запрос отслеживания, суффиксыad,analytics,social, иcontentидентифицируют тип трекера. -
any_basic_tracking: мета-флаг, который объединяет любые флаги отслеживания и определения характеристик, за исключениемtracking_contentиfingerprinting_content. -
any_strict_tracking: мета-флаг, который объединяет любые флаги отслеживания и определения характеристик, включаяtracking_contentиfingerprinting_content. -
any_social_tracking: мета-флаг, который объединяет любые флаги социального отслеживания.
Совместимость с браузерами
| Рабочий стол | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | WebView Android | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | |
onHeadersReceived |
ДаАсинхронные обработчики событий не поддерживаются. |
14Асинхронные обработчики событий не поддерживаются. |
45["Изменение заголовка 'Content-Type' поддерживается начиная с версии 51.", "Асинхронные обработчики событий поддерживаются начиная с версии 52."] |
? | ДаАсинхронные обработчики событий не поддерживаются. |
14extraInfoSpec опции не поддерживаются. |
? | ? | 48["Изменение заголовка 'Content-Type' поддерживается начиная с версии 51.", "Асинхронные обработчики событий поддерживаются начиная с версии 52."] |
? | Нет | ? |
Примеры
Этот код устанавливает дополнительный cookie при запросе ресурса с целевого URL:
let targetPage = "https://developer.mozilla.org/en-US/Firefox/Developer_Edition"; // Add the new header to the original array, // and return it. function setCookie(e) { const setMyCookie = { name: "Set-Cookie", value: "my-cookie1=my-cookie-value1" }; e.responseHeaders.push(setMyCookie); return { responseHeaders: e.responseHeaders }; } // Listen for onHeaderReceived for the target page. // Set "blocking" and "responseHeaders". browser.webRequest.onHeadersReceived.addListener( setCookie, { urls: [targetPage] }, ["blocking", "responseHeaders"] );
Этот код делает то же самое, что и предыдущий пример, за исключением того, что обработчик асинхронный, возвращая Promise, который разрешается новыми заголовками:
const targetPage = "https://developer.mozilla.org/en-US/Firefox/Developer_Edition"; // Return a Promise that sets a timer. // When the timer fires, resolve the promise with // modified set of response headers. function setCookieAsync(e) { const asyncSetCookie = new Promise((resolve, reject) => { setTimeout(() => { const setMyCookie = { name: "Set-Cookie", value: "my-cookie1=my-cookie-value1" }; e.responseHeaders.push(setMyCookie); resolve({ responseHeaders: e.responseHeaders }); }, 2000); }); return asyncSetCookie; } // Listen for onHeaderReceived for the target page. // Set "blocking" and "responseHeaders". browser.webRequest.onHeadersReceived.addListener( setCookieAsync, { urls: [targetPage] }, ["blocking", "responseHeaders"] );
Примечание: Этот API основан на API chrome.webRequest Chromium. Данная документация взята из web_request.json кода Chromium.
© 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/onHeadersReceived