我正在尝试使用这个相当常见的观察者代码检查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]
答案 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一起使用,但这很快就会改变......
另请注意,卸载扩展时应再次删除侦听器 - 但同样的规则适用于观察者。