@Override public IoFuture<WebSocketChannel> handshake(final HttpServerExchange exchange) { String origin = exchange.getRequestHeaders().getFirst(Headers.SEC_WEB_SOCKET_ORIGIN); if (origin != null) { exchange.getResponseHeaders().put(Headers.SEC_WEB_SOCKET_ORIGIN, origin); } String protocol = exchange.getRequestHeaders().getFirst(Headers.SEC_WEB_SOCKET_PROTOCOL); if (protocol != null) { exchange.getResponseHeaders().put(Headers.SEC_WEB_SOCKET_PROTOCOL, protocol); } exchange .getResponseHeaders() .put(Headers.SEC_WEB_SOCKET_LOCATION, getWebSocketLocation(exchange)); final String key = exchange.getRequestHeaders().getFirst(Headers.SEC_WEB_SOCKET_KEY); try { final String solution = solve(key); exchange.getResponseHeaders().put(Headers.SEC_WEB_SOCKET_ACCEPT, solution); return performUpgrade(exchange); } catch (NoSuchAlgorithmException e) { final ConcreteIoFuture<WebSocketChannel> ioFuture = new ConcreteIoFuture<WebSocketChannel>(); ioFuture.setException(new IOException(new WebSocketHandshakeException(e))); return ioFuture; } }