Прослушиватель WebRequest не видит заголовков типа ‘cookie’, ‘referer’, ‘origin’

#javascript #google-chrome-extension

#javascript #файлы cookie #google-chrome-расширение #http-заголовки

Вопрос:

Мы написали расширение Chrome, которое, используя событие onBeforeSendHeaders, добавляет cookie к каждому веб-запросу:

 chrome.webRequest.onBeforeSendHeaders.addListener(addCookie, {
    urls: ["<all_urls>"]
}, ["blocking", "requestHeaders"]);

function addCookie(details) {
    if (details.url.match(/ourWebsite/)) {
        details.requestHeaders.forEach(function (requestHeader) {
            if (requestHeader.name.toLowerCase() === "cookie") {
                //Code that adds a cookie with a value
            }
        });
        return {requestHeaders: details.requestHeaders};
    }
}
 

Он отлично работает на всех Chrome, кроме моего собственного. При отладке расширения я заметил, что в details.requestHeaders массиве нет cookie заголовка (это всегда false: requestHeader.name.toLowerCase() === "cookie" ).

Моей первой мыслью было, что другое расширение мешает нашему, поэтому я попробовал в режиме инкогнито (где другие расширения не разрешены), но это не сработало.

В манифесте расширения у нас есть как «cookies», так и «WebRequest» permissions .

Есть идеи? Заранее спасибо!

Комментарии:

1. @wOxxOm не Set-Cookie является заголовком ответа? Мы пытаемся изменить заголовки запросов

Ответ №1:

В соответствии с этим https://developer.chrome.com/extensions/webRequest

  • Начиная с Chrome 72, следующие заголовки запросов не предоставляются и не могут быть изменены или удалены без указания «extraHeaders» в opt_extraInfoSpec:
    • Принять-язык
    • Принять-кодирование
    • Referer
    • Cookie
  • начиная с Chrome 79:
    • Происхождение
    • Предполетные запросы CORS

Заголовки ответов для других слушателей, таких как onHeadersReceived:

  • начиная с Chrome 72:
    • Set-Cookie
    • любой заголовок, который вы хотите изменить до применения CORB
  • начиная с Chrome 79:
    • Предварительные ответы CORS

Поэтому вы должны добавить «Дополнительные заголовки» к третьему параметру прослушивателя WebRequest, и это должно быть ["blocking", "requestHeaders", "extraHeaders"] для вашего примера.

Обратите внимание, что он не будет запускаться в старом Chrome до 72, о котором вы не знаете extraHeaders , поэтому вы можете использовать следующий трюк, чтобы иметь универсально совместимый прослушиватель:

 chrome.webRequest.onBeforeSendHeaders.addListener(
  addCookie,
  {urls: ["<all_urls>"]},
  ["blocking", "requestHeaders",
   chrome.webRequest.OnBeforeSendHeadersOptions.EXTRA_HEADERS].filter(Boolean)
);