Как определить, кто инициировал HTTP-запрос в Firefox?

105

Я разрабатываю новое дополнение Firefox, которое перехватывает весь сетевой трафик Firefox (запросы http (s) с http-on-modify-request)

С помощью моего текущего кода я могу разделять запросы, поступающие от веб-страниц / вкладок и всех других компонентов (обновления RSS-канала, запросы XHR от компонентов XPCOM, расширений, диспетчера расширений и т. Д.)

Я хотел бы точно определить, кто инициирует запрос, кроме трафика вкладки, а не только для всей группы? (RSS, компоненты XPCOM, расширения, менеджер расширений и т. Д.)

Пример: гипотетическая настраиваемая переменная requestRequestorможет иметь значение для идентификации конкретного дополнения или обновления RSS и т. Д.

Я нашел этот аналогичный вопрос, но без решения.

Текущий код для идентификации всей группы ( получение браузера, запускающего уведомление http-on-modify-request ):

Components.utils.import('resource://gre/modules/Services.jsm');
Services.obs.addObserver(httpObs, 'http-on-modify-request', false);
//Services.obs.removeObserver(httpObs, 'http-on-modify-request'); //uncomment this line, or run this line when you want to remove the observer

var httpObs = {
    observe: function (aSubject, aTopic, aData) {
        if (aTopic == 'http-on-modify-request') {
            /*start - do not edit here*/
            var oHttp = aSubject.QueryInterface(Components.interfaces.nsIHttpChannel); //i used nsIHttpChannel but i guess you can use nsIChannel, im not sure why though
            var interfaceRequestor = oHttp.notificationCallbacks.QueryInterface(Components.interfaces.nsIInterfaceRequestor);
            //var DOMWindow = interfaceRequestor.getInterface(Components.interfaces.nsIDOMWindow); //not to be done anymore because: https://developer.mozilla.org/en-US/docs/Updating_extensions_for_Firefox_3.5#Getting_a_load_context_from_a_request //instead do the loadContext stuff below
            var loadContext;
            try {
                loadContext = interfaceRequestor.getInterface(Components.interfaces.nsILoadContext);
            } catch (ex) {
                try {
                    loadContext = aSubject.loadGroup.notificationCallbacks.getInterface(Components.interfaces.nsILoadContext);
                    //in ff26 aSubject.loadGroup.notificationCallbacks was null for me, i couldnt find a situation where it wasnt null, but whenever this was null, and i knew a loadContext is supposed to be there, i found that "interfaceRequestor.getInterface(Components.interfaces.nsILoadContext);" worked fine, so im thinking in ff26 it doesnt use aSubject.loadGroup.notificationCallbacks anymore, but im not sure
                } catch (ex2) {
                    loadContext = null;
                    //this is a problem i dont know why it would get here
                }
            }
            /*end do not edit here*/
            /*start - do all your edits below here*/
            var url = oHttp.URI.spec; //can get url without needing loadContext
            if (loadContext) {
                var contentWindow = loadContext.associatedWindow; //this is the HTML window of the page that just loaded
                //aDOMWindow this is the firefox window holding the tab
                var aDOMWindow = contentWindow.top.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIWebNavigation).QueryInterface(Ci.nsIDocShellTreeItem).rootTreeItem.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindow);
                var gBrowser = aDOMWindow.gBrowser; //this is the gBrowser object of the firefox window this tab is in
                var aTab = gBrowser._getTabForContentWindow(contentWindow.top); //this is the clickable tab xul element, the one found in the tab strip of the firefox window, aTab.linkedBrowser is same as browser var above //can stylize tab like aTab.style.backgroundColor = 'blue'; //can stylize the tab like aTab.style.fontColor = 'red';
                var browser = aTab.linkedBrowser; //this is the browser within the tab //this is what the example in the previous section gives
                //end getting other useful stuff
            } else {
                Components.utils.reportError('EXCEPTION: Load Context Not Found!!');
                //this is likely no big deal as the channel proably has no associated window, ie: the channel was loading some resource. but if its an ajax call you may end up here
            }
        }
    }
};
интика
источник
9
Ух ты, фантастическая работа здесь, вы видели эту тему: stackoverflow.com/questions/27483651/… Это больше тема, в которую вы можете внести свой вклад. Мне очень интересно узнать, как вы до сих пор определяете источники.
Noitidart
2
Спасибо, братан за вашу ссылку, чем больше у меня информации о запросах firefox и т. Д., Тем больше мой аддон будет лучше, работать над расширенным аддоном безопасности, хотя и непросто (это просто хобби, аддон будет общедоступным;) Я позволю вам знаю на github)
интика
1
Также вот loadContextAndGoodiesфункция, которую я написал, которая может быть улучшена, я написал ее некоторое время назад, но, пожалуйста, улучшите, если возможно. gist.github.com/Noitidart/ ... похоже, вы используете старую версию этого фрагмента в приведенном выше коде, поэтому использование этого фрагмента очистит этот код выше, и фрагмент, вероятно, имеет некоторые улучшения (я не знаю, что я не сравнивал : P)
Noitidart
2
да, я видел ваш код в другом вопросе, просто добавил его и протестировал;) при необходимости
отправлю запрос на перенос
2
спасибо за пиар, я сделал пиар о вашем пр :) gist.github.com/Noitidart/644494bdc26f996739ef#comment-1483890
Noitidart 01

Ответы:

1

По состоянию на июнь 2020 года не существует официального метода / способа достижения фильтрации / идентификации инициатора запросов http.

В настоящее время единственная возможность - это то, что делается в коде вопроса, который разделяет запросы от веб-страниц / вкладок и других компонентов Firefox (обновления каналов, запросы расширений, запросы XHR от компонентов XPCOM и т. Д.).

Как упоминалось в комментариях, это внутреннее ограничение Firefox. Текущий основной код Firefox не реализует отслеживание инициатора запроса и поэтому не знает, кто инициировал запрос и почему. Возможно, будет полезно узнать, что инструменты разработчика Chrome недавно получили эту функцию .

интика
источник