XPCOM: анализ HTTP-ответов - PullRequest
       22

XPCOM: анализ HTTP-ответов

2 голосов
/ 26 ноября 2010

Я хотел бы написать небольшой компонент с XPCOM, который может прослушивать все HTTP-ответы, полученные браузером. Прямо сейчас единственные примеры, которые я могу найти (например, приведенный ниже), позволяют мне только получить ответ на запрос, который я запускаю сам:

var req = new XMLHttpRequest();  
req.open('GET', 'http://www.mozilla.org/', true);  
req.onreadystatechange = function (aEvt) {  
if (req.readyState == 4) {  
    if(req.status == 200)  
        dump(req.responseText);  
        else  
        dump("Error loading page\n");  
    }  
};

Я хочу, чтобы для любого ответа HTTP, полученного браузером, были получены заголовки HTTP соответствующего запроса.

Спасибо

Ответы [ 2 ]

1 голос
/ 21 января 2011

Вы также можете использовать уведомления http-on-modify-request и http-on-examine-response. Смотри https://developer.mozilla.org/en/XUL_School/Intercepting_Page_Loads#HTTP_Observers

0 голосов
/ 01 декабря 2010

Вы можете прослушать весь http-трафик через nsIHttpActivityObserver, пример, извлеченный из веб-консоли Firefox:

const Cc = Components.classes;
Cu.import("resource://gre/modules/XPCOMUtils.jsm");

XPCOMUtils.defineLazyServiceGetter(this, "activityDistributor",
                                       "@mozilla.org/network/http-activity-distributor;1",
                                       "nsIHttpActivityDistributor");

    let httpTrafficObserver = {

      /**
       * Begin observing HTTP traffic that we care about,
       * namely traffic that originates inside any context that a Heads Up Display
       * is active for.
       */
      startHTTPObservation: function httpObserverFactory()
      {
        // creates an observer for http traffic
        var self = this;
        var httpObserver = {
          observeActivity :
          function observeActivity(aChannel,
                                   aActivityType,
                                   aActivitySubtype,
                                   aTimestamp,
                                   aExtraSizeData,
                                   aExtraStringData)
          {
            if (aActivityType ==
                  activityDistributor.ACTIVITY_TYPE_HTTP_TRANSACTION ||
                aActivityType ==
                  activityDistributor.ACTIVITY_TYPE_SOCKET_TRANSPORT) {

              aChannel = aChannel.QueryInterface(Ci.nsIHttpChannel);

              let transCodes = this.httpTransactionCodes;

              if (aActivitySubtype ==
                  activityDistributor.ACTIVITY_SUBTYPE_REQUEST_HEADER ) {

                let httpActivity = {
                  url: aChannel.URI.spec,
                  method: aChannel.requestMethod,
                  channel: aChannel
                };

              }
            }
          },

          httpTransactionCodes: {
            0x5001: "REQUEST_HEADER",
            0x5002: "REQUEST_BODY_SENT",
            0x5003: "RESPONSE_START",
            0x5004: "RESPONSE_HEADER",
            0x5005: "RESPONSE_COMPLETE",
            0x5006: "TRANSACTION_CLOSE",

            0x804b0003: "STATUS_RESOLVING",
            0x804b0007: "STATUS_CONNECTING_TO",
            0x804b0004: "STATUS_CONNECTED_TO",
            0x804b0005: "STATUS_SENDING_TO",
            0x804b000a: "STATUS_WAITING_FOR",
            0x804b0006: "STATUS_RECEIVING_FROM"
          }
        };

        this.httpObserver = httpObserver;

        activityDistributor.addObserver(httpObserver);
      }

    };

и http://mxr.mozilla.org/mozilla-central/source/netwerk/protocol/http/nsIHttpActivityObserver.idl

...