使用HTTP-on-modify-request重定向URL

Use HTTP-on-modify-request to redirect URL

本文关键字:URL 重定向 HTTP-on-modify-request 使用      更新时间:2023-09-26

我正在为Firefox构建一个附加组件,如果URL符合某些条件,则将请求重定向到新的URL。我试过了,但是没有效果。

我在HTTP-on-modify-request上注册一个观察者来处理URL,如果URL符合我的条件,我将重定向到一个新的URL。

下面是我的代码:
var Cc = Components.classes;
var Ci = Components.interfaces;
var Cr = Components.results;
var newUrl = "https://google.com";
function isInBlacklist(url) {
// here will be somemore condition, I just use youtube.com to test
    if (url.indexOf('youtube.com') != -1) {
        return true;
    }
    return false;
}
exports.main = function(options,callbacks) {
// Create observer
httpRequestObserver =
{
    observe: function (subject, topic, data) {
        if (topic == "http-on-modify-request") {
            var httpChannel = subject.QueryInterface(Ci.nsIHttpChannel);
            var uri = httpChannel.URI;
            var domainLoc = uri.host;
            if (isInBlacklist(domainLoc) === true) {
                httpChannel.cancel(Cr.NS_BINDING_ABORTED);
                var gBrowser = utils.getMostRecentBrowserWindow().gBrowser;
                var domWin = channel.notificationCallbacks.getInterface(Ci.nsIDOMWindow);
                var browser = gBrowser.getBrowserForDocument(domWin.top.document);
                browser.loadURI(newUrl);
            }
        }
    },
    register: function () {
        var observerService = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
        observerService.addObserver(this, "http-on-modify-request", false);
    },
    unregister: function () {
        var observerService = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
        observerService.removeObserver(this, "http-on-modify-request");
    }
};
//register observer
httpRequestObserver.register();
};
exports.onUnload = function(reason) {
    httpRequestObserver.unregister();
};

我是Firefox插件开发新手。

您可以通过调用nsIHttpChannel.redirectTo来重定向通道。一旦通道打开,这是不可能的,但在http-on-modify-request中它将工作。

在你的代码中,你可以这样做:
Cu.import("resource://gre/modules/Services.jsm");
// ...
if (condition) {
  httpChannel.redirectTo(
    Services.io.newURI("http://example.org/", null, null));
}

看起来你可能正在使用附加SDK。在这种情况下,阅读使用Chrome权限。

你可以直接做一个

httpChannel.URI.spec = newUrl;
不是

httpChannel.cancel(Cr.NS_BINDING_ABORTED);
...
browser.loadURI(newUrl);

不确定在您的情况下如何"安全",因为我不完全确定请求中的其他标头(例如Cookie)如何在此阶段更改URL指向完全不同的域时被操纵。