2015-05-15 37 views
1

我正在嘗試監視/攔截所有http通信並將所有內容的記錄都推送到日誌中。這對於訪問初始頁面加載效果很好,但它沒有觀察其他任何東西(xhr,css,圖像等)。使用nsIObserverService監視Firefox XHR

我嘗試了建議@http://www.softwareishard.com/blog/firebug/nsitraceablechannel-intercept-http-traffic/的聽衆方法,但是這也不會給我xhr(只是服務器的完整html答覆,而不是任何ajax或其他請求)。

這是我觀察代碼:

var httpLogger = { 
    http_methods_list: [ 
     'http-on-examine-response', 
     'http-on-examine-cached-response', 
     'http-on-examine-merged-response' 
    ], 

    is_enabled: false, 
    check_url_list: [ "*" ], 
    log: {}, 

    enable: function() { 
     if (! this.is_enabled) { 
      this.is_enabled = true; 

      var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService); 
      for (var i=0; i < this.http_methods_list.length; ++i) { 
       observerService.addObserver(this, this.http_methods_list[i], false); 
      } 
     } 
    }, 

    disable: function() { 
     if (this.is_enabled) { 
      this.is_enabled = false; 

      var observerService = fxdriver.moz.getService("@mozilla.org/observer-service;1", "nsIObserverService"); 
      for (var i=0; i < this.http_methods_list.length; ++i) { 
       observerService.removeObserver(this, this.http_methods_list[i], false); 
      } 
     } 
    }, 

    observe: function(subject, topic, data) { 
     try { 
      if (this.http_methods_list.indexOf(topic) != -1) { 
       subject = subject.QueryInterface(Components.interfaces.nsIHttpChannel); 

       if (subject.URI) { 
        url = subject.URI.spec; 
       } else if (subject.originalURI) { 
        url = subject.originalURI.spec; 
       } else { 
        this._pushToLog("debug", {event: "no_URI"}); 
        return; 
       } 

       if (this._urlIsKosher(subject.URI.spec)) { 
        dom_window = this._getDomWindow(subject); 

        event_log = { 
         request: this._getRequestFromSubject(subject), 
         response: this._getResponseFromSubject(subject), 
         responseStatus: subject.responseStatus, 
         responseStatusText: subject.responseStatusText, 
         requestSucceeded: subject.requestSucceeded, 
         requestMethod: subject.requestMethod, 
         status: subject.status, 
         name: subject.name 
        }; 

        if (dom_window) { 
         window_handle = this._getWindowHandle(dom_window); 
         if (window_handle) { 
          this._pushToLog(window_handle, event_log); 
         } else { 
          event_log.event = "no_handle"; 
          this._pushToLog("debug", event_log); 
         } 
        } else { 
         event_log.event = "no_window"; 
         this._pushToLog("debug", event_log); 
        } 
       } 
      } 
     } catch (err) { 
      this._pushToLog("debug", {error: err.message}); 
     } 
    }, 

    /* other helper functions like this._pushToLog(), this._urlIsKosher(), etc. */ 

} 

例如,如果我瀏覽到https://developer.yahoo.com/yql/console/,我的記錄器會記錄如下:

{ 
    request: { 
     Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
     Accept-Encoding: 'gzip, deflate', 
     Accept-Language: 'en-US,en;q=0.5', 
     Connection: 'keep-alive', 
     Host: 'developer.yahoo.com', 
     User-Agent: 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0' 
    }, 
    response: { 
     Age: '3', 
     Cache-Control: 'private, no-cache', 
     Connection: 'keep-alive', 
     Content-Encoding: 'gzip', 
     Content-Type: 'text/html; charset=utf-8', 
     Date: 'Fri, 15 May 2015 16:25:28 GMT', 
     P3P: 'policyref="http://info.yahoo.com/w3c/p3p.xml", CP="CAODSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV"', 
     Server: 'ATS', 
     Set-Cookie: 'B=e2jdjjpalc7fo&b=3&s=ei; expires=Mon, 15-May-2017 16:25:29 GMT; path=/; domain=.yahoo.com', 
     Transfer-Encoding: 'chunked', 
     Vary: 'Accept-Encoding', 
     Via: 'http/1.1 r36.ycpi.bf1.yahoo.net (ApacheTrafficServer [cMsSf ])', 
     X-Frame-Options: 'SAMEORIGIN' 
    }, 
    responseStatus: 200, 
    responseStatusText: 'OK', 
    requestSucceeded: true, 
    requestMethod: 'GET', 
    status: 0, 
    name: 'https://developer.yahoo.com/yql/console/' 
} 

但是,當我點擊「測試」按鈕yahoo-yql頁面(您可以在firebug中看到xhr),我的記錄器不記錄任何內容(「調試」或其他)。

任何建議將是超級有用的 - 我很困擾這一點。謝謝!

+0

其實,我看我的代碼,我意識到,我不是在觀察()的捕獲任何錯誤初始如果-有條件的,它實際上是拋出「subject.URI未定義」...所以我必須弄清楚如何獲得這些URI的URI – user2426679

+0

我已經更新了該修補的帖子,以防其他人有幫助 – user2426679

回答