通过id识别http请求/响应

时间:2012-08-20 18:03:42

标签: firefox firefox-addon firefox-addon-sdk

我正在使用Firefox的ADD ON SDK(v1.9)构建扩展,该扩展将能够读取所有HTTP请求/响应并计算加载时间。这不仅包括主框架,还包括任何其他加载文件(子框架,脚本,CSS,图像等)。

到目前为止,我可以使用“observer-service”模块来监听:

  • 创建HTTP请求时的“http-on-modify-request”。
  • 收到HTTP响应时的“http-on-examine-response”
  • 当完全从缓存收到HTTP响应时,
  • “http-on-examine-cached-response” 当从缓存
  • 部分接收到HTTP响应时,
  • “http-on-examine-merged-response”

我的申请遵循以下顺序:

  1. 通过观察者创建并注册请求。
  2. 我保存当前时间并将其标记为请求加载的start_time。
  3. 收到请求的回复,并通过其中一名观察员注册。
  4. 我保存当前时间并使用先前保存的时间来计算请求的加载时间。
  5. 问题: 我无法链接负载的开始和结束时间,因为我找不到将请求与响应绑定的请求ID(或其他唯一值)。 我目前正在使用请求/响应的URL将它们绑定在一起,但这不正确,因为如果同时加载两个或更多相等的URL,它将引发“竞争条件”。谷歌Chrome通过提供独特的requestIds解决了这个问题,但我无法在Firefox上找到类似的功能。

2 个答案:

答案 0 :(得分:2)

我知道有两种方法可以识别您在此观察者中收到的频道。 “旧”解决方案是使用nsIWritablePropertyBag interface将数据附加到频道:

var {Ci} = require("chrome");
var channelId = 0;

...

// Attach channel ID to a channel
if (channel instanceof Ci.nsIWritablePropertyBag)
  channel.setProperty("myExtension-channelId", ++channelId);

...

// Read out channel ID for a channel
if (channel instanceof Ci.nsIPropertyBag)
  console.log(channel.getProperty("myExtension-channelId"));

另一个解决方案是使用WeakMap API(只能从Firefox 13开始正常工作):

var channelMap = new WeakMap();
var channelId = 0;

...

// Attach channel ID to a channel
channelMap.set(channel, ++channelId);

...

// Read out channel ID for a channel
console.log(channelMap.get(channel));

我不确定附加SDK模块的上下文中是否有WeakMap,您可能需要从常规JavaScript模块中“窃取”它:

var {Cu} = require("chrome");
var {WeakMap} = Cu.import("resource://gre/modules/FileUtils.jsm", null);

显然,在这两种情况下,您可以将更多数据附加到频道而不是简单数字。

答案 1 :(得分:0)

Firebug通过为这些事件实施中央观察员来实现您的想法:

https://github.com/firebug/firebug/blob/master/extension/modules/firebug-http-observer.js

这可能是一个很好的起点,虽然最终 Firefox默认会发布更完整的网络监视器/调试器。我想我会在某处读到它将基于Firebug的。