2013-02-07 37 views
0

我想實現一個修改POST請求數據的Firefox擴展。無法修改Firefox擴展中的POST數據

代碼如下,其中標明失敗「這裏失敗!!!

任何有識之士將是有益的。

Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); 

    var newData = "test 123"; 
    function LOG(msg) { 
     var consoleService = Components.classes["@mozilla.org/consoleservice;1"] 
            .getService(Components.interfaces.nsIConsoleService); 
     consoleService.logStringMessage(msg); 
    } 

    function CMP() { 
     this.registered = false; 
     this.register(); 
    } 

    CMP.prototype = { 

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

     observe: function(subject, topic, data) 
     { 
      LOG("Inside observe"); 
      if (topic == "http-on-modify-request") 
      { 
       LOG("TOPIC is http-on-modify-request"); 
       var httpChannel = subject.QueryInterface(Components.interfaces.nsIHttpChannel); 

       if(httpChannel.requestMethod == "POST"){ 
        LOG("Inside POST") 
        var uploadChannel = httpChannel.QueryInterface(Components.interfaces.nsIUploadChannel); 
        //var uploadChannelStream = uploadChannel.uploadStream; 

修改這裏的數據。在這裏進行測試,我通過「測試123」作爲新的數據

    var newStringInputStream = Components.classes['@mozilla.org/io/string-input-stream;1'].createInstance(Components.interfaces.nsIStringInputStream); 
        newStringInputStream.setData(newData,newData.length); 
        LOG("set data in newStringInputStream!!"); 

        uploadChannel.setUploadStream(newStringInputStream, "text/plain", -1);// Fails here!!! 
        httpChannel.requestMethod = "POST"; 
        LOG("upload DONE!!") 
       } 
      } 
     }, 

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

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

     classID: Components.ID('{F799F47E-ABA5-4AF1-B8F2-BD74E3E5BCC0}'), 
     QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsIObserver]) 
    }; 

    if (XPCOMUtils.generateNSGetFactory) 
    { 
     var NSGetFactory = XPCOMUtils.generateNSGetFactory([CMP]); 
    } 

回答

1

通過在上面的代碼中的以下更改修復它。主要更改是在httpChannel.uploadStream中設置修改後的數據。

希望這可以幫助別人!

var httpChannel = subject.QueryInterface(Components.interfaces.nsIHttpChannel); 
      if(httpChannel.requestMethod == "POST") 
      { 
       LOG("Inside POST") 
       var uploadChannel = httpChannel.QueryInterface(Components.interfaces.nsIUploadChannel); 
       var newStringInputStream = Components.classes['@mozilla.org/io/string-input-stream;1'].createInstance(Components.interfaces.nsIStringInputStream); 
       newStringInputStream.setData(newData,newData.length); 
       var uploadChannelStream = uploadChannel.uploadStream; 
       uploadChannelStream = uploadChannelStream.QueryInterface(Components.interfaces.nsISeekableStream).seek(Components.interfaces.nsISeekableStream.NS_SEEK_SET, 0); 
       httpChannel.uploadStream.QueryInterface(Components.interfaces.nsIMIMEInputStream); 
       httpChannel.uploadStream.setData(newStringInputStream); 
       LOG("Done POST") 
      }