Spec-Zone.ru › Web Extensions

webRequest.onBeforeSendHeaders

Это событие срабатывает перед отправкой любых данных HTTP, но после того, как все заголовки HTTP доступны. Это хорошее место для прослушивания, если вы хотите изменить заголовки HTTP-запроса.

Чтобы передать заголовки запроса в обработчик вместе с остальными данными запроса, передайте "requestHeaders" в массив extraInfoSpec.

Чтобы изменить заголовки синхронно: передайте "blocking" в extraInfoSpec, затем в вашем обработчике событий верните BlockingResponse со свойством, названным requestHeaders, значение которого — набор заголовков запроса для отправки.

Чтобы изменить заголовки асинхронно: передайте "blocking" в extraInfoSpec, затем в вашем обработчике событий верните Promise, который разрешается с помощью BlockingResponse.

Если вы используете "blocking", вам необходим разрешение API «webRequestBlocking» в вашем файле manifest.json.

Расширения могут конфликтовать в этом месте. Если два расширения прослушивают onBeforeSendHeaders для одного и того же запроса, то второе расширение увидит изменения, внесённые первым, и сможет отменить любые изменения, внесённые первым. Например, если первое расширение добавит заголовок Cookie, а второе расширение удалит все заголовки Cookie, то изменения первого расширения будут утеряны. Если вы хотите увидеть заголовки, которые фактически отправляются, не рискуя тем, что другое расширение их затем изменит, используйте onSendHeaders, хотя вы не можете изменять заголовки в этом событии.

Не все заголовки, фактически отправленные, всегда включаются в requestHeaders. В частности, заголовки, связанные с кэшированием (например, Cache-Control, If-Modified-Since, If-None-Match) никогда не отправляются. Кроме того, поведение здесь может отличаться в разных браузерах.

Согласно спецификации, имена заголовков нечувствительны к регистру. Это означает, что для сопоставления конкретного заголовка обработчик должен привести имя к нижнему регистру перед сравнением:

for (const header of e.requestHeaders) {
  if (header.name.toLowerCase() === desiredHeader) {
    // process header
  }
}

Браузер сохраняет исходный регистр имени заголовка, как сгенерированный браузером. Если обработчик расширения изменяет регистр, это изменение не будет сохранено.

Синтаксис

browser.webRequest.onBeforeSendHeaders.addListener(
  listener,             //  function
  filter,               //  object
  extraInfoSpec         //  optional array of strings
)
browser.webRequest.onBeforeSendHeaders.removeListener(listener)
browser.webRequest.onBeforeSendHeaders.hasListener(listener)

События имеют три функции:

addListener(callback, filter, extraInfoSpec)

Добавляет обработчик к этому событию.

removeListener(listener)

Прекратить прослушивание этого события. Аргумент listener — это обработчик для удаления.

hasListener(listener)

Проверить, зарегистрирован ли listener для этого события. Возвращает true , если он прослушивает, false в противном случае.

Синтаксис addListener

Параметры

callback

Функция, которая будет вызвана при возникновении этого события. Функция получит следующие аргументы:

details

object. Детали запроса. Это будет включать заголовки запроса, если вы включили "requestHeaders" в extraInfoSpec. Дополнительную информацию см. в разделе details.

Возвращает: webRequest.BlockingResponse. Если "blocking" указан в параметре extraInfoSpec, обработчик события должен вернуть объект BlockingResponse, и может установить свойство requestHeaders.

filter

webRequest.RequestFilter. Набор фильтров, ограничивающих события, которые будут отправлены этому обработчику.

extraInfoSpec Необязательно

array string. Дополнительные параметры для события. Вы можете передать любое из следующих значений:

  • "blocking": сделать запрос синхронным, чтобы вы могли изменить заголовки запроса
  • "requestHeaders": включить заголовки запроса в объект details , переданный обработчику

Дополнительные объекты

детали

cookieStoreId

string. Если запрос поступает из вкладки, открытой в контекстной идентичности, идентификатор хранилища cookie контекстной идентичности.

documentUrl

string. URL документа, в котором будет загружен ресурс. Например, если веб-страница по адресу "https://example.com" содержит изображение или iframe, то documentUrl для изображения или iframe будет "https://example.com". Для документа верхнего уровня documentUrl не определено.

frameId

integer. Ноль, если запрос происходит в главном фрейме; положительное значение — ID подфрейма, в котором происходит запрос. Если документ (под)фрейма загружается (type равен main_frame или sub_frame), frameId указывает ID этого фрейма, а не ID внешнего фрейма. Идентификаторы фреймов уникальны в пределах вкладки.

incognito

boolean. Признак того, что запрос поступает из окна приватного просмотра.

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. Время ожидания переключения на резервный сервер в секундах. Если подключение к прокси прервано, прокси не будет использоваться в течение этого периода.

requestHeaders Необязательно

webRequest.HttpHeaders. HTTP-заголовки запроса, которые будут отправлены с этим запросом.

requestId

string. Идентификатор запроса. Идентификаторы запросов уникальны в пределах сессии браузера, поэтому вы можете использовать их для связи различных событий, связанных с одним запросом.

tabId

integer. Идентификатор вкладки, в которой происходит запрос. Устанавливается в -1, если запрос не связан с вкладкой.

thirdParty

boolean. Указывает, является ли запрос и его иерархия окна сторонними.

timeStamp

number. Время, когда это событие сработало, в миллисекундах с начала эпохи Unix.

type

webRequest.ResourceType. Тип запрашиваемого ресурса: например, "image", "script", "stylesheet".

url

string. Цель запроса.

urlClassification

object. Тип отслеживания, связанный с запросом, если запрос был классифицирован Защитой от отслеживания Firefox. Это объект со следующими свойствами:

firstParty

array strings. Флаги классификации для первого запроса.

thirdParty

array strings. Флаги классификации для сторонних запросов или иерархии окна.

Флаги классификации включают:

  • 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
onBeforeSendHeaders
ДаАсинхронные обработчики событий не поддерживаются.
14Асинхронные обработчики событий не поддерживаются.
45Асинхронные обработчики событий поддерживаются начиная с версии 52.
?
ДаАсинхронные обработчики событий не поддерживаются.
14extraInfoSpec параметры не поддерживаются.
? ?
48Асинхронные обработчики событий поддерживаются начиная с версии 52.
? Нет ?

Примеры

Этот код изменяет заголовок "User-Agent", чтобы браузер определял себя как Opera 12.16, но только при посещении страниц по https://httpbin.org/.

"use strict";

/*
This is the page for which we want to rewrite the User-Agent header.
*/
const targetPage = "https://httpbin.org/*";

/*
Set UA string to Opera 12
*/
const ua = "Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16";

/*
Rewrite the User-Agent header to "ua".
*/
function rewriteUserAgentHeader(e) {
  for (const header of e.requestHeaders) {
    if (header.name.toLowerCase() === "user-agent") {
      header.value = ua;
    }
  }
  return { requestHeaders: e.requestHeaders };
}

/*
Add rewriteUserAgentHeader as a listener to onBeforeSendHeaders,
only for the target page.

Make it "blocking" so we can modify the headers.
*/
browser.webRequest.onBeforeSendHeaders.addListener(
  rewriteUserAgentHeader,
  { urls: [targetPage] },
  ["blocking", "requestHeaders"]
);

Этот код идентичен предыдущему примеру, за исключением того, что обработчик событий асинхронный, возвращая Promise, который разрешается новыми заголовками:

"use strict";

/*
This is the page for which we want to rewrite the User-Agent header.
*/
const targetPage = "https://httpbin.org/*";

/*
Set UA string to Opera 12
*/
const ua = "Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16";

/*
Rewrite the User-Agent header to "ua".
*/
function rewriteUserAgentHeaderAsync(e) {
  const asyncRewrite = new Promise((resolve, reject) => {
    setTimeout(() => {
      for (const header of e.requestHeaders) {
        if (header.name.toLowerCase() === "user-agent") {
          header.value = ua;
        }
      }
      resolve({ requestHeaders: e.requestHeaders });
    }, 2000);
  });

  return asyncRewrite;
}

/*
Add rewriteUserAgentHeader as a listener to onBeforeSendHeaders,
only for the target page.

Make it "blocking" so we can modify the headers.
*/
browser.webRequest.onBeforeSendHeaders.addListener(
  rewriteUserAgentHeaderAsync,
  { urls: [targetPage] },
  ["blocking", "requestHeaders"]
);

Примеры расширений

  • user-agent-rewriter

Примечание: Этот 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/onBeforeSendHeaders

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API