我正在編寫一個(gè)org.springframework.cloud.gateway.filter.GatewayFilter(spring-cloud-gateway),它試圖使用遵循某個(gè)任意協(xié)議的響應(yīng)。響應(yīng)正文遵循以下原則:200\nheader1:value1\nheader2:header2\n\n<the actual body>這個(gè)想法是,來自下游服務(wù)的整個(gè)響應(yīng)元數(shù)據(jù)都在響應(yīng)主體中(很像 SOAP 信封如何封裝實(shí)體)。網(wǎng)關(guān)的客戶端應(yīng)收到修改后的未包裝響應(yīng)。我一直在關(guān)注如何作為指導(dǎo)ModifyRequestBodyGatewayFilterFactory,ModifyResponseBodyGatewayFilterFactory但我認(rèn)為它們不適合我的用例。我相信我可以通過返回 的子類來實(shí)現(xiàn)這一點(diǎn)ServerHttpResponseDecorator,但我還不知道如何著手實(shí)施:@Overridepublic Mono<Void> writeWith(Publisher<? extends DataBuffer> body) { // unwrap status code // unwrap headers // let it continue as usual }
1 回答

慕哥6287543
TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超10個(gè)贊
我能夠通過以下方式實(shí)現(xiàn)這一目標(biāo):
@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直到到達(dá)換行符。返回讀取的字節(jié)數(shù)(即size)也很重要,因?yàn)镃ontent-Length如果存在,則需要重新計(jì)算。
添加回答
舉報(bào)
0/150
提交
取消