我正在写一个org.springframework.cloud.gateway.filter.GatewayFilter
(spring-cloud-gateway),它尝试消耗遵循某种任意协议的响应。响应主体遵循以下原则:
200\n
header1:value1\n
header2:header2\n
\n
<the actual body>
这个想法是,来自下游服务的整个响应元数据都在响应主体中(非常类似于SOAP信封如何封装实体)。网关的客户端应该收到修改后的 unwrapped 响应。
我一直遵循ModifyRequestBodyGatewayFilterFactory
和ModifyResponseBodyGatewayFilterFactory
的指南,但是我认为它们不适合我的用例。
我相信我可以通过返回ServerHttpResponseDecorator
的子类来实现这一点,但是我还不能全神贯注于如何实现:
@Override
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
// unwrap status code
// unwrap headers
// let it continue as usual
}
答案 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
(如果存在)需要重新计算。