Я пытаюсь реализовать потоковый прокси. Я столкнулся с проблемой с WebClient из Spring Reactive.
Может ли кто-нибудь помочь мне понять, я ошибаюсь или это просто ошибка со стороны WebClient?
Стек:
response-netty 0.7.8.RELEASE
Spring-boot 2.0.4.RELEASE
Desc:
Я хочу передать длинный поток внешней службе, а затем переслать поток ответов запрашивающей стороне. Потоковая передача осуществляется с использованием фрагментов (HTTP 1.1 Transfer-Encoding: фрагментировано). Внешний сервис обрабатывает каждый чанк и отправляет результат ответа.
Ожидаемое поведение:
WebClient должен немедленно прочитать каждую полученную часть ответа.
Фактическое поведение:
WebClient не запускает процесс ответа до тех пор, пока запись запроса не будет завершена.
Код:
return client
.post()
.header("Transfer-Encoding", "chunked")
//because I want to flush each received part
.body((outputMessage, context) -> outputMessage.writeAndFlushWith(
request.body(BodyExtractors.toDataBuffers())
.map(dataBuffer -> Mono.just(dataBuffer))))
.exchange()
.flatMap(clientResponse -> {
ServerResponse.BodyBuilder bodyBuilder = ServerResponse.status(clientResponse.statusCode());
bodyBuilder.contentType(MediaType.APPLICATION_STREAM_JSON);
return bodyBuilder.body((outputMessage, context) ->
outputMessage.writeAndFlushWith(
clientResponse.body(BodyExtractors.toDataBuffers())
.map(dataBuffer -> Mono.just(dataBuffer))
));}
);