2009-11-08 14 views
17

मैं फ़ायरफ़ॉक्स एक्सटेंशन में HTTP प्रतिक्रिया निकाय को कैसे बदल सकता हूं? मैंने नीचे दिए गए कोड के साथ एक http-on-test-प्रतिक्रिया पर्यवेक्षक और एक nsIStreamListener ऑब्जेक्ट सेट किया है। डेटा प्राप्त करने के बाद, इसे पार्स करें, और इसे बदलें, मैं बदले गए प्रतिक्रिया को फ़ायरफ़ॉक्स ब्राउज़र पर कैसे दबा सकता हूं? उदाहरण के लिए, मान लीजिए कि मैं अपने एक्सटेंशन सक्षम होने के साथ Google.com पर जाता हूं, एक्सटेंशन को प्रतिक्रिया को रोकना चाहिए और "google" से "goggle" के हर अवसर को बदलना चाहिए। तो जब पृष्ठ लोड हो जाता है, तो उपयोगकर्ता हर जगह "गॉगल" देखेगा।फ़ायरफ़ॉक्स एक्सटेंशन में HTTP प्रतिक्रियाओं को बदलना

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

उत्तर

11

आप प्रतिक्रिया को रोकने के लिए nsITraceableChannel का उपयोग कर सकते हैं।

आप डेटा जो आपको क्या चाहिए के लिए उपलब्ध है को संशोधित करने और यह innerListener के OnDataAvailable

लिंक नीचे को पारित करने में मदद मिलेगी आप इस बेहतर समझना चाहिए।

http://www.softwareishard.com/blog/firebug/nsitraceablechannel-intercept-http-traffic/

http://www.ashita.org/howto-xhr-listening-by-a-firefox-addon/

0

पर्यवेक्षक सेवा बस अपने श्रोताओं कहते हैं। फ़ायरफ़ॉक्स अनुरोध प्राप्त करेंगे, अपने श्रोताओं को बुलाएंगे, और प्रतिक्रिया भेजेंगे। मोज़िला दस्तावेज़ Creating HTTP POSTs देखें।

संबंधित मुद्दे