在Firefox扩展中重定向请求(nsiHttpChannel?)

Avi*_*ran 43 javascript httprequest firefox-addon

我一直在尝试这个很长一段时间,并没有很好的结果.

var myObserver = {
    observe: function(subject, topic, data)
    {
        if (topic == "http-on-examine-response") 
        {   
             //  implement later
        } 
        else if(topic == "http-on-modify-request") 
        {
             //  implement later
        }
   },

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

var obs = new Service("observer-service", "ObserverService");
obs.addObserver(myObserver, "http-on-modify-request", false);
Run Code Online (Sandbox Code Playgroud)

基本上,http-on-modify-request我知道如何检查URI,找出与之关联的窗口(如果有的话)以及其他一些东西.我无法弄清楚的是如何重定向请求,我知道这是可能的,因为我可以在发出任何请求之前获得nsIHttpChannel.

谁知道该怎么办?:/我一直试着打了几个星期,然后无处可去.

Dan*_*iel 1

我的印象是,您不能在这个级别执行此操作 - 我尝试了各种从外部“欺骗”需要创建 nsIHttpChannel 的代码的方法(示例位于帖子末尾)。

我建议的是,如果您想要重定向,请联系频道的所有者窗口(99% 的情况下都有效),并指示它进行重定向。我知道它的行为不会相同,但由于我不知道你为什么要这样做,所以这在外部(对用户来说)似乎正在做与你所要求的相同的事情。

这是我尝试的基础知识:

if(aTopic == "http-on-examine-response") {                                                                                     
            var request = aSubject.QueryInterface(Components.interfaces.nsIHttpChannel);                                                      

            if(!request.URI.spec.match("^http://www.apple.com/")) {                                                          
                var ios = Components.classes["@mozilla.org/network/io-service;1"]                                                             
                    .getService(Components.interfaces.nsIIOService);                                                                          
                var ch = ios.newChannel("http://www.apple.com/", null, null);                                                                 

                var listener = {                                                                                                              
                    QueryInterface : XPCOMUtils.generateQI([Ci.nsIChannelEventSink]),                                                         
                    onDataAvailable: function() {},                                                                                           
                    onStopRequest: function() {},                                                                                             
                    onStartRequest: function() {}                                                                                             
                };                                                                                                                            

                ch.asyncOpen(listener,null);                                                                                                  

                var eventSink = request.notificationCallbacks.getInterface(Ci.nsIChannelEventSink);                                           
                eventSink.asyncOnChannelRedirect(request,ch,Ci.nsIChannelEventSink.REDIRECT_INTERNAL,function() {});                          
            } 
Run Code Online (Sandbox Code Playgroud)