如何从nsIInputStream中读取响应数据

时间:2014-07-15 13:37:17

标签: firefox firefox-addon firefox-addon-sdk

我正在尝试为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的所有数据。

如果需要更多细节,请告诉我。

提前致谢。

1 个答案:

答案 0 :(得分:3)

我不是流专家,但这是一些做事方式。我推荐下面的方法1,如果你发现问题,那么转到方法2,比如果仍然存在问题,那么研究方法3.方法1绝对是最合适的,因为它遵循了合同协议。

方法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();
    }
};

方法2 - 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);
        }
    }
};

方法3 - 这是我在跟踪侦听器

中使用的另一种方法

这个方法我只是复制粘贴,因为我不太了解它。我在这里使用它: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);