diff --git a/akka-stream-tests/src/test/scala/akka/stream/scaladsl/FramingSpec.scala b/akka-stream-tests/src/test/scala/akka/stream/scaladsl/FramingSpec.scala index 07c3f5fed4..3667e3cbde 100644 --- a/akka-stream-tests/src/test/scala/akka/stream/scaladsl/FramingSpec.scala +++ b/akka-stream-tests/src/test/scala/akka/stream/scaladsl/FramingSpec.scala @@ -380,6 +380,22 @@ class FramingSpec extends StreamSpec { ex.getMessage should ===("Decoded frame header reported negative size -4") } + "ignore length field value when provided computeFrameSize (#27884)" in { + implicit val bo = java.nio.ByteOrder.LITTLE_ENDIAN + + def computeFrameSize(@unused arr: Array[Byte], @unused l: Int): Int = 8 + + val bs = ByteString.newBuilder.putInt(0xFF010203).putInt(0x04050607).result + + val res = + Source + .single(bs) + .via(Flow[ByteString].via(Framing.lengthField(4, 0, 1000, bo, computeFrameSize))) + .runWith(Sink.seq) + + res.futureValue should equal(Seq(bs)) + } + "fail the stage on computeFrameSize values less than minimum chunk size" in { implicit val bo = java.nio.ByteOrder.LITTLE_ENDIAN diff --git a/akka-stream/src/main/scala/akka/stream/scaladsl/Framing.scala b/akka-stream/src/main/scala/akka/stream/scaladsl/Framing.scala index 6277a28154..1ab05d6bcb 100644 --- a/akka-stream/src/main/scala/akka/stream/scaladsl/Framing.scala +++ b/akka-stream/src/main/scala/akka/stream/scaladsl/Framing.scala @@ -421,7 +421,7 @@ object Framing { if (frameSize > maximumFrameLength) { failStage(new FramingException( s"Maximum allowed frame size is $maximumFrameLength but decoded frame header reported size $frameSize")) - } else if (parsedLength < 0) { + } else if (computeFrameSize.isEmpty && parsedLength < 0) { failStage(new FramingException(s"Decoded frame header reported negative size $parsedLength")) } else if (frameSize < minimumChunkSize) { failStage(