部分使用 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 响应。
我一直在关注 ModifyRequestBodyGatewayFilterFactory
和 ModifyResponseBodyGatewayFilterFactory
如何作为指南,但我认为它们不适合我的用例。
我相信我可以通过返回 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
需要重新计算(如果存在)。
我正在写一个 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
}
我是通过以下方式实现的:
@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
需要重新计算(如果存在)。