ネッティーでファイルをサービング - レスポンスは1バイトで切り捨てられます
-
27-10-2019 - |
質問
私はネッティーサーバ(画像、HTML)を経由してAndroidの資産からファイルを提供しました。 テキストは、このようなHTMLが無効に圧縮.MP3として保存されるファイル(私はInputStreamを必要とする!)
私のパイプラインは次のように探しています:
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));
私のハンドラがあります:
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
}
私は、少なくとも1バイトで切り捨てられた私のresposesを持っているハンドラでは、。私はChunkedStream
にChunkedNioFile
を変更した場合(およびそれにコンストラクタとしてis.getChannel()
の代わりis
を使用) - すべてが完璧に動作します。
は、ヘルプは私がChunkedStreamと間違っているかを理解してください。
解決
あなたのコードは、右の私には見えます。 AssetFileDescriptorの返さFileInputStreamのは、「すべてのバイトを」含まれていますか?あなたはユニットテストでこれを確認することができます。何もそれにバグネッティーでそのAバグが存在しない場合。私はChunkInputStreamを多用すると、まだ、このような問題を抱えていたことはありませんが、多分それは本当にInputStreamの性質に依存します。
あなたはテストケースを書いて、網状のgithubのに問題を開くことができればいいだろう。
所属していません StackOverflow