/** * Duplex conversion to {@link WebsocketInbound}, {@link WebsocketOutbound} and a * closing {@link Publisher}. Mono and Callback are invoked on handshake success, * otherwise the returned {@link Mono} fails. * * @param websocketHandler the in/out handler for ws transport * * @return a {@link Mono} completing when upgrade is confirmed */ default Mono<Void> receiveWebsocket(BiFunction<? super WebsocketInbound, ? super WebsocketOutbound, ? extends Publisher<Void>> websocketHandler) { return receiveWebsocket(null, websocketHandler); }
@Override public Mono<Void> execute(URI url, HttpHeaders headers, WebSocketHandler handler) { String[] protocols = beforeHandshake(url, headers, handler); // TODO: https://github.com/reactor/reactor-netty/issues/20 return getHttpClient() .get(url.toString(), request -> addHeaders(request, headers).sendWebsocket()) .then(response -> { HandshakeInfo info = afterHandshake(url, toHttpHeaders(response)); ByteBufAllocator allocator = response.channel().alloc(); NettyDataBufferFactory factory = new NettyDataBufferFactory(allocator); return response.receiveWebsocket((in, out) -> { WebSocketSession session = new ReactorNettyWebSocketSession(in, out, info, factory); return handler.handle(session); }); }); }