1- import io.netty.channel.ChannelFutureListener
2- import io.netty.handler.codec.http.websocketx.BinaryWebSocketFrame
3- import io.netty.handler.codec.http.websocketx.CloseWebSocketFrame
4- import io.netty.handler.codec.http.websocketx.TextWebSocketFrame
5- import io.netty.handler.codec.http.websocketx.WebSocketFrame
6- import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler
7-
8- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.BODY_URLENCODED
9- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.ERROR
10- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.EXCEPTION
11- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.FORWARDED
12- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.NOT_FOUND
13- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.QUERY_ENCODED_BOTH
14- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.QUERY_ENCODED_QUERY
15- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.QUERY_PARAM
16- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.REDIRECT
17- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.SUCCESS
18- import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.USER_BLOCK
19- import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
20- import static io.netty.handler.codec.http.HttpHeaderNames.CONTENT_LENGTH
21- import static io.netty.handler.codec.http.HttpHeaderNames.CONTENT_TYPE
22- import static io.netty.handler.codec.http.HttpResponseStatus.CONTINUE
23- import static io.netty.handler.codec.http.HttpResponseStatus.INTERNAL_SERVER_ERROR
24- import static io.netty.handler.codec.http.HttpUtil.is100ContinueExpected
25- import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1
26-
271import datadog.appsec.api.blocking.Blocking
282import datadog.trace.agent.test.base.HttpServer
293import datadog.trace.agent.test.base.HttpServerTest
@@ -34,6 +8,7 @@ import datadog.trace.instrumentation.netty41.server.NettyHttpServerDecorator
348import io.netty.bootstrap.ServerBootstrap
359import io.netty.buffer.ByteBuf
3610import io.netty.buffer.Unpooled
11+ import io.netty.channel.ChannelFutureListener
3712import io.netty.channel.ChannelHandlerContext
3813import io.netty.channel.ChannelInitializer
3914import io.netty.channel.ChannelPipeline
@@ -51,10 +26,33 @@ import io.netty.handler.codec.http.HttpResponseStatus
5126import io.netty.handler.codec.http.HttpServerCodec
5227import io.netty.handler.codec.http.multipart.Attribute
5328import io.netty.handler.codec.http.multipart.HttpPostRequestDecoder
29+ import io.netty.handler.codec.http.websocketx.BinaryWebSocketFrame
30+ import io.netty.handler.codec.http.websocketx.CloseWebSocketFrame
31+ import io.netty.handler.codec.http.websocketx.TextWebSocketFrame
32+ import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler
5433import io.netty.handler.logging.LogLevel
5534import io.netty.handler.logging.LoggingHandler
5635import io.netty.util.CharsetUtil
5736
37+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.BODY_URLENCODED
38+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.ERROR
39+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.EXCEPTION
40+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.FORWARDED
41+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.NOT_FOUND
42+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.QUERY_ENCODED_BOTH
43+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.QUERY_ENCODED_QUERY
44+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.QUERY_PARAM
45+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.REDIRECT
46+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.SUCCESS
47+ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.USER_BLOCK
48+ import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
49+ import static io.netty.handler.codec.http.HttpHeaderNames.CONTENT_LENGTH
50+ import static io.netty.handler.codec.http.HttpHeaderNames.CONTENT_TYPE
51+ import static io.netty.handler.codec.http.HttpResponseStatus.CONTINUE
52+ import static io.netty.handler.codec.http.HttpResponseStatus.INTERNAL_SERVER_ERROR
53+ import static io.netty.handler.codec.http.HttpUtil.is100ContinueExpected
54+ import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1
55+
5856abstract class Netty41ServerTest extends HttpServerTest<EventLoopGroup > {
5957
6058 static final LoggingHandler LOGGING_HANDLER = new LoggingHandler (SERVER_LOGGER . name, LogLevel . DEBUG )
@@ -159,6 +157,7 @@ abstract class Netty41ServerTest extends HttpServerTest<EventLoopGroup> {
159157 }
160158 }
161159 if (msg instanceof TextWebSocketFrame || msg instanceof BinaryWebSocketFrame ) {
160+ // generate a child span. The websocket test expects this way
162161 runUnderTrace(" onRead" , {})
163162 }
164163 },
@@ -172,15 +171,13 @@ abstract class Netty41ServerTest extends HttpServerTest<EventLoopGroup> {
172171 channelReadComplete : {
173172 it. flush()
174173 },
175- handlerAdded : {
176- ChannelHandlerContext ctx -> {
177- WsEndpoint . onOpen(ctx)
178- }
179- },
180174 userEventTriggered : { ChannelHandlerContext ctx , Object evt ->
181- if (evt == WebSocketServerProtocolHandler.HandshakeComplete ) {
175+ if (evt instanceof WebSocketServerProtocolHandler.HandshakeComplete ) {
182176 WsEndpoint . onOpen(ctx)
183177 }
178+ },
179+ channelInactive : { ChannelHandlerContext ctx ->
180+ WsEndpoint . onClose()
184181 }
185182 ] as SimpleChannelInboundHandler )
186183 }
@@ -210,12 +207,16 @@ abstract class Netty41ServerTest extends HttpServerTest<EventLoopGroup> {
210207
211208 @Override
212209 void serverSendText (String [] messages ) {
213- WsEndpoint . onMessage(messages[0 ], false )
210+ for (int i = 0 ; i< messages. size(); i++ ) {
211+ WsEndpoint . activeSession. writeAndFlush(new TextWebSocketFrame (i == messages. size() - 1 , 0 , messages[i]))
212+ }
214213 }
215214
216215 @Override
217216 void serverSendBinary (byte [][] binaries ) {
218- WsEndpoint . onMessage(binaries[0 ], false )
217+ for (int i = 0 ; i< binaries. length; i++ ) {
218+ WsEndpoint . activeSession. writeAndFlush(new BinaryWebSocketFrame (i == binaries. length - 1 , 0 , Unpooled . wrappedBuffer(binaries[i])))
219+ }
219220 }
220221
221222 @Override
@@ -227,6 +228,11 @@ abstract class Netty41ServerTest extends HttpServerTest<EventLoopGroup> {
227228 void setMaxPayloadSize (int size ) {
228229 // not applicable
229230 }
231+
232+ @Override
233+ boolean canSplitLargeWebsocketPayloads () {
234+ false
235+ }
230236 }
231237
232238 @Override
@@ -292,17 +298,4 @@ class WsEndpoint {
292298 static void onClose () {
293299 activeSession = null
294300 }
295-
296- static void onMessage (String s , boolean last ) {
297- synchronized (WsEndpoint ) {
298- activeSession. writeAndFlush(new TextWebSocketFrame (s))
299- }
300- }
301-
302- static void onMessage (byte [] b , boolean last ) {
303- synchronized (WsEndpoint ) {
304- ByteBuf responseBuf = Unpooled . wrappedBuffer(b)
305- activeSession. writeAndFlush(new BinaryWebSocketFrame (responseBuf))
306- }
307- }
308301}
0 commit comments