@Nullable
    private static HttpResponseStatus validateHandshakeRequest(HttpServerRequest request) {
        HttpMethod method = request.method();
        HttpHeaders headers = request.requestHeaders();
        if (HttpMethod.GET != method) {
            return new HttpResponseStatus(
                    HttpResponseStatus.METHOD_NOT_ALLOWED.code(),
                    "Request method '"
                            + method
                            + "' not supported");
        }
        if (!headers.containsValue(UPGRADE, "websocket", true)) {
            return new HttpResponseStatus(
                    HttpResponseStatus.BAD_REQUEST.code(),
                    "Invalid 'Upgrade' header: "
                            + headers);
        }
        if (!headers.containsValue(CONNECTION, "upgrade", true)) {
            return new HttpResponseStatus(
                    HttpResponseStatus.BAD_REQUEST.code(),
                    "Invalid 'Connection' header: "
                            + headers);
        }
        String key = headers.get(SEC_WEBSOCKET_KEY);
        if (key == null) {
            return new HttpResponseStatus(
                    HttpResponseStatus.BAD_REQUEST.code(),
                    "Missing \"Sec-WebSocket-Key\" header");
        }
        return null;
    }
@implNote 1. Return MonoNever to keep the connection alive
          <p>
          2. Return MonoEmpty to close the connection.
turms-gateway/src/main/java/im/turms/gateway/access/client/websocket/WebSocketServerFactory.java