Я пишу org.springframework.cloud.gateway.filter.GatewayFilter
(весенний облачный шлюз), который пытается использовать ответ, соответствующий определенному произвольному протоколу. Тело ответа идет по строкам:
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
}
Я смог добиться этого с помощью:
@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
необходимо пересчитать, если он присутствует.