From e3ed0ba24de20a56ed437d96a5a97a24816a637a Mon Sep 17 00:00:00 2001 From: eikek Date: Fri, 18 Mar 2022 23:57:36 +0100 Subject: [PATCH] Use temporary files when receiving large data --- .../restserver/routes/UploadRoutes.scala | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/modules/restserver/src/main/scala/docspell/restserver/routes/UploadRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/routes/UploadRoutes.scala index 70c67945..8a18cd6c 100644 --- a/modules/restserver/src/main/scala/docspell/restserver/routes/UploadRoutes.scala +++ b/modules/restserver/src/main/scala/docspell/restserver/routes/UploadRoutes.scala @@ -20,7 +20,6 @@ import docspell.restserver.http4s.ResponseGenerator import org.http4s._ import org.http4s.circe.CirceEntityEncoder._ import org.http4s.dsl.Http4sDsl -import org.http4s.multipart.Multipart import org.log4s._ object UploadRoutes { @@ -80,17 +79,26 @@ object UploadRoutes { ): F[Response[F]] = { import dsl._ - for { - multipart <- req.as[Multipart[F]] - updata <- readMultipart( - multipart, - "webapp", - logger, - prio, - cfg.backend.files.validMimeTypes - ) - result <- backend.upload.submitEither(updata, accOrSrc, true, itemId) - res <- Ok(basicResult(result)) - } yield res + val decodeMultipart = + EntityDecoder + .mixedMultipartResource( + maxSizeBeforeWrite = 10 * 1024 * 1024 + ) + .evalMap(_.decode(req, strict = false).value) + .rethrow + + decodeMultipart.use { multipart => + for { + updata <- readMultipart( + multipart, + "webapp", + logger, + prio, + cfg.backend.files.validMimeTypes + ) + result <- backend.upload.submitEither(updata, accOrSrc, true, itemId) + res <- Ok(basicResult(result)) + } yield res + } } }