Serving eine Datei mit Netty - Antwort wird durch ein Byte abgeschnitten
-
27-10-2019 - |
Frage
Ich habe ein Dateien von Android Assets über Netty Server dient (Bilder, HTML). Text-Dateien so ein html als .mp3 zu deaktivieren Kompression gespeichert wird (Ich brauche einen Inputstream!)
Meine Pipeline wird wie folgt aussehen:
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));
Mein Handler ist:
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
}
Mit diesem Handler ich habe meine resposes abgeschnitten bekam von mindestens einem Byte. Wenn ich ChunkedStream
zu ChunkedNioFile
ändern (und verwenden Sie so eine is.getChannel()
statt is
als Konstrukteur, um es) - alles perfekt funktioniert.
Bitte, mir helfen verstehen, was mit ChunkedStream falsch ist.
Lösung
Ihr Code sieht mir recht. Ist der zurückgegebene Fileinputstream von AssetFileDescriptor enthalten „alle die Bytes“? Sie können dies überprüfen, mit einem Gerät zu testen. Wenn es in ihm keinen Fehler dann in netty seinem Bug. Ich mache die starke Nutzung von ChunkInputStream und hatte nie ein solches Problem noch nicht, aber vielleicht ist es hängt wirklich von der Art des Input.
Wäre schön, wenn Sie einen Testfall schreiben könnte und öffnen Sie ein Problem bei netty der Github.