部分消耗Publisher <databuffer>

时间:2019-05-29 08:42:19

标签: java spring-webflux project-reactor reactive spring-cloud-gateway

我正在写一个org.springframework.cloud.gateway.filter.GatewayFilter(spring-cloud-gateway),它尝试消耗遵循某种任意协议的响应。响应主体遵循以下原则:

200\n
header1:value1\n
header2:header2\n
\n
<the actual body>

这个想法是,来自下游服务的整个响应元数据都在响应主体中(非常类似于SOAP信封如何封装实体)。网关的客户端应该收到修改后的 unwrapped 响应。

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

我相信我可以通过返回ServerHttpResponseDecorator的子类来实现这一点,但是我还不能全神贯注于如何实现:

@Override
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
   // unwrap status code
   // unwrap headers
   // let it continue as usual 
}

1 个答案:

答案 0 :(得分:0)

我能够通过以下方式实现这一目标:

@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(如果存在)需要重新计算。