如何识别是谁在 Firefox 中发起了 http 请求?

我正在开发一个新的 Firefox 插件,它可以通过 http-on-modify-request拦截 Firefox 的所有网络请求

使用我目前的代码,我能够分离来自网页/选项卡和所有其他组件的请求(RSS 提要更新、来自 XPCOM 组件的 XHR 请求、扩展、扩展管理器等)

我想确定谁发起一个请求以外的标签的流量与精确度,而不仅仅是整个组?(RSS、 XPCOM 组件、扩展、扩展管理器等)

例如: 一个假设的自定义变量 requestRequestor将有一个值来标识一个特定的插件或 RSS 更新等。

我发现这个类似的 有个问题,但没有解决方案。

标识整个组(获取触发 http-on-Amendment-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
}
}
}
};
11936 次浏览

As of June 2020, there is no official method/way of achieving http request requester filtering/identification.

Currently the only possibility is what is done on the question's code which is separating requests from web-pages/tabs and the other Firefox's components (feed updates, extensions requests, XHR requests from XPCOM components, etc).

As mentioned on the comments this is an internal limitation of Firefox. The current Firefox's core code does not implement a requester tracking and thus does not know who initiated the request and why. It may be useful to know that Chrome dev tools got recently this feature.