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正被读取为字符.
| 归档时间: |
|
| 查看次数: |
887 次 |
| 最近记录: |