¿Cómo identificar quién inició la solicitud http en Firefox?


105

Estoy desarrollando un nuevo complemento de Firefox que intercepta todo el tráfico de red de Firefox (solicitudes http (s) con http-on-modify-request)

Con mi código actual, puedo separar las solicitudes procedentes de páginas web / pestañas y todos los demás componentes (actualizaciones de fuentes RSS, solicitudes XHR de componentes XPCOM, extensiones, administrador de extensiones, etc.)

Me gustaría identificar quién inicia una solicitud que no sea el tráfico de la pestaña con precisión, no solo todo el grupo. (RSS, componentes XPCOM, extensiones, administrador de extensiones, etc.)

Ejemplo: una variable personalizada hipotética requestRequestortendría un valor para identificar un complemento específico o una actualización RSS, etc.

Encontré esta pregunta similar pero sin solución.

El código actual para identificar a todo el grupo ( obteniendo el navegador que activa la notificación http-on-modified-request ) es:

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
Vaya trabajo fantástico aquí, ¿viste este tema? Stackoverflow.com/questions/27483651/… Es más un tema en el que puedes contribuir, estoy muy interesado en ver cómo estás identificando fuentes hasta ahora.
Noitidart

2
Gracias hermano por tu enlace, cuanta más información tenga sobre las solicitudes de Firefox, etc., mejor será mi complemento, trabajar en un complemento de seguridad avanzado, aunque no es fácil (es solo un pasatiempo, el complemento será público;) te dejaré saber en github)
intika

1
También aquí está la loadContextAndGoodiesfunción que escribí que puede mejorar, la escribí hace un tiempo, pero por favor, mejore si es posible. gist.github.com/Noitidart/… parece que estás usando una versión anterior de ese fragmento en tu código anterior, por lo que usar este fragmento limpiaría ese código anterior, y el fragmento probablemente tenga algunas mejoras (no sé que no comparé : P)
Noitidart

2
sí, vi su código en la otra pregunta, solo lo agregué y lo
probé

2
gracias por el PR Hice un PR en su PR :) gist.github.com/Noitidart/644494bdc26f996739ef#comment-1483890
Noitidart

Respuestas:


1

A partir de junio de 2020, no existe un método / forma oficial de lograr el filtrado / identificación del solicitante de solicitud http.

Actualmente, la única posibilidad es lo que se hace en el código de la pregunta, que separa las solicitudes de las páginas web / pestañas y los otros componentes de Firefox (actualizaciones de alimentación, solicitudes de extensiones, solicitudes XHR de componentes XPCOM, etc.).

Como se mencionó en los comentarios, esta es una limitación interna de Firefox. El código central actual de Firefox no implementa un seguimiento de solicitantes y, por lo tanto, no sabe quién inició la solicitud y por qué. Puede ser útil saber que las herramientas de desarrollo de Chrome obtuvieron recientemente esta función .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.