我正在尝试为firefox创建一个类似fire-bug的扩展名,这实际上是dev-tool扩展。我已注册httpRequestObserver
来观察http-on-examine-response
事件。我有一个监听器,实现了以下方法。
onDataAvailable: function(request, context, inputStream, offset, count) {
//I get the request URL using request.name
//What I need to do is fetch response data from inputStream
}
我已阅读文档here,但仍无法弄清楚。
我正在寻找一种方法来读取inputStream
的所有数据。
如果需要更多细节,请告诉我。
提前致谢。
答案 0 :(得分:3)
我不是流专家,但这是一些做事方式。我推荐下面的方法1,如果你发现问题,那么转到方法2,比如果仍然存在问题,那么研究方法3.方法1绝对是最合适的,因为它遵循了合同协议。
nsIScriptableScream
read
保持一个全局缓冲区并在启动请求中将其空白,并在可用数据上填充它。
var ScriptableInputStream = CC("@mozilla.org/scriptableinputstream;1", "nsIScriptableInputStream", "init");
var blah = {
data: '',
onStartRequest: function (aRequest, aContext) {
this.data = '';
},
onDataAvailable: function(request, context, inputStream, offset, count) {
var scriptStream = new ScriptableInputStream(inputStream);
this.data += scriptStream.read(count);
scriptStream.close();
}
};
nsIBinaryInputStream
readBytes
我不知道这个readBytes
方法有什么优势,也可能是你也可以将此方法用于图像,而上述方法不会读取我不确定的图像。此方法还包含一个全局缓冲区,并在启动请求中将其空白,并在可用数据上填充它。另一个优点可能是您不需要close
二进制输入流,但我不确定这一点。我认为它没有合同,所以你可以重复使用它。
var bstream = Cc["@mozilla.org/binaryinputstream;1"].createInstance(Ci.nsIBinaryInputStream);
var blah = {
data: '',
onStartRequest: function (aRequest, aContext) {
this.data = '';
},
onDataAvailable: function(request, context, inputStream, offset, count) {
bstream.setInputStream(inputStream);
var size = 0;
while(size = bstream.available()) {
this.data.value += bstream.readBytes(size);
}
}
};
这个方法我只是复制粘贴,因为我不太了解它。我在这里使用它:GitHub :: Noitidart / demo-nsITraceableChannel #L120
function CCIN(cName, ifaceName) {
return Cc[cName].createInstance(Ci[ifaceName]);
}
TracingListener.prototype =
{
onDataAvailable: function(request, context, inputStream, offset, count)
{
var binaryInputStream = CCIN("@mozilla.org/binaryinputstream;1",
"nsIBinaryInputStream");
var storageStream = CCIN("@mozilla.org/storagestream;1", "nsIStorageStream");
var binaryOutputStream = CCIN("@mozilla.org/binaryoutputstream;1",
"nsIBinaryOutputStream");
binaryInputStream.setInputStream(inputStream);
storageStream.init(8192, count, null);
binaryOutputStream.setOutputStream(storageStream.getOutputStream(0));
// Copy received data as they come.
var data = binaryInputStream.readBytes(count);
this.receivedData.push(data);
binaryOutputStream.writeBytes(data, count);
this.originalListener.onDataAvailable(request, context, storageStream.newInputStream(0), offset, count);