Обслуживание файла с помощью Netty - ответ усекается на один байт

StackOverflow https://stackoverflow.com/questions/8826529

Вопрос

Я передаю файлы из ресурсов Android через сервер Netty (изображения, html).Текстовые файлы, такие как 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
}

С помощью этого обработчика мои ответы усекаются как минимум на один байт.Если я изменюсь ChunkedStream к ChunkedNioFile (и поэтому используйте is.getChannel() вместо is в качестве конструктора к нему) - все работает отлично.

Пожалуйста, помогите мне понять, что не так с ChunkedStream.

Это было полезно?

Решение

Ваш код мне кажется правильным.Содержит ли возвращенный FileInputStream AssetFileDescriptor «все байты»?Вы можете проверить это с помощью модульного теста.Если в нем нет ошибки, то это ошибка в netty.Я активно использую ChunkInputStream, и у меня еще никогда не было такой проблемы, но, возможно, это действительно зависит от характера InputStream.

Было бы неплохо, если бы вы могли написать тестовый пример и открыть проблему на GitHub Netty.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top