Попытка загрузить файл через Spring-Cloud-Gateway и RestController

Я пытаюсь загрузить (PUT) файл через шлюз с весенней загрузкой, перенаправляя запрос на внутренний RestController (см. DemoController.java). Я могу прочитать данные, но соединение остается открытым. Маршруты шлюза настраиваются через application.yml.

Демо-код и запросы curl можно найти по адресу: https://github.com/knottnhupfer/spring-boot-reactive-gateway-demo

Запустите приложение весенней загрузки и вызовите:

curl --user user:secret -v http://localhost:8080/api/testing/README.md \
     --upload-file README.md

ОБНОВИТЬ:

Тем временем я могу прочитать файл, но соединение на стороне сервера не закрывается. Это нормальное реактивное поведение, и мне нужно активно закрыть соединение? Я понял, что упаковка его с помощью Mono закрывает соединение, но больше не читает данные.

В настоящее время метод RestController выглядит так:

@PutMapping(value = "/{value}/**", consumes = "application/octet-stream")
public  Mono<ResponseEntity>  putArtifact(ServerHttpRequest request,
   @RequestBody ByteArrayResource resource, @PathVariable("value") String value) {
   [...]
}

Спасибо заранее

/Дэйвид


person David M.    schedule 10.09.2019    source источник


Ответы (1)


Короткий ответ

Обходной путь для вас - добавить -H 'Expect' в конец вашей команды curl.

Подробности

Речь идет о Http 100 Continue Status Code. Он используется, когда сервер может отклонить запрос (возможно, из-за слишком большого размера файла), тогда клиент может сначала спросить сервер, будет ли запрос принят или нет. Таким образом, и клиент, и сервер не будут тратить свое время, например, в случае возможного отказа из-за размера файла.

Когда вы отправляете запрос PUT, curl добавляет Expect. 100 - продолжить запрос по умолчанию (также добавляет в POST, если размер больше некоторого порога). Я ожидаю, что в этом случае серверы ответят Http 100, но похоже, что может быть проблема в весеннем облачном шлюзе

Добавление -H 'Expect' в конец вашей команды означает, что вы, как клиент, больше не будете ждать статуса HTTP 100 от сервера для отправки вашего запроса. Но это все еще проблема, и ее первопричину необходимо выяснить. Видимо из-за того, что есть 2 сервера, обрабатывающих HTTP 100 (шлюз + сервер), клиент как-то зависает. Они также упоминаются в этом выпуске

person cmlonder    schedule 19.03.2020