压缩Undertow服务器响应

时间:2015-02-03 09:45:37

标签: java http-compression undertow

我有一个程序化的Undertow服务器设置。静态内容也由Undertow提供,没有反向代理。 Undertow启动的Java代码如下所示:

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中响应?

谢谢, 维塔利。

3 个答案:

答案 0 :(得分:8)

我必须在Undertow的来源中查看GzipContentEncodingTestCase才能让它发挥作用。必须使用适当的参数创建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();

答案 1 :(得分:2)

来自@siphiuel的回答对我来说是正确的。

但是,具有GZIP编码的EncodingHandler也可以如下创建:

    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包装/链接。

答案 2 :(得分:0)

一个非常有趣的链接帮助我个人:Add compression to Server-Sent events with Undertow。 @siphiuel提供的EncodingHandler中使用的所有参数都是逐一解释的。

以下是gzip压缩的快速摘要。 addEncodingHandler(...)的参数为:

  • 类型(“gzip”)
  • 要应用的EncodingProvider(Undertow提供deflate和gzip的实现)
  • 优先级(可以应用多个提供商,因此优先级将用于选择要应用的提供商)
  • 用于激活编码的谓词(在@ siphiuel的示例中,只有内容大小> 5字节的响应才会被编码 - 在我分享的链接中提到的5 KB但我的测试已经证明这是5字节)。