在chrome服务

时间:2018-06-27 13:54:30

标签: javascript fetch service-worker

最近,我们在我们的网站上添加了一个服务人员,以实现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个错误:

      

    POST https://our.testing.domain/reportCSP.php 0()

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同时发送所有邮件,并使其中的一部分失败。

0 个答案:

没有答案