2017-08-28 1 views
1

私はこのAPIChrome拡張機能からブラウザで消費されるトラフィック量を取得するにはどうすればよいですか?

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

さらに多くのデータが必要ですが、Content-Lengthとコードは何ですか? –

+0

コードスニペットを追加しました... –

+0

公正であるためには、コードはバグで始まります。あなたの '休憩 'は無条件なので、あなたは一番最初のヘッダーを見ます。 – Xan

答えて

1

良い質問ですが、webRequest APIはこの種の情報を提供しません。

実際には、サーバーはコンテンツの大きさを事前に伝えずにコンテンツをプッシュするだけなので、その情報が利用できる唯一のポイントはonCompletedイベントです。

クイックルックスルーthe documentationにはそのような情報はありません。

一般に、webRequestは、ネットワークスタックが実際にやっていること(消費中)よりも起こっていることのより抽象的なバージョンを示しています。だから、それは仕事には適切ではない。 Web要求のAPIが拡張へのネットワークスタックの抽象化を提供することを

注:

は、ここでさらに部分的に関連しているドキュメントからの引用は、だ、この時点で家を駆動します。内部的には、1つのURL要求を複数のHTTP要求(たとえば、大きなファイルから個々のバイト範囲をフェッチする)に分割することも、ネットワークと通信せずにネットワークスタックで処理することもできます。このため、APIはネットワークに送信される最終的なHTTPヘッダーを提供しません。たとえば、キャッシングに関連するすべてのヘッダーは、拡張機能には見えません。

現在、次のヘッダーはonBeforeSendHeadersイベントには提供されていません。このリストは完全でも安定していることも保証されていません。

  • ...
  • のContent-Length
  • ...

私は、このための合理的なアプローチがないと思います。chrome://net-internals/#bandwidthはデータを表示しますが、APIを介して公開されていません(拡張機能からそのページにアクセスすることはできません)。

開発ツールの拡張機能(ネットワークイベントへのアクセスを有する)、またはchrome.debugger API(異なるインタフェースを介して同じデータ)のいずれかを介して特定のページの近似値を得ることは可能かもしれません。しかし、それは "統計を見るためにこのページをリロードする"シナリオでのみ機能し、ネットワークレベルで実際に起こるよりも抽象的になります。

関連する問題