Чтение и анализ данных из S3 PutRequest с использованием Spring WebFlux - PullRequest
0 голосов
/ 09 октября 2018

У меня есть настройка заглушки для обработки тестов, которые взаимодействуют с корзинами AWS S3.(Пользовательская) реализация заглушки использует Spring WebFlux для ответа, например, на S3 put-запросы.

В последнее время я был вынужден изменить мою реализацию S3, чтобы использовать InputStream вместо реального файла в качестве ввода.Моя проблема в том, что моя реализация заглушки не дает ожидаемого результата при передаче InputStream, а не файла.

Моя заглушка в настоящее время реализована так:

RouterFunction<ServerResponse> putS3Object() {
    return RouterFunctions.route(PUT("/S3/MyBucket/{filename}").and(accept(TEXT_PLAIN))) { ServerRequest request ->
        return request.bodyToMono(String)
                .doOnSuccess { s3Stubs.registerPutObject(request.pathVariable("filename"), it) }
                .flatMap { response -> ServerResponse.ok().build() }
    }
}

Переданная строказначение s3Stubs.registerPutObject в параметре it содержит ожидаемое значение «Hello World».

Теперь, когда я использую InputStream в качестве аргумента API S3 вместо файла, параметр it больше не является«читабельно».Он содержит данные вроде: 18;chunk-signature=c27c7fa381b8aa2824e8487979d2d0e9ded04dd3 ..... 0;chunk-signature=db7e8b1bacc57da0d410ee116 - где я ожидал бы того же результата «Hello World».

Я не уверен, связано ли это с моей реализацией Webflux или как S3 обрабатывает InputStreams по сравнению с фактическимфайлы.

Использование точно такой же реализации S3 с использованием InputStream работает при переносе в реальную корзину S3 ...

1 Ответ

0 голосов
/ 09 октября 2018

Глядя на AWS S3 SDK, кажется, что вариант InputStream также требует некоторых метаданных, которые должны содержать длину и base64-хеш контента.Это, вероятно, то, что вы видите здесь, когда отправляете свою заглушку.

bodyToMono(String.class) действительно буферизует все тело запроса в памяти и декодирует его в строку.Для других форматов проводов Spring использует реализации Encoder и Decoder (одна для JSON, другая для protobuf).Можно, но довольно сложно написать свой собственный, и, вероятно, не лучший выбор при написании реализации заглушки.

Если вы действительно хотите заглушить это, вы должны либо принять все, что отправляет вам клиент S3,или прочитайте о фактическом формате проводника, используемом этим клиентом.

Теперь о вашей текущей реализации: кажется, вы пытаетесь выполнить операции ввода-вывода в методе doOnXYZ.Эти методы называются «побочными эффектами», поскольку их цель - распечатать некоторые журналы или записать какое-то состояние, но не выполнять работу, связанную с вводом / выводом - и определенно не блокировать ввод / вывод. Reactor предлагает способы обернуть блокирующий код для этого .

...