javascript - nsITraceableChannel,拦截HTTP流量代码

标签 javascript firefox-addon

我一直在尝试让这段代码适用于 Firefox,这是我从 nsITraceableChannel, Intercept HTTP Traffic 获得的。和来自 How to get an url from nsITraceableChannel? ,我一直在谷歌上寻找答案,但没有运气。 我想做的是拦截某些链接并更改它们。 欢迎任何帮助

我得到的错误是函数语句需要名称女巫指向观察:函数(aSubject,aTopic,aData)代码部分

 const Cc = Components.classes;
const Ci = Components.interfaces;

var observerService = Cc["@mozilla.org/observer-service;1"]
    .getService(Ci.nsIObserverService);

observerService.addObserver(httpRequestObserver,
    "http-on-examine-response", false);

observerService.removeObserver(httpRequestObserver,
    "http-on-examine-response");
//--------------------------------------------------------

 var httpRequestObserver =
{
    observe: function(aSubject, aTopic, aData)
    {
        if (aTopic == "http-on-examine-response")
        {
        }
    },

    QueryInterface : function (aIID)
    {
        if (aIID.equals(Ci.nsIObserver) ||
            aIID.equals(Ci.nsISupports))
        {
            return this;
        }

        throw Components.results.NS_NOINTERFACE;

    }
}

//------------------------------------------------------------

 function TracingListener() {
    this.originalListener = null;
}

TracingListener.prototype =
{
    onDataAvailable: function(request, context, inputStream, offset, count) {
        this.originalListener.onDataAvailable(request, context, inputStream, offset, count);
    },

    onStartRequest: function(request, context) {
        this.originalListener.onStartRequest(request, context);
    },

    onStopRequest: function(request, context, statusCode) {
        this.originalListener.onStopRequest(request, context, statusCode);
    },

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

observe: function(aSubject, aTopic, aData)
{
    if (aTopic == "http-on-examine-response") {
        var newListener = new TracingListener();
        aSubject.QueryInterface(Ci.nsITraceableChannel);
        newListener.originalListener = aSubject.setNewListener(newListener);
    }
}

aSubject = aSubject.QueryInterface(Ci.nsIChannel);
var uri = aSubject.URI;
// original URI that was requested before any other resolver steps
// and/or redirects.
var ouri = aSubject.originalURI;

ch = Services.io.newChannel("https://google.com/", null, null);
console.log(ch.toString());
// "[xpconnect wrapped nsIChannel]"

ch.QueryInterface(Ci.nsITraceableChannel); 
console.log(ch.toString());
// "[xpconnect wrapped (nsISupports, nsIChannel, nsITraceableChannel)]"

console.log(ch instanceof Ci.nsIUploadChannel);
// true
console.log(ch.toString());
// "[xpconnect wrapped (nsISupports, nsIChannel, nsITraceableChannel, nsIUploadChannel)]"
// the variable "ch" is known to implement the four given interfaces at this point.

最佳答案

复制粘贴此内容即可:

// const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
// Cu.import('resource://gre/modules/Services.jsm');

Services.obs.addObserver(httpRequestObserver, "http-on-examine-response", false);

// Services.obs.removeObserver(httpRequestObserver, "http-on-examine-response");
//--------------------------------------------------------

var httpRequestObserver = {
    observe: function(aSubject, aTopic, aData) {
        // if (aTopic == "http-on-examine-response") {} // no need for this, we added observer for `http-on-examine-response` so we know for sure this only triggers for `http-on-examine-response`
        var newListener = new TracingListener();
        aSubject.QueryInterface(Ci.nsITraceableChannel);
        newListener.originalListener = aSubject.setNewListener(newListener);
    }
    /* // what was the point of this block of code?
    ,
    QueryInterface: function(aIID) {
        if (aIID.equals(Ci.nsIObserver) || aIID.equals(Ci.nsISupports)) {
            return this;
        }
        throw Cr.NS_NOINTERFACE;
    }
    */
}

//------------------------------------------------------------

function TracingListener() {}
TracingListener.prototype = {
    onDataAvailable: function(request, context, inputStream, offset, count) {
        console.log('data available');
        this.originalListener.onDataAvailable(request, context, inputStream, offset, count);
    },
    onStartRequest: function(request, context) {
        this.originalListener.onStartRequest(request, context);
    },
    onStopRequest: function(request, context, statusCode) {
        this.originalListener.onStopRequest(request, context, statusCode);
    },
    QueryInterface: function(aIID) {
        if (aIID.equals(Ci.nsIStreamListener) || aIID.equals(Ci.nsISupports)) {
            return this;
        }
        throw Cr.NS_NOINTERFACE;
    }
}

// what the hell? this is not part of an object? why observe colon?
/*
observe: function(aSubject, aTopic, aData) {
    if (aTopic == "http-on-examine-response") {
        var newListener = new TracingListener();
        aSubject.QueryInterface(Ci.nsITraceableChannel);
        newListener.originalListener = aSubject.setNewListener(newListener);
    }
}
*/

// whats with all this junk? is it supposed to be in an observer??
/*
aSubject = aSubject.QueryInterface(Ci.nsIChannel);
var uri = aSubject.URI;
// original URI that was requested before any other resolver steps
// and/or redirects.
var ouri = aSubject.originalURI;

ch = Services.io.newChannel("https://google.com/", null, null);
console.log(ch.toString());
// "[xpconnect wrapped nsIChannel]"

ch.QueryInterface(Ci.nsITraceableChannel);
console.log(ch.toString());
// "[xpconnect wrapped (nsISupports, nsIChannel, nsITraceableChannel)]"

console.log(ch instanceof Ci.nsIUploadChannel);
// true
console.log(ch.toString());
// "[xpconnect wrapped (nsISupports, nsIChannel, nsITraceableChannel, nsIUploadChannel)]"
// the variable "ch" is known to implement the four given interfaces at this point.
*/

更新

有人问我如何获取响应源,所以我从中创建了一个要点:https://gist.github.com/Noitidart/d0b08629ee2804538ad9#file-_ff-addon-snippet-copyofrequestsource-js-L16

关于javascript - nsITraceableChannel,拦截HTTP流量代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31825090/

相关文章:

firefox - 向 Firefox 插件开发人员提出的快速而简单的问题

javascript - 火狐扩展开发 : How to set an observer only once

javascript - 当选项卡 URL 属于文件系统时访问 contentScript 文件时出现问题

javascript - 使用 Addon SDK API 下载许多文件时,Firefox UI 变得无响应

Firefox 插件 : TypeError: getBrowserForTab(. ..) 未定义

javascript - JQuery 日期选择器功能不起作用

javascript - 在标签 <a> 上使用 JS 执行表单

javascript - 存储在嵌套 map /对象中使用的实例

javascript - 自定义右键菜单仅显示在 div 的子级上

javascript - 使用 jQuery 检查复选框时禁用选择元素