2015-02-03 3 views
5

У меня есть программная настройка сервера Undertow. Статический контент также подает Undertow, без обратного прокси. Java-код для запуска прибойного выглядит следующим образом:Сжатие ответов сервера Undertow

ResourceManager resourceManager = 
    new FileResourceManager(new File("deploymentDir"), 100); 

DeploymentInfo servletBuilder = Servlets.deployment() 
     .setResourceManager(resourceManager) 
     .setDeploymentName("testDeployment") 
     .setContextPath("/"); 

DeploymentManager manager = Servlets.defaultContainer() 
     .addDeployment(servletBuilder); 
manager.deploy(); 

Undertow.Builder builder = Undertow.builder(); 
builder.addHttpListener(8080, domainName); 

PathHandler path = Handlers.path(Handlers.redirect("/")) 
     .addPrefixPath("/", manager.start()); 

Undertow server = builder.setHandler(path).build(); 
server.start(); 

мне интересен, как делает ответы сервера один GZIP в Undertow?

Thanks, Vitaliy.

ответ

8

Мне нужно было посмотреть GzipContentEncodingTestCase в источнике Undertow, чтобы заставить его работать. Нужно создать EncodingHandler с соответствующими параметрами, а затем вызвать setNext() таким образом, чтобы цепь его к PathHandler:

PathHandler path = Handlers.path(Handlers.redirect("/")) 
    .addPrefixPath("/", manager.start()); 

final EncodingHandler handler = 
    new EncodingHandler(new ContentEncodingRepository() 
     .addEncodingHandler("gzip", 
      new GzipEncodingProvider(), 50, 
      Predicates.parse("max-content-size[5]"))) 
     .setNext(path); 

// ... 
Undertow server = builder.setHandler(handler).build(); 
0

Очень интересную ссылку, которая помогла мне лично: Add compression to Server-Sent events with Undertow. Все параметры, используемые в EncodingHandler, предоставляемые @siphiuel, объясняются один за другим.

Вот краткое резюме для сжатия gzip, например. параметры addEncodingHandler(...) будет:

  • типа («GZIP»)
  • EncodingProvider применять (Undertow обеспечивает реализацию для Deflate и Gzip)
  • приоритет (несколько провайдеров могут быть применены, так приоритет будет использоваться, чтобы выбрать поставщика для подачи заявки)
  • предикат для активации кодировки (в примере @ siphiuel только ответы с размером содержимого> 5 байтов будут закодированы - в ссылке, которую я поделил, упомянуто 5 КБ, но мои тесты доказали, что это 5 байт).
0

Ответ от @siphiuel выглядит корректно для меня.

Однако EncodingHandler с кодированием GZIP также могут быть созданы, как показано ниже:

HttpHandler pathHandler = Handlers.path(Handlers.redirect("/")) 
     .addPrefixPath("/", exchange -> exchange.getResponseSender().send("echo")); 

    HttpHandler encodingHandler = new EncodingHandler.Builder().build(null) 
     .wrap(pathHandler); 

    Undertow server = Undertow.builder() 
     .addHttpListener(8080, "localhost") 
     .setHandler(encodingHandler).build(); 
    server.start(); 

EncodingHandler обеспечивает HandlerBuilder, что по умолчанию добавляет GzipEncodingProvider и DeflateEncodingProvider с использованием конфигурации по умолчанию. Таким образом, ваш код не связан с конструктором и его параметрами для создания EncodingHandler.

Кроме того, HandlerBuilder # build возвращает HandlerWrapper для плавного переноса/цепочки HttpHandler.

Смежные вопросы