webRequest.onBeforeRequest
Это событие срабатывает, когда происходит запрос, и перед тем, как станут доступны заголовки. Это хорошее место для прослушивания, если вы хотите отменить или перенаправить запрос.
Чтобы отменить или перенаправить запрос, сначала включите "blocking" в массив аргументов extraInfoSpec к addListener(). Затем в функции-обработчике верните объект BlockingResponse, установив соответствующее свойство:
- чтобы отменить запрос, включите свойство
cancelсо значениемtrue. - чтобы перенаправить запрос, включите свойство
redirectUrlсо значением URL, на который вы хотите перенаправить.
Если расширение хочет перенаправить общедоступный (например, HTTPS) URL на страницу расширения (например, страницу расширения), файл manifest.json расширения должен содержать ключ web_accessible_resources, в котором перечислены URL-адреса страницы расширения.
Когда несколько обработчиков блокировки изменяют запрос, вступает в силу только один набор изменений. Перенаправления и отмены имеют одинаковый приоритет. Таким образом, если вы отменили запрос, вы можете увидеть другой запрос с тем же requestId снова, если другой обработчик блокировки перенаправил запрос.
Начиная с Firefox 52, вместо возврата BlockingResponse, обработчик события может вернуть Promise, который разрешается с помощью BlockingResponse. Это позволяет обработчику события обрабатывать запрос асинхронно.
Если вы используете "blocking", вам необходимо разрешение на использование API "webRequestBlocking" в вашем файле manifest.json.
Синтаксис
browser.webRequest.onBeforeRequest.addListener( listener, // function filter, // object extraInfoSpec // optional array of strings ) browser.webRequest.onBeforeRequest.removeListener(listener) browser.webRequest.onBeforeRequest.hasListener(listener)
События имеют три функции:
addListener(callback, filter, extraInfoSpec)-
Добавляет обработчик в это событие.
removeListener(listener)-
Прекратить прослушивание этого события. Аргумент
listener— это обработчик, который нужно удалить. hasListener(listener)-
Проверить, зарегистрирован ли
listenerдля этого события. Возвращаетtrueесли он прослушивает,falseв противном случае.
Синтаксис addListener
Параметры
callback-
Функция, которая будет вызываться при возникновении этого события. Функции будут переданы следующие аргументы:
details-
object. Детали запроса. Смотрите раздел details для получения дополнительной информации.
Возвращает:
webRequest.BlockingResponse. Если"blocking"указано в параметреextraInfoSpec, обработчик события должен вернуть объектBlockingResponse, и может установить либо его свойствоcancel, либо его свойствоredirectUrl. Начиная с Firefox 52, вместо возвратаBlockingResponse, обработчик может вернутьPromise, который разрешается с помощьюBlockingResponse. Это позволяет обработчику обрабатывать запрос асинхронно. filter-
webRequest.RequestFilter. Фильтр, который ограничивает события, которые будут отправлены этому обработчику. -
extraInfoSpecНеобязательно -
arraystring. Дополнительные параметры для события. Вы можете передать следующие значения:-
"blocking": сделать запрос синхронным, чтобы вы могли отменить или перенаправить запрос -
"requestBody": включитьrequestBodyв объект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 этого фрейма, а не 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. Идентификатор фрейма, содержащего фрейм, отправивший запрос. Устанавливается в -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. True, если прокси будет выполнять разрешение доменных имён на основе предоставленного имени хоста, что означает, что клиент не должен выполнять свой собственный поиск DNS. failoverTimeout-
integer. Время ожидания резервного копирования в секундах. Если соединение с прокси прерывается, прокси не будет использоваться снова в течение этого периода.
-
requestBodyНеобязательно -
object. Содержит данные тела HTTP-запроса. Предоставляется только еслиextraInfoSpecсодержит"requestBody".-
errorНеобязательно -
string. Устанавливается, если при получении данных тела запроса возникли ошибки. -
formDataНеобязательно -
object. Этот объект присутствует, если метод запроса POST, а тело представляет собой последовательность пар ключ-значение, закодированных в UTF-8 как "multipart/form-data" или "application/x-www-form-urlencoded".Это словарь, в котором каждый ключ содержит список всех значений для этого ключа. Например:
{'key': ['value1', 'value2']}. Если данные имеют другой тип носителя или если они неверны, объект не присутствует. -
rawНеобязательно -
array. Если метод запроса PUT или POST, и тело ещё не обработано вwebRequest.UploadDataformData, то этот массив содержит необработанные элементы тела запроса.
-
requestId-
string. Идентификатор запроса. Идентификаторы запросов уникальны в сеансе браузера, поэтому вы можете использовать их для связи различных событий, связанных с одним запросом. tabId-
integer. Идентификатор вкладки, в которой происходит запрос. Устанавливается в -1, если запрос не связан с вкладкой. thirdParty-
boolean. Указывает, являются ли запрос и его иерархия окон третьей стороной. timeStamp-
number. Время, когда произошло это событие, в миллисекундах с момента эпохи. type-
webRequest.ResourceType. Тип запрашиваемого ресурса: например, "изображение", "скрипт", "стиль". url-
string. Цель запроса. urlClassification-
object. Тип отслеживания, связанного с запросом, если запрос был классифицирован защитой от отслеживания Firefox. Это объект со следующими свойствами: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 | |
onBeforeRequest |
ДаАсинхронные обработчики событий не поддерживаются. |
14Асинхронные обработчики событий не поддерживаются. |
46Асинхронные обработчики событий поддерживаются начиная с версии 52. |
? | ДаАсинхронные обработчики событий не поддерживаются. |
14extraInfoSpec опции не поддерживаются. |
? | ? | 48Асинхронные обработчики событий поддерживаются начиная с версии 52. |
? | Нет | ? |
Порядок разрешения DNS при использовании BlockingResponse
Что касается разрешения DNS при использовании BlockingResponse с OnBeforeRequest: в канале HTTP, onBeforeRequest с блокирующим ответом происходит до разрешения DNS и также до спекулятивного подключения. В других каналах спекулятивное подключение может привести к тому, что запросы DNS будут происходить до onBeforeRequest. Этот порядок не является чем-то, на чём должен полагаться разработчик расширения, так как он может меняться в разных браузерах и от одной версии браузера к другой, не говоря уже об одном канале запросов от другого. Обратитесь к разъяснению проблемы BugZilla, предоставленному разработчиками Mozilla по порядку разрешения DNS
Примеры
Этот код регистрирует URL каждого запрошенного ресурса, соответствующего шаблону <all_urls>:
function logURL(requestDetails) { console.log(`Loading: ${requestDetails.url}`); } browser.webRequest.onBeforeRequest.addListener( logURL, {urls: ["<all_urls>"]} );
Этот код отменяет запросы изображений, которые выполняются по URL, находящимся под "https://developer.mozilla.org/" (чтобы увидеть эффект, посетите любую страницу MDN, содержащую изображения, например, webRequest):
// match pattern for the URLs to redirect let pattern = "https://developer.mozilla.org/*"; // cancel function returns an object // which contains a property `cancel` set to `true` function cancel(requestDetails) { console.log(`Canceling: ${requestDetails.url}`); return { cancel: true }; } // add the listener, // passing the filter argument and "blocking" browser.webRequest.onBeforeRequest.addListener( cancel, {urls: [pattern], types: ["image"]}, ["blocking"] );
Этот код заменяет все сетевые запросы изображений, которые выполняются по URL, находящимся под "https://developer.mozilla.org/", перенаправлением (чтобы увидеть эффект, посетите любую страницу MDN, содержащую изображения, например, webRequest):
// match pattern for the URLs to redirect let pattern = "https://developer.mozilla.org/*"; // redirect function // returns an object with a property `redirectURL` // set to the new URL function redirect(requestDetails) { console.log(`Redirecting: ${requestDetails.url}`); return { redirectUrl: "https://38.media.tumblr.com/tumblr_ldbj01lZiP1qe0eclo1_500.gif" }; } // add the listener, // passing the filter argument and "blocking" browser.webRequest.onBeforeRequest.addListener( redirect, {urls:[pattern], types:["image"]}, ["blocking"] );
Этот код точно такой же, как предыдущий пример, за исключением того, что обработчик запроса обрабатывает запрос асинхронно. Он возвращает Promise, который устанавливает таймер и разрешается URL перенаправления, когда таймер истекает:
// match pattern for the URLs to redirect let pattern = "https://developer.mozilla.org/*"; // URL we will redirect to let redirectUrl = "https://38.media.tumblr.com/tumblr_ldbj01lZiP1qe0eclo1_500.gif"; // redirect function returns a Promise // which is resolved with the redirect URL when a timer expires function redirectAsync(requestDetails) { console.log(`Redirecting async: ${requestDetails.url}`); return new Promise((resolve, reject) => { setTimeout(() => { resolve({ redirectUrl }); }, 2000); }); } // add the listener, // passing the filter argument and "blocking" browser.webRequest.onBeforeRequest.addListener( redirectAsync, {urls: [pattern], types: ["image"]}, ["blocking"] );
Другой пример, который перенаправляет все изображения на URL данных:
let pattern = "https://developer.mozilla.org/*"; let image = ` <svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%"> <rect style="stroke-width: 10; stroke: #666;" width="100%" height="100%" fill="#d4d0c8" /> <text transform="translate(0, 9)" x="50%" y="50%" width="100%" fill="#666" height="100%" style="text-anchor: middle; font: bold 10pt 'Segoe UI', Arial, Helvetica, Sans-serif;">Blocked</text> </svg> `; function listener(details) { const redirectUrl = `data:image/svg+xml,${encodeURIComponent(image)}`; return { redirectUrl }; } browser.webRequest.onBeforeRequest.addListener( listener, {urls: [pattern], types: ["image"]}, ["blocking"] );
Вот еще одна версия:
function randomColor() { return `#${Math.floor(Math.random()*16777215).toString(16)}`; } const pattern = "https://developer.mozilla.org/*"; let image = ` <svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%"> <rect width="100%" height="100%" fill="${randomColor()}"/> </svg> `; function listener(details) { const redirectUrl = `data:image/svg+xml,${encodeURIComponent(image)}`; return { redirectUrl }; } browser.webRequest.onBeforeRequest.addListener( listener, {urls: [pattern], types: ["image"]}, ["blocking"] );
Примеры расширений
Примечание: Этот 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/onBeforeRequest