2009-11-08 14 views
17

Jak zmienić treść odpowiedzi HTTP w rozszerzeniu przeglądarki Firefox? Skonfigurowałem obserwatora http-on-examination-response i obiekt nsIStreamListener z poniższym kodem. Po otrzymaniu danych, przeanalizuj je i zmień, jak mogę przekazać zmienioną odpowiedź z powrotem do przeglądarki Firefox? Na przykład, powiedzmy, że wchodzę do Google.com z włączonym moim rozszerzeniem, rozszerzenie powinno przechwytywać odpowiedź i zmieniać każdy przypadek "google" na "gogle". Więc kiedy strona zostanie załadowana, użytkownik zobaczy wszędzie "gogle".Zmienianie odpowiedzi HTTP w rozszerzeniu przeglądarki Firefox

function TmSteroidsObserver() 
{ 
    this.register(); 
} 


TmSteroidsObserver.prototype = { 
    observe: function(subject, topic, data) { 

    if (topic == "http-on-examine-response") { 

    } 
    else if (topic == "http-on-modify-request") { 
     var channel = subject.QueryInterface(Components.interfaces.nsIChannel); 
     var listener = new StreamListener(channel); 
    } 

    }, 

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

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

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

} 

function StreamListener(channel) { 

    channel.notificationCallbacks = listener; 
    channel.asyncOpen(listener, null); 

} 

StreamListener.prototype = { 
    mData: "", 
    mChannel: null, 

    // nsIStreamListener 
    onStartRequest: function (aRequest, aContext) { 
    this.mData = ""; 
    }, 

    onDataAvailable: function (aRequest, aContext, aStream, aSourceOffset, aLength) { 
    var scriptableInputStream = 
     Components.classes["@mozilla.org/scriptableinputstream;1"] 
     .createInstance(Components.interfaces.nsIScriptableInputStream); 
    scriptableInputStream.init(aStream); 

    this.mData += scriptableInputStream.read(aLength); 
    }, 

    onStopRequest: function (aRequest, aContext, aStatus) { 
    if (Components.isSuccessCode(aStatus)) { 
     // request was successfull 
     this.mCallbackFunc(this.mData); 
    } else { 
     // request failed 
     this.mCallbackFunc(null); 
    } 

    this.mChannel = null; 
    }, 

    // nsIChannelEventSink 
    onChannelRedirect: function (aOldChannel, aNewChannel, aFlags) { 
    // if redirecting, store the new channel 
    this.mChannel = aNewChannel; 
    }, 

    // nsIInterfaceRequestor 
    getInterface: function (aIID) { 
    try { 
     return this.QueryInterface(aIID); 
    } catch (e) { 
     throw Components.results.NS_NOINTERFACE; 
    } 
    }, 

    // nsIProgressEventSink (not implementing will cause annoying exceptions) 
    onProgress : function (aRequest, aContext, aProgress, aProgressMax) { }, 
    onStatus : function (aRequest, aContext, aStatus, aStatusArg) { }, 

    // nsIHttpEventSink (not implementing will cause annoying exceptions) 
    onRedirect : function (aOldChannel, aNewChannel) { }, 

    // we are faking an XPCOM interface, so we need to implement QI 
    QueryInterface : function(aIID) { 
    if (aIID.equals(Components.interfaces.nsISupports) || 
     aIID.equals(Components.interfaces.nsIInterfaceRequestor) || 
     aIID.equals(Components.interfaces.nsIChannelEventSink) || 
     aIID.equals(Components.interfaces.nsIProgressEventSink) || 
     aIID.equals(Components.interfaces.nsIHttpEventSink) || 
     aIID.equals(Components.interfaces.nsIStreamListener)) 
     return this; 

    throw Components.results.NS_NOINTERFACE; 
    } 
}; 

Odpowiedz

0

Usługa obserwator po prostu zadzwonić do swoich słuchaczy. Firefox odbierze żądania, zadzwoni do twoich słuchaczy i wyśle ​​odpowiedzi. zobacz dokumentację Mozilli Creating HTTP POSTs.

Powiązane problemy