@Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        if (evt instanceof SslHandshakeCompletionEvent handshakeEvent) {
            if (handshakeEvent.isSuccess()) {
                TlsPskHandler tlsPskHandler = ctx.channel().pipeline().get(TlsPskHandler.class);
                if (tlsPskHandler != null) {
                    // PSK mode
                    try {
                        String tlsPskApplicationProtocol = tlsPskHandler.getApplicationProtocol();
                        configurePipeline(
                                ctx,
                                tlsPskApplicationProtocol != null
                                        ? tlsPskApplicationProtocol
                                        : FALLBACK_APPLICATION_PROTOCOL);
                    } catch (Throwable cause) {
                        exceptionCaught(ctx, cause);
                    } finally {
                        // Handshake failures are handled in exceptionCaught(...).
                        if (handshakeEvent.isSuccess()) {
                            removeSelfIfPresent(ctx);
                        }
                    }
                } else {
                    // non PSK mode
                    super.userEventTriggered(ctx, evt);
                }
            } else {
                // handshake failures
                // TODO sunnys - handle PSK handshake failures
                super.userEventTriggered(ctx, evt);
            }
        } else {
            super.userEventTriggered(ctx, evt);
        }
    }
this method is inspired by ApplicationProtocolNegotiationHandler.userEventTriggered
zuul-core/src/main/java/com/netflix/zuul/netty/server/http2/Http2OrHttpHandler.java