Skip to content

Commit fd36a74

Browse files
authored
Make the chunk size used to convert InputStreams to ZIO response bodies configurable (#4780)
Closes #4762
1 parent d262ddd commit fd36a74

File tree

3 files changed

+11
-8
lines changed

3 files changed

+11
-8
lines changed

server/zio-http-server/src/main/scala/sttp/tapir/server/ziohttp/ZioHttpInterpreter.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ trait ZioHttpInterpreter[R] {
2828
val widenedSes = ses.map(_.widen[R & R2])
2929
val widenedServerOptions = zioHttpServerOptions.widen[R & R2]
3030
val zioHttpRequestBody = new ZioHttpRequestBody(widenedServerOptions)
31-
val zioHttpResponseBody = new ZioHttpToResponseBody
31+
val zioHttpResponseBody = new ZioHttpToResponseBody(zioHttpServerOptions.inputStreamChunkSize)
3232
val interceptors = RejectInterceptor.disableWhenSingleEndpoint(widenedServerOptions.interceptors, widenedSes)
3333

3434
def handleRequest(req: Request, filteredEndpoints: List[ZServerEndpoint[R & R2, ZioStreams with WebSockets]]) =

server/zio-http-server/src/main/scala/sttp/tapir/server/ziohttp/ZioHttpServerOptions.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,15 @@ import sttp.tapir.server.interceptor.{CustomiseInterceptors, Interceptor}
66
import sttp.tapir.{Defaults, TapirFile}
77
import zio.http.WebSocketConfig
88
import zio.{Cause, RIO, Task, ZIO}
9+
import zio.stream.ZStream
910

1011
case class ZioHttpServerOptions[R](
1112
createFile: ServerRequest => Task[TapirFile],
1213
deleteFile: TapirFile => RIO[R, Unit],
1314
interceptors: List[Interceptor[RIO[R, *]]],
14-
customWebSocketConfig: ServerRequest => Option[WebSocketConfig]
15+
customWebSocketConfig: ServerRequest => Option[WebSocketConfig],
16+
/** #4762: the chunk size used when converting an input stream to a response body. */
17+
inputStreamChunkSize: Int = ZStream.DefaultChunkSize
1518
) {
1619
def prependInterceptor(i: Interceptor[RIO[R, *]]): ZioHttpServerOptions[R] =
1720
copy(interceptors = i :: interceptors)

server/zio-http-server/src/main/scala/sttp/tapir/server/ziohttp/ZioHttpToResponseBody.scala

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import java.io.InputStream
1414
import java.nio.ByteBuffer
1515
import java.nio.charset.Charset
1616

17-
class ZioHttpToResponseBody extends ToResponseBody[ZioResponseBody, ZioStreams] {
17+
class ZioHttpToResponseBody(inputStreamChunkSize: Int) extends ToResponseBody[ZioResponseBody, ZioStreams] {
1818
override val streams: ZioStreams = ZioStreams
1919

2020
override def fromRawValue[R](
@@ -49,16 +49,16 @@ class ZioHttpToResponseBody extends ToResponseBody[ZioResponseBody, ZioStreams]
4949
val buffer: ByteBuffer = r
5050
ZioRawHttpResponseBody(Chunk.fromByteBuffer(buffer), Some(buffer.remaining()))
5151
case RawBodyType.InputStreamBody =>
52-
ZioStreamHttpResponseBody(ZStream.fromInputStream(r), None)
52+
ZioStreamHttpResponseBody(ZStream.fromInputStream(r, inputStreamChunkSize), None)
5353
case RawBodyType.InputStreamRangeBody =>
5454
r.range
5555
.map(range =>
5656
ZioStreamHttpResponseBody(
57-
ZStream.fromInputStream(r.inputStreamFromRangeStart()).take(range.contentLength),
57+
ZStream.fromInputStream(r.inputStreamFromRangeStart(), inputStreamChunkSize).take(range.contentLength),
5858
Some(range.contentLength)
5959
)
6060
)
61-
.getOrElse(ZioStreamHttpResponseBody(ZStream.fromInputStream(r.inputStream()), None))
61+
.getOrElse(ZioStreamHttpResponseBody(ZStream.fromInputStream(r.inputStream(), inputStreamChunkSize), None))
6262
case RawBodyType.FileBody =>
6363
val tapirFile = r
6464
tapirFile.range
@@ -118,14 +118,14 @@ class ZioHttpToResponseBody extends ToResponseBody[ZioResponseBody, ZioStreams]
118118
case RawBodyType.InputStreamBody =>
119119
FormField.streamingBinaryField(
120120
part.name,
121-
ZStream.fromInputStream(part.body).orDie,
121+
ZStream.fromInputStream(part.body, inputStreamChunkSize).orDie,
122122
mediaType.getOrElse(MediaType.application.`octet-stream`),
123123
filename = part.fileName
124124
)
125125
case RawBodyType.InputStreamRangeBody =>
126126
FormField.streamingBinaryField(
127127
part.name,
128-
ZStream.fromInputStream(part.body.inputStream()).orDie,
128+
ZStream.fromInputStream(part.body.inputStream(), inputStreamChunkSize).orDie,
129129
mediaType.getOrElse(MediaType.application.`octet-stream`),
130130
filename = part.fileName
131131
)

0 commit comments

Comments
 (0)