void onData()

in src/main/java/com/twitter/whiskey/net/SpdyStream.java [328:356]


    void onData(ByteBuffer data) throws DataFormatException {

        if (!data.hasRemaining()) return;
        if (!compressed) {
            operation.getBodyFuture().provide(data);
        } else {
            // Set chunk size to twice the next power of 2
            assert(data.remaining() < Integer.MAX_VALUE >> 2);
            int chunkSize = Integer.highestOneBit(data.remaining()) << 2;
            ByteBuffer decompressed = ByteBuffer.allocate(chunkSize);
            inflater.setInput(data.array(), data.arrayOffset() + data.position(), data.remaining());

            int bytesWritten = 0;
            do {
                bytesWritten = inflater.inflate(
                    decompressed.array(), decompressed.arrayOffset() + decompressed.position(), decompressed.remaining());
                decompressed.position(decompressed.position() + bytesWritten);
                if (inflater.getRemaining() > 0 && !decompressed.hasRemaining()) {
                    decompressed.flip();
                    operation.getBodyFuture().provide(decompressed);
                    decompressed = ByteBuffer.allocate(chunkSize);
                }
            } while (!inflater.needsInput() && !inflater.finished());

            decompressed.flip();
            operation.getBodyFuture().provide(decompressed);
            assert(inflater.getRemaining() == 0);
        }
    }