【问题标题】:Amount of transferred bytes per web request每个 Web 请求传输的字节数
【发布时间】:2016-06-19 22:09:58
【问题描述】:

当您执行 XMLHttpRequest 时,通常会压缩数据。看着the Content-Length header

xhr.getResponseHeader("Content-Length");

为您提供响应正文中的八位字节数,您可以通过调整响应标头的大小来添加标头的近似值。

但是:您如何找到实际传输的(压缩)字节数?(在 Firefox 中,如果这只能通过特定于浏览器的方式实现。)

在下面的屏幕截图中,您可以看到几个文件的不同之处:

以下都应该等于这个

  • 从套接字读取的字节数
  • squid 日志中的文件大小
  • 为响应请求而通过网络发送的应用层八位字节数

【问题讨论】:

  • 嗯,这不是响应中的八位字节数,而是响应正文中的八位字节数。重要的区别。我认为您想要整个消息中的八位字节数?
  • @DaSourcerer:完全正确。谢谢。
  • @DaSourcerer:如果是压缩的,压缩的八位字节数
  • 是的。但这仍然与响应正文中的八位字节数相同。 HTTP 消息对它们的有效负载可能出人意料地不可知:压缩是内容的属性,而不是消息本身。至少就Content-Encoding 标头而言。
  • @DaSourcerer:该信息再次很有用(并且可以解释为什么传输的大小大于图片中几个项目的内容大小)。澄清一下:为响应请求而通过网络发送的应用层八位字节数。

标签: javascript http firefox xmlhttprequest


【解决方案1】:

上面的截图显示了Network MonitorIts code 似乎使用了network-monitor.js 文件

实现 nsIStreamListener 和 nsIRequestObserver 接口。这在 NetworkMonitor 功能中用于获取请求的响应正文。

相关代码好像是

  onProgress: function(request, context, progress, progressMax) {
    this.transferredSize = progress;
    // Need to forward as well to keep things like Download Manager's progress
    // bar working properly.
    this._forwardNotification(Ci.nsIProgressEventSink, "onProgress", arguments);
  },

  _onComplete: function NRL__onComplete(aData)
  {
    let response = {
      mimeType: "",
      text: aData || "",
    };

    response.size = response.text.length;
    response.transferredSize = this.transferredSize;

progress 事件不是这两个接口的一部分。它可能来自xhr,但目前还不清楚它来自哪里。

【讨论】:

    【解决方案2】:

    只要响应是文本(而不是二进制 blob),您就可以在 SO 上找到一些好的起点: Measure string length in bytes

    【讨论】:

    • 看来我的问题还不够清楚。它是关于发送的字节数,包括压缩。还是您的意思是可以重新构建文本,然后重新压缩? (链接谈到与编码类似的内容)
    猜你喜欢
    • 1970-01-01
    • 2014-10-26
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多