简体   繁体   English

在Spring Boot中配置Undertow RequestEncodingHandler

[英]Configuring Undertow RequestEncodingHandler in Spring Boot

I am trying to enable request decompressing (gzip) in Undertow. 我试图在Undertow中启用请求解压缩(gzip)。 In the documentation its specified that this is handled by RequestEncodingHandler . 在文档中,它指定了这是由RequestEncodingHandler处理的。 I have created following component in Spring config 我在Spring配置中创建了以下组件

@Component
class UndertowWebServerCustomizer : WebServerFactoryCustomizer<UndertowServletWebServerFactory> {
    override fun customize(factory: UndertowServletWebServerFactory) {
        factory.addDeploymentInfoCustomizers(
            UndertowDeploymentInfoCustomizer { deploymentInfo ->
                deploymentInfo.addInitialHandlerChainWrapper { handler ->
                    RequestEncodingHandler(handler)
                        .addEncoding("gzip", GzipStreamSourceConduit.WRAPPER)
                        .addEncoding("deflate", InflatingStreamSourceConduit.WRAPPER)
                }
            }
        )
    }
}

Looks like Spring is executing this code but when I try to upload gzipped file with Content-Encoding: gzip header I get following error: 看起来Spring正在执行此代码,但是当我尝试使用Content-Encoding: gzip header上传gzipped文件时,我收到以下错误:

14:51:03.378 [XNIO-2 task-1] ERROR io.undertow.request.io - UT005090: Unexpected failure
java.lang.IllegalStateException: UT000091: Buffer has already been freed
    at io.undertow.server.DefaultByteBufferPool$DefaultPooledBuffer.getBuffer(DefaultByteBufferPool.java:260)
    at io.undertow.conduits.InflatingStreamSourceConduit.read(InflatingStreamSourceConduit.java:93)
    at org.xnio.conduits.ConduitStreamSourceChannel.read(ConduitStreamSourceChannel.java:127)
    at io.undertow.channels.DetachableStreamSourceChannel.read(DetachableStreamSourceChannel.java:209)
    at io.undertow.server.HttpServerExchange$ReadDispatchChannel.read(HttpServerExchange.java:2341)
    at org.xnio.channels.Channels.readBlocking(Channels.java:294)
    at io.undertow.servlet.spec.ServletInputStreamImpl.readIntoBuffer(ServletInputStreamImpl.java:192)
    at io.undertow.servlet.spec.ServletInputStreamImpl.close(ServletInputStreamImpl.java:257)
    at io.undertow.servlet.spec.HttpServletRequestImpl.closeAndDrainRequest(HttpServletRequestImpl.java:682)
    at io.undertow.servlet.core.ServletBlockingHttpExchange.close(ServletBlockingHttpExchange.java:89)
    at io.undertow.server.HttpServerExchange.endExchange(HttpServerExchange.java:1624)
    at io.undertow.server.Connectors.executeRootHandler(Connectors.java:385)
    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)

What is the correct way to setup this customization? 设置此自定义的正确方法是什么?

显然发布的代码是正确的,问题是gzipped文件,我正在测试它

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM