java - 部分消耗 Publisher<DataBuffer>

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

我正在编写一个org.springframework.cloud.gateway.filter.GatewayFilter(spring-cloud-gateway),它尝试使用遵循特定任意协议(protocol)的响应。响应正文的内容如下:

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

这个想法是,来自下游服务的整个响应元数据都在响应主体中(很像 SOAP 信封封装真实主体的方式)。网关的客户端应该收到修改后的解包响应。

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

关于java - 部分消耗 Publisher<DataBuffer>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56356428/

相关文章:

spring - 如何全局处理 Spring WebFlux 中 WebFilter 抛出的错误?

java - 如何在 Spring Web MVC Controller 中利用非阻塞请求

java - 如何将 List<Mono<T>> 转换为 Mono<List<T>>?

java - 我怎样才能在android代码中同时打开手电筒(闪光灯)和后置摄像头

java - 如何更新 Java 8 EA (Windows 8)?

java - FirebaseRecyclerAdapter 不会覆盖 onDataChanged

spring - 执行时间响应式编程

java - 如何检索 Java 中括号内的数字部分?

java - 嵌套的 webflux 路由总是和最上面的路由一起走

Spring Boot WebFlux 测试未找到 MockMvc