/** * 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 HttpClientResponse addHandler(String name, ChannelHandler handler);
@Override HttpClientResponse addHandlerLast(String name, ChannelHandler handler);
@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); }); }); }
private static Function<Integer, Mono<InputStream>> zipkinServerStream(String zipkinUrl, Mono<HttpClient> client) { return lookbackSeconds -> client .flatMap(c -> c .get(zipkinQuery(zipkinUrl, lookbackSeconds)) .flatMap(resp -> resp.receive() .aggregate() .asInputStream())); }
/** * Return a {@link Flux} of {@link HttpContent} containing received chunks * * @return a {@link Flux} of {@link HttpContent} containing received chunks */ default Flux<HttpContent> receiveContent(){ return receiveObject().ofType(HttpContent.class); }
private HttpHeaders toHttpHeaders(HttpClientResponse response) { HttpHeaders headers = new HttpHeaders(); response.responseHeaders().forEach(entry -> { String name = entry.getKey(); headers.put(name, response.responseHeaders().getAll(name)); }); return headers; }
@Test public void hoverflyProxy() { Mono<HttpClientResponse> remote = HttpClient.create(o -> o.httpProxy(ops -> ops .address(new InetSocketAddress("localhost", hoverflyRule.getProxyPort())) )) .get("http://www.my-test.com/api/bookings/1", HttpClientRequest::sendHeaders); Mono<String> page = remote .flatMapMany(r -> r.receive() .retain() .asString() .limitRate(1)) .reduce(String::concat); StepVerifier.create(page) .expectNextMatches(s -> s.contains("bookingId")) .expectComplete() .verify(Duration.ofSeconds(30)); } }