部分使用 Publisher<DataBuffer>

Partially consuming a Publisher<DataBuffer>

我正在写一个 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 
}

我是通过以下方式实现的:

@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 直到它到达换行符。 return 读取的字节数(即 size)也很重要,因为 Content-Length 需要重新计算(如果存在)。