#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)
);