我尝试使用此API
https://developer.chrome.com/extensions/webRequest
并总结Content-Length字段,但它们似乎总是丢失。有没有可行的方法呢?
chrome.webRequest.onCompleted.addListener(function(data) {
console.log('Got request!', data);
var size = 0;
for (i = 0; i < data.responseHeaders.length; i++) {
var header = data.responseHeaders[i];
if (header.name === 'Content-Length') {
size += parseInt(data.responseHeaders[i].value);
break;
}
}
if (size > 0) {
chrome.runtime.sendMessage({
msg: 'traffic',
amount: size
}, function(resp) {})
}
}, {
urls: ["<all_urls>"]
}, ["responseHeaders"]);
结果是Content-Length标头总是丢失。
谢谢!
答案 0 :(得分:1)
很好的问题,但 webRequest
API肯定不会提供此类信息。
事实上,大多数情况下,服务器只是在不事先告知内容有多大的情况下将内容推出,唯一可以获得该信息的地方是onCompleted
事件。
快速查看the documentation表示没有此类信息。
通常,webRequest
显示的内容比网络堆栈实际执行(消费)的内容更抽象。所以这不适合这份工作。
为了进一步推动这一点,这里是文档的引用,部分相关:
请注意,Web请求API会向扩展程序提供网络堆栈的抽象。在内部,一个URL请求可以分成几个HTTP请求(例如,从大文件中获取单个字节范围),或者可以由网络堆栈处理,而无需与网络通信。因此,API不提供发送到网络的最终HTTP标头。例如,与缓存相关的所有标头都对扩展名不可见。
目前未向
onBeforeSendHeaders
事件提供以下标头。此列表不保证完整也不稳定。
- ...
- 的Content-Length
- ...
我认为没有任何合理的方法。 chrome://net-internals/#bandwidth
显示数据,但不会通过API公开(并且您无法从扩展程序访问该页面) )。
可能可以通过Dev Tools扩展(可访问网络事件)或chrome.debugger
API(通过不同接口的相同数据)获取特定页面的近似值。但它只会在“重新加载此页面以查看统计信息”方案中工作,并且再次比网络级别的实际情况更加抽象。