Частично потребляет Издатель <DataBuffer> - PullRequest
0 голосов
/ 29 мая 2019

Я пишу org.springframework.cloud.gateway.filter.GatewayFilter (spring-cloud-gateway), который пытается использовать ответ, который следует определенному произвольному протоколу.Тело ответа имеет вид:

200\n
header1:value1\n
header2:header2\n
\n
<the actual body>

Идея состоит в том, что все метаданные ответа от нисходящего сервиса находятся в теле ответа (очень похоже на то, как конверт SOAP охватывает реальное тело).Клиент шлюза должен получить измененный развернутый ответ.

Я следовал инструкциям ModifyRequestBodyGatewayFilterFactory и ModifyResponseBodyGatewayFilterFactory, но я не думаю, что они подходят для моего использованияcase.

Я верю, что смогу добиться этого, вернув подкласс ServerHttpResponseDecorator, но пока не могу понять, как приступить к реализации:

@Override
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
   // unwrap status code
   // unwrap headers
   // let it continue as usual 
}

1 Ответ

0 голосов
/ 06 июня 2019

Мне удалось достичь этого с:

@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 необходимо пересчитать, если оно есть.

...