对服务器服务器的分块请求导致挂起状态

js7*_*758 6 java http chunked-encoding wildfly undertow

我有一个Undertow服务器,我正在运行默认值.我试图发送一个分块请求,当服务器接收块时,输入流服务器端永远不会达到-1状态并挂起.

我已经使用了Undertow服务器的默认值(我曾尝试增加线程数但仍然没有运气).

Undertow server = Undertow.builder()
            .addHttpListener(8080, "localhost")
            .setHandler(new HttpHandler() {
                @Override
                public void handleRequest(final HttpServerExchange exchange) throws Exception {
                    exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
                    exchange.getResponseSender().send("Hello World");
                }
            })
            .setHandler(Handlers.routing().post("/xml", blockingHandler))
            .build();
    server.start();
Run Code Online (Sandbox Code Playgroud)

起初我试图使用普通的httpHandler,但是却引发了错误.

java.lang.IllegalStateException: UT000035: Cannot get stream as startBlocking has not been invoked
Run Code Online (Sandbox Code Playgroud)

经过一些研究后,我使用了Blockoverflow上的建议,然后使用了BlockingHandler.我不再收到上面的错误,但现在处理程序挂起.

这是处理程序的代码(为了清楚起见,我删除了异常处理):

HttpHandler httpHandler = new HttpHandler() {
        @Override
        public void handleRequest(HttpServerExchange exchange) throws Exception {

            StringBuilder builder = new StringBuilder( );

            try(InputStream inputStream = exchange.getInputStream()){

                int line;
                while( ( line = inputStream.read() ) != -1 ) {
                    builder.append( line );
                    System.out.print((char)line);
                }
                exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
                exchange.getResponseSender().send("Chunks Posted");

            } }
Run Code Online (Sandbox Code Playgroud)

我是使用邮递员发送请求如下:

POST /xml HTTP/1.1
Host: localhost:8080
Transfer-Encoding: chunked
Cache-Control: no-cache
Postman-Token: c67e61c0-ce64-4490-9add-f8c37b128fe4

5<CR><LF>
aaaaa<CR><LF>
5<CR><LF>
bbbbb<CR><LF>
0<CR><LF><CR><LF>
Run Code Online (Sandbox Code Playgroud)

当请求与上面的主体一起发送时,数据被正确读取,但看起来inputStream没有关闭,导致挂起.如果我不使用chunked标头发送,则流的行为与预期一致.

我能找到的最接近的问题是:https://issues.jboss.org/browse/WFLY-6671

但无法复制,门票已经关闭.我试图增加工作者io线程的数量,因为下面的文档声明它默认为1,这可能导致挂起其他连接,但仍然没有运气.

我是Undertow和chunking的新手,但基本上我想要创建的是一个服务器,它可以处理大量的XML请求,这些XML请求以块的形式接收并输出到管道,也许是Kafka或像Mongo这样的数据库.

任何帮助都会很棒,因为我无法理解为什么它会挂起并且不了解底部包装流.我认为也许0读入可能意味着流的结束而不是通常的-1,但从我可以看到的情况并非如此.

更新:如果我尝试通过带有-H"Transfer-Encoding:chunked"标志的cURL发送请求,则没有挂起,但是正在读取''标签.尝试转义字符以及删除它们但是表示块结尾的0正被读取为字符.