http-on-examine-response 主题何时发布?

When is the http-on-examine-response topic issued?

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

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);

唯一的主题 issued/printed 是 http-on-modify-request,当您想要响应状态时,它是无用的。我收到这样的错误:

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

抱歉,意大利面复制错误。 addObserver 方法的第二个参数应该是您希望在

上收到通知的主题
Services.obs.addObserver(httpRequestObserver, 'http-on-examine-response', false);

您似乎在尝试读取 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 唯一的 "drawback" 是,它不适用于当前稳定版本的 Firefox,但很快就会改变...

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