Servindo um arquivo com Netty - resposta é truncado por um byte
-
27-10-2019 - |
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.
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.