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 }
14+
15+ import java .nio .file .{Files => JFiles }
16+ import scala .util .Try
1717
1818private [cats] class NettyCatsRequestBody [F [_]: Async ](
1919 val createFile : ServerRequest => F [TapirFile ],
20- val streamCompatible : StreamCompatible [Fs2Streams [F ]]
21- ) extends NettyStreamingRequestBody [F , Fs2Streams [F ]] {
20+ val streamCompatible : StreamCompatible [Fs2Streams [F ]],
21+ multipartTempDirectory : Option [TapirFile ] = None ,
22+ multipartMinSizeForDisk : Option [Long ] = None
23+ ) extends NettyStreamingRequestBody [F , Fs2Streams [F ]](
24+ multipartTempDirectory,
25+ multipartMinSizeForDisk
26+ ) {
2227
2328 override implicit val monad : MonadError [F ] = new CatsMonadError ()
2429
30+ import cats .implicits ._
31+
32+ override protected val listMonadToMonadOfList : List [F [RawPart ]] => F [List [RawPart ]] = _.sequence
33+
2534 override def publisherToBytes (publisher : Publisher [HttpContent ], contentLength : Option [Long ], maxBytes : Option [Long ]): F [Array [Byte ]] =
2635 streamCompatible.fromPublisher(publisher, maxBytes).compile.to(Chunk ).map(_.toArray[Byte ])
2736
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-
3537 override def writeToFile (serverRequest : ServerRequest , file : TapirFile , maxBytes : Option [Long ]): F [Unit ] =
3638 (toStream(serverRequest, maxBytes)
3739 .asInstanceOf [streamCompatible.streams.BinaryStream ])
@@ -42,5 +44,5 @@ private[cats] class NettyCatsRequestBody[F[_]: Async](
4244 .drain
4345
4446 override def writeBytesToFile (bytes : Array [Byte ], file : TapirFile ): F [Unit ] =
45- monad.error( new UnsupportedOperationException ( " Multipart requests are not supported " ))
47+ monad.fromTry( for { _ <- Try ( JFiles .write(file.toPath, bytes)) } yield ( ))
4648}
0 commit comments