Я пишу базовое приложение в Javascript, которое использует новый API-интерфейс fetch. Вот базовый пример соответствующей части кода:
function foo(url) {
const options = {};
options.credentials = 'omit';
options.method = 'get';
options.headers = {'Accept': 'text/html'};
options.mode = 'cors';
options.cache = 'default';
options.redirect = 'follow';
options.referrer = 'no-referrer';
options.referrerPolicy = 'no-referrer';
return fetch(url, options);
}
При выполнении запроса на выборку я иногда вижу ошибки в консоли, которые выглядят следующим образом:
Отказано для загрузки script '<url> ' потому что он нарушает следующую директиву политики безопасности контента...
После некоторого чтения и изучения HTTP/2, похоже, что это сообщение появляется, потому что ответ отбрасывает предварительно загруженный script. Используя devtools, я могу увидеть следующий заголовок в ответе:
ссылка: < путь-to script > ; отно = предварительная нагрузка; а = script
Ниже приведена соответствующая часть моего файла расширения manifest.json.
{
"content_security_policy": "script-src 'self'; object-src 'self'"
}
Вот документация по формату Chrome manifest.json и как политика безопасности содержимого применяется к выборкам, сделанным расширением: https://developer.chrome.com/extensions/contentSecurityPolicy
Я провел некоторое тестирование и смог определить, что это сообщение об ошибке происходит во время выборки, а не позже при анализе текста ответа. Нет проблемы, когда элемент script загружается в живую DOM, все это происходит во время выборки.
То, что я не смог найти в своих исследованиях, заключалось в том, как избежать такого поведения. Похоже, что в спешке, чтобы поддержать эту замечательную новую функцию, люди, которые делали HTTP/2 и выборку, не рассматривали вариант использования, когда я не получаю удаленную страницу с целью ее отображения или любых связанных с ней ресурсов, таких как css/изображение/ script. Я (приложение) никогда не будет использовать какой-либо связанный ресурс; только содержимое самого ресурса.
В моем случае использования этот push (1) представляет собой полную трату ресурсов и (2) теперь вызывает случайное появление раздражающего и вызывающего стресс сообщения в консоли.
С учетом сказанного, вот вопрос, который мне бы очень понравился: есть ли способ сообщить браузеру, используя манифест или script, что я не заинтересован в HTTP/2 push? Есть ли заголовок, который я могу задать для запроса на выборку, который сообщает веб-серверу, что он не отвечает нажатием? Есть ли параметр CSP, который я могу использовать в своем манифесте приложения, который каким-то образом вызывает ответ do-not-push-me?
Я просмотрел https://w3c.github.io/preload/ раздел 3.3, это не помогло. Я вижу, что я могу отправлять заголовки типа Link: </dont/want/to/push/this>; rel=preload; as=script; nopush
. Проблема в том, что я еще не знаю, какие заголовки ссылок будут в ответе, и я не уверен, что выборка даже разрешает установку заголовков Link в первоначальном запросе. Интересно, могу ли я отправить какой-то запрос, который может видеть заголовки Link в ответе, но избегает их, а затем отправить запрос на последующий запрос, который добавляет все соответствующие заголовки nopush?
Вот простой тестовый пример, чтобы воспроизвести проблему:
- Получить версию разработчика последней или самой последней версии chrome
- Создать папку расширения
- Создать манифест с аналогичным CSP
- Расширение загрузки как распакованное в хром
- Откройте базовую страницу для расширения в devtools
- В консоли типа fetch ('https://www.yahoo.com').
- Изучите полученное сообщение об ошибке, появившееся в консоли: Отказано для загрузки script 'https://www.yahoo.com/sy/rq/darla/2-9-20/js/g-r-min.js', поскольку оно нарушает следующие Политика политики безопасности содержимого: "script -src" self ".
Дополнительные примечания:
- Я не хочу использовать прокси-сервер. Ясное объяснение того, почему это будет моим единственным вариантом, будет приемлемым ответом.
- Я не знаю URL-адреса, которые будут выбраны во время настройки CSP.
- См. https://tools.ietf.org/html/rfc7540#section-6.5.1, в котором говорится, что" SETTINGS_ENABLE_PUSH (0x2): этот параметр можно использовать для отключения нажатия на сервер (раздел 8.2). Конечная точка НЕ ДОЛЖНА отправлять кадр PUSH_PROMISE, если он принимает этот параметр, чтобы установить значение 0. "Есть ли способ указать этот параметр из script или манифест или он испечен в Chrome?