最近,我们在我们的网站上添加了一个服务人员,以实现PWA。
唯一的想法是侦听fetch事件并获取请求。
service_worker.js:
self.addEventListener('fetch', function (event) {
event.respondWith(fetch(event.request));
});
我正在测试环境中对其进行测试,并且一切正常,直到在页面中加载了一些http内容(带有http:// src的9张图像)之前。 我们的网站是完整的https,我们在http call页面的响应标头上有此标头:
Content-Security-Policy:default-src https:'unsafe-inline''unsafe-eval'blob :; img-src https:数据:blob :; report-uri https://our.testing.domain/reportCSP.php
当我查看chrome devtools的“控制台”标签时,有
18个错误(每个http://图像2个错误)
拒绝加载图片”,因为它违反了以下内容安全策略指令:“ img-src https:数据:blob:”。
6条警告:
“ https://our.testing.domain/reportCSP.php”的FetchEvent结果 在网络错误响应中:承诺被拒绝。
6个:
未捕获(承诺)TypeError:无法获取
以及其中的6个错误:
chrome devtools's Network tab with reportCSP filter显示对reportCSP.php的所有调用(所有涂黑的html页面均为当前页面)。似乎请求的类型以“ csp-report”开头,然后在完成后转换为“ text / html”。这就是为什么失败的类型为'csp-report'
当我将光标移到(失败的)文本上时,对于“ csp-report”类型的reportCSP请求有(失败)net :: ERR_FAILED,对于“ fetch”类型的reportCSP请求有(失败)net :: ERR_INSUFFICIENT_RESOURCES >
这些错误仅在Chrome或Chrome浏览器上发生,我的版本为67.0.3396.99(内部版本)(64位)
如果我使用CTRL + F5重新加载页面,则所有CSP报告均有效。
在没有拦截获取事件的情况下,所有CSP报告均有效。
我对这里发生的事情一无所知,有人可以帮我吗?
[EDIT]我没有提到在我们的测试服务器上有HTTP基本身份验证,但是当我关闭它时,没有任何变化。
[编辑]我得到了答案
与本文net::ERR_INSUFFICIENT_RESOURCES error when adding numerous img elements to dom
中解释的错误相同。通过拦截提取事件并以fetch(event.request)响应,Chrome希望同时发送所有csp报告。
我试图随机延迟每次获取,因此我已经像这样自定义了我的代码:
self.addEventListener('fetch', function (event) {
if (event.request.url.indexOf('reportCSP.php') > 0) {
event.preventDefault();
var rand = getRandomInt(10000);
sleep(rand).then(function () {
event.respondWith(fetch(event.request));
});
}
else {
event.respondWith(fetch(event.request));
}
});
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
function getRandomInt(max) {
return Math.floor(Math.random() * Math.floor(max));
}
in this image,您会看到所有csp报告都在第一次失败(由于event.preventDefault()),然后它们全部起作用。随机延迟会阻止chrome同时发送所有邮件,并使其中的一部分失败。