Firefox插件拦截并修改POST数据并获取URL

问题描述:

我试图获取每个POST请求的URL,读取POST数据,然后更改它(例如替换)。我的代码是抛出一个错误:stringStream is not defined,这是正确的,那么应该定义什么来获取setData()方法?部分代码最初来自SO帖子。另外我如何获取它发布的URL?Firefox插件拦截并修改POST数据并获取URL

//create an nsIObserver implementor 
var listener = { 
    observe : function(aSubject, aTopic, aData) { 
     var httpChannel = aSubject.QueryInterface(Components.interfaces.nsIHttpChannel); 


      if (aTopic == "http-on-modify-request") { 

      var channel= aSubject.QueryInterface(Components.interfaces.nsIHttpChannel); 

      if(channel.requestMethod == "POST") 
      { 

       channel=channel.QueryInterface(Components.interfaces.nsIUploadChannel); 
       channel = channel.uploadStream; 
       channel.QueryInterface(Components.interfaces.nsISeekableStream) 
           .seek(Components.interfaces.nsISeekableStream.NS_SEEK_SET, 0); 
       var stream = Components.classes["@mozilla.org/binaryinputstream;1"] 
           .createInstance(Components.interfaces.nsIBinaryInputStream); 
       stream.setInputStream(channel); 
       var postBytes = stream.readByteArray(stream.available()); 
       poststr = String.fromCharCode.apply(null, postBytes); 

       //change the poststr 

       // poststr=poststr.replace(....); 

       // ERROR HERE - stringStream is not defined 
       stringStream.setData(poststr, poststr.length); 
       //changing the postdata 
       channel = channel.QueryInterface(Components.interfaces.nsIUploadChannel); 
       channel = channel.uploadStream; 
       channel = channel.QueryInterface(Components.interfaces.nsISeekableStream) 
          .seek(Components.interfaces.nsISeekableStream.NS_SEEK_SET, 0); 
       channel.uploadStream.QueryInterface(Components.interfaces.nsIMIMEInputStream); 
       channel.uploadStream.setData(stringStream); 
       channel.requestMethod = "POST"; 

      } 

      } 

    }, 

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

var observerService = null; 

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

    removeObserver : function(){ 
     observerService.removeObserver(listener, "http-on-modify-request"); 
    } 
}; 

Init.addObserver(); 

请参阅Creating HTTP POSTs如何做到这一点。

  1. stringStream没有在你的代码中的任何地方定义,所以把var声明放在那里。
  2. inputStream.setData(postData, postData.length),详情请参考nsInputStrem
+0

很好,谢谢 – MrCode 2012-03-06 17:51:03