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

Firefox addon intercept and modify POST data and get the URL

本文关键字:数据 获取 URL POST 修改 插件 Firefox      更新时间:2023-09-26

我试图获得每个POST请求的URL,读取POST数据,然后更改它(例如替换)。我的代码抛出了一个错误:stringStream is not defined,这是正确的,那么它应该被定义为获得setData()方法吗?部分代码最初来自一个SO帖子。另外,我如何得到的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();

请参见创建HTTP post。

  1. stringStream在你的代码中没有任何定义,所以放var声明之类的。
  2. inputStream.setData(postData, postData.length),详情请参考nsinputstream。