From 227b444d8141b63744abf7009d013c7b5f878362 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Sun, 25 Jul 2021 16:40:27 +0100 Subject: [PATCH] Accept client_no_context_takeover in websockets Doesn't fix #695, but Good Enough(TM). --- .../core/apis/http/websocket/Websocket.java | 3 +- .../WebsocketCompressionHandler.java | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 src/main/java/dan200/computercraft/core/apis/http/websocket/WebsocketCompressionHandler.java diff --git a/src/main/java/dan200/computercraft/core/apis/http/websocket/Websocket.java b/src/main/java/dan200/computercraft/core/apis/http/websocket/Websocket.java index 3e54be9a1..155540560 100644 --- a/src/main/java/dan200/computercraft/core/apis/http/websocket/Websocket.java +++ b/src/main/java/dan200/computercraft/core/apis/http/websocket/Websocket.java @@ -28,7 +28,6 @@ import io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker; import io.netty.handler.codec.http.websocketx.WebSocketClientHandshakerFactory; import io.netty.handler.codec.http.websocketx.WebSocketVersion; -import io.netty.handler.codec.http.websocketx.extensions.compression.WebSocketClientCompressionHandler; import io.netty.handler.ssl.SslContext; import java.lang.ref.WeakReference; @@ -160,7 +159,7 @@ protected void initChannel( SocketChannel ch ) p.addLast( new HttpClientCodec(), new HttpObjectAggregator( 8192 ), - WebSocketClientCompressionHandler.INSTANCE, + WebsocketCompressionHandler.INSTANCE, new WebsocketHandler( Websocket.this, handshaker, options ) ); } diff --git a/src/main/java/dan200/computercraft/core/apis/http/websocket/WebsocketCompressionHandler.java b/src/main/java/dan200/computercraft/core/apis/http/websocket/WebsocketCompressionHandler.java new file mode 100644 index 000000000..e29a87837 --- /dev/null +++ b/src/main/java/dan200/computercraft/core/apis/http/websocket/WebsocketCompressionHandler.java @@ -0,0 +1,38 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ +package dan200.computercraft.core.apis.http.websocket; + +import io.netty.channel.ChannelHandler; +import io.netty.handler.codec.compression.ZlibCodecFactory; +import io.netty.handler.codec.http.websocketx.extensions.WebSocketClientExtensionHandler; +import io.netty.handler.codec.http.websocketx.extensions.compression.DeflateFrameClientExtensionHandshaker; +import io.netty.handler.codec.http.websocketx.extensions.compression.PerMessageDeflateClientExtensionHandshaker; +import io.netty.handler.codec.http.websocketx.extensions.compression.WebSocketClientCompressionHandler; + +import static io.netty.handler.codec.http.websocketx.extensions.compression.PerMessageDeflateServerExtensionHandshaker.MAX_WINDOW_SIZE; + +/** + * An alternative to {@link WebSocketClientCompressionHandler} which supports the {@literal client_no_context_takeover} + * extension. Makes CC slightly more flexible. + */ +@ChannelHandler.Sharable +final class WebsocketCompressionHandler extends WebSocketClientExtensionHandler +{ + public static final WebsocketCompressionHandler INSTANCE = new WebsocketCompressionHandler(); + + private WebsocketCompressionHandler() + { + super( + new PerMessageDeflateClientExtensionHandshaker( + 6, ZlibCodecFactory.isSupportingWindowSizeAndMemLevel(), MAX_WINDOW_SIZE, + true, false + ), + new DeflateFrameClientExtensionHandshaker( false ), + new DeflateFrameClientExtensionHandshaker( true ) + ); + + } +}