6

我有一个程序化的 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();

我想知道在 Undertow 中一个 gzip 服务器如何响应?

谢谢,维塔利。

4

3 回答 3

9

我必须查看GzipContentEncodingTestCaseUndertow 的源代码才能使其正常工作。必须使用适当的参数创建一个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();
于 2015-02-04T19:31:14.727 回答
4

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

于 2017-10-19T18:46:05.327 回答
2

对我个人有帮助的一个非常有趣的链接是:使用 Undertow 将压缩添加到 Server-Sent 事件。@siphiuel提供的EncodingHandler中用到的所有参数都一一说明。

例如,这里是 gzip 压缩的快速摘要。的参数addEncodingHandler(...)是:

  • 类型(“gzip”)
  • 要应用的 EncodingProvider(Undertow 提供了 deflate 和 gzip 的实现)
  • 优先级(可以申请多个提供商,所以优先级将用于选择要申请的提供商)
  • 激活编码的谓词(在@siphiuel 的示例中,只有内容大小> 5 字节的响应才会被编码 - 在我分享的链接中提到了 5 KB,但我的测试证明它是 5 字节)。
于 2017-01-18T15:02:39.163 回答