我正在编写一个org.springframework.cloud.gateway.filter.GatewayFilter (Spring),它试图使用遵循某种任意协议的响应。响应机构大致如下:
200\n
header1:value1\n
header2:header2\n
\n
<the actual body>其思想是,来自下游服务的整个响应元数据都在响应体中(很像SOAP信封如何封装真实的主体)。网关的客户端应接收修改后的未包装响应。
我一直在遵循ModifyRequestBodyGatewayFilterFactory和ModifyResponseBodyGatewayFilterFactory作为指南的方式,但我认为它们不适合我的用例。
我相信我可以通过返回ServerHttpResponseDecorator的一个子类来实现这一点,但是我还无法理解如何实现:
@Override
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
// unwrap status code
// unwrap headers
// let it continue as usual
}发布于 2019-06-06 10:28:20
我能够做到这一点:
@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。
https://stackoverflow.com/questions/56356428
复制相似问题