首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >部分消费Publisher<DataBuffer>

部分消费Publisher<DataBuffer>
EN

Stack Overflow用户
提问于 2019-05-29 08:42:18
回答 1查看 280关注 0票数 0

我正在编写一个org.springframework.cloud.gateway.filter.GatewayFilter (Spring),它试图使用遵循某种任意协议的响应。响应机构大致如下:

代码语言:javascript
运行
复制
200\n
header1:value1\n
header2:header2\n
\n
<the actual body>

其思想是,来自下游服务的整个响应元数据都在响应体中(很像SOAP信封如何封装真实的主体)。网关的客户端应接收修改后的未包装响应。

我一直在遵循ModifyRequestBodyGatewayFilterFactoryModifyResponseBodyGatewayFilterFactory作为指南的方式,但我认为它们不适合我的用例。

我相信我可以通过返回ServerHttpResponseDecorator的一个子类来实现这一点,但是我还无法理解如何实现:

代码语言:javascript
运行
复制
@Override
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
   // unwrap status code
   // unwrap headers
   // let it continue as usual 
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-06 10:28:20

我能够做到这一点:

代码语言:javascript
运行
复制
@Override
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
   return Mono.from(body).flatMap { buffer -> 
      val size = readUtf8Line(buffer)
      // recompute 'Content-Length', if applicable

      super.writeWith(Mono.just(buffer))
   }
}

readUtf8Line只是我自己的方法,它会消耗DataBuffer,直到到达中断行为止。返回读取的字节数(即size)也很重要,因为如果存在的话,需要重新计算Content-Length

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56356428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档