summaryrefslogtreecommitdiffstats
path: root/external/java_websocket
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 05:54:39 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 05:54:39 +0000
commit267c6f2ac71f92999e969232431ba04678e7437e (patch)
tree358c9467650e1d0a1d7227a21dac2e3d08b622b2 /external/java_websocket
parentInitial commit. (diff)
downloadlibreoffice-267c6f2ac71f92999e969232431ba04678e7437e.tar.xz
libreoffice-267c6f2ac71f92999e969232431ba04678e7437e.zip
Adding upstream version 4:24.2.0.upstream/4%24.2.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r--external/java_websocket/ExternalPackage_java_websocket.mk16
-rw-r--r--external/java_websocket/ExternalProject_java_websocket.mk31
-rw-r--r--external/java_websocket/Makefile7
-rw-r--r--external/java_websocket/Module_java_websocket.mk18
-rw-r--r--external/java_websocket/README3
-rw-r--r--external/java_websocket/UnpackedTarball_java_websocket.mk31
-rw-r--r--external/java_websocket/patches/0001-cid-1545227-Dm-Dubious-method-used.patch55
-rw-r--r--external/java_websocket/patches/0001-cid-1545249-Bad-bit-shift-operation.patch50
-rw-r--r--external/java_websocket/patches/0001-cid-1545515-Dm-Dubious-method-used.patch42
-rw-r--r--external/java_websocket/patches/0001-cid-1545614-UR-Uninitialized-read-of-field-in-constr.patch26
-rw-r--r--external/java_websocket/patches/0001-cid-1546192-SIC-Inner-class-could-be-made-static.patch25
-rw-r--r--external/java_websocket/patches/0001-cid-1546264-Dm-Dubious-method-used.patch64
-rw-r--r--external/java_websocket/patches/0001-cid-1546292-DLS-Dead-local-store.patch25
-rw-r--r--external/java_websocket/patches/0001-cid-1546341-Resource-leak-on-an-exceptional-path.patch40
-rw-r--r--external/java_websocket/patches/0001-cid-1546344-Dm-Dubious-method-used.patch30
-rw-r--r--external/java_websocket/patches/0002-cid-1545284-UR-Uninitialized-read-of-field-in-constr.patch26
-rw-r--r--external/java_websocket/patches/ant-build.patch27
-rw-r--r--external/java_websocket/patches/no-slf4j.patch748
18 files changed, 1264 insertions, 0 deletions
diff --git a/external/java_websocket/ExternalPackage_java_websocket.mk b/external/java_websocket/ExternalPackage_java_websocket.mk
new file mode 100644
index 0000000000..2b3d1d87f3
--- /dev/null
+++ b/external/java_websocket/ExternalPackage_java_websocket.mk
@@ -0,0 +1,16 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+$(eval $(call gb_ExternalPackage_ExternalPackage,java_websocket_project,java_websocket))
+
+$(eval $(call gb_ExternalPackage_use_external_project,java_websocket_project,java_websocket))
+
+$(eval $(call gb_ExternalPackage_add_file,java_websocket_project,$(LIBO_SHARE_JAVA_FOLDER)/java_websocket.jar,dist/java_websocket.jar))
+
+# vim: set noet sw=4 ts=4:
diff --git a/external/java_websocket/ExternalProject_java_websocket.mk b/external/java_websocket/ExternalProject_java_websocket.mk
new file mode 100644
index 0000000000..0d713aadc0
--- /dev/null
+++ b/external/java_websocket/ExternalProject_java_websocket.mk
@@ -0,0 +1,31 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+$(eval $(call gb_ExternalProject_ExternalProject,java_websocket))
+
+$(eval $(call gb_ExternalProject_register_targets,java_websocket,\
+ build \
+))
+
+$(call gb_ExternalProject_get_state_target,java_websocket,build) :
+ $(call gb_Trace_StartRange,java_websocket,EXTERNAL)
+ $(call gb_ExternalProject_run,build,\
+ JAVA_HOME=$(JAVA_HOME_FOR_BUILD) \
+ $(ICECREAM_RUN) "$(ANT)" \
+ $(if $(verbose),-v,-q) \
+ -f build.xml \
+ -Dbuild.label="build-$(LIBO_VERSION_MAJOR).$(LIBO_VERSION_MINOR).$(LIBO_VERSION_MICRO).$(LIBO_VERSION_PATCH)" \
+ -Dant.build.javac.source=$(JAVA_SOURCE_VER) \
+ -Dant.build.javac.target=$(JAVA_TARGET_VER) \
+ $(if $(debug),-Dbuild.debug="on") \
+ jar \
+ )
+ $(call gb_Trace_EndRange,java_websocket,EXTERNAL)
+
+# vim: set noet sw=4 ts=4:
diff --git a/external/java_websocket/Makefile b/external/java_websocket/Makefile
new file mode 100644
index 0000000000..e4968cf85f
--- /dev/null
+++ b/external/java_websocket/Makefile
@@ -0,0 +1,7 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+
+module_directory:=$(dir $(realpath $(firstword $(MAKEFILE_LIST))))
+
+include $(module_directory)/../../solenv/gbuild/partial_build.mk
+
+# vim: set noet sw=4 ts=4:
diff --git a/external/java_websocket/Module_java_websocket.mk b/external/java_websocket/Module_java_websocket.mk
new file mode 100644
index 0000000000..3dcb12dde4
--- /dev/null
+++ b/external/java_websocket/Module_java_websocket.mk
@@ -0,0 +1,18 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+$(eval $(call gb_Module_Module,java_websocket))
+
+$(eval $(call gb_Module_add_targets,java_websocket,\
+ ExternalPackage_java_websocket \
+ ExternalProject_java_websocket \
+ UnpackedTarball_java_websocket \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/external/java_websocket/README b/external/java_websocket/README
new file mode 100644
index 0000000000..def0298a09
--- /dev/null
+++ b/external/java_websocket/README
@@ -0,0 +1,3 @@
+Java WebSocket Implmentation from [https://github.com/TooTallNate/Java-WebSocket].
+
+To send data over websockets, enabling uno over websockets.
diff --git a/external/java_websocket/UnpackedTarball_java_websocket.mk b/external/java_websocket/UnpackedTarball_java_websocket.mk
new file mode 100644
index 0000000000..c0794de9b4
--- /dev/null
+++ b/external/java_websocket/UnpackedTarball_java_websocket.mk
@@ -0,0 +1,31 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+$(eval $(call gb_UnpackedTarball_UnpackedTarball,java_websocket))
+
+$(eval $(call gb_UnpackedTarball_set_tarball,java_websocket,$(JAVA_WEBSOCKET_TARBALL),,java_websocket))
+
+$(eval $(call gb_UnpackedTarball_set_patchlevel,java_websocket,1))
+
+$(eval $(call gb_UnpackedTarball_add_patches,java_websocket,\
+ external/java_websocket/patches/ant-build.patch \
+ external/java_websocket/patches/no-slf4j.patch \
+ external/java_websocket/patches/0001-cid-1546192-SIC-Inner-class-could-be-made-static.patch \
+ external/java_websocket/patches/0001-cid-1545614-UR-Uninitialized-read-of-field-in-constr.patch \
+ external/java_websocket/patches/0002-cid-1545284-UR-Uninitialized-read-of-field-in-constr.patch \
+ external/java_websocket/patches/0001-cid-1546292-DLS-Dead-local-store.patch \
+ external/java_websocket/patches/0001-cid-1545227-Dm-Dubious-method-used.patch \
+ external/java_websocket/patches/0001-cid-1545515-Dm-Dubious-method-used.patch \
+ external/java_websocket/patches/0001-cid-1546264-Dm-Dubious-method-used.patch \
+ external/java_websocket/patches/0001-cid-1546341-Resource-leak-on-an-exceptional-path.patch \
+ external/java_websocket/patches/0001-cid-1545249-Bad-bit-shift-operation.patch \
+ external/java_websocket/patches/0001-cid-1546344-Dm-Dubious-method-used.patch \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/external/java_websocket/patches/0001-cid-1545227-Dm-Dubious-method-used.patch b/external/java_websocket/patches/0001-cid-1545227-Dm-Dubious-method-used.patch
new file mode 100644
index 0000000000..162051aca2
--- /dev/null
+++ b/external/java_websocket/patches/0001-cid-1545227-Dm-Dubious-method-used.patch
@@ -0,0 +1,55 @@
+From 695aacc67345bf1f9d311972f864751c135d4047 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolan.mcnamara@collabora.com>
+Date: Sun, 1 Oct 2023 19:42:26 +0100
+Subject: [PATCH] cid#1545227 Dm: Dubious method used
+
+and
+
+cid#1545310 Dm: Dubious method used
+cid#1545513 Dm: Dubious method used
+---
+ src/main/java/org/java_websocket/drafts/Draft_6455.java | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/src/main/java/org/java_websocket/drafts/Draft_6455.java b/src/main/java/org/java_websocket/drafts/Draft_6455.java
+index f9f960d..1e08448 100644
+--- a/src/main/java/org/java_websocket/drafts/Draft_6455.java
++++ b/src/main/java/org/java_websocket/drafts/Draft_6455.java
+@@ -26,6 +26,7 @@
+ package org.java_websocket.drafts;
+
+ import java.math.BigInteger;
++import java.nio.charset.StandardCharsets;
+ import java.nio.ByteBuffer;
+ import java.security.MessageDigest;
+ import java.security.NoSuchAlgorithmException;
+@@ -470,7 +471,7 @@
+ if (log.isLoggable(Level.FINE)) {
+ log.fine("afterEnconding({}): {}" + " : " + framedata.getPayloadData().remaining() + " : " +
+ (framedata.getPayloadData().remaining() > 1000 ? "too big to display"
+- : new String(framedata.getPayloadData().array())));
++ : new String(framedata.getPayloadData().array(), StandardCharsets.US_ASCII)));
+ }
+ return createByteBufferFromFramedata(framedata);
+ }
+@@ -590,7 +591,7 @@
+ if (log.isLoggable(Level.FINE)) {
+ log.fine("afterDecoding({}): {}" + " : " + frame.getPayloadData().remaining() + " : " +
+ (frame.getPayloadData().remaining() > 1000 ? "too big to display"
+- : new String(frame.getPayloadData().array())));
++ : new String(frame.getPayloadData().array(), StandardCharsets.US_ASCII)));
+ }
+ frame.isValid();
+ return frame;
+@@ -838,7 +839,7 @@
+ } catch (NoSuchAlgorithmException e) {
+ throw new IllegalStateException(e);
+ }
+- return Base64.encodeBytes(sh1.digest(acc.getBytes()));
++ return Base64.encodeBytes(sh1.digest(acc.getBytes(StandardCharsets.US_ASCII)));
+ }
+
+ private byte[] toByteArray(long val, int bytecount) {
+--
+2.41.0
+
diff --git a/external/java_websocket/patches/0001-cid-1545249-Bad-bit-shift-operation.patch b/external/java_websocket/patches/0001-cid-1545249-Bad-bit-shift-operation.patch
new file mode 100644
index 0000000000..759038d8d3
--- /dev/null
+++ b/external/java_websocket/patches/0001-cid-1545249-Bad-bit-shift-operation.patch
@@ -0,0 +1,50 @@
+From 49a74350016b59c4cca054c5802b4437c0b3857f Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolan.mcnamara@collabora.com>
+Date: Wed, 4 Oct 2023 15:19:13 +0100
+Subject: [PATCH] cid#1545249 Bad bit shift operation
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.19
+
+If the promoted type of the left-hand operand is int, only the five
+lowest-order bits of the right-hand operand are used as the shift
+distance. It is as if the right-hand operand were subjected to a bitwise
+logical AND operator & (ยง15.22.1) with the mask value 0x1f (0b11111).
+The shift distance actually used is therefore always in the range 0 to
+31, inclusive.
+
+so a >>> of 32 is the same as >>> 0 so this is
+result = 31 * result + (maxFrameSize ^ maxFrameSize);
+i.e.
+result = 31 * result + (0);
+
+which all looks a bit dubious.
+
+Working theory from https://gerrit.libreoffice.org/c/core/+/157571/1 is
+that at some point maxFrameSize was a long value, and then got changed
+to an int, but the hashCode() was not updated and should now read as
+changed here.
+
+ result = 31 * result + maxFrameSize;
+---
+ src/main/java/org/java_websocket/drafts/Draft_6455.java | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/main/java/org/java_websocket/drafts/Draft_6455.java b/src/main/java/org/java_websocket/drafts/Draft_6455.java
+index 1e08448..635fa1f 100644
+--- a/src/main/java/org/java_websocket/drafts/Draft_6455.java
++++ b/src/main/java/org/java_websocket/drafts/Draft_6455.java
+@@ -1150,7 +1150,7 @@ public class Draft_6455 extends Draft {
+ public int hashCode() {
+ int result = negotiatedExtension != null ? negotiatedExtension.hashCode() : 0;
+ result = 31 * result + (protocol != null ? protocol.hashCode() : 0);
+- result = 31 * result + (maxFrameSize ^ (maxFrameSize >>> 32));
++ result = 31 * result + maxFrameSize;
+ return result;
+ }
+
+--
+2.41.0
+
diff --git a/external/java_websocket/patches/0001-cid-1545515-Dm-Dubious-method-used.patch b/external/java_websocket/patches/0001-cid-1545515-Dm-Dubious-method-used.patch
new file mode 100644
index 0000000000..e56780600a
--- /dev/null
+++ b/external/java_websocket/patches/0001-cid-1545515-Dm-Dubious-method-used.patch
@@ -0,0 +1,42 @@
+From 695941c8da3e6cefa0553996773a8cf8673bb00e Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolan.mcnamara@collabora.com>
+Date: Sun, 1 Oct 2023 19:50:02 +0100
+Subject: [PATCH] cid#1545515 Dm: Dubious method used
+
+---
+ src/main/java/org/java_websocket/WebSocketImpl.java | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/src/main/java/org/java_websocket/WebSocketImpl.java b/src/main/java/org/java_websocket/WebSocketImpl.java
+index 85fd413..926f330 100644
+--- a/src/main/java/org/java_websocket/WebSocketImpl.java
++++ b/src/main/java/org/java_websocket/WebSocketImpl.java
+@@ -30,6 +30,7 @@
+ import java.nio.ByteBuffer;
+ import java.nio.channels.ByteChannel;
+ import java.nio.channels.SelectionKey;
++import java.nio.charset.StandardCharsets;
+ import java.util.ArrayList;
+ import java.util.Collection;
+ import java.util.Collections;
+@@ -227,7 +228,7 @@
+ if (log.isLoggable(Level.FINE)) {
+ log.fine("process({}): ({})" + " : " + socketBuffer.remaining() + " : " +
+ (socketBuffer.remaining() > 1000 ? "too big to display"
+- : new String(socketBuffer.array(), socketBuffer.position(), socketBuffer.remaining())));
++ : new String(socketBuffer.array(), socketBuffer.position(), socketBuffer.remaining(), StandardCharsets.US_ASCII)));
+ }
+ if (readyState != ReadyState.NOT_YET_CONNECTED) {
+ if (readyState == ReadyState.OPEN) {
+@@ -740,7 +741,7 @@
+
+ private void write(ByteBuffer buf) {
+ log.fine("write({}): {}" + " : " + buf.remaining() + " : " +
+- (buf.remaining() > 1000 ? "too big to display" : new String(buf.array())));
++ (buf.remaining() > 1000 ? "too big to display" : new String(buf.array(), StandardCharsets.US_ASCII)));
+
+ outQueue.add(buf);
+ wsl.onWriteDemand(this);
+--
+2.41.0
+
diff --git a/external/java_websocket/patches/0001-cid-1545614-UR-Uninitialized-read-of-field-in-constr.patch b/external/java_websocket/patches/0001-cid-1545614-UR-Uninitialized-read-of-field-in-constr.patch
new file mode 100644
index 0000000000..f23b3c5323
--- /dev/null
+++ b/external/java_websocket/patches/0001-cid-1545614-UR-Uninitialized-read-of-field-in-constr.patch
@@ -0,0 +1,26 @@
+From b6191d3422873648bebb322d85367647ae7d9dc0 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolan.mcnamara@collabora.com>
+Date: Sun, 1 Oct 2023 19:28:15 +0100
+Subject: [PATCH 1/2] cid#1545614 UR: Uninitialized read of field in
+ constructor
+
+---
+ src/main/java/org/java_websocket/WebSocketImpl.java | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/main/java/org/java_websocket/WebSocketImpl.java b/src/main/java/org/java_websocket/WebSocketImpl.java
+index c2cd223..85fd413 100644
+--- a/src/main/java/org/java_websocket/WebSocketImpl.java
++++ b/src/main/java/org/java_websocket/WebSocketImpl.java
+@@ -205,7 +205,7 @@ public class WebSocketImpl implements WebSocket {
+ */
+ public WebSocketImpl(WebSocketListener listener, Draft draft) {
+ // socket can be null because we want do be able to create the object without already having a bound channel
+- if (listener == null || (draft == null && role == Role.SERVER)) {
++ if (listener == null) {
+ throw new IllegalArgumentException("parameters must not be null");
+ }
+ this.outQueue = new LinkedBlockingQueue<>();
+--
+2.41.0
+
diff --git a/external/java_websocket/patches/0001-cid-1546192-SIC-Inner-class-could-be-made-static.patch b/external/java_websocket/patches/0001-cid-1546192-SIC-Inner-class-could-be-made-static.patch
new file mode 100644
index 0000000000..ea7c56c036
--- /dev/null
+++ b/external/java_websocket/patches/0001-cid-1546192-SIC-Inner-class-could-be-made-static.patch
@@ -0,0 +1,25 @@
+From 2fc9513baa5b6e1d9fd26edef5816e598805754c Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolan.mcnamara@collabora.com>
+Date: Sat, 30 Sep 2023 19:45:58 +0100
+Subject: [PATCH] cid#1546192 SIC: Inner class could be made static
+
+---
+ src/main/java/org/java_websocket/drafts/Draft_6455.java | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/main/java/org/java_websocket/drafts/Draft_6455.java b/src/main/java/org/java_websocket/drafts/Draft_6455.java
+index eb48799..f9f960d 100644
+--- a/src/main/java/org/java_websocket/drafts/Draft_6455.java
++++ b/src/main/java/org/java_websocket/drafts/Draft_6455.java
+@@ -1192,7 +1192,7 @@ public class Draft_6455 extends Draft {
+ return totalSize;
+ }
+
+- private class TranslatedPayloadMetaData {
++ private static class TranslatedPayloadMetaData {
+
+ private int payloadLength;
+ private int realPackageSize;
+--
+2.41.0
+
diff --git a/external/java_websocket/patches/0001-cid-1546264-Dm-Dubious-method-used.patch b/external/java_websocket/patches/0001-cid-1546264-Dm-Dubious-method-used.patch
new file mode 100644
index 0000000000..22730e59f8
--- /dev/null
+++ b/external/java_websocket/patches/0001-cid-1546264-Dm-Dubious-method-used.patch
@@ -0,0 +1,64 @@
+From 83e8f4ee244e2616032dc0b8b260fda30ca1105b Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolan.mcnamara@collabora.com>
+Date: Sun, 1 Oct 2023 19:52:37 +0100
+Subject: [PATCH] cid#1546264 Dm: Dubious method used
+
+and
+
+cid#1546494 Dm: Dubious method used
+---
+ src/main/java/org/java_websocket/SSLSocketChannel2.java | 7 ++++---
+ .../java/org/java_websocket/framing/FramedataImpl1.java | 3 ++-
+ 2 files changed, 6 insertions(+), 4 deletions(-)
+
+diff --git a/src/main/java/org/java_websocket/SSLSocketChannel2.java b/src/main/java/org/java_websocket/SSLSocketChannel2.java
+index c0ea28e..2d3a279 100644
+--- a/src/main/java/org/java_websocket/SSLSocketChannel2.java
++++ b/src/main/java/org/java_websocket/SSLSocketChannel2.java
+@@ -34,6 +34,7 @@
+ import java.nio.channels.SelectableChannel;
+ import java.nio.channels.SelectionKey;
+ import java.nio.channels.SocketChannel;
++import java.nio.charset.StandardCharsets;
+ import java.util.ArrayList;
+ import java.util.Iterator;
+ import java.util.List;
+@@ -257,12 +258,12 @@
+ }
+ }
+ if (inData.remaining() != 0 && log.isLoggable(Level.FINE)) {
+- log.fine(new String(inData.array(), inData.position(), inData.remaining()));
++ log.fine(new String(inData.array(), inData.position(), inData.remaining(), StandardCharsets.US_ASCII));
+ }
+ inData.rewind();
+ inData.flip();
+ if (inCrypt.remaining() != 0 && log.isLoggable(Level.FINE)) {
+- log.fine(new String(inCrypt.array(), inCrypt.position(), inCrypt.remaining()));
++ log.fine(new String(inCrypt.array(), inCrypt.position(), inCrypt.remaining(), StandardCharsets.US_ASCII));
+ }
+ inCrypt.rewind();
+ inCrypt.flip();
+diff --git a/src/main/java/org/java_websocket/framing/FramedataImpl1.java b/src/main/java/org/java_websocket/framing/FramedataImpl1.java
+index fc74f7a..6ff1af2 100644
+--- a/src/main/java/org/java_websocket/framing/FramedataImpl1.java
++++ b/src/main/java/org/java_websocket/framing/FramedataImpl1.java
+@@ -26,6 +26,7 @@
+ package org.java_websocket.framing;
+
+ import java.nio.ByteBuffer;
++import java.nio.charset.StandardCharsets;
+ import org.java_websocket.enums.Opcode;
+ import org.java_websocket.exceptions.InvalidDataException;
+ import org.java_websocket.util.ByteBufferUtils;
+@@ -162,7 +163,7 @@ public abstract class FramedataImpl1 implements Framedata {
+ + ", rsv2:" + isRSV2() + ", rsv3:" + isRSV3() + ", payload length:[pos:" + unmaskedpayload
+ .position() + ", len:" + unmaskedpayload.remaining() + "], payload:" + (
+ unmaskedpayload.remaining() > 1000 ? "(too big to display)"
+- : new String(unmaskedpayload.array())) + '}';
++ : new String(unmaskedpayload.array(), StandardCharsets.US_ASCII)) + '}';
+ }
+
+ /**
+--
+2.41.0
+
diff --git a/external/java_websocket/patches/0001-cid-1546292-DLS-Dead-local-store.patch b/external/java_websocket/patches/0001-cid-1546292-DLS-Dead-local-store.patch
new file mode 100644
index 0000000000..c1981de3f1
--- /dev/null
+++ b/external/java_websocket/patches/0001-cid-1546292-DLS-Dead-local-store.patch
@@ -0,0 +1,25 @@
+From 01a9d917f7f595a191f67a876ee67f3276dbf7cc Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolan.mcnamara@collabora.com>
+Date: Sun, 1 Oct 2023 19:39:22 +0100
+Subject: [PATCH] cid#1546292 DLS: Dead local store
+
+---
+ .../permessage_deflate/PerMessageDeflateExtension.java | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/main/java/org/java_websocket/extensions/permessage_deflate/PerMessageDeflateExtension.java b/src/main/java/org/java_websocket/extensions/permessage_deflate/PerMessageDeflateExtension.java
+index f24f9b6..9947da0 100644
+--- a/src/main/java/org/java_websocket/extensions/permessage_deflate/PerMessageDeflateExtension.java
++++ b/src/main/java/org/java_websocket/extensions/permessage_deflate/PerMessageDeflateExtension.java
+@@ -304,7 +304,7 @@ public class PerMessageDeflateExtension extends CompressionExtension {
+ }
+
+ // Holds parameters that are sent by the server, as a response to our initial extension request.
+- Map<String, String> headers = extensionData.getExtensionParameters();
++ // Map<String, String> headers = extensionData.getExtensionParameters();
+ // After this point, parameters that the server sent back can be configured, but we don't use them for now.
+ return true;
+ }
+--
+2.41.0
+
diff --git a/external/java_websocket/patches/0001-cid-1546341-Resource-leak-on-an-exceptional-path.patch b/external/java_websocket/patches/0001-cid-1546341-Resource-leak-on-an-exceptional-path.patch
new file mode 100644
index 0000000000..8c388f2ef2
--- /dev/null
+++ b/external/java_websocket/patches/0001-cid-1546341-Resource-leak-on-an-exceptional-path.patch
@@ -0,0 +1,40 @@
+From 77aac6a0be7a22dc63fd449a8292ff0b83dcb005 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolan.mcnamara@collabora.com>
+Date: Tue, 3 Oct 2023 11:06:35 +0100
+Subject: [PATCH] cid#1546341 Resource leak on an exceptional path
+
+---
+ .../java_websocket/server/WebSocketServer.java | 17 +++++++++++++----
+ 1 file changed, 13 insertions(+), 4 deletions(-)
+
+diff --git a/src/main/java/org/java_websocket/server/WebSocketServer.java b/src/main/java/org/java_websocket/server/WebSocketServer.java
+index bb8178c..36e19a7 100644
+--- a/src/main/java/org/java_websocket/server/WebSocketServer.java
++++ b/src/main/java/org/java_websocket/server/WebSocketServer.java
+@@ -473,10 +473,19 @@ public abstract class WebSocketServer extends AbstractWebSocket implements Runna
+ if (channel == null) {
+ return;
+ }
+- channel.configureBlocking(false);
+- Socket socket = channel.socket();
+- socket.setTcpNoDelay(isTcpNoDelay());
+- socket.setKeepAlive(true);
++ try {
++ channel.configureBlocking(false);
++ Socket socket = channel.socket();
++ socket.setTcpNoDelay(isTcpNoDelay());
++ socket.setKeepAlive(true);
++ } catch (IOException ex) {
++ try {
++ channel.close();
++ } catch (IOException e) {
++ // there is nothing that must be done here
++ }
++ throw ex;
++ }
+ WebSocketImpl w = wsf.createWebSocket(this, drafts);
+ w.setSelectionKey(channel.register(selector, SelectionKey.OP_READ, w));
+ try {
+--
+2.41.0
+
diff --git a/external/java_websocket/patches/0001-cid-1546344-Dm-Dubious-method-used.patch b/external/java_websocket/patches/0001-cid-1546344-Dm-Dubious-method-used.patch
new file mode 100644
index 0000000000..0dff805889
--- /dev/null
+++ b/external/java_websocket/patches/0001-cid-1546344-Dm-Dubious-method-used.patch
@@ -0,0 +1,30 @@
+From f08918e466a99bdb7577fe4f91fa651d7c14fcb5 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolan.mcnamara@collabora.com>
+Date: Wed, 4 Oct 2023 15:36:02 +0100
+Subject: [PATCH] cid#1546344 Dm: Dubious method used
+
+---
+ src/main/java/org/java_websocket/util/Base64.java | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+diff --git a/src/main/java/org/java_websocket/util/Base64.java b/src/main/java/org/java_websocket/util/Base64.java
+index e9ff7b8..da49ed5 100644
+--- a/src/main/java/org/java_websocket/util/Base64.java
++++ b/src/main/java/org/java_websocket/util/Base64.java
+@@ -620,12 +620,7 @@ public class Base64 {
+ byte[] encoded = encodeBytesToBytes(source, off, len, options);
+
+ // Return value according to relevant encoding.
+- try {
+- return new String(encoded, PREFERRED_ENCODING);
+- } catch (java.io.UnsupportedEncodingException uue) {
+- return new String(encoded);
+- } // end catch
+-
++ return new String(encoded, PREFERRED_ENCODING);
+ } // end encodeBytes
+
+ /**
+--
+2.41.0
+
diff --git a/external/java_websocket/patches/0002-cid-1545284-UR-Uninitialized-read-of-field-in-constr.patch b/external/java_websocket/patches/0002-cid-1545284-UR-Uninitialized-read-of-field-in-constr.patch
new file mode 100644
index 0000000000..61415c932e
--- /dev/null
+++ b/external/java_websocket/patches/0002-cid-1545284-UR-Uninitialized-read-of-field-in-constr.patch
@@ -0,0 +1,26 @@
+From 04fa9cea4d9d14743ff54ad5faaf7e31f081bacb Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolan.mcnamara@collabora.com>
+Date: Sun, 1 Oct 2023 19:29:27 +0100
+Subject: [PATCH 2/2] cid#1545284 UR: Uninitialized read of field in
+ constructor
+
+---
+ src/main/java/org/java_websocket/SSLSocketChannel.java | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/main/java/org/java_websocket/SSLSocketChannel.java b/src/main/java/org/java_websocket/SSLSocketChannel.java
+index b402450..760f643 100644
+--- a/src/main/java/org/java_websocket/SSLSocketChannel.java
++++ b/src/main/java/org/java_websocket/SSLSocketChannel.java
+@@ -130,7 +130,7 @@ public class SSLSocketChannel implements WrappedByteChannel, ByteChannel, ISSLCh
+
+ public SSLSocketChannel(SocketChannel inputSocketChannel, SSLEngine inputEngine,
+ ExecutorService inputExecutor, SelectionKey key) throws IOException {
+- if (inputSocketChannel == null || inputEngine == null || executor == inputExecutor) {
++ if (inputSocketChannel == null || inputEngine == null || inputExecutor == null) {
+ throw new IllegalArgumentException("parameter must not be null");
+ }
+
+--
+2.41.0
+
diff --git a/external/java_websocket/patches/ant-build.patch b/external/java_websocket/patches/ant-build.patch
new file mode 100644
index 0000000000..c2546bcc1f
--- /dev/null
+++ b/external/java_websocket/patches/ant-build.patch
@@ -0,0 +1,27 @@
+--- /dev/null 1970-01-01 01:00:00.000000000 +0100
++++ b/build.xml 2023-08-30 11:43:05.152647141 +0100
+@@ -0,0 +1,24 @@
++<project default="all">
++ <target name="all" depends="jar" />
++
++ <target name="compile">
++ <mkdir dir="build/classes" />
++ <javac includeantruntime="false" srcdir="src/main/java"
++ destdir="build/classes" encoding="UTF-8">
++ <exclude name="**/PerMessageDeflateExtension.java"/>
++ </javac>
++ </target>
++
++ <target name="jar" depends="compile">
++ <mkdir dir="dist"/>
++ <jar destfile="dist/java_websocket.jar">
++ <fileset dir="build/classes" includes="**/*.class" />
++ </jar>
++ </target>
++
++ <target name="clean">
++ <delete dir="build" />
++ <delete dir="dist" />
++ </target>
++
++</project>
diff --git a/external/java_websocket/patches/no-slf4j.patch b/external/java_websocket/patches/no-slf4j.patch
new file mode 100644
index 0000000000..27296071ef
--- /dev/null
+++ b/external/java_websocket/patches/no-slf4j.patch
@@ -0,0 +1,748 @@
+diff -ru a/src/main/java/org/java_websocket/AbstractWebSocket.java b/src/main/java/org/java_websocket/AbstractWebSocket.java
+--- a/src/main/java/org/java_websocket/AbstractWebSocket.java 2023-07-20 21:24:05.000000000 +0100
++++ b/src/main/java/org/java_websocket/AbstractWebSocket.java 2023-08-30 12:06:11.004719499 +0100
+@@ -33,9 +33,7 @@
+ import java.util.concurrent.TimeUnit;
+ import org.java_websocket.framing.CloseFrame;
+ import org.java_websocket.util.NamedThreadFactory;
+-import org.slf4j.Logger;
+-import org.slf4j.LoggerFactory;
+-
++import java.util.logging.Logger;
+
+ /**
+ * Base class for additional implementations for the server as well as the client
+@@ -47,7 +45,7 @@
+ *
+ * @since 1.4.0
+ */
+- private final Logger log = LoggerFactory.getLogger(AbstractWebSocket.class);
++ private final Logger log = Logger.getLogger(AbstractWebSocket.class.getName());
+
+ /**
+ * Attribute which allows you to deactivate the Nagle's algorithm
+@@ -118,12 +116,12 @@
+ synchronized (syncConnectionLost) {
+ this.connectionLostTimeout = TimeUnit.SECONDS.toNanos(connectionLostTimeout);
+ if (this.connectionLostTimeout <= 0) {
+- log.trace("Connection lost timer stopped");
++ log.fine("Connection lost timer stopped");
+ cancelConnectionLostTimer();
+ return;
+ }
+ if (this.websocketRunning) {
+- log.trace("Connection lost timer restarted");
++ log.fine("Connection lost timer restarted");
+ //Reset all the pings
+ try {
+ ArrayList<WebSocket> connections = new ArrayList<>(getConnections());
+@@ -135,7 +133,7 @@
+ }
+ }
+ } catch (Exception e) {
+- log.error("Exception during connection lost restart", e);
++ log.severe("Exception during connection lost restart" + " : " + e);
+ }
+ restartConnectionLostTimer();
+ }
+@@ -151,7 +149,7 @@
+ synchronized (syncConnectionLost) {
+ if (connectionLostCheckerService != null || connectionLostCheckerFuture != null) {
+ this.websocketRunning = false;
+- log.trace("Connection lost timer stopped");
++ log.fine("Connection lost timer stopped");
+ cancelConnectionLostTimer();
+ }
+ }
+@@ -165,10 +163,10 @@
+ protected void startConnectionLostTimer() {
+ synchronized (syncConnectionLost) {
+ if (this.connectionLostTimeout <= 0) {
+- log.trace("Connection lost timer deactivated");
++ log.fine("Connection lost timer deactivated");
+ return;
+ }
+- log.trace("Connection lost timer started");
++ log.fine("Connection lost timer started");
+ this.websocketRunning = true;
+ restartConnectionLostTimer();
+ }
+@@ -228,14 +226,14 @@
+ }
+ WebSocketImpl webSocketImpl = (WebSocketImpl) webSocket;
+ if (webSocketImpl.getLastPong() < minimumPongTime) {
+- log.trace("Closing connection due to no pong received: {}", webSocketImpl);
++ log.fine("Closing connection due to no pong received: {}" + " : " + webSocketImpl);
+ webSocketImpl.closeConnection(CloseFrame.ABNORMAL_CLOSE,
+ "The connection was closed because the other endpoint did not respond with a pong in time. For more information check: https://github.com/TooTallNate/Java-WebSocket/wiki/Lost-connection-detection");
+ } else {
+ if (webSocketImpl.isOpen()) {
+ webSocketImpl.sendPing();
+ } else {
+- log.trace("Trying to ping a non open connection: {}", webSocketImpl);
++ log.fine("Trying to ping a non open connection: {}" + " : " + webSocketImpl);
+ }
+ }
+ }
+diff -ru a/src/main/java/org/java_websocket/drafts/Draft_6455.java b/src/main/java/org/java_websocket/drafts/Draft_6455.java
+--- a/src/main/java/org/java_websocket/drafts/Draft_6455.java 2023-07-20 21:24:05.000000000 +0100
++++ b/src/main/java/org/java_websocket/drafts/Draft_6455.java 2023-08-30 12:16:03.534083539 +0100
+@@ -66,8 +66,8 @@
+ import org.java_websocket.protocols.Protocol;
+ import org.java_websocket.util.Base64;
+ import org.java_websocket.util.Charsetfunctions;
+-import org.slf4j.Logger;
+-import org.slf4j.LoggerFactory;
++import java.util.logging.Level;
++import java.util.logging.Logger;
+
+ /**
+ * Implementation for the RFC 6455 websocket protocol This is the recommended class for your
+@@ -110,7 +110,7 @@
+ *
+ * @since 1.4.0
+ */
+- private final Logger log = LoggerFactory.getLogger(Draft_6455.class);
++ private final Logger log = Logger.getLogger(Draft_6455.class.getName());
+
+ /**
+ * Attribute for the used extension in this draft
+@@ -263,7 +263,7 @@
+ throws InvalidHandshakeException {
+ int v = readVersion(handshakedata);
+ if (v != 13) {
+- log.trace("acceptHandshakeAsServer - Wrong websocket version.");
++ log.fine("acceptHandshakeAsServer - Wrong websocket version.");
+ return HandshakeState.NOT_MATCHED;
+ }
+ HandshakeState extensionState = HandshakeState.NOT_MATCHED;
+@@ -272,7 +272,7 @@
+ if (knownExtension.acceptProvidedExtensionAsServer(requestedExtension)) {
+ negotiatedExtension = knownExtension;
+ extensionState = HandshakeState.MATCHED;
+- log.trace("acceptHandshakeAsServer - Matching extension found: {}", negotiatedExtension);
++ log.fine("acceptHandshakeAsServer - Matching extension found: {}" + " : " + negotiatedExtension);
+ break;
+ }
+ }
+@@ -281,7 +281,7 @@
+ if (protocolState == HandshakeState.MATCHED && extensionState == HandshakeState.MATCHED) {
+ return HandshakeState.MATCHED;
+ }
+- log.trace("acceptHandshakeAsServer - No matching extension or protocol found.");
++ log.fine("acceptHandshakeAsServer - No matching extension or protocol found.");
+ return HandshakeState.NOT_MATCHED;
+ }
+
+@@ -295,7 +295,7 @@
+ for (IProtocol knownProtocol : knownProtocols) {
+ if (knownProtocol.acceptProvidedProtocol(requestedProtocol)) {
+ protocol = knownProtocol;
+- log.trace("acceptHandshake - Matching protocol found: {}", protocol);
++ log.fine("acceptHandshake - Matching protocol found: {}" + " : " + protocol);
+ return HandshakeState.MATCHED;
+ }
+ }
+@@ -306,12 +306,12 @@
+ public HandshakeState acceptHandshakeAsClient(ClientHandshake request, ServerHandshake response)
+ throws InvalidHandshakeException {
+ if (!basicAccept(response)) {
+- log.trace("acceptHandshakeAsClient - Missing/wrong upgrade or connection in handshake.");
++ log.fine("acceptHandshakeAsClient - Missing/wrong upgrade or connection in handshake.");
+ return HandshakeState.NOT_MATCHED;
+ }
+ if (!request.hasFieldValue(SEC_WEB_SOCKET_KEY) || !response
+ .hasFieldValue(SEC_WEB_SOCKET_ACCEPT)) {
+- log.trace("acceptHandshakeAsClient - Missing Sec-WebSocket-Key or Sec-WebSocket-Accept");
++ log.fine("acceptHandshakeAsClient - Missing Sec-WebSocket-Key or Sec-WebSocket-Accept");
+ return HandshakeState.NOT_MATCHED;
+ }
+
+@@ -320,7 +320,7 @@
+ seckeyChallenge = generateFinalKey(seckeyChallenge);
+
+ if (!seckeyChallenge.equals(seckeyAnswer)) {
+- log.trace("acceptHandshakeAsClient - Wrong key for Sec-WebSocket-Key.");
++ log.fine("acceptHandshakeAsClient - Wrong key for Sec-WebSocket-Key.");
+ return HandshakeState.NOT_MATCHED;
+ }
+ HandshakeState extensionState = HandshakeState.NOT_MATCHED;
+@@ -329,7 +329,7 @@
+ if (knownExtension.acceptProvidedExtensionAsClient(requestedExtension)) {
+ negotiatedExtension = knownExtension;
+ extensionState = HandshakeState.MATCHED;
+- log.trace("acceptHandshakeAsClient - Matching extension found: {}", negotiatedExtension);
++ log.fine("acceptHandshakeAsClient - Matching extension found: {}" + " : " + negotiatedExtension);
+ break;
+ }
+ }
+@@ -338,7 +338,7 @@
+ if (protocolState == HandshakeState.MATCHED && extensionState == HandshakeState.MATCHED) {
+ return HandshakeState.MATCHED;
+ }
+- log.trace("acceptHandshakeAsClient - No matching extension or protocol found.");
++ log.fine("acceptHandshakeAsClient - No matching extension or protocol found.");
+ return HandshakeState.NOT_MATCHED;
+ }
+
+@@ -467,8 +467,8 @@
+ @Override
+ public ByteBuffer createBinaryFrame(Framedata framedata) {
+ getExtension().encodeFrame(framedata);
+- if (log.isTraceEnabled()) {
+- log.trace("afterEnconding({}): {}", framedata.getPayloadData().remaining(),
++ if (log.isLoggable(Level.FINE)) {
++ log.fine("afterEnconding({}): {}" + " : " + framedata.getPayloadData().remaining() + " : " +
+ (framedata.getPayloadData().remaining() > 1000 ? "too big to display"
+ : new String(framedata.getPayloadData().array())));
+ }
+@@ -587,8 +587,8 @@
+ }
+ currentDecodingExtension.isFrameValid(frame);
+ currentDecodingExtension.decodeFrame(frame);
+- if (log.isTraceEnabled()) {
+- log.trace("afterDecoding({}): {}", frame.getPayloadData().remaining(),
++ if (log.isLoggable(Level.FINE)) {
++ log.fine("afterDecoding({}): {}" + " : " + frame.getPayloadData().remaining() + " : " +
+ (frame.getPayloadData().remaining() > 1000 ? "too big to display"
+ : new String(frame.getPayloadData().array())));
+ }
+@@ -615,7 +615,7 @@
+ int payloadlength = oldPayloadlength;
+ int realpacketsize = oldRealpacketsize;
+ if (optcode == Opcode.PING || optcode == Opcode.PONG || optcode == Opcode.CLOSING) {
+- log.trace("Invalid frame: more than 125 octets");
++ log.fine("Invalid frame: more than 125 octets");
+ throw new InvalidFrameException("more than 125 octets");
+ }
+ if (payloadlength == 126) {
+@@ -647,15 +647,15 @@
+ */
+ private void translateSingleFrameCheckLengthLimit(long length) throws LimitExceededException {
+ if (length > Integer.MAX_VALUE) {
+- log.trace("Limit exedeed: Payloadsize is to big...");
++ log.fine("Limit exedeed: Payloadsize is to big...");
+ throw new LimitExceededException("Payloadsize is to big...");
+ }
+ if (length > maxFrameSize) {
+- log.trace("Payload limit reached. Allowed: {} Current: {}", maxFrameSize, length);
++ log.fine("Payload limit reached. Allowed: {} Current: {}" + " : " + maxFrameSize + " : " + length);
+ throw new LimitExceededException("Payload limit reached.", maxFrameSize);
+ }
+ if (length < 0) {
+- log.trace("Limit underflow: Payloadsize is to little...");
++ log.fine("Limit underflow: Payloadsize is to little...");
+ throw new LimitExceededException("Payloadsize is to little...");
+ }
+ }
+@@ -670,7 +670,7 @@
+ private void translateSingleFrameCheckPacketSize(int maxpacketsize, int realpacketsize)
+ throws IncompleteException {
+ if (maxpacketsize < realpacketsize) {
+- log.trace("Incomplete frame: maxpacketsize < realpacketsize");
++ log.fine("Incomplete frame: maxpacketsize < realpacketsize");
+ throw new IncompleteException(realpacketsize);
+ }
+ }
+@@ -903,7 +903,7 @@
+ } else if (!frame.isFin() || curop == Opcode.CONTINUOUS) {
+ processFrameContinuousAndNonFin(webSocketImpl, frame, curop);
+ } else if (currentContinuousFrame != null) {
+- log.error("Protocol error: Continuous frame sequence not completed.");
++ log.severe("Protocol error: Continuous frame sequence not completed.");
+ throw new InvalidDataException(CloseFrame.PROTOCOL_ERROR,
+ "Continuous frame sequence not completed.");
+ } else if (curop == Opcode.TEXT) {
+@@ -911,7 +911,7 @@
+ } else if (curop == Opcode.BINARY) {
+ processFrameBinary(webSocketImpl, frame);
+ } else {
+- log.error("non control or continious frame expected");
++ log.severe("non control or continious frame expected");
+ throw new InvalidDataException(CloseFrame.PROTOCOL_ERROR,
+ "non control or continious frame expected");
+ }
+@@ -932,13 +932,13 @@
+ } else if (frame.isFin()) {
+ processFrameIsFin(webSocketImpl, frame);
+ } else if (currentContinuousFrame == null) {
+- log.error("Protocol error: Continuous frame sequence was not started.");
++ log.severe("Protocol error: Continuous frame sequence was not started.");
+ throw new InvalidDataException(CloseFrame.PROTOCOL_ERROR,
+ "Continuous frame sequence was not started.");
+ }
+ //Check if the whole payload is valid utf8, when the opcode indicates a text
+ if (curop == Opcode.TEXT && !Charsetfunctions.isValidUTF8(frame.getPayloadData())) {
+- log.error("Protocol error: Payload is not UTF8");
++ log.severe("Protocol error: Payload is not UTF8");
+ throw new InvalidDataException(CloseFrame.NO_UTF8);
+ }
+ //Checking if the current continuous frame contains a correct payload with the other frames combined
+@@ -969,7 +969,7 @@
+ * @param e the runtime exception
+ */
+ private void logRuntimeException(WebSocketImpl webSocketImpl, RuntimeException e) {
+- log.error("Runtime exception during onWebsocketMessage", e);
++ log.severe("Runtime exception during onWebsocketMessage" + " : " + e);
+ webSocketImpl.getWebSocketListener().onWebsocketError(webSocketImpl, e);
+ }
+
+@@ -999,7 +999,7 @@
+ private void processFrameIsFin(WebSocketImpl webSocketImpl, Framedata frame)
+ throws InvalidDataException {
+ if (currentContinuousFrame == null) {
+- log.trace("Protocol error: Previous continuous frame sequence not completed.");
++ log.fine("Protocol error: Previous continuous frame sequence not completed.");
+ throw new InvalidDataException(CloseFrame.PROTOCOL_ERROR,
+ "Continuous frame sequence was not started.");
+ }
+@@ -1036,7 +1036,7 @@
+ */
+ private void processFrameIsNotFin(Framedata frame) throws InvalidDataException {
+ if (currentContinuousFrame != null) {
+- log.trace("Protocol error: Previous continuous frame sequence not completed.");
++ log.fine("Protocol error: Previous continuous frame sequence not completed.");
+ throw new InvalidDataException(CloseFrame.PROTOCOL_ERROR,
+ "Previous continuous frame sequence not completed.");
+ }
+@@ -1102,7 +1102,7 @@
+ long totalSize = getByteBufferListSize();
+ if (totalSize > maxFrameSize) {
+ clearBufferList();
+- log.trace("Payload limit reached. Allowed: {} Current: {}", maxFrameSize, totalSize);
++ log.fine("Payload limit reached. Allowed: {} Current: {}" + " : " + maxFrameSize + " : " + totalSize);
+ throw new LimitExceededException(maxFrameSize);
+ }
+ }
+diff -ru a/src/main/java/org/java_websocket/server/WebSocketServer.java b/src/main/java/org/java_websocket/server/WebSocketServer.java
+--- a/src/main/java/org/java_websocket/server/WebSocketServer.java 2023-07-20 21:24:05.000000000 +0100
++++ b/src/main/java/org/java_websocket/server/WebSocketServer.java 2023-08-30 12:06:46.372798355 +0100
+@@ -67,8 +67,7 @@
+ import org.java_websocket.framing.Framedata;
+ import org.java_websocket.handshake.ClientHandshake;
+ import org.java_websocket.handshake.Handshakedata;
+-import org.slf4j.Logger;
+-import org.slf4j.LoggerFactory;
++import java.util.logging.Logger;
+
+ /**
+ * <tt>WebSocketServer</tt> is an abstract class that only takes care of the
+@@ -84,7 +83,7 @@
+ *
+ * @since 1.4.0
+ */
+- private final Logger log = LoggerFactory.getLogger(WebSocketServer.class);
++ private final Logger log = Logger.getLogger(WebSocketServer.class.getName());
+
+ /**
+ * Holds the list of active WebSocket connections. "Active" means WebSocket handshake is complete
+@@ -611,7 +610,7 @@
+ try {
+ selector.close();
+ } catch (IOException e) {
+- log.error("IOException during selector.close", e);
++ log.severe("IOException during selector.close" + " : " + e);
+ onError(null, e);
+ }
+ }
+@@ -619,7 +618,7 @@
+ try {
+ server.close();
+ } catch (IOException e) {
+- log.error("IOException during server.close", e);
++ log.severe("IOException during server.close" + " : " + e);
+ onError(null, e);
+ }
+ }
+@@ -677,13 +676,13 @@
+ } catch (IOException e) {
+ // there is nothing that must be done here
+ }
+- log.trace("Connection closed because of exception", ex);
++ log.fine("Connection closed because of exception" + " : " + ex);
+ }
+ }
+ }
+
+ private void handleFatal(WebSocket conn, Exception e) {
+- log.error("Shutdown due to fatal error", e);
++ log.severe("Shutdown due to fatal error" + " : " + e);
+ onError(conn, e);
+
+ String causeMessage = e.getCause() != null ? " caused by " + e.getCause().getClass().getName() : "";
+@@ -692,7 +691,7 @@
+ stop(0, errorMessage);
+ } catch (InterruptedException e1) {
+ Thread.currentThread().interrupt();
+- log.error("Interrupt during stop", e);
++ log.severe("Interrupt during stop" + " : " + e);
+ onError(null, e1);
+ }
+
+@@ -760,8 +759,8 @@
+ removed = this.connections.remove(ws);
+ } else {
+ //Don't throw an assert error if the ws is not in the list. e.g. when the other endpoint did not send any handshake. see #512
+- log.trace(
+- "Removing connection which is not in the connections collection! Possible no handshake received! {}",
++ log.fine(
++ "Removing connection which is not in the connections collection! Possible no handshake received! {}" + " : " +
+ ws);
+ }
+ }
+@@ -1065,7 +1064,7 @@
+ setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
+ @Override
+ public void uncaughtException(Thread t, Throwable e) {
+- log.error("Uncaught exception in thread {}: {}", t.getName(), e);
++ log.severe("Uncaught exception in thread {}: {}" + " : " + t.getName() + " : " + e);
+ }
+ });
+ }
+@@ -1089,11 +1088,11 @@
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ } catch (VirtualMachineError | ThreadDeath | LinkageError e) {
+- log.error("Got fatal error in worker thread {}", getName());
++ log.severe("Got fatal error in worker thread {}" + " : " + getName());
+ Exception exception = new Exception(e);
+ handleFatal(ws, exception);
+ } catch (Throwable e) {
+- log.error("Uncaught exception in thread {}: {}", getName(), e);
++ log.severe("Uncaught exception in thread {}: {}" + " : " + getName() + " : " + e);
+ if (ws != null) {
+ Exception exception = new Exception(e);
+ onWebsocketError(ws, exception);
+@@ -1113,7 +1112,7 @@
+ try {
+ ws.decode(buf);
+ } catch (Exception e) {
+- log.error("Error while reading from remote connection", e);
++ log.severe("Error while reading from remote connection" + " : " + e);
+ } finally {
+ pushBuffer(buf);
+ }
+diff -ru a/src/main/java/org/java_websocket/SSLSocketChannel2.java b/src/main/java/org/java_websocket/SSLSocketChannel2.java
+--- a/src/main/java/org/java_websocket/SSLSocketChannel2.java 2023-07-20 21:24:05.000000000 +0100
++++ b/src/main/java/org/java_websocket/SSLSocketChannel2.java 2023-08-30 12:05:33.937636854 +0100
+@@ -47,8 +47,8 @@
+ import javax.net.ssl.SSLException;
+ import javax.net.ssl.SSLSession;
+ import org.java_websocket.interfaces.ISSLChannel;
+-import org.slf4j.Logger;
+-import org.slf4j.LoggerFactory;
++import java.util.logging.Level;
++import java.util.logging.Logger;
+
+ /**
+ * Implements the relevant portions of the SocketChannel interface with the SSLEngine wrapper.
+@@ -66,7 +66,7 @@
+ *
+ * @since 1.4.0
+ */
+- private final Logger log = LoggerFactory.getLogger(SSLSocketChannel2.class);
++ private final Logger log = Logger.getLogger(SSLSocketChannel2.class.getName());
+
+ protected ExecutorService exec;
+
+@@ -256,13 +256,13 @@
+ inCrypt = ByteBuffer.allocate(netBufferMax);
+ }
+ }
+- if (inData.remaining() != 0 && log.isTraceEnabled()) {
+- log.trace(new String(inData.array(), inData.position(), inData.remaining()));
++ if (inData.remaining() != 0 && log.isLoggable(Level.FINE)) {
++ log.fine(new String(inData.array(), inData.position(), inData.remaining()));
+ }
+ inData.rewind();
+ inData.flip();
+- if (inCrypt.remaining() != 0 && log.isTraceEnabled()) {
+- log.trace(new String(inCrypt.array(), inCrypt.position(), inCrypt.remaining()));
++ if (inCrypt.remaining() != 0 && log.isLoggable(Level.FINE)) {
++ log.fine(new String(inCrypt.array(), inCrypt.position(), inCrypt.remaining()));
+ }
+ inCrypt.rewind();
+ inCrypt.flip();
+@@ -498,4 +498,4 @@
+ saveCryptData = null;
+ }
+ }
+-}
+\ No newline at end of file
++}
+diff -ru a/src/main/java/org/java_websocket/SSLSocketChannel.java b/src/main/java/org/java_websocket/SSLSocketChannel.java
+--- a/src/main/java/org/java_websocket/SSLSocketChannel.java 2023-07-20 21:24:05.000000000 +0100
++++ b/src/main/java/org/java_websocket/SSLSocketChannel.java 2023-08-30 11:55:09.427244528 +0100
+@@ -39,8 +39,7 @@
+ import javax.net.ssl.SSLSession;
+ import org.java_websocket.interfaces.ISSLChannel;
+ import org.java_websocket.util.ByteBufferUtils;
+-import org.slf4j.Logger;
+-import org.slf4j.LoggerFactory;
++import java.util.logging.Logger;
+
+
+ /**
+@@ -70,7 +69,7 @@
+ *
+ * @since 1.4.0
+ */
+- private final Logger log = LoggerFactory.getLogger(SSLSocketChannel.class);
++ private final Logger log = Logger.getLogger(SSLSocketChannel.class.getName());
+
+ /**
+ * The underlying socket channel
+@@ -148,7 +147,7 @@
+ try {
+ socketChannel.close();
+ } catch (IOException e) {
+- log.error("Exception during the closing of the channel", e);
++ log.severe("Exception during the closing of the channel" + " : " + e);
+ }
+ }
+ }
+@@ -176,7 +175,7 @@
+ try {
+ result = engine.unwrap(peerNetData, peerAppData);
+ } catch (SSLException e) {
+- log.error("SSLException during unwrap", e);
++ log.severe("SSLException during unwrap" + " : " + e);
+ throw e;
+ }
+ switch (result.getStatus()) {
+@@ -490,7 +489,7 @@
+ try {
+ engine.closeInbound();
+ } catch (Exception e) {
+- log.error(
++ log.severe(
+ "This engine was forced to close inbound, without having received the proper SSL/TLS close notification message from the peer, due to end of stream.");
+ }
+ closeConnection();
+@@ -536,4 +535,4 @@
+ public SSLEngine getSSLEngine() {
+ return engine;
+ }
+-}
+\ No newline at end of file
++}
+diff -ru a/src/main/java/org/java_websocket/WebSocketImpl.java b/src/main/java/org/java_websocket/WebSocketImpl.java
+--- a/src/main/java/org/java_websocket/WebSocketImpl.java 2023-07-20 21:24:05.000000000 +0100
++++ b/src/main/java/org/java_websocket/WebSocketImpl.java 2023-08-30 12:12:26.045577651 +0100
+@@ -61,8 +61,8 @@
+ import org.java_websocket.protocols.IProtocol;
+ import org.java_websocket.server.WebSocketServer.WebSocketWorker;
+ import org.java_websocket.util.Charsetfunctions;
+-import org.slf4j.Logger;
+-import org.slf4j.LoggerFactory;
++import java.util.logging.Level;
++import java.util.logging.Logger;
+
+ /**
+ * Represents one end (client or server) of a single WebSocketImpl connection. Takes care of the
+@@ -95,7 +95,7 @@
+ *
+ * @since 1.4.0
+ */
+- private final Logger log = LoggerFactory.getLogger(WebSocketImpl.class);
++ private final Logger log = Logger.getLogger(WebSocketImpl.class.getName());
+
+ /**
+ * Queue of buffers that need to be sent to the client.
+@@ -224,8 +224,8 @@
+ */
+ public void decode(ByteBuffer socketBuffer) {
+ assert (socketBuffer.hasRemaining());
+- if (log.isTraceEnabled()) {
+- log.trace("process({}): ({})", socketBuffer.remaining(),
++ if (log.isLoggable(Level.FINE)) {
++ log.fine("process({}): ({})" + " : " + socketBuffer.remaining() + " : " +
+ (socketBuffer.remaining() > 1000 ? "too big to display"
+ : new String(socketBuffer.array(), socketBuffer.position(), socketBuffer.remaining())));
+ }
+@@ -280,7 +280,7 @@
+ socketBuffer.reset();
+ Handshakedata tmphandshake = d.translateHandshake(socketBuffer);
+ if (!(tmphandshake instanceof ClientHandshake)) {
+- log.trace("Closing due to wrong handshake");
++ log.fine("Closing due to wrong handshake");
+ closeConnectionDueToWrongHandshake(
+ new InvalidDataException(CloseFrame.PROTOCOL_ERROR, "wrong http function"));
+ return false;
+@@ -293,11 +293,11 @@
+ try {
+ response = wsl.onWebsocketHandshakeReceivedAsServer(this, d, handshake);
+ } catch (InvalidDataException e) {
+- log.trace("Closing due to wrong handshake. Possible handshake rejection", e);
++ log.fine("Closing due to wrong handshake. Possible handshake rejection" + " : " + e);
+ closeConnectionDueToWrongHandshake(e);
+ return false;
+ } catch (RuntimeException e) {
+- log.error("Closing due to internal server error", e);
++ log.severe("Closing due to internal server error" + " : " + e);
+ wsl.onWebsocketError(this, e);
+ closeConnectionDueToInternalServerError(e);
+ return false;
+@@ -313,7 +313,7 @@
+ }
+ }
+ if (draft == null) {
+- log.trace("Closing due to protocol error: no draft matches");
++ log.fine("Closing due to protocol error: no draft matches");
+ closeConnectionDueToWrongHandshake(
+ new InvalidDataException(CloseFrame.PROTOCOL_ERROR, "no draft matches"));
+ }
+@@ -322,7 +322,7 @@
+ // special case for multiple step handshakes
+ Handshakedata tmphandshake = draft.translateHandshake(socketBuffer);
+ if (!(tmphandshake instanceof ClientHandshake)) {
+- log.trace("Closing due to protocol error: wrong http function");
++ log.fine("Closing due to protocol error: wrong http function");
+ flushAndClose(CloseFrame.PROTOCOL_ERROR, "wrong http function", false);
+ return false;
+ }
+@@ -333,7 +333,7 @@
+ open(handshake);
+ return true;
+ } else {
+- log.trace("Closing due to protocol error: the handshake did finally not match");
++ log.fine("Closing due to protocol error: the handshake did finally not match");
+ close(CloseFrame.PROTOCOL_ERROR, "the handshake did finally not match");
+ }
+ return false;
+@@ -342,7 +342,7 @@
+ draft.setParseMode(role);
+ Handshakedata tmphandshake = draft.translateHandshake(socketBuffer);
+ if (!(tmphandshake instanceof ServerHandshake)) {
+- log.trace("Closing due to protocol error: wrong http function");
++ log.fine("Closing due to protocol error: wrong http function");
+ flushAndClose(CloseFrame.PROTOCOL_ERROR, "wrong http function", false);
+ return false;
+ }
+@@ -352,11 +352,11 @@
+ try {
+ wsl.onWebsocketHandshakeReceivedAsClient(this, handshakerequest, handshake);
+ } catch (InvalidDataException e) {
+- log.trace("Closing due to invalid data exception. Possible handshake rejection", e);
++ log.fine("Closing due to invalid data exception. Possible handshake rejection" + " : " + e);
+ flushAndClose(e.getCloseCode(), e.getMessage(), false);
+ return false;
+ } catch (RuntimeException e) {
+- log.error("Closing since client was never connected", e);
++ log.severe("Closing since client was never connected" + " : " + e);
+ wsl.onWebsocketError(this, e);
+ flushAndClose(CloseFrame.NEVER_CONNECTED, e.getMessage(), false);
+ return false;
+@@ -364,12 +364,12 @@
+ open(handshake);
+ return true;
+ } else {
+- log.trace("Closing due to protocol error: draft {} refuses handshake", draft);
++ log.fine("Closing due to protocol error: draft {} refuses handshake" + " : " + draft);
+ close(CloseFrame.PROTOCOL_ERROR, "draft " + draft + " refuses handshake");
+ }
+ }
+ } catch (InvalidHandshakeException e) {
+- log.trace("Closing due to invalid handshake", e);
++ log.fine("Closing due to invalid handshake" + " : " + e);
+ close(e);
+ }
+ } catch (IncompleteHandshakeException e) {
+@@ -398,24 +398,24 @@
+ try {
+ frames = draft.translateFrame(socketBuffer);
+ for (Framedata f : frames) {
+- log.trace("matched frame: {}", f);
++ log.fine("matched frame: {}" + " : " + f);
+ draft.processFrame(this, f);
+ }
+ } catch (LimitExceededException e) {
+ if (e.getLimit() == Integer.MAX_VALUE) {
+- log.error("Closing due to invalid size of frame", e);
++ log.severe("Closing due to invalid size of frame" + " : " + e);
+ wsl.onWebsocketError(this, e);
+ }
+ close(e);
+ } catch (InvalidDataException e) {
+- log.error("Closing due to invalid data in frame", e);
++ log.severe("Closing due to invalid data in frame" + " : " + e);
+ wsl.onWebsocketError(this, e);
+ close(e);
+ } catch (VirtualMachineError | ThreadDeath | LinkageError e) {
+- log.error("Got fatal error during frame processing");
++ log.severe("Got fatal error during frame processing");
+ throw e;
+ } catch (Error e) {
+- log.error("Closing web socket due to an error during frame processing");
++ log.severe("Closing web socket due to an error during frame processing");
+ Exception exception = new Exception(e);
+ wsl.onWebsocketError(this, exception);
+ String errorMessage = "Got error " + e.getClass().getName();
+@@ -491,7 +491,7 @@
+ sendFrame(closeFrame);
+ }
+ } catch (InvalidDataException e) {
+- log.error("generated frame is invalid", e);
++ log.severe("generated frame is invalid" + " : " + e);
+ wsl.onWebsocketError(this, e);
+ flushAndClose(CloseFrame.ABNORMAL_CLOSE, "generated frame is invalid", false);
+ }
+@@ -551,9 +551,9 @@
+ channel.close();
+ } catch (IOException e) {
+ if (e.getMessage() != null && e.getMessage().equals("Broken pipe")) {
+- log.trace("Caught IOException: Broken pipe during closeConnection()", e);
++ log.fine("Caught IOException: Broken pipe during closeConnection()" + " : " + e);
+ } else {
+- log.error("Exception during channel.close()", e);
++ log.severe("Exception during channel.close()" + " : " + e);
+ wsl.onWebsocketError(this, e);
+ }
+ }
+@@ -601,7 +601,7 @@
+ try {
+ wsl.onWebsocketClosing(this, code, message, remote);
+ } catch (RuntimeException e) {
+- log.error("Exception in onWebsocketClosing", e);
++ log.severe("Exception in onWebsocketClosing" + " : " + e);
+ wsl.onWebsocketError(this, e);
+ }
+ if (draft != null) {
+@@ -678,7 +678,7 @@
+ }
+ ArrayList<ByteBuffer> outgoingFrames = new ArrayList<>();
+ for (Framedata f : frames) {
+- log.trace("send frame: {}", f);
++ log.fine("send frame: {}" + " : " + f);
+ outgoingFrames.add(draft.createBinaryFrame(f));
+ }
+ write(outgoingFrames);
+@@ -729,7 +729,7 @@
+ // Stop if the client code throws an exception
+ throw new InvalidHandshakeException("Handshake data rejected by client.");
+ } catch (RuntimeException e) {
+- log.error("Exception in startHandshake", e);
++ log.severe("Exception in startHandshake" + " : " + e);
+ wsl.onWebsocketError(this, e);
+ throw new InvalidHandshakeException("rejected because of " + e);
+ }
+@@ -739,8 +739,8 @@
+ }
+
+ private void write(ByteBuffer buf) {
+- log.trace("write({}): {}", buf.remaining(),
+- buf.remaining() > 1000 ? "too big to display" : new String(buf.array()));
++ log.fine("write({}): {}" + " : " + buf.remaining() + " : " +
++ (buf.remaining() > 1000 ? "too big to display" : new String(buf.array())));
+
+ outQueue.add(buf);
+ wsl.onWriteDemand(this);
+@@ -760,7 +760,7 @@
+ }
+
+ private void open(Handshakedata d) {
+- log.trace("open using draft: {}", draft);
++ log.fine("open using draft: {}" + " : " + draft);
+ readyState = ReadyState.OPEN;
+ updateLastPong();
+ try {