Firefoxで誰がhttpリクエストを開始したかを特定する方法は?


105

Firefoxのすべてのネットワークトラフィックをインターセプトする新しいFirefoxアドオンを開発しています(http(s)リクエストでhttp-on-modify-request

現在のコードでは、Webページ/タブと他のすべてのコンポーネント(RSSフィードの更新、XPCOMコンポーネント、拡張機能、拡張機能マネージャーなどからのXHR要求)からの要求を分離できます。

グループ全体だけでなく、タブのトラフィック以外のリクエストを開始したのは誰かを正確に特定したいですか?(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 2015年

2
あなたのリンクに感謝します。Firefoxのリクエストなどに関する情報が多ければ多いほど、私のアドオンはより良くなり、高度なセキュリティアドオンに取り組んでいますが、簡単ではありません(これは、アドオンが公開される趣味です;) githubで知っている)
intika 2015年

1
また、loadContextAndGoodiesこれは私が書いた関数で、いくつかの改善を使用できます。少し前に書きましたが、可能であれば拡張してください。gist.github.com/Noitidart/…上記のコードでそのスニペットの古いバージョンを使用しているようです。したがって、このスニペットを使用すると、上記のコードがクリーンアップされ、スニペットにはおそらくいくつかの拡張機能があります(比較しなかったのかわかりません) :P)
Noitidart 2015年

2
ええ、他の質問であなたのコードを追加してテストしました;)必要に応じてプルリクエストを投稿します;)
intika 2015年

2
PRに感謝します私はあなたのPRでPRをしました:)gist.github.com/Noitidart/644494bdc26f996739ef#comment-1483890
Noitidart 2015

回答:


1

2020年6月の時点で、httpリクエストリクエスターのフィルタリング/識別を実現する公式の方法/方法はありません。

現在のところ、唯一の可能性は、Webページ/タブおよび他のFirefoxのコンポーネント(フィードの更新、拡張機能のリクエスト、XPCOMコンポーネントからのXHRリクエストなど)からリクエストを分離する質問のコードで行われることです。

コメントで述べたように、これはFirefoxの内部制限です。現在のFirefoxのコアコ​​ードはリクエスターの追跡を実装していないため、誰がリクエストを開始したのか、そしてその理由はわかりません。Chrome開発ツールが最近この機能を備えていることを知っておくと便利かもしれません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.