Silvio,

The standard way to upgrade to websocket in Jetty is to register a mapping
with the JettyWebSocketServlet or with the WebSocketUpgradeFilter.

If you don't want to register a mapping and want to programmatically
upgrade then you will need to use the `upgrade` method on the
JettyWebSocketServerContainer.

Here is an example of this:
```
public class WebSocketProgrammaticUpgradeServlet extends HttpServlet
{
    private JettyWebSocketServerContainer container;
    private JettyWebSocketCreator creator;

    @Override
    public void init(ServletConfig config) throws ServletException
    {
        container =
JettyWebSocketServerContainer.getContainer(config.getServletContext());
        creator = new SocketCreator();
        super.init(config);
    }

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException
    {
        // This will return true if the connection has been upgraded to
websocket.
        if (container.upgrade(creator, request, response))
            return;

        if (response.isCommitted())
            return;

        super.service(request,response);
    }
}
```

Cheers,
Lachlan

On Tue, Mar 16, 2021 at 11:31 AM Silvio Bierman <sbier...@jambo-software.com>
wrote:

> Thank you Lachlan,
>
> That gets me a bit further. The last parts giving me trouble are the
> following methods of the only Servlet class in my aplication (pardon my
> Scala, compiler errors inlined with ***prefix)
>
>     override def init(cfg : ServletConfig) =
>     {
>         _config = cfg
>         val policy = new WebSocketPolicy(WebSocketBehavior.SERVER)
>             ***trait WebSocketPolicy is abstract; cannot be instantiated
>         val ctx = _config.getServletContext
>         _socketFactory = WebSocketServletFactory.Loader.load(ctx,policy)
>             ***value Loader is not a member of object
> org.eclipse.jetty.websocket.server.JettyWebSocketServletFactory
>         _socketFactory.setCreator(new SocketCreator())
>         _socketFactory.start
>             ***value start is not a member of
> org.eclipse.jetty.websocket.server.JettyWebSocketServletFactory
>
> ctx.setAttribute(classOf[JettyWebSocketServletFactory].getName,_socketFactory)
>     }
>
>     override def service(request : HttpServletRequest,response :
> HttpServletResponse)
>     {
>         if (_socketFactory == null) super.service(request,response)
>         else if (!_socketFactory.isUpgradeRequest(request,response))
> super.service(request,response)
>             ***value isUpgradeRequest is not a member of
> org.eclipse.jetty.websocket.server.JettyWebSocketServletFactory
>         else if (!_socketFactory.acceptWebSocket(request,response) &&
> !response.isCommitted) super.service(request,response)
>             ***value acceptWebSocket is not a member of
> org.eclipse.jetty.websocket.server.JettyWebSocketServletFactory
>     }
>
> Perhaps you can help me with these last bits?
>
> I do not know if it is relevant at all but I described the context here
> earlier. Our application implements a runtime engine for a dynamic
> object-functional server side scripting language that supports HTTP request
> handler instance methods. Requests are routed to the corresponding class
> instances to be handled locally. Such handler classes can exist at the
> global application level but can also be part of session instances. A
> special type of upgrade handler method is called to create locally embedded
> websocket objects with their own methods to handle the socket events. Since
> request routing is done from inside the above service method we need the
> Jetty API. All our end user (web-)applications are implemented in the form
> of such scripts.
>
> Cheers,
>
> Silvio
>
>
>
> On 3/16/21 12:25 AM, Lachlan Roberts wrote:
>
> Silvio,
>
> The usage of the Jetty WebSocket API should essentially be the same, but
> you will need to update your code to use some of the new WebSocket classes
> for Jetty 10. The websocket classes you need to use for the Jetty WebSocket
> Server API were previously in the websocket-servlet jar but are now in the
> websocket-jetty-server jar.
>
> == Classes Renamed ==
> WebSocketCreator -> JettyWebSocketCreator
> ServletUpgradeRequest -> JettyServerUpgradeRequest
> ServletUpgradeResponse -> JettyServerUpgradeResponse
> WebSocketServlet -> JettyWebSocketServlet
> WebSocketServletFactory -> JettyWebSocketServletFactory
>
> == Package Change for these Classes ==
> org.eclipse.jetty.websocket.servlet  ->  org.eclipse.jetty.websocket.server
>
> Cheers,
> Lachlan
>
> On Tue, Mar 16, 2021 at 5:00 AM Silvio Bierman <
> sbier...@jambo-software.com> wrote:
>
>> Thank you very much for this Greg. No problem for us to wait a bit longer
>> before moving to Jetty 10 considering 9.4 is serving us as well as it is.
>>
>> Cheers,
>>
>> Sillvio
>>
>> On 3/15/21 6:32 PM, Greg Wilkins wrote:
>>
>> Silvio,
>>
>> yes the jetty websocket API has been significantly revisited in
>> jetty-10.   We believe that we have added significant improvements as a
>> result and have been waiting for the major release to make such a breaking
>> change.
>>
>> We definitely will continue to support our API going forward, due to
>> deficiencies and complications of the JSR API.  So if your use-case is not
>> already supported, then we will definitely look to see if we can.  Lachlan
>> Roberts is the lead developer of websocket now and hopefully will get back
>> to you with pointers to servlet based upgrade (which I'm 99% sure is
>> supported).
>>
>> cheers
>>
>>
>>
>>
>>
>>
>> On Mon, 15 Mar 2021 at 18:25, Silvio Bierman <sbier...@jambo-software.com>
>> wrote:
>>
>>> Some time ago I extended our embedded Jetty (9.4.36) based server
>>> application to support websockets using the Jetty websocket API. At this
>>> time we want to revisit our previously successful efforts making the
>>> application compatible with Jetty 10. But it seems the websocket API has
>>> changed quite significantly and many of the classes in
>>> org.eclipse.jetty.websocket.servlet and org.eclipse.jetty.websocket.api
>>> (notably WebSocketServletFactory, WebSocketCreator,
>>> ServletUpgradeRequest and ServletUpgradeResponse) appear to be missing
>>> or have been moved/renamed. So now we use the websocket API it appears
>>> porting to Jetty 10 has become much more difficult, let alone managing a
>>> code-base that allows us to swap one in for the other.
>>>
>>> We picked the Jetty websocket API since it allows us to handle the
>>> request upgrade at the Servlet level (inside the service method) while
>>> the javax.websocket API upgrades to websockets at the context level and
>>> is therefore of nu use to us. I hope this is still possible in the
>>> revised Jetty websocket API but can not find any documentation about how
>>> to rewrite 9.4.x based code to the new 10.x version.
>>>
>>> I can live with not being able to switch back to Jetty 9 without
>>> recompiling.
>>>
>>> Can anyone give me some pointers?
>>>
>>> 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
>>>
>>
>>
>> --
>> Greg Wilkins <gr...@webtide.com> CTO http://webtide.com
>>
>> _______________________________________________
>> jetty-users mailing listjetty-us...@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
>>
>
> _______________________________________________
> jetty-users mailing listjetty-us...@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
>
_______________________________________________
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