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

クライアント側の JavaScript について話していると仮定すると、この機能を実現するのに役立つプロジェクトがいくつかあります。

  1. http://code.google.com/p/jssockets/ [フラッシュが必要です]
  2. http://socket.io/

それが役に立てば幸い。

于 2011-10-24T17:25:15.527 に答える
0

私は自分のffアドオンで非常に似たようなことをしています。nsiHttpChannel接続に関連付けられたへの参照が必要であると想定しています。ただし、プロパティを追加する (そして永続化する) ことができるかどうかはわかりません。おそらくネイティブ コードに支えられているため、どちらの方法もわかりません。ただし、他の場所に保存して、その方法でIDを保持 できます。nsiHttpChannel

これは、アドオンで 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 に答える