2009-05-30 5 views
2

배경
기존 확장 기능이 브라우저 기반 게임에 포함되도록 설계되었습니다 (확장 기능은 내 것이고 게임은 그렇지 않습니다). 확장 프로그램은 필요한 데이터가 들어 왔을 때 페이지를 긁어내어 어떤 행동을 취할 것인지에 대한 아약스 요청을 내 렸습니다.페이지에서 xmlhttprequests를 듣는 Firefox addon을 만드는 방법은 무엇입니까?

문제
게임의 개발자들이 최근 아약스 요청을 사용하는 사이트에 대한 작업의 번호를 변경하고 나는 그 요청에서 데이터를 얻을 지금까지 드릴 수 없습니다. 내가 가진 무엇

지금까지 HTTP 요청을 처리 할 때 위의 코드가 제대로 통지
을 무슨 일

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); 

. uri도 사용 가능하고 정확합니다 (도메인/경로 검사를 통과 함). 그러나 덤프되는 responseSource은 브라우저가 열린 후에 만들어진 첫 번째 HTTP 요청의 내용을 항상 알 수 있습니다. 내가 기대했던 것.

위의 코드는 큰 부분으로 http://www.softwareishard.com/blog/firebug/nsitraceablechannel-intercept-http-traffic/에서옵니다. 나는 그것이 간과했던 단지 작은 무엇인가이기를 정말로 바라고있다. 그러나 나는이 머리에 관해 날 동안 책상에 대해 머리를 치고 있었다. 그래서 지금 나는 SO의 지혜로 향했다. 어떤 아이디어? 덤프 를 얻을 수

답변

3

하지만 responseSource은 지금까지 내가 말할 수있는,이다, 브라우저 이후 처음 HTTP 요청 항상 내용이 내가 기대 아니었다 것을 분명히 을 열고.

위의 코드에 문제가 있습니다. "receivedData"멤버는 프로토 타입 객체에 선언되고 빈 배열이 할당됩니다. 이로써 TracingListener 클래스의 모든 인스턴스가 receiveData의 메모리에있는 동일한 객체를 사용하게됩니다. 코드를 변경하면 문제가 해결 될 수 있습니다.

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

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

/* skipped */ 

} 

원래 문제를 해결할 수 있는지 확실하지 않더라도.

+0

+1 내 신이 네가 옳았다. 몇 달 전에 똑같은 버그가 나에게 닥쳤다. 나는 그걸 잊어 버린 것 같아. 그 트릭은 배열을 onStartRequest 안에 할당하는 것이었다. –

+0

생성자에서 할당하는 것도 물론 가능합니다. onStartRequest에 할당하면 할당이 너무 일찍 발생하지 않습니다. –