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

标签 javascript http firefox-addon observer-pattern

我正在尝试获取每个 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();

最佳答案

参见 Creating HTTP POSTs了解如何正确执行此操作。

  1. stringStream 未在您的代码中的任何位置定义,因此请放置 var 声明。
  2. inputStream.setData(postData, postData.length),请引用nsInputStrem了解更多。

关于javascript - Firefox 插件拦截和修改 POST 数据并获取 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8614170/

相关文章:

javascript - 创建一个 JavaScript npm 包 - 是否需要提供一个转译的 dist?

javascript - Firefox 扩展中的 __defineGetter__ 未定义

firefox - Selenium默认添加Skype点击调用插件

javascript - 在 Firefox 扩展中使用 Components.utils.import

javascript - 为什么这个 JavaScript 函数中有一个额外的变量?

javascript - Jasmine 的 `done()` 是怎么实现的?

javascript - 在一个表单字段中获取多个用户输入

javascript - 从 JavaScript 获取 HTTP 文本

security - Lift 是否会阻止 HTTP 响应拆分?

c++ - 适用于 Windows CE/Mobile 的 C++ HTTP Websockets 客户端库