【问题标题】:XPCOM: sniff HTTP responsesXPCOM:嗅探 HTTP 响应
【发布时间】:2011-05-16 03:26:08
【问题描述】:

我想用 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 标头。

谢谢

【问题讨论】:

    标签: firefox xmlhttprequest xpcom


    【解决方案1】:

    您还可以使用http-on-modify-requesthttp-on-examine-response 通知。见https://developer.mozilla.org/en/XUL_School/Intercepting_Page_Loads#HTTP_Observers

    【讨论】:

      【解决方案2】:

      您可以通过 nsIHttpActivityObserver 嗅探所有 http 流量,这是从 Firefox Web 控制台抄录的示例:

      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

      【讨论】:

        猜你喜欢
        • 2013-12-07
        • 2011-02-23
        • 1970-01-01
        • 1970-01-01
        • 2017-02-14
        • 2012-10-15
        • 2014-01-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多