Pergunta

Eu servindo uns arquivos de ativos Android via servidor Netty (imagens, html). arquivos de texto tal html é salva como .mp3 para desativar a compactação (Eu preciso de um InputStream!)

Meu gasoduto é parecido com isto:

    pipeline.addLast("decoder", new HttpRequestDecoder());
    pipeline.addLast("aggregator", new HttpChunkAggregator(65536));
    pipeline.addLast("encoder", new HttpResponseEncoder());
    pipeline.addLast("chunkedWriter", new ChunkedWriteHandler());

    pipeline.addLast("handler", new AssetsServerHandler(context));

O meu manipulador é:

public class AssetsServerHandler extends SimpleChannelUpstreamHandler {

    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {

        // some checks

        final FileInputStream is;
        final AssetFileDescriptor afd;
        try {
            afd = assetManager.openFd(path);
            is = afd.createInputStream();   
        } catch(IOException exc) {
            sendError(ctx, NOT_FOUND);
            return;
        }

        final long fileLength = afd.getLength();

        HttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK);
        setContentLength(response, fileLength);

        final Channel ch = e.getChannel();
        final ChannelFuture future;
        ch.write(response);
        future = ch.write(new ChunkedStream(is));
        future.addListener(new ChannelFutureListener() {
            @Override
            public void operationComplete(ChannelFuture future) throws Exception {
                future.getChannel().close();
            }
        });
        if (!isKeepAlive(request)) {
            future.addListener(ChannelFutureListener.CLOSE);
        }
    }
    // other stuff
}

Com esse manipulador Eu tenho o meu resposes truncado por pelo menos um byte. Se eu mudar ChunkedStream para ChunkedNioFile (e assim usar um is.getChannel() vez de is como um construtor para ele) - tudo funciona perfeitamente.

Por favor, ajuda-me a entender o que está errado com ChunkedStream.

Foi útil?

Solução

Seu código parece certo para mim. Será que o FileInputStream retornou de AssetFileDescriptor conter "todos os bytes"? Você pode verificar isso com um teste de unidade. Se não houver um bug nele, então é um bug no netty. I fazem uso pesado de ChunkInputStream e nunca tive um problema tão grande ainda, mas talvez ele realmente depende da natureza do InputStream.

Seria bom se você pudesse escrever um caso de teste e abrir um problema no github do netty.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top