11package sttp .tapir .server .netty .cats .internal
22
33import cats .effect .Async
4- import cats .syntax .all ._
54import fs2 .Chunk
65import fs2 .io .file .{Files , Path }
76import io .netty .handler .codec .http .HttpContent
8- import org .playframework .netty .http .StreamedHttpRequest
97import org .reactivestreams .Publisher
108import sttp .capabilities .fs2 .Fs2Streams
119import sttp .monad .MonadError
1210import sttp .tapir .integ .cats .effect .CatsMonadError
1311import sttp .tapir .model .ServerRequest
14- import sttp .tapir .server .interpreter .RawValue
1512import sttp .tapir .server .netty .internal .{NettyStreamingRequestBody , StreamCompatible }
16- import sttp .tapir .{RawBodyType , RawPart , TapirFile }
13+ import sttp .tapir .{RawPart , TapirFile }
1714
1815private [cats] class NettyCatsRequestBody [F [_]: Async ](
1916 val createFile : ServerRequest => F [TapirFile ],
20- val streamCompatible : StreamCompatible [Fs2Streams [F ]]
21- ) extends NettyStreamingRequestBody [F , Fs2Streams [F ]] {
17+ val streamCompatible : StreamCompatible [Fs2Streams [F ]],
18+ multipartTempDirectory : Option [TapirFile ] = None ,
19+ multipartMinSizeForDisk : Option [Long ] = None
20+ ) extends NettyStreamingRequestBody [F , Fs2Streams [F ]](
21+ multipartTempDirectory,
22+ multipartMinSizeForDisk
23+ ) {
2224
2325 override implicit val monad : MonadError [F ] = new CatsMonadError ()
2426
27+ import cats .implicits ._
28+
29+ override protected val listMonadToMonadOfList : List [F [RawPart ]] => F [List [RawPart ]] = _.sequence
30+
2531 override def publisherToBytes (publisher : Publisher [HttpContent ], contentLength : Option [Long ], maxBytes : Option [Long ]): F [Array [Byte ]] =
2632 streamCompatible.fromPublisher(publisher, maxBytes).compile.to(Chunk ).map(_.toArray[Byte ])
2733
28- def publisherToMultipart (
29- nettyRequest : StreamedHttpRequest ,
30- serverRequest : ServerRequest ,
31- m : RawBodyType .MultipartBody ,
32- maxBytes : Option [Long ]
33- ): F [RawValue [Seq [RawPart ]]] = monad.error(new UnsupportedOperationException (" Multipart requests are not supported" ))
34-
3534 override def writeToFile (serverRequest : ServerRequest , file : TapirFile , maxBytes : Option [Long ]): F [Unit ] =
3635 (toStream(serverRequest, maxBytes)
3736 .asInstanceOf [streamCompatible.streams.BinaryStream ])
@@ -42,5 +41,5 @@ private[cats] class NettyCatsRequestBody[F[_]: Async](
4241 .drain
4342
4443 override def writeBytesToFile (bytes : Array [Byte ], file : TapirFile ): F [Unit ] =
45- monad.error( new UnsupportedOperationException ( " Multipart requests are not supported " ))
44+ Async [ F ].fromFuture( Async [ F ].delay(writeBytesToFileFuture(bytes, file) ))
4645}
0 commit comments