> org.eclipse.jetty.websocket.api.exceptions.InvalidWebSocketException:
Cannot replace previously assigned [TEXT Handler] at
MethodHandle(ObjectSocketAdapter,String,boolean)void with public void
nl.idfix.scriptlet.scripts.handlers.ScriptHandler$ObjectSocketAdapter.onWebSocketText(java.lang.String)

This is a totally different issue that has nothing to do
with socketContainer.upgrade or Servlet.service.

This stacktrace means you have a WebSocket that starts out with a handler
for TEXT messages, then you attempt to swap to a different TEXT handler
using
the 
nl.idfix.scriptlet.scripts.handlers.ScriptHandler$ObjectSocketAdapter.onWebSocketText(java.lang.String)
class.

With just this 1 stacktrace it's hard to tell when this occurs.
But the changed TEXT handler is likely happening after you have registered
the websocket (or websocket creator).

If you feel this is a bug in Jetty, then please provide a link to a github
project that can replicate this issue.

Joakim Erdfelt / joa...@webtide.com


On Thu, Oct 19, 2023 at 6:27 AM Silvio Bierman <sbier...@jambo-software.com>
wrote:

> Thanks Joakim for the response.
>
> Very interesting, this is about the exact same code I was using in Jetty11
> and which I got to compile with Jetty12 by just changing some imports and
> the type for the endpoint.
>
> But then I am back with some issues I had earlier on. I was assuming this
> was because I was using some deprecated stuff and had to convert to the
> code in the documentation examples.
>
> The first issue is that the call to
> socketContainer.upgrade(socketCreator,request,response)
>
> logs a
>
> 2023-10-19 13:03:04.628:WARN :oeju.Blocker:qtp1582071873-35:
> Blocking.Callback incomplete
>
> for every request that is not an upgrade request. The second problem is
> that when the upgrade request does come in and the endpoint object (which
> now extends Session.Listener) the next exception occurs:
>
> org.eclipse.jetty.websocket.api.exceptions.InvalidWebSocketException:
> Cannot replace previously assigned [TEXT Handler] at
> MethodHandle(ObjectSocketAdapter,String,boolean)void with public void
> nl.idfix.scriptlet.scripts.handlers.ScriptHandler$ObjectSocketAdapter.onWebSocketText(java.lang.String)
>     at
> org.eclipse.jetty.websocket.common.JettyWebSocketFrameHandlerMetadata.assertNotSet(JettyWebSocketFrameHandlerMetadata.java:159)
> JettyWebSocketFrameHandlerMetadata.java:159
>     at
> org.eclipse.jetty.websocket.common.JettyWebSocketFrameHandlerMetadata.setTextHandle(JettyWebSocketFrameHandlerMetadata.java:131)
> JettyWebSocketFrameHandlerMetadata.java:131
>     at
> org.eclipse.jetty.websocket.common.JettyWebSocketFrameHandlerFactory.createListenerMetadata(JettyWebSocketFrameHandlerFactory.java:213)
> JettyWebSocketFrameHandlerFactory.java:213
>     at
> org.eclipse.jetty.websocket.common.JettyWebSocketFrameHandlerFactory.createMetadata(JettyWebSocketFrameHandlerFactory.java:129)
> JettyWebSocketFrameHandlerFactory.java:129
>     at
> org.eclipse.jetty.websocket.common.JettyWebSocketFrameHandlerFactory.getMetadata(JettyWebSocketFrameHandlerFactory.java:119)
> JettyWebSocketFrameHandlerFactory.java:119
>     at
> org.eclipse.jetty.websocket.common.JettyWebSocketFrameHandlerFactory.newJettyFrameHandler(JettyWebSocketFrameHandlerFactory.java:140)
> JettyWebSocketFrameHandlerFactory.java:140
>     at
> org.eclipse.jetty.ee10.websocket.server.internal.JettyServerFrameHandlerFactory.newFrameHandler(JettyServerFrameHandlerFactory.java:42)
> JettyServerFrameHandlerFactory.java:42
>     at
> org.eclipse.jetty.websocket.core.server.internal.CreatorNegotiator.negotiate(CreatorNegotiator.java:68)
> CreatorNegotiator.java:68
>     at
> org.eclipse.jetty.websocket.core.server.internal.AbstractHandshaker.upgradeRequest(AbstractHandshaker.java:70)
> AbstractHandshaker.java:70
>     at
> org.eclipse.jetty.websocket.core.server.internal.HandshakerSelector.upgradeRequest(HandshakerSelector.java:46)
> HandshakerSelector.java:46
>     at
> org.eclipse.jetty.websocket.core.server.WebSocketMappings.upgrade(WebSocketMappings.java:294)
> WebSocketMappings.java:294
>     at
> org.eclipse.jetty.ee10.websocket.server.JettyWebSocketServerContainer.upgrade(JettyWebSocketServerContainer.java:228)
> JettyWebSocketServerContainer.java:228
>
> Earlier on I posted this and you then asked me
>
> **************
> Does your `_socketCreator = new SocketCreator` return an Endpoint 100% of
> the time?
> **************
>
> and the answer to that is yes.
>
> The class extending JettySocketCreator implements createWebSocket by
> passing the underlying jettyServerUpgradeRequest.httpServletRequest to
> application level code which then is expected to return an EndPoint. In
> this case this application level code does return an object that implements
> Session.Listener just before the exception occurs.
>
> Thanks very much for all the help.
>
> Cheers,
>
> Silvio
>
>
>
> On 16-10-2023 17:19, Joakim Erdfelt wrote:
>
> Also, for Jetty WebSocket API on EE10 take a look at this test class for
> inspiration.
>
>
> https://github.com/jetty/jetty.project/blob/jetty-12.0.x/jetty-ee10/jetty-ee10-websocket/jetty-ee10-websocket-jetty-tests/src/test/java/org/eclipse/jetty/ee10/websocket/tests/ProgrammaticWebSocketUpgradeTest.java
>
> Joakim Erdfelt / joa...@webtide.com
>
>
> On Mon, Oct 16, 2023 at 10:01 AM Silvio Bierman via jetty-users <
> jetty-users@eclipse.org> wrote:
>
>> Hallo all,
>>
>> I am porting an existing embedded Jetty application from Jetty11 to
>> Jetty12. Since 12.0.2 everything seems to be working perfectly except
>> for one thing I have not yet been able to port: our applications usage
>> of the Jetty WebSocket API.
>>
>> The Jetty12 WebSocket API documentation shows the upgrade being done
>> inside the Handler#handle method using the
>> org.eclipse.jetty.server.Request / org.eclipse.jetty.server.Response
>> objects available there. However, in our application code the
>> information required to create the endpoint object is only known inside
>> the Servlet instance. In the Jetty11 API we where able to upgrade the
>> request from inside the Servlet#service method because the
>> JettyWebSocketServerContainer#upgrade took
>> HttpServletRequest/HttpServletResponse parameters. In the Jetty12
>> WebSocket API ServerWebSocketContainer#upgrade these have been replaced
>> by above mentioned Request/Response objects.
>>
>> Is there a way around this?
>>
>> Kind regards,
>>
>> Silvio
>>
>> _______________________________________________
>> jetty-users mailing list
>> jetty-users@eclipse.org
>> To unsubscribe from this list, visit
>> https://www.eclipse.org/mailman/listinfo/jetty-users
>>
>
>
_______________________________________________
jetty-users mailing list
jetty-users@eclipse.org
To unsubscribe from this list, visit 
https://www.eclipse.org/mailman/listinfo/jetty-users

Reply via email to