在 Undertow 中读取 POST 请求而不使用它



在Undertow中,我有两个链式处理程序:

  1. 第一个处理程序读取请求,然后通过next.handleRequest(exchange);调用第二个处理程序
  2. 第二个处理程序是一个代理处理程序,它将请求发送到处理请求的外部服务器。

我的问题是读取请求的第一个处理程序。请求标头没什么大不了的,但是获取 POST 请求的正文数据是一个问题。

问题"如何在处理程序中正确读取 POST 请求正文?"中使用处理程序链接不再工作的请求正文 su 中所示的现有解决方案。

如何读取请求正文数据而不使用它或以处理程序链之后不起作用的方式更改请求?

我发现了问题,最后是缺少ByteBuffer.flip()的调用。

如果有人需要这样的 POST 数据读取器,可以使用以下简化的AbstractStreamSourceConduit实现,该能够在不消耗的情况下读取传入的 POST 数据:

exchange.addRequestWrapper(new ConduitWrapper<StreamSourceConduit>() {
@Override
public StreamSourceConduit wrap(ConduitFactory<StreamSourceConduit> factory, HttpServerExchange exchange) {
StreamSourceConduit source = factory.create();
return new AbstractStreamSourceConduit<StreamSourceConduit>(source) {
ByteArrayOutputStream bout = new ByteArrayOutputStream(8192);
@Override
public int read(ByteBuffer dst) throws IOException {
int x = super.read(dst);
if (x >= 0) {
ByteBuffer dup = dst.duplicate();
dup.flip();
byte[] data = new byte[x];
dup.get(data);
bout.write(data);
} else {
// end of stream reached
byte[] data = bout.toByteArray();
// ... to something with data
}
return x;
}
};
}
});

相关内容

  • 没有找到相关文章

最新更新