Частично потребляет Publisher<DataBuffer>

Я пишу 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 
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
128
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я смог добиться этого с помощью:

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

Другие вопросы по теме