This issue has been created
There are 5 updates.
 
 
XWiki Platform / cid:jira-generated-image-avatar-23df2b19-33d2-4da1-9003-cdbd4d8d907a XWIKI-23350 Open

Unable to find Decoder for type: jakarta.websocket.MessageHandler$Whole on DynamicEchoEndpoint

 
View issue   ยท   Add comment
 

Issue created

 
cid:jira-generated-image-avatar-96f1dd0d-9300-4eb7-8304-c2ba316469b2 Manuel Leduc created this issue on 30/Jun/25 11:02
 
Summary: Unable to find Decoder for type: jakarta.websocket.MessageHandler$Whole on DynamicEchoEndpoint
Issue Type: cid:jira-generated-image-avatar-23df2b19-33d2-4da1-9003-cdbd4d8d907a Bug
Affects Versions: 17.0.0-rc-1
Assignee: Unassigned
Components: WebSocket
Created: 30/Jun/25 11:02
Priority: cid:jira-generated-image-static-major-aaabc05e-d215-4d36-a911-e17c32a3efd6 Major
Reporter: Manuel Leduc
Description:

Reproductions steps

  1. connect to the dynamic echo websocket (see websockat example below)
  2. observe the exception in XWikiEndpoint dispatcher (here https://github.com/xwiki/xwiki-commons/blob/209da6a9c1f59673c08b51b7e89cdc98e468eb8f/xwiki-commons-core/xwiki-commons-websocket/src/main/java/org/xwiki/websocket/internal/XWikiEndpointDispatcher.java#L91)

Expected

No exception.

Actual

An exception with the stacktrace below is thrown

java.lang.IllegalStateException: Unable to find Decoder for type: interface jakarta.websocket.MessageHandler$Whole
    at org.eclipse.jetty.ee10.websocket.jakarta.common.JakartaWebSocketFrameHandler.addMessageHandler(JakartaWebSocketFrameHandler.java:413)
    at org.eclipse.jetty.ee10.websocket.jakarta.common.JakartaWebSocketSession.addMessageHandler(JakartaWebSocketSession.java:130)
    at org.eclipse.jetty.ee10.websocket.jakarta.common.JakartaWebSocketSession.addMessageHandler(JakartaWebSocketSession.java:150)
    at org.xwiki.websocket.internal.DynamicEchoEndpoint.lambda$onOpen$1(DynamicEchoEndpoint.java:61)
    at org.xwiki.websocket.internal.DefaultWebSocketContext.run(DefaultWebSocketContext.java:96)
    at org.xwiki.websocket.internal.DynamicEchoEndpoint.onOpen(DynamicEchoEndpoint.java:56)
    at org.xwiki.websocket.internal.XWikiEndpointDispatcher.onOpen(XWikiEndpointDispatcher.java:83)
    at org.eclipse.jetty.ee10.websocket.jakarta.common.JakartaWebSocketFrameHandler.onOpen(JakartaWebSocketFrameHandler.java:175)
    at org.eclipse.jetty.websocket.core.WebSocketCoreSession.lambda$onOpen$6(WebSocketCoreSession.java:402)
    at org.eclipse.jetty.server.handler.ContextHandler$ScopedContext.run(ContextHandler.java:1524)
    at org.eclipse.jetty.server.handler.ContextHandler$ScopedContext.run(ContextHandler.java:1511)
    at org.eclipse.jetty.websocket.core.server.internal.AbstractHandshaker$1.handle(AbstractHandshaker.java:179)
    at org.eclipse.jetty.websocket.core.WebSocketCoreSession.onOpen(WebSocketCoreSession.java:402)
    at org.eclipse.jetty.websocket.core.WebSocketConnection.onOpen(WebSocketConnection.java:532)
    at org.eclipse.jetty.io.AbstractEndPoint.upgrade(AbstractEndPoint.java:435)
    at org.eclipse.jetty.server.internal.HttpConnection$HttpStreamOverHTTP1.succeeded(HttpConnection.java:1550)
    at org.eclipse.jetty.server.HttpStream$Wrapper.succeeded(HttpStream.java:227)
    at org.eclipse.jetty.server.internal.CompletionStreamWrapper.succeeded(CompletionStreamWrapper.java:45)
    at org.eclipse.jetty.server.HttpStream$Wrapper.succeeded(HttpStream.java:227)
    at org.eclipse.jetty.session.AbstractSessionManager$SessionStreamWrapper.succeeded(AbstractSessionManager.java:1499)
    at org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.completeStream(HttpChannelState.java:787)
    at org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.run(HttpChannelState.java:713)
    at org.eclipse.jetty.server.internal.HttpConnection.onFillable(HttpConnection.java:416)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:322)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:99)
    at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53)
    at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:480)
    at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:443)
    at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:293)
    at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.run(AdaptiveExecutionStrategy.java:201)
    at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:311)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:981)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1211)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1166)
    at java.base/java.lang.Thread.run(Thread.java:840) 

Websocat example

Note:

  • https://github.com/vi/websocat
  • the cookie must be from a logged-in user, basic auth and cookies from a guest users are not working
    websocat -H='Cookie: cookie copied from the browser debugger network tab' ws://localhost:8082/xwiki/websocket/xwiki/echo
 
 

5 updates

 
cid:jira-generated-image-avatar-96f1dd0d-9300-4eb7-8304-c2ba316469b2 Changes by Manuel Leduc on 30/Jun/25 11:05
 
Fix Version: 17.4.2
Fix Version: 17.6.0-rc-1
Description: h2. Reproductions steps
# connect to the dynamic echo websocket (see websockat example below)
# observe the exception in XWikiEndpoint dispatcher (here [https://github.com/xwiki/xwiki-commons/blob/209da6a9c1f59673c08b51b7e89cdc98e468eb8f/xwiki-commons-core/xwiki-commons-websocket/src/main/java/org/xwiki/websocket/internal/XWikiEndpointDispatcher.java#L91)]

h2. Expected

No exception.
h2. Actual

An exception with the stacktrace below is thrown
{noformat}
java.lang.IllegalStateException: Unable to find Decoder for type: interface jakarta.websocket.MessageHandler$Whole
    at org.eclipse.jetty.ee10.websocket.jakarta.common.JakartaWebSocketFrameHandler.addMessageHandler(JakartaWebSocketFrameHandler.java:413)
    at org.eclipse.jetty.ee10.websocket.jakarta.common.JakartaWebSocketSession.addMessageHandler(JakartaWebSocketSession.java:130)
    at org.eclipse.jetty.ee10.websocket.jakarta.common.JakartaWebSocketSession.addMessageHandler(JakartaWebSocketSession.java:150)
    at org.xwiki.websocket.internal.DynamicEchoEndpoint.lambda$onOpen$1(DynamicEchoEndpoint.java:61)
    at org.xwiki.websocket.internal.DefaultWebSocketContext.run(DefaultWebSocketContext.java:96)
    at org.xwiki.websocket.internal.DynamicEchoEndpoint.onOpen(DynamicEchoEndpoint.java:56)
    at org.xwiki.websocket.internal.XWikiEndpointDispatcher.onOpen(XWikiEndpointDispatcher.java:83)
    at org.eclipse.jetty.ee10.websocket.jakarta.common.JakartaWebSocketFrameHandler.onOpen(JakartaWebSocketFrameHandler.java:175)
    at org.eclipse.jetty.websocket.core.WebSocketCoreSession.lambda$onOpen$6(WebSocketCoreSession.java:402)
    at org.eclipse.jetty.server.handler.ContextHandler$ScopedContext.run(ContextHandler.java:1524)
    at org.eclipse.jetty.server.handler.ContextHandler$ScopedContext.run(ContextHandler.java:1511)
    at org.eclipse.jetty.websocket.core.server.internal.AbstractHandshaker$1.handle(AbstractHandshaker.java:179)
    at org.eclipse.jetty.websocket.core.WebSocketCoreSession.onOpen(WebSocketCoreSession.java:402)
    at org.eclipse.jetty.websocket.core.WebSocketConnection.onOpen(WebSocketConnection.java:532)
    at org.eclipse.jetty.io.AbstractEndPoint.upgrade(AbstractEndPoint.java:435)
    at org.eclipse.jetty.server.internal.HttpConnection$HttpStreamOverHTTP1.succeeded(HttpConnection.java:1550)
    at org.eclipse.jetty.server.HttpStream$Wrapper.succeeded(HttpStream.java:227)
    at org.eclipse.jetty.server.internal.CompletionStreamWrapper.succeeded(CompletionStreamWrapper.java:45)
    at org.eclipse.jetty.server.HttpStream$Wrapper.succeeded(HttpStream.java:227)
    at org.eclipse.jetty.session.AbstractSessionManager$SessionStreamWrapper.succeeded(AbstractSessionManager.java:1499)
    at org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.completeStream(HttpChannelState.java:787)
    at org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.run(HttpChannelState.java:713)
    at org.eclipse.jetty.server.internal.HttpConnection.onFillable(HttpConnection.java:416)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:322)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:99)
    at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53)
    at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:480)
    at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:443)
    at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:293)
    at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.run(AdaptiveExecutionStrategy.java:201)
    at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:311)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:981)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1211)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1166)
    at java.base/java.lang.Thread.run(Thread.java:840) {noformat}

h2. Websocat example

Note:
* https://github.com/vi/websocat
* the cookie must be from a logged-in user, basic auth and cookies from a guest users are not working
{noformat}websocat -H='Cookie: cookie copied from the browser debugger network tab' ws://localhost:
8082 8080 /xwiki/websocket/xwiki/echo{noformat}
Priority: Major Blocker
Labels: regression