2009-05-30 39 views
2

背景
我有一個現有的擴展,旨在陪伴基於瀏覽器的遊戲(擴展是我的,遊戲不是)。該擴展程序一直在抓取所需的數據,並提出請求採取任何操作的請求。如何使Firefox插件從頁面偵聽xmlhttprequests?

問題
遊戲開發者最近改變了一些在網站上操作,即可使用Ajax請求,我迄今無法從這些請求獲取數據。

我有什麼到目前爲止

function TracingListener() { 
} 

TracingListener.prototype = 
{ 
    originalListener: null, 
    receivedData: [], // array for incoming data. 

    onDataAvailable: function(request, context, inputStream, offset, count) 
    { 
     var binaryInputStream = CCIN("@mozilla.org/binaryinputstream;1", 
       "nsIBinaryInputStream"); 
     var storageStream = CCIN("@mozilla.org/storagestream;1", "nsIStorageStream"); 
     binaryInputStream.setInputStream(inputStream); 
     storageStream.init(8192, count, null); 

     var binaryOutputStream = CCIN("@mozilla.org/binaryoutputstream;1", 
       "nsIBinaryOutputStream"); 

     binaryOutputStream.setOutputStream(storageStream.getOutputStream(0)); 

     // Copy received data as they come. 
     var data = binaryInputStream.readBytes(count); 

     this.receivedData.push(data); 

     binaryOutputStream.writeBytes(data, count); 
     this.originalListener.onDataAvailable(request, context,storageStream.newInputStream(0), offset, count); 
    }, 

    onStartRequest: function(request, context) { 
     this.originalListener.onStartRequest(request, context); 
    }, 

    onStopRequest: function(request, context, statusCode) 
    { 
     try { 
      if (request.originalURI && piratequesting.baseURL == request.originalURI.prePath && request.originalURI.path.indexOf("/index.php?ajax=") == 0) { 

       dump("\nProcessing: " + request.originalURI.spec + "\n"); 
       var date = request.getResponseHeader("Date"); 

       var responseSource = this.receivedData.join(); 
       dump("\nResponse: " + responseSource + "\n"); 

       piratequesting.ProcessRawResponse(request.originalURI.spec, responseSource, date); 
      } 
     } catch(e) { dumpError(e);} 

     this.originalListener.onStopRequest(request, context, statusCode); 
    }, 

    QueryInterface: function (aIID) { 
     if (aIID.equals(Ci.nsIStreamListener) || 
      aIID.equals(Ci.nsISupports)) { 
      return this; 
     } 
     throw Components.results.NS_NOINTERFACE; 
    } 
} 


hRO = { 

    observe: function(aSubject, aTopic, aData){ 
     try { 
      if (aTopic == "http-on-examine-response") { 
       if (aSubject.originalURI && piratequesting.baseURL == aSubject.originalURI.prePath && aSubject.originalURI.path.indexOf("/index.php?ajax=") == 0) { 
        var newListener = new TracingListener(); 
        aSubject.QueryInterface(Ci.nsITraceableChannel); 
        newListener.originalListener = aSubject.setNewListener(newListener); 

        dump("\n\nObserver Processing: " + aSubject.originalURI.spec + "\n"); 
        for (var i in aSubject) { 
         dump("\n\trequest." + i); 
        } 
       } 
      } 
     } catch (e) { 
      dumpError(e); 

     } 
    }, 

    QueryInterface: function(aIID){ 
     if (aIID.equals(Ci.nsIObserver) || 
     aIID.equals(Ci.nsISupports)) { 
      return this; 
     } 

     throw Components.results.NS_NOINTERFACE; 

    } 
}; 


var observerService = Cc["@mozilla.org/observer-service;1"] .getService(Ci.nsIObserverService); 

observerService.addObserver(hRO, "http-on-examine-response", false); 

發生了什麼事
在處理HTTP請求上面的代碼是否正確通知。 uri也是可用的並且是正確的(它通過域/路徑檢查),但是被轉儲的responseSource據我所知可以始終是瀏覽器打開後第一個http請求的內容,顯然不是我期待什麼。

上面的代碼大部分來自http://www.softwareishard.com/blog/firebug/nsitraceablechannel-intercept-http-traffic/。我真的很希望這只是我忽略的一小部分,但是我一直在這張桌子上撞了幾天頭,所以現在我轉向SO的智慧。有任何想法嗎?

回答

3

但是那得到 傾倒responseSource是,據我所知, 總是瀏覽器後的第一部HTTP 請求的內容打開 ,很明顯,不是我所期待 。

上面的代碼有問題。 「receivedData」成員在原型對象上聲明並分配有空數組。這導致TracingListener類的每個實例都在存儲器中爲receivedData使用相同的對象。改變你的代碼可能會解決他的問題:

function TracingListener() { 
    this.receivedData = []; 
} 

TracingListener.prototype = 
{ 
    originalListener: null, 
    receivedData: null, // array for incoming data. 

/* skipped */ 

} 

不知道如果這將解決您的原始問題。

+0

+1我的上帝,你是對的。我在幾個月前遇到了同樣的問題,我想我會忘記它。訣竅是在onStartRequest中分配數組。 – 2009-05-30 06:54:09