何时发出了http-on-examine-response主题?

时间:2015-08-26 23:49:45

标签: firefox-addon firefox-addon-sdk

我正在尝试使用这个相当常见的观察者代码检查Firefox插件中的302响应,但即使在具有302重定向的页面上也几乎不会发出http-on-examine-response

var httpRequestObserver = {
  observe: function (subject, topic, data) {
    console.log(topic)
    if (topic == 'http-on-examine-response') {
      subject.QueryInterface(Ci.nsIHttpChannel);
      try {
        this.handleRequest(subject);
      } catch(error) {
        console.error(error.message)
      }
    }
  },
  handleRequest: function(oHTTP) {
    var uri = oHTTP.URI.asciiSpec;
    console.log(oHTTP.responseStatus, uri);
  }
};
Services.obs.addObserver(httpRequestObserver, 'http-on-modify-request', false);

发布/打印的唯一主题是http-on-modify-request,当您需要响应状态时,这是无用的。我得到这样的错误:

Component returned failure code: 0x80040111 (NS_ERROR_NOT_AVAILABLE) [nsIHttpChannel.responseStatus]

1 个答案:

答案 0 :(得分:0)

当HTTPChannel中尚未提供响应状态时,您似乎正在尝试读取响应状态,尽管这很奇怪。 它在我的requestmod模块(在NPM上可用)中完美运行,它在HTTP通道观察器周围实现类似SDK的包装器,我无法发现代码处理事物的位置不同。

或者我建议使用WebRequest.jsm,它是为扩展使用而设计的。特别是它的onHeadersReceived监听器:https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/WebRequest.jsm#onHeadersReceived

您的代码如下所示:

let { WebRequest } = require("resource://gre/modules/WebRequest.jsm");

WebRequest.onHeadersReceived.addListener(function handleRequest(response) {
  console.log(response.statusCode, response.url);
});

WebRequest.jsm的唯一“缺点”是,它不能与当前稳定版本的Firefox一起使用,但这很快就会改变......

另请注意,卸载扩展时应再次删除侦听器 - 但同样的规则适用于观察者。