From b23dcaa983e160ee3873cbc936babdacd1e4466b Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Fri, 6 Sep 2024 11:36:23 +0100 Subject: [PATCH 1/4] use ByteString unsafe methods where it is ok --- .../sttp/tapir/server/akkagrpc/AkkaGrpcToResponseBody.scala | 2 +- .../scala/sttp/tapir/server/akkahttp/AkkaWebSockets.scala | 4 ++-- .../tapir/server/pekkogrpc/PekkoGrpcToResponseBody.scala | 2 +- .../scala/sttp/tapir/server/pekkohttp/PekkoWebSockets.scala | 4 ++-- .../main/scala/sttp/tapir/server/play/PlayRequestBody.scala | 6 +++--- .../main/scala/sttp/tapir/server/play/PlayRequestBody.scala | 6 +++--- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/server/akka-grpc-server/src/main/scala/sttp/tapir/server/akkagrpc/AkkaGrpcToResponseBody.scala b/server/akka-grpc-server/src/main/scala/sttp/tapir/server/akkagrpc/AkkaGrpcToResponseBody.scala index 864b95b964..a85630f64a 100644 --- a/server/akka-grpc-server/src/main/scala/sttp/tapir/server/akkagrpc/AkkaGrpcToResponseBody.scala +++ b/server/akka-grpc-server/src/main/scala/sttp/tapir/server/akkagrpc/AkkaGrpcToResponseBody.scala @@ -46,7 +46,7 @@ private[akkagrpc] class AkkaGrpcToResponseBody(implicit m: Materializer, ec: Exe ): ResponseEntity = { bodyType match { case RawBodyType.StringBody(charset) => ??? - case RawBodyType.ByteArrayBody => HttpEntity(ct, encodeDataToFrameBytes(ByteString(r))) + case RawBodyType.ByteArrayBody => HttpEntity(ct, encodeDataToFrameBytes(ByteString.fromArrayUnsafe(r))) case RawBodyType.ByteBufferBody => HttpEntity(ct, encodeDataToFrameBytes(ByteString(r))) case RawBodyType.InputStreamBody => ??? case RawBodyType.InputStreamRangeBody => ??? diff --git a/server/akka-http-server/src/main/scala/sttp/tapir/server/akkahttp/AkkaWebSockets.scala b/server/akka-http-server/src/main/scala/sttp/tapir/server/akkahttp/AkkaWebSockets.scala index 1318f3d1d1..3ed6cd51dc 100644 --- a/server/akka-http-server/src/main/scala/sttp/tapir/server/akkahttp/AkkaWebSockets.scala +++ b/server/akka-http-server/src/main/scala/sttp/tapir/server/akkahttp/AkkaWebSockets.scala @@ -40,13 +40,13 @@ private[akkahttp] object AkkaWebSockets { case msg: TextMessage => msg.textStream.runFold("")(_ + _).map(t => WebSocketFrame.text(t)) case msg: BinaryMessage => - msg.dataStream.runFold(ByteString.empty)(_ ++ _).map(b => WebSocketFrame.binary(b.toArray)) + msg.dataStream.runFold(ByteString.empty)(_ ++ _).map(b => WebSocketFrame.binary(b.toArrayUnsafe())) } private def frameToMessage(w: WebSocketFrame): Option[Message] = { w match { case WebSocketFrame.Text(p, _, _) => Some(TextMessage(p)) - case WebSocketFrame.Binary(p, _, _) => Some(BinaryMessage(ByteString(p))) + case WebSocketFrame.Binary(p, _, _) => Some(BinaryMessage(ByteString.fromArrayUnsafe(p))) case WebSocketFrame.Ping(_) => None case WebSocketFrame.Pong(_) => None case WebSocketFrame.Close(_, _) => throw WebSocketClosed(None) diff --git a/server/pekko-grpc-server/src/main/scala/sttp/tapir/server/pekkogrpc/PekkoGrpcToResponseBody.scala b/server/pekko-grpc-server/src/main/scala/sttp/tapir/server/pekkogrpc/PekkoGrpcToResponseBody.scala index 6eb0cd13ff..60921414dd 100644 --- a/server/pekko-grpc-server/src/main/scala/sttp/tapir/server/pekkogrpc/PekkoGrpcToResponseBody.scala +++ b/server/pekko-grpc-server/src/main/scala/sttp/tapir/server/pekkogrpc/PekkoGrpcToResponseBody.scala @@ -46,7 +46,7 @@ private[pekkogrpc] class PekkoGrpcToResponseBody(implicit m: Materializer, ec: E ): ResponseEntity = { bodyType match { case RawBodyType.StringBody(charset) => ??? - case RawBodyType.ByteArrayBody => HttpEntity(ct, encodeDataToFrameBytes(ByteString(r))) + case RawBodyType.ByteArrayBody => HttpEntity(ct, encodeDataToFrameBytes(ByteString.fromArrayUnsafe(r))) case RawBodyType.ByteBufferBody => HttpEntity(ct, encodeDataToFrameBytes(ByteString(r))) case RawBodyType.InputStreamBody => ??? case RawBodyType.InputStreamRangeBody => ??? diff --git a/server/pekko-http-server/src/main/scala/sttp/tapir/server/pekkohttp/PekkoWebSockets.scala b/server/pekko-http-server/src/main/scala/sttp/tapir/server/pekkohttp/PekkoWebSockets.scala index 5bdb918665..67ba262379 100644 --- a/server/pekko-http-server/src/main/scala/sttp/tapir/server/pekkohttp/PekkoWebSockets.scala +++ b/server/pekko-http-server/src/main/scala/sttp/tapir/server/pekkohttp/PekkoWebSockets.scala @@ -40,13 +40,13 @@ private[pekkohttp] object PekkoWebSockets { case msg: TextMessage => msg.textStream.runFold("")(_ + _).map(t => WebSocketFrame.text(t)) case msg: BinaryMessage => - msg.dataStream.runFold(ByteString.empty)(_ ++ _).map(b => WebSocketFrame.binary(b.toArray)) + msg.dataStream.runFold(ByteString.empty)(_ ++ _).map(b => WebSocketFrame.binary(b.toArrayUnsafe())) } private def frameToMessage(w: WebSocketFrame): Option[Message] = { w match { case WebSocketFrame.Text(p, _, _) => Some(TextMessage(p)) - case WebSocketFrame.Binary(p, _, _) => Some(BinaryMessage(ByteString(p))) + case WebSocketFrame.Binary(p, _, _) => Some(BinaryMessage(ByteString.fromArrayUnsafe(p))) case WebSocketFrame.Ping(_) => None case WebSocketFrame.Pong(_) => None case WebSocketFrame.Close(_, _) => throw WebSocketClosed(None) diff --git a/server/play-server/src/main/scala/sttp/tapir/server/play/PlayRequestBody.scala b/server/play-server/src/main/scala/sttp/tapir/server/play/PlayRequestBody.scala index cc8aa49af0..d488166568 100644 --- a/server/play-server/src/main/scala/sttp/tapir/server/play/PlayRequestBody.scala +++ b/server/play-server/src/main/scala/sttp/tapir/server/play/PlayRequestBody.scala @@ -63,11 +63,11 @@ private[play] class PlayRequestBody(serverOptions: PlayServerOptions)(implicit bodyType match { case RawBodyType.StringBody(defaultCharset) => bodyAsByteString().map(b => RawValue(b.decodeString(charset.getOrElse(defaultCharset)))) - case RawBodyType.ByteArrayBody => bodyAsByteString().map(b => RawValue(b.toArray)) + case RawBodyType.ByteArrayBody => bodyAsByteString().map(b => RawValue(b.toArrayUnsafe())) case RawBodyType.ByteBufferBody => bodyAsByteString().map(b => RawValue(b.toByteBuffer)) - case RawBodyType.InputStreamBody => bodyAsByteString().map(b => RawValue(new ByteArrayInputStream(b.toArray))) + case RawBodyType.InputStreamBody => bodyAsByteString().map(b => RawValue(b.asInputStream())) case RawBodyType.InputStreamRangeBody => - bodyAsByteString().map(b => RawValue(new InputStreamRange(() => new ByteArrayInputStream(b.toArray)))) + bodyAsByteString().map(b => RawValue(new InputStreamRange(() => b.asInputStream()))) case RawBodyType.FileBody => bodyAsFile match { case Some(file) => diff --git a/server/play29-server/src/main/scala/sttp/tapir/server/play/PlayRequestBody.scala b/server/play29-server/src/main/scala/sttp/tapir/server/play/PlayRequestBody.scala index 1f91ee3659..210cc4c059 100644 --- a/server/play29-server/src/main/scala/sttp/tapir/server/play/PlayRequestBody.scala +++ b/server/play29-server/src/main/scala/sttp/tapir/server/play/PlayRequestBody.scala @@ -63,11 +63,11 @@ private[play] class PlayRequestBody(serverOptions: PlayServerOptions)(implicit bodyType match { case RawBodyType.StringBody(defaultCharset) => bodyAsByteString().map(b => RawValue(b.decodeString(charset.getOrElse(defaultCharset)))) - case RawBodyType.ByteArrayBody => bodyAsByteString().map(b => RawValue(b.toArray)) + case RawBodyType.ByteArrayBody => bodyAsByteString().map(b => RawValue(b.toArrayUnsafe())) case RawBodyType.ByteBufferBody => bodyAsByteString().map(b => RawValue(b.toByteBuffer)) - case RawBodyType.InputStreamBody => bodyAsByteString().map(b => RawValue(new ByteArrayInputStream(b.toArray))) + case RawBodyType.InputStreamBody => bodyAsByteString().map(b => RawValue(new ByteArrayInputStream(b.toArrayUnsafe()))) case RawBodyType.InputStreamRangeBody => - bodyAsByteString().map(b => RawValue(new InputStreamRange(() => new ByteArrayInputStream(b.toArray)))) + bodyAsByteString().map(b => RawValue(new InputStreamRange(() => new ByteArrayInputStream(b.toArrayUnsafe())))) case RawBodyType.FileBody => bodyAsFile match { case Some(file) => From 4720e9adbacf7aa4425a98e749379a7350e59053 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Fri, 6 Sep 2024 11:41:09 +0100 Subject: [PATCH 2/4] Update PlayRequestBody.scala --- .../main/scala/sttp/tapir/server/play/PlayRequestBody.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/play-server/src/main/scala/sttp/tapir/server/play/PlayRequestBody.scala b/server/play-server/src/main/scala/sttp/tapir/server/play/PlayRequestBody.scala index d488166568..78bf70de15 100644 --- a/server/play-server/src/main/scala/sttp/tapir/server/play/PlayRequestBody.scala +++ b/server/play-server/src/main/scala/sttp/tapir/server/play/PlayRequestBody.scala @@ -65,9 +65,9 @@ private[play] class PlayRequestBody(serverOptions: PlayServerOptions)(implicit bodyAsByteString().map(b => RawValue(b.decodeString(charset.getOrElse(defaultCharset)))) case RawBodyType.ByteArrayBody => bodyAsByteString().map(b => RawValue(b.toArrayUnsafe())) case RawBodyType.ByteBufferBody => bodyAsByteString().map(b => RawValue(b.toByteBuffer)) - case RawBodyType.InputStreamBody => bodyAsByteString().map(b => RawValue(b.asInputStream())) + case RawBodyType.InputStreamBody => bodyAsByteString().map(b => RawValue(b.asInputStream)) case RawBodyType.InputStreamRangeBody => - bodyAsByteString().map(b => RawValue(new InputStreamRange(() => b.asInputStream()))) + bodyAsByteString().map(b => RawValue(new InputStreamRange(() => b.asInputStream))) case RawBodyType.FileBody => bodyAsFile match { case Some(file) => From c2fad00dfe95efca643457257aaa3fc3e80e645a Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Fri, 6 Sep 2024 11:45:48 +0100 Subject: [PATCH 3/4] grpc changes --- .../sttp/tapir/server/akkagrpc/AkkaGrpcRequestBody.scala | 6 +++--- .../sttp/tapir/server/pekkogrpc/PekkoGrpcRequestBody.scala | 7 +++---- .../scala/sttp/tapir/server/play/PlayRequestBody.scala | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/server/akka-grpc-server/src/main/scala/sttp/tapir/server/akkagrpc/AkkaGrpcRequestBody.scala b/server/akka-grpc-server/src/main/scala/sttp/tapir/server/akkagrpc/AkkaGrpcRequestBody.scala index 9097491d57..dbdbfc042e 100644 --- a/server/akka-grpc-server/src/main/scala/sttp/tapir/server/akkagrpc/AkkaGrpcRequestBody.scala +++ b/server/akka-grpc-server/src/main/scala/sttp/tapir/server/akkagrpc/AkkaGrpcRequestBody.scala @@ -39,10 +39,10 @@ private[akkagrpc] class AkkaGrpcRequestBody(serverOptions: AkkaHttpServerOptions private def toExpectedBodyType[R](byteString: ByteString, bodyType: RawBodyType[R]): RawValue[R] = { bodyType match { - case RawBodyType.ByteArrayBody => RawValue(byteString.toArray) + case RawBodyType.ByteArrayBody => RawValue(byteString.toArrayUnsafe()) case RawBodyType.ByteBufferBody => RawValue(byteString.asByteBuffer) - case RawBodyType.InputStreamBody => RawValue(new ByteArrayInputStream(byteString.toArray)) - case RawBodyType.InputStreamRangeBody => RawValue(InputStreamRange(() => new ByteArrayInputStream(byteString.toArray))) + case RawBodyType.InputStreamBody => RawValue(new ByteArrayInputStream(byteString.toArrayUnsafe())) + case RawBodyType.InputStreamRangeBody => RawValue(InputStreamRange(() => new ByteArrayInputStream(byteString.toArrayUnsafe()))) case RawBodyType.FileBody => ??? case m: RawBodyType.MultipartBody => ??? case _ => ??? diff --git a/server/pekko-grpc-server/src/main/scala/sttp/tapir/server/pekkogrpc/PekkoGrpcRequestBody.scala b/server/pekko-grpc-server/src/main/scala/sttp/tapir/server/pekkogrpc/PekkoGrpcRequestBody.scala index 3dac104b2e..a2a6f12952 100644 --- a/server/pekko-grpc-server/src/main/scala/sttp/tapir/server/pekkogrpc/PekkoGrpcRequestBody.scala +++ b/server/pekko-grpc-server/src/main/scala/sttp/tapir/server/pekkogrpc/PekkoGrpcRequestBody.scala @@ -11,7 +11,6 @@ import sttp.tapir.model.ServerRequest import sttp.tapir.server.pekkohttp.PekkoHttpServerOptions import sttp.tapir.server.interpreter.{RawValue, RequestBody} -import java.io.ByteArrayInputStream import scala.concurrent.{ExecutionContext, Future} import scala.util.Try @@ -39,10 +38,10 @@ private[pekkogrpc] class PekkoGrpcRequestBody(serverOptions: PekkoHttpServerOpti private def toExpectedBodyType[R](byteString: ByteString, bodyType: RawBodyType[R]): RawValue[R] = { bodyType match { - case RawBodyType.ByteArrayBody => RawValue(byteString.toArray) + case RawBodyType.ByteArrayBody => RawValue(byteString.toArrayUnsafe()) case RawBodyType.ByteBufferBody => RawValue(byteString.asByteBuffer) - case RawBodyType.InputStreamBody => RawValue(new ByteArrayInputStream(byteString.toArray)) - case RawBodyType.InputStreamRangeBody => RawValue(InputStreamRange(() => new ByteArrayInputStream(byteString.toArray))) + case RawBodyType.InputStreamBody => RawValue(byteString.asInputStream) + case RawBodyType.InputStreamRangeBody => RawValue(InputStreamRange(() => byteString.asInputStream)) case RawBodyType.FileBody => ??? case m: RawBodyType.MultipartBody => ??? case _ => ??? diff --git a/server/play-server/src/main/scala/sttp/tapir/server/play/PlayRequestBody.scala b/server/play-server/src/main/scala/sttp/tapir/server/play/PlayRequestBody.scala index 78bf70de15..dfd8138911 100644 --- a/server/play-server/src/main/scala/sttp/tapir/server/play/PlayRequestBody.scala +++ b/server/play-server/src/main/scala/sttp/tapir/server/play/PlayRequestBody.scala @@ -12,7 +12,7 @@ import sttp.tapir.model.ServerRequest import sttp.tapir.server.interpreter.{RawValue, RequestBody} import sttp.tapir.{FileRange, InputStreamRange, RawBodyType, RawPart} -import java.io.{ByteArrayInputStream, File} +import java.io.File import java.nio.charset.Charset import scala.concurrent.{ExecutionContext, Future} import scala.collection.compat._ From f5747c62da630eaf25fb25abdea8ae6978f8614e Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Fri, 6 Sep 2024 11:58:59 +0100 Subject: [PATCH 4/4] can't use asInputStream as Play doesn't yet support pekko 1.1 --- .../main/scala/sttp/tapir/server/play/PlayRequestBody.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/play-server/src/main/scala/sttp/tapir/server/play/PlayRequestBody.scala b/server/play-server/src/main/scala/sttp/tapir/server/play/PlayRequestBody.scala index dfd8138911..e1a81d9566 100644 --- a/server/play-server/src/main/scala/sttp/tapir/server/play/PlayRequestBody.scala +++ b/server/play-server/src/main/scala/sttp/tapir/server/play/PlayRequestBody.scala @@ -12,7 +12,7 @@ import sttp.tapir.model.ServerRequest import sttp.tapir.server.interpreter.{RawValue, RequestBody} import sttp.tapir.{FileRange, InputStreamRange, RawBodyType, RawPart} -import java.io.File +import java.io.{ByteArrayInputStream, File} import java.nio.charset.Charset import scala.concurrent.{ExecutionContext, Future} import scala.collection.compat._ @@ -65,9 +65,9 @@ private[play] class PlayRequestBody(serverOptions: PlayServerOptions)(implicit bodyAsByteString().map(b => RawValue(b.decodeString(charset.getOrElse(defaultCharset)))) case RawBodyType.ByteArrayBody => bodyAsByteString().map(b => RawValue(b.toArrayUnsafe())) case RawBodyType.ByteBufferBody => bodyAsByteString().map(b => RawValue(b.toByteBuffer)) - case RawBodyType.InputStreamBody => bodyAsByteString().map(b => RawValue(b.asInputStream)) + case RawBodyType.InputStreamBody => bodyAsByteString().map(b => RawValue(new ByteArrayInputStream(b.toArrayUnsafe()))) case RawBodyType.InputStreamRangeBody => - bodyAsByteString().map(b => RawValue(new InputStreamRange(() => b.asInputStream))) + bodyAsByteString().map(b => RawValue(new InputStreamRange(() => new ByteArrayInputStream(b.toArrayUnsafe())))) case RawBodyType.FileBody => bodyAsFile match { case Some(file) =>