Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript &引用;内容长度“;服务工作者获取的响应中不包括标头_Javascript_Ajax_Amazon S3_Fetch_Service Worker - Fatal编程技术网

Javascript &引用;内容长度“;服务工作者获取的响应中不包括标头

Javascript &引用;内容长度“;服务工作者获取的响应中不包括标头,javascript,ajax,amazon-s3,fetch,service-worker,Javascript,Ajax,Amazon S3,Fetch,Service Worker,我正在从AWSS3获取静态资产(图像、PDF等),并使用ServiceWorkerAPI向客户端显示它们的下载进度。为此,我读取响应中的“内容长度”标题。在Chrome Canary(77.0.3821.0)中,这很好,但在Firefox(67.0版)和Chrome(75.0.3770.80版)中,响应中没有“内容长度”标题 on SO有助于将request.mode设置为“cors”,这为我提供了一些初步的成功,但到目前为止,这似乎只适用于Chrome Canary 使用ProgressMon

我正在从AWSS3获取静态资产(图像、PDF等),并使用ServiceWorkerAPI向客户端显示它们的下载进度。为此,我读取响应中的“内容长度”标题。在Chrome Canary(77.0.3821.0)中,这很好,但在Firefox(67.0版)和Chrome(75.0.3770.80版)中,响应中没有“内容长度”标题

on SO有助于将
request.mode
设置为“cors”,这为我提供了一些初步的成功,但到目前为止,这似乎只适用于Chrome Canary

使用ProgressMonitor响应函数(clientId,响应){
for(response.headers.keys()的常量键){
console.log(key);//在chrome和firefox上只返回“content type”和“last modified”,但在chrome Canary中包括“content length”
}
const contentLength=response.headers.get('content-length');
// ...
}
函数fetchWithProgressMonitor(事件){
const request=新请求(event.request.clone(){
模式:“cors”,
凭据:“省略”,
});
返回fetch(请求).then(response=>respondWithProgressMonitor(event.clientId,response));
}
我的S3 bucket CORS配置规则应该公开标题,除非我做错了什么


*
头
*
内容长度

我不确定为什么在金丝雀响应中显示内容长度标题,但在当前的Chrome版本或Firefox中不显示。我是否需要在请求中包含一些其他选项,以便在响应中返回“内容长度”标题?非常感谢您提供的任何见解或线索。

这不是答案,而是一种解决方法。。。将内容大小放入另一个标题中。为标题名创建类似“x-content-length-visible”的名称,这可能不是serviceworker保护的名称。

不是答案,而是解决方法。。。将内容大小放入另一个标题中。为标题名创建类似“x-content-length-visible”的名称,这可能不是serviceworker保护的名称。

我认为这是因为直到一年前,Fetch规范中的CORS要求没有将内容长度定义为“CORS安全列表响应标题名”。因此,由于它也被定义为“禁止的标题名”,浏览器被要求从不向前端JavaScript代码公开它。随着时间的推移,情况发生了变化。另见。但我猜浏览器直到现在才实现了这一改变。这些是非常棒的资源,这是否只适用于
无cors
请求模式,或者在请求中添加
cors
模式是否允许我访问禁止的域?它适用于“cors”模式。将模式设置为“no cors”将确保您的代码根本无法访问任何响应头,而不仅仅是禁止的头。“无cors”模式确保您的代码也无法访问响应主体。因此,我前面的评论中的所有内容都提到了“cors”模式,这是跨源请求的正常模式。(您基本上不想使用‘no cors’模式;该模式的存在几乎仅仅是为了缓存服务工作者的资源。)我认为这是因为直到一年前,Fetch规范中的cors要求还没有将内容长度定义为“cors safelisted响应头名称”。因此,由于它也被定义为“禁止的标题名”,浏览器被要求从不向前端JavaScript代码公开它。随着时间的推移,情况发生了变化。另见。但我猜浏览器直到现在才实现了这一改变。这些是非常棒的资源,这是否只适用于
无cors
请求模式,或者在请求中添加
cors
模式是否允许我访问禁止的域?它适用于“cors”模式。将模式设置为“no cors”将确保您的代码根本无法访问任何响应头,而不仅仅是禁止的头。“无cors”模式确保您的代码也无法访问响应主体。因此,我前面的评论中的所有内容都提到了“cors”模式,这是跨源请求的正常模式。(基本上,您永远不希望使用“无cors”模式;该模式几乎只存在于使用服务工作者缓存资源的情况下。)