3

我的目标是识别 Firefox 插件中的 TCP 连接。

为此,我需要为每个连接设置一个唯一 ID。我的问题是,如果可能并且有人知道如何从 HTTP 请求访问 TCP 连接的对象?然后我可以为它设置一个唯一的 ID,每个请求/响应对都将唯一地设置为一个连接。

4

4 回答 4

1

虽然我不知道您问题的直接答案,但我建议您查看 Firebug 的源代码,它似乎至少可以访问网络堆栈的 HTTP 请求级别,甚至可能更低。

希望这有帮助,祝你好运!

于 2011-10-24T17:23:18.147 回答
0

来自 MDN:如何监控 HTTP 活动

这是他们的示例代码

// Define a reference to the interface
var nsIHttpActivityObserver = Components.interfaces.nsIHttpActivityObserver;

var httpObserver =
{
    observeActivity: function(aHttpChannel, aActivityType, aActivitySubtype, aTimestamp, aExtraSizeData, aExtraStringData)
    {
      if (aActivityType == nsIHttpActivityObserver.ACTIVITY_TYPE_HTTP_TRANSACTION) {
        switch(aActivitySubtype) {
          case nsIHttpActivityObserver.ACTIVITY_SUBTYPE_RESPONSE_HEADER:
            // received response header
            break;
          case nsIHttpActivityObserver.ACTIVITY_SUBTYPE_RESPONSE_COMPLETE:
            // received complete HTTP response
            break;
        }
      }
    }
};

var activityDistributor = 
    Components.classes["@mozilla.org/network/http-activity-distributor;1"]
    .getService(Components.interfaces.nsIHttpActivityDistributor);
activityDistributor.addObserver(httpObserver);
于 2011-10-24T17:31:28.840 回答
0

我在自己的 ff 插件中做了非常相似的事情。我假设您想要对nsiHttpChannel与连接关联的引用。但是,我不确定您是否可以只向它添加属性(并让它们保持不变),因为它可能由本机代码支持,我不确定哪种方式。但是您可以将其存储在nsiHttpChannel其他地方并以这种方式保留一个 id。

这是我用来监控插件中的 http 流量的一些简化代码,它应该可以解决您的问题。

var Cc = Components.classes;
var Ci = Components.interfaces;

var MyHttpObserver = {
    // must be exposed so that the ObserverService can register itself
    observe: function(subject, topic, data) {
        subject.QueryInterface(Ci.nsIHttpChannel);
        if( topic === "http-on-modify-request" ){
            // store 'subject' somewhere
        } else if( topic === "http-on-examine-response" ){
            // look up 'subject' it will be the same reference as before
        }
    },

    register: function() {
        var observerService = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
        observerService.addObserver(this, "http-on-modify-request", false);
        observerService.addObserver(this, "http-on-examine-response", false);
    },

    unregister: function() {
        var observerService = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
        observerService.removeObserver(this, "http-on-modify-request");
        observerService.removeObserver(this, "http-on-examine-response");
    },

    QueryInterface: function (aIID) {
        if (aIID.equals(Ci.nsIObserver) || aIID.equals(Ci.nsISupports) ){
            return this;
        }
        throw Components.results.NS_NOINTERFACE;
    }
};
于 2011-10-24T23:00:50.060 回答
0

假设您正在谈论客户端 JavaScript,有一些项目可以帮助您实现此功能。

  1. http://code.google.com/p/jssockets/ [需要闪存]
  2. http://socket.io/

希望能帮助到你。

于 2011-10-24T17:25:15.527 回答