我有一个程序化的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中响应?
谢谢, 维塔利。
答案 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(...)
的参数为: