From a606d0b4ca4e55606018de701903696115f376f8 Mon Sep 17 00:00:00 2001 From: Thanh Le Date: Thu, 22 Feb 2024 21:25:23 +0700 Subject: [PATCH 1/2] Avoid IndexOutOfBoundsException when frame.content() is empty ByteBuf.getLong(0) will throw exception if it doesn't have enough data (aka 8 bytes) --- src/main/scala/netty/FrameHandler.scala | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/scala/netty/FrameHandler.scala b/src/main/scala/netty/FrameHandler.scala index 47d4d89f..16ab23aa 100644 --- a/src/main/scala/netty/FrameHandler.scala +++ b/src/main/scala/netty/FrameHandler.scala @@ -38,9 +38,10 @@ final private class FrameHandler(using Executor) extends SimpleChannelInboundHan case out => withClientOf(ctx.channel)(_ tell out) case frame: PongWebSocketFrame => - val lagMillis = (System.currentTimeMillis() - frame.content().getLong(0)).toInt - val pong = ClientOut.RoundPongFrame(lagMillis) - Option(ctx.channel.attr(key.client).get) foreach { _.value foreach { _ foreach (_ ! pong) } } + if frame.content().readableBytes() >= 8 then + val lagMillis = (System.currentTimeMillis() - frame.content().getLong(0)).toInt + val pong = ClientOut.RoundPongFrame(lagMillis) + Option(ctx.channel.attr(key.client).get) foreach { _.value foreach { _ foreach (_ ! pong) } } case frame => logger.info("unsupported frame type: " + frame.getClass.getName) From e9e620e8e6dad667c279d4498b6d9e752a07a412 Mon Sep 17 00:00:00 2001 From: Thanh Le Date: Thu, 22 Feb 2024 21:48:29 +0700 Subject: [PATCH 2/2] Scala tweak --- src/main/scala/netty/FrameHandler.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/netty/FrameHandler.scala b/src/main/scala/netty/FrameHandler.scala index 16ab23aa..85b8acfc 100644 --- a/src/main/scala/netty/FrameHandler.scala +++ b/src/main/scala/netty/FrameHandler.scala @@ -41,7 +41,7 @@ final private class FrameHandler(using Executor) extends SimpleChannelInboundHan if frame.content().readableBytes() >= 8 then val lagMillis = (System.currentTimeMillis() - frame.content().getLong(0)).toInt val pong = ClientOut.RoundPongFrame(lagMillis) - Option(ctx.channel.attr(key.client).get) foreach { _.value foreach { _ foreach (_ ! pong) } } + Option(ctx.channel.attr(key.client).get).foreach(_.value.foreach(_.foreach(_ ! pong))) case frame => logger.info("unsupported frame type: " + frame.getClass.getName)