Кодирование GZIP в Джерси 2 / Гризли

Я не могу активировать gzip-кодирование в своем сервисе в Джерси. Это то, что я пробовал:

  1. Начал с архетипа jersey-quickstart-grizzly2 из Руководства по началу работы.

  2. Добавлено rc.register(org.glassfish.grizzly.http.GZipContentEncoding.class);

    (также пробовал rc.register(org.glassfish.jersey.message.GZipEncoder.class);)

  3. Начал с mvn exec:java

  4. Протестировано с curl --compressed -v -o - http://localhost:8080/myapp/myresource

Результат следующий:

> GET /myapp/myresource HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 zlib/1.2.3.4 ...
> Host: localhost:8080
> Accept: */*
> Accept-Encoding: deflate, gzip
> 
< HTTP/1.1 200 OK
< Content-Type: text/plain
< Date: Sun, 03 Nov 2013 08:07:10 GMT
< Content-Length: 7
< 
* Connection #0 to host localhost left intact
* Closing connection #0
Got it!

То есть, несмотря на Accept-Encoding: deflate, gzip в запросе, Content-Encoding: gzip в ответе нет.

Что мне здесь не хватает??


person aioobe    schedule 03.11.2013    source источник


Ответы (2)


Попробуйте код вроде:

HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(
        BASE_URI, rc, false);

CompressionConfig compressionConfig =
        httpServer.getListener("grizzly").getCompressionConfig();
compressionConfig.setCompressionMode(CompressionConfig.CompressionMode.ON); // the mode
compressionConfig.setCompressionMinSize(1); // the min amount of bytes to compress
compressionConfig.setCompressableMimeTypes("text/plain", "text/html"); // the mime types to compress

httpServer.start();
person alexey    schedule 04.11.2013
comment
Кажется, получается! Я думал на Grizzly 2.2.3, поэтому у меня не было CompressConfig, но соответствующие методы были доступны на NetworkListener. Спасибо! - person aioobe; 04.11.2013

Вы также должны зарегистрировать org.glassfish.jersey.server.filter.EncodingFilter. В этом примере включается сжатие deflate и gzip:

import org.glassfish.jersey.message.DeflateEncoder;
import org.glassfish.jersey.message.GZipEncoder;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.filter.EncodingFilter;
...
private void enableCompression(ResourceConfig rc) {
    rc.registerClasses(
            EncodingFilter.class,
            GZipEncoder.class,
            DeflateEncoder.class);
}

Это решение специфично для майки и работает не только с Grizzly, но и с Http-сервером JDK.

person timomeinen    schedule 31.03.2014
comment
Это единственное, что мне было нужно. - person alfonx; 28.06.2018