Как использовать дефлятор Netty для сжатия ответа, отправленного в браузер - PullRequest
2 голосов
/ 22 декабря 2011

Я пытаюсь использовать компрессор, доступный в netty, добавил следующую строку в конвейер канала

pipeline.addLast("gzip", new HttpContentCompressor());

Я устанавливаю заголовок ответа "Content-Encoding" на "gzip".

Мой вопрос здесь, как установить содержимое, я попробовал следующее

response.setContent(ChannelBuffers.copiedBuffer(responseText, CharsetUtil.UTF_8));

где responseText -> Строка, которую я хочу отправить в браузер.

Я получаю сообщение об ошибке, что содержимое не является потоком gzip

org.jboss.netty.handler.codec.embedder.CodecEmbedderException: org.jboss.netty.handler.codec.compression.CompressionException: ошибка декомпрессии (-3): не поток gzip

Должен ли я сжать responseText, а затем сделать setContent(gzippedResponse)? или я что-то здесь упускаю?

1 Ответ

4 голосов
/ 23 декабря 2011
  • Вам не нужно устанавливать заголовок ответа «Content-Encoding» в «gzip».Нетти делает это для вас.См. HttpContentEncoder от которого наследуется HttpContentCompressor.

  • Вам не нужно gzip responseText.

  • Ваш конвейервыглядеть примерно так:

    // Create a default pipeline implementation.
    ChannelPipeline pipeline = pipeline();
    
    // Decodes ChannelBuffer into HTTP Request message
    pipeline.addLast("decoder", new HttpRequestDecoder());
    
    // Encodes HTTTPRequest message to ChannelBuffer
    pipeline.addLast("encoder", new HttpResponseEncoder());
    
    // Compress
    pipeline.addLast("deflater", new HttpContentCompressor(1));
    
    // Handler to dispatch processing to our services
    pipeline.addLast("handler", new YourHttpRequestHandler());
    
...