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

发布于 2024-12-22 15:15:24 字数 2765 浏览 3 评论 0原文

我试图获取每个 POST 请求的 URL,读取 POST 数据,然后更改它(例如替换)。我的代码抛出一个错误:stringStream is not Define,这是正确的,那么应该定义什么来获取 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();

I'm trying to get the URL of each POST request, read the POST data and then change it (with a replace for example). The code I have is throwing an error: stringStream is not defined, which is correct, so what should it be defined as to get the setData() method? Part of the code is originally from an SO post. Also how do I get the URL it's posting to?

//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();

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

弥枳 2024-12-29 15:15:24

请参阅创建 HTTP POST 了解如何正确执行此操作。

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

see Creating HTTP POSTs for how to do this right.

  1. stringStream is not defined anywhere in your code, so put var declaration or so.
  2. inputStream.setData(postData, postData.length), please refer to nsInputStrem for more.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文