Làm thế nào để xác định ai đã khởi tạo yêu cầu http trong Firefox?


105

Tôi đang phát triển một addon Firefox mới chặn tất cả các yêu cầu về lưu lượng mạng của Firefox ((các) http với http-on-modify-request)

Với mã hiện tại của mình, tôi có thể tách các yêu cầu đến từ các trang / tab và tất cả các thành phần khác (cập nhật nguồn cấp RSS, yêu cầu XHR từ các thành phần XPCOM, tiện ích mở rộng, trình quản lý tiện ích mở rộng, v.v.)

Tôi muốn xác định ai là người khởi xướng yêu cầu ngoài lưu lượng truy cập của tab với độ chính xác không chỉ toàn bộ nhóm? (RSS, thành phần XPCOM, phần mở rộng, trình quản lý phần mở rộng, v.v.)

Ví dụ: một biến tùy chỉnh giả định requestRequestorsẽ có giá trị để xác định một phần bổ trợ cụ thể hoặc bản cập nhật RSS, v.v.

Tôi tìm thấy câu hỏi tương tự này nhưng không có giải pháp.

Mã hiện tại để xác định toàn bộ nhóm ( nhận trình duyệt kích hoạt thông báo http-on-mod-request ) là:

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
Thật tuyệt vời ở đây, bạn có thấy chủ đề này không: stackoverflow.com/questions/27483651/… Nó là một chủ đề mà bạn có thể đóng góp, tôi rất quan tâm đến cách bạn xác định nguồn cho đến nay.
Noitidart

2
Cảm ơn người anh em vì liên kết của bạn, tôi càng có nhiều thông tin hơn về các yêu cầu firefox, v.v. thì addon của tôi sẽ càng tốt hơn, làm việc trên một addon bảo mật nâng cao, không dễ dàng chút nào, (nó chỉ là sở thích mà addon sẽ được công khai;) Tôi sẽ cho phép bạn biết trên github)
intika

1
Ngoài ra, đây là một loadContextAndGoodieschức năng tôi đã viết có thể sử dụng một số cải tiến, tôi đã viết nó một lúc trước nhưng hãy nâng cao nếu có thể. gist.github.com/Noitidart/… dường như bạn đang sử dụng phiên bản cũ hơn của đoạn mã đó trong đoạn mã của bạn ở trên, vì vậy việc sử dụng đoạn mã này sẽ xóa sạch đoạn mã đó ở trên và đoạn mã có thể có một số cải tiến (tôi không biết mình không so sánh : P)
Noitidart

2
yeah tôi thấy mã của bạn trong câu hỏi khác chỉ cần thêm nó và thử nghiệm nó;) sẽ gửi một yêu cầu kéo nếu cần thiết;)
intika

2
cảm ơn cho PR tôi đã làm một pr trên của bạn pr :) gist.github.com/Noitidart/644494bdc26f996739ef#comment-1483890
Noitidart

Câu trả lời:


1

Kể từ tháng 6 năm 2020, không có phương pháp / cách thức chính thức nào để đạt được lọc / nhận dạng người yêu cầu http.

Hiện tại, khả năng duy nhất là những gì được thực hiện trên mã của câu hỏi đang tách các yêu cầu từ các trang / tab và các thành phần khác của Firefox (cập nhật nguồn cấp dữ liệu, yêu cầu tiện ích mở rộng, yêu cầu XHR từ các thành phần XPCOM, v.v.).

Như đã đề cập ở trên, đây là một hạn chế nội bộ của Firefox. Mã lõi của Firefox hiện tại không thực hiện theo dõi người yêu cầu và do đó không biết ai đã khởi xướng yêu cầu và tại sao. Có thể hữu ích khi biết rằng các công cụ dành cho nhà phát triển Chrome gần đây đã có tính năng này .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.