Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [jetty-users] Handle websocket upgrade request from inside Servlet#service (Jetty 12)

> 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 / joakim@xxxxxxxxxxx


On Thu, Oct 19, 2023 at 6:27 AM Silvio Bierman <sbierman@xxxxxxxxxxxxxxxxxx> 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:

On Mon, Oct 16, 2023 at 10:01 AM Silvio Bierman via jetty-users <jetty-users@xxxxxxxxxxx> 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@xxxxxxxxxxx
To unsubscribe from this list, visit https://www.eclipse.org/mailman/listinfo/jetty-users


Back to the top