Sirviendo a un archivo con Netty - respuesta se trunca por un byte
-
27-10-2019 - |
Pregunta
He sirven a los archivos de activos Android a través del servidor de Netty (imágenes, html). archivos de texto, un HTML se guarda como .mp3 para desactivar la compresión (Necesito un InputStream!)
Mi gasoducto está buscando de esta manera:
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));
Mi manejador es:
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
}
Con ese manejador Tengo mi resposes truncados por al menos un byte. Si cambio ChunkedStream
a ChunkedNioFile
(y de usar una is.getChannel()
en lugar de is
como constructor a ella) - todo funciona perfectamente.
Por favor, me ayudan a entender lo que está mal con ChunkedStream.
Solución
Su código es correcto para mí. ¿El FileInputStream regresado de AssetFileDescriptor contiene "todos los bytes"? Usted puede comprobar esto con una prueba de unidad. Si no hay ningún error en él, entonces es un error en Netty. Puedo hacer un uso intensivo de ChunkInputStream y nunca tuvo un problema todavía, pero tal vez lo que realmente depende de la naturaleza de la InputStream.
Sería bueno si usted podría escribir un caso de prueba y abrir un tema en github de Netty.