firefox extension: intercepting url it is requesting and blocking conditionally

…衆ロ難τιáo~ 提交于 2019-12-12 07:23:25

问题


in firefox extension I want to intercept the url browser is making request to and block the request entirely if some condition matches

how can I intercept URL being requested


回答1:


you can have a look at the source of those addons

https://addons.mozilla.org/en-us/firefox/addon/blocksite/?src=search https://addons.mozilla.org/en-us/firefox/addon/url-n-extension-blockune-bl/?src=search

or use service observer with nsIHTTPChannel for fast handling

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

var observers = {
    'http-on-modify-request': {
        observe: function (aSubject, aTopic, aData) {
            console.info('http-on-modify-request: aSubject = ' + aSubject + ' | aTopic = ' + aTopic + ' | aData = ' + aData);
            var httpChannel = aSubject.QueryInterface(Ci.nsIHttpChannel);
            var requestUrl = httpChannel.URI.spec
            if (requestUrl.indexOf('google.com') > -1) {
               //httpChannel.cancel(Cr.NS_BINDING_ABORTED); //this aborts the load
               httpChannel.redirectTo(Services.io.newURI('data:text,url_blocked', null, null)); //can redirect with this line, if dont want to redirect and just block, then uncomment this line and comment out line above (line 17)
            }
        },
        reg: function () {
            Services.obs.addObserver(observers['http-on-modify-request'], 'http-on-modify-request', false);
        },
        unreg: function () {
            Services.obs.removeObserver(observers['http-on-modify-request'], 'http-on-modify-request');
        }
    }
};

To start observing

To start start obseving all requests do this (for example on startup of your addon)

for (var o in observers) {
    observers[o].reg();
}

To stop observing

Its important to stop observring (make sure to run this at least on shutdown of addon, you dont want to leave the observer registered for memory reasons)

for (var o in observers) {
    observers[o].unreg();
}

Full working example of the observer service to block/redirect urls: https://github.com/Noitidart/PortableTester/tree/block-urls




回答2:


An other possible solution :

Here is an other implementation as modules example from HTTPS-Everywhere

Init function :

  init: function() {
    // start observing all http requests
    Services.obs.addObserver(httpNowhere, "http-on-modify-request", false);
  },

Observer function :

observe: function(subject, topic, data) {
var request = subject.QueryInterface(Ci.nsIHttpChannel);
  if (topic == "http-on-modify-request") {
    if (request.URI.spec == "xxx.example.com") {
      request.redirectTo("yyy.example.com");
    }
    else {
      request.cancel(Components.results.NS_ERROR_ABORT);
    }
  }
},

Example addons :

HTTPS-Nowhere - https://github.com/cwilper/http-nowhere

HTTPS-Everywhere - https://github.com/EFForg/https-everywhere

Migrating your extension to chrome :

i answered your question for chrome in this page : Chrome Extension : How to intercept requested urls?



来源:https://stackoverflow.com/questions/30585385/firefox-extension-intercepting-url-it-is-requesting-and-blocking-conditionally

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!