@Override
    public WebSocket decode(ServiceRequestContext ctx, HttpRequest req) {
        final WebSocketServiceFrameDecoder decoder =
                new WebSocketServiceFrameDecoder(ctx, maxFramePayloadLength, allowMaskMismatch,
                                                 aggregateContinuation);
        ctx.setAttr(DECODER, decoder);
        return new WebSocketWrapper(req.decode(decoder, ctx.alloc()));
    }
Handles the HTTP/2 web socket handshake described in
<a href="https://datatracker.ietf.org/doc/html/rfc8441">Bootstrapping WebSockets with HTTP/2</a>.
These are examples of a request and the corresponding response:

<p>Request:
<pre>
HEADERS + END_HEADERS
:method = CONNECT
:protocol = websocket
:scheme = https
:path = /chat
:authority = server.example.com
sec-websocket-protocol = chat, superchat
sec-websocket-extensions = permessage-deflate
sec-websocket-version = 13
origin = http://www.example.com
</pre>

<p>Response:
<pre>
HEADERS + END_HEADERS
:status = 200
sec-websocket-protocol = chat
</pre>
core/src/main/java/com/linecorp/armeria/internal/server/websocket/DefaultWebSocketService.java