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

时间:2017-01-01 23:11:29

标签: java http wildfly chunked-encoding undertow

我有一个Undertow服务器并运行默认值。 我试图发送一个chunked请求,当服务器接收块时,输入流服务器端永远不会达到-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();

起初我试图使用普通的httpHandler,但是却犯了错误。

java.lang.IllegalStateException: UT000035: Cannot get stream as startBlocking has not been invoked

经过一番研究后,我在stackoverflow上找到了以下建议的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");

            } }

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

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>

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

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

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

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

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

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

0 个答案:

没有答案