@Override public Mono<Void> execute(URI url, WebSocketHandler handler) { return execute(url, new HttpHeaders(), handler); }
private Observable<Void> executeInternal(URI url, HttpHeaders headers, WebSocketHandler handler) { String[] protocols = beforeHandshake(url, headers, handler); return createRequest(url, headers, protocols) .flatMap(response -> { Observable<WebSocketConnection> conn = response.getWebSocketConnection(); return Observable.zip(Observable.just(response), conn, Tuples::of); }) .flatMap(tuple -> { WebSocketResponse<ByteBuf> response = tuple.getT1(); WebSocketConnection conn = tuple.getT2(); HandshakeInfo info = afterHandshake(url, toHttpHeaders(response)); ByteBufAllocator allocator = response.unsafeNettyChannel().alloc(); NettyDataBufferFactory factory = new NettyDataBufferFactory(allocator); RxNettyWebSocketSession session = new RxNettyWebSocketSession(conn, info, factory); session.aggregateFrames(response.unsafeNettyChannel(), WsClientDecoder.getName()); return RxReactiveStreams.toObservable(handler.handle(session)); }); }
@Override public Mono<Void> execute(URI url, HttpHeaders headers, WebSocketHandler handler) { Observable<Void> completion = executeInternal(url, headers, handler); return Mono.from(RxReactiveStreams.toPublisher(completion)); }
private WebSocketRequest<ByteBuf> createRequest(URI url, HttpHeaders headers, String[] protocols) { String query = url.getRawQuery(); String requestUrl = url.getRawPath() + (query != null ? "?" + query : ""); HttpClientRequest<ByteBuf, ByteBuf> request = getHttpClient(url).createGet(requestUrl); if (!headers.isEmpty()) { Map<String, List<Object>> map = new HashMap<>(headers.size()); headers.forEach((key, values) -> map.put(key, new ArrayList<>(headers.get(key)))); request = request.setHeaders(map); } return (ObjectUtils.isEmpty(protocols) ? request.requestWebSocketUpgrade() : request.requestWebSocketUpgrade().requestSubProtocols(protocols)); }