sttp.tapir.server.ziohttp.ZioHttpRequestBody.scala Maven / Gradle / Ivy
package sttp.tapir.server.ziohttp
import sttp.capabilities
import sttp.capabilities.zio.ZioStreams
import sttp.tapir.FileRange
import sttp.tapir.RawBodyType
import sttp.tapir.model.ServerRequest
import sttp.tapir.server.interpreter.RawValue
import sttp.tapir.server.interpreter.RequestBody
import zhttp.http.Request
import zio.RIO
import zio.Task
import zio.stream.Stream
import zio.stream.ZStream
import java.io.ByteArrayInputStream
import java.nio.ByteBuffer
class ZioHttpRequestBody[R](serverOptions: ZioHttpServerOptions[R]) extends RequestBody[RIO[R, *], ZioStreams] {
override val streams: capabilities.Streams[ZioStreams] = ZioStreams
override def toRaw[RAW](serverRequest: ServerRequest, bodyType: RawBodyType[RAW]): Task[RawValue[RAW]] = bodyType match {
case RawBodyType.StringBody(defaultCharset) => asByteArray(serverRequest).map(new String(_, defaultCharset)).map(RawValue(_))
case RawBodyType.ByteArrayBody => asByteArray(serverRequest).map(RawValue(_))
case RawBodyType.ByteBufferBody => asByteArray(serverRequest).map(bytes => ByteBuffer.wrap(bytes)).map(RawValue(_))
case RawBodyType.InputStreamBody => asByteArray(serverRequest).map(new ByteArrayInputStream(_)).map(RawValue(_))
case RawBodyType.FileBody =>
serverOptions.createFile(serverRequest).map(d => FileRange(d)).flatMap(file => Task.succeed(RawValue(file, Seq(file))))
case RawBodyType.MultipartBody(_, _) => Task.never
}
override def toStream(serverRequest: ServerRequest): streams.BinaryStream = stream(serverRequest).asInstanceOf[streams.BinaryStream]
private def stream(serverRequest: ServerRequest): Stream[Throwable, Byte] =
ZStream.fromZIO(zioHttpRequest(serverRequest).body).flattenChunks
private def asByteArray(serverRequest: ServerRequest): Task[Array[Byte]] = zioHttpRequest(serverRequest).body.map(_.toArray)
private def zioHttpRequest(serverRequest: ServerRequest) = serverRequest.underlying.asInstanceOf[Request]
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy