DefaultWebTestClient(WebClient.Builder clientBuilder, ClientHttpConnector connector, @Nullable Duration timeout, DefaultWebTestClientBuilder webTestClientBuilder) { Assert.notNull(clientBuilder, "WebClient.Builder is required"); this.wiretapConnector = new WiretapConnector(connector); this.webClient = clientBuilder.clientConnector(this.wiretapConnector).build(); this.timeout = (timeout != null ? timeout : Duration.ofSeconds(5)); this.builder = webTestClientBuilder; }
/** * Returns a {@link WebClientCustomizer} which sets an {@link ArmeriaClientHttpConnector} to the * {@link Builder}. */ @Bean public WebClientCustomizer webClientCustomizer(ClientHttpConnector clientHttpConnector) { return builder -> builder.clientConnector(clientHttpConnector); } }
private static WebClient.Builder createDefaultWebClient(Duration connectTimeout, Duration readTimeout) { HttpClient httpClient = HttpClient.create() .compress(true) .tcpConfiguration(tcp -> tcp.bootstrap(bootstrap -> bootstrap.option( ChannelOption.CONNECT_TIMEOUT_MILLIS, (int) connectTimeout.toMillis() )).observe((connection, newState) -> { if (ConnectionObserver.State.CONNECTED.equals(newState)) { connection.addHandlerLast(new ReadTimeoutHandler(readTimeout.toMillis(), TimeUnit.MILLISECONDS )); } })); ReactorClientHttpConnector connector = new ReactorClientHttpConnector(httpClient); return WebClient.builder().clientConnector(connector); } }
.exchangeStrategies(strategies).clientConnector(connector).build();
/** * Sets request options using Feign {@link Request.Options} * * @param options Feign {@code Request.Options} object * @return this builder */ public Builder<T> options(final ReactiveOptions options) { if (!options.isEmpty()) { ReactorClientHttpConnector connector = new ReactorClientHttpConnector( opts -> { if (options.getConnectTimeoutMillis() != null) { opts.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, options.getConnectTimeoutMillis()); } if (options.getReadTimeoutMillis() != null) { opts.afterNettyContextInit(ctx -> { ctx.addHandlerLast(new ReadTimeoutHandler( options.getReadTimeoutMillis(), TimeUnit.MILLISECONDS)); }); } if (options.isTryUseCompression() != null) { opts.compression(options.isTryUseCompression()); } }); this.webClient = webClient.mutate().clientConnector(connector).build(); } return this; }
@Override public Builder<T> options(ReactiveOptions options) { if (!options.isEmpty()) { ReactorClientHttpConnector connector = new ReactorClientHttpConnector( opts -> { if (options.getConnectTimeoutMillis() != null) { opts.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, options.getConnectTimeoutMillis().intValue()); } if (options.getReadTimeoutMillis() != null) { opts.afterNettyContextInit(ctx -> { ctx.addHandlerLast(new ReadTimeoutHandler( options.getReadTimeoutMillis(), TimeUnit.MILLISECONDS)); }); } if (options.isTryUseCompression() != null) { opts.compression(options.isTryUseCompression()); } }); setWebClient(webClient.mutate().clientConnector(connector).build()); } return this; }
ReactiveCloudFoundrySecurityService(WebClient.Builder webClientBuilder, String cloudControllerUrl, boolean skipSslValidation) { Assert.notNull(webClientBuilder, "Webclient must not be null"); Assert.notNull(cloudControllerUrl, "CloudControllerUrl must not be null"); if (skipSslValidation) { webClientBuilder.clientConnector(buildTrustAllSslConnector()); } this.webClient = webClientBuilder.build(); this.cloudControllerUrl = cloudControllerUrl; }
DefaultWebTestClient(WebClient.Builder clientBuilder, ClientHttpConnector connector, @Nullable Duration timeout, DefaultWebTestClientBuilder webTestClientBuilder) { Assert.notNull(clientBuilder, "WebClient.Builder is required"); this.wiretapConnector = new WiretapConnector(connector); this.webClient = clientBuilder.clientConnector(this.wiretapConnector).build(); this.timeout = (timeout != null ? timeout : Duration.ofSeconds(5)); this.builder = webTestClientBuilder; }
DefaultWebTestClient(WebClient.Builder clientBuilder, ClientHttpConnector connector, @Nullable Duration timeout, DefaultWebTestClientBuilder webTestClientBuilder) { Assert.notNull(clientBuilder, "WebClient.Builder is required"); this.wiretapConnector = new WiretapConnector(connector); this.webClient = clientBuilder.clientConnector(this.wiretapConnector).build(); this.timeout = (timeout != null ? timeout : Duration.ofSeconds(5)); this.builder = webTestClientBuilder; }
.clientConnector(httpConnector) .build();
@Test public void testReactiveReturn() { ClientHttpConnector httpConnector = new HttpHandlerConnector((request, response) -> { response.setStatusCode(HttpStatus.OK); return Mono.defer(response::setComplete); }); WebClient webClient = WebClient.builder() .clientConnector(httpConnector) .build(); String destinationUri = "http://www.springsource.org/spring-integration"; WebFluxRequestExecutingMessageHandler reactiveHandler = new WebFluxRequestExecutingMessageHandler(destinationUri, webClient); FluxMessageChannel ackChannel = new FluxMessageChannel(); reactiveHandler.setOutputChannel(ackChannel); reactiveHandler.handleMessage(MessageBuilder.withPayload("hello, world").build()); reactiveHandler.handleMessage(MessageBuilder.withPayload("hello, world").build()); StepVerifier.create(ackChannel, 2) .assertNext(m -> assertThat(m, hasHeader(HttpHeaders.STATUS_CODE, HttpStatus.OK))) .assertNext(m -> assertThat(m, hasHeader(HttpHeaders.STATUS_CODE, HttpStatus.OK))) .then(() -> ((Subscriber<?>) TestUtils.getPropertyValue(ackChannel, "subscribers", List.class).get(0)) .onComplete()) .verifyComplete(); }
@Test public void testReactiveConnectErrorOneWay() { ClientHttpConnector httpConnector = new HttpHandlerConnector((request, response) -> { throw new RuntimeException("Intentional connection error"); }); WebClient webClient = WebClient.builder() .clientConnector(httpConnector) .build(); String destinationUri = "http://www.springsource.org/spring-integration"; WebFluxRequestExecutingMessageHandler reactiveHandler = new WebFluxRequestExecutingMessageHandler(destinationUri, webClient); reactiveHandler.setExpectReply(false); QueueChannel errorChannel = new QueueChannel(); reactiveHandler.handleMessage(MessageBuilder.withPayload("hello, world") .setErrorChannel(errorChannel) .build()); Message<?> errorMessage = errorChannel.receive(10000); assertNotNull(errorMessage); assertThat(errorMessage, instanceOf(ErrorMessage.class)); Throwable throwable = (Throwable) errorMessage.getPayload(); assertThat(throwable.getMessage(), containsString("Intentional connection error")); }
@Test public void testReactiveErrorOneWay() { ClientHttpConnector httpConnector = new HttpHandlerConnector((request, response) -> { response.setStatusCode(HttpStatus.UNAUTHORIZED); return Mono.defer(response::setComplete); }); WebClient webClient = WebClient.builder() .clientConnector(httpConnector) .build(); String destinationUri = "http://www.springsource.org/spring-integration"; WebFluxRequestExecutingMessageHandler reactiveHandler = new WebFluxRequestExecutingMessageHandler(destinationUri, webClient); reactiveHandler.setExpectReply(false); QueueChannel errorChannel = new QueueChannel(); reactiveHandler.handleMessage(MessageBuilder.withPayload("hello, world") .setErrorChannel(errorChannel) .build()); Message<?> errorMessage = errorChannel.receive(10000); assertNotNull(errorMessage); assertThat(errorMessage, instanceOf(ErrorMessage.class)); Throwable throwable = (Throwable) errorMessage.getPayload(); assertThat(throwable.getMessage(), containsString("401 Unauthorized")); }
@Test public void testHttpReactiveProxyFlow() throws Exception { ClientHttpConnector httpConnector = new HttpHandlerConnector((request, response) -> { response.setStatusCode(HttpStatus.OK); response.getHeaders().setContentType(MediaType.TEXT_PLAIN); return response.writeWith(Mono.just(response.bufferFactory().wrap("FOO".getBytes()))) .then(Mono.defer(response::setComplete)); }); WebClient webClient = WebClient.builder() .clientConnector(httpConnector) .build(); new DirectFieldAccessor(this.httpReactiveProxyFlow) .setPropertyValue("webClient", webClient); this.mockMvc.perform( get("/service2") .with(httpBasic("guest", "guest")) .param("name", "foo")) .andExpect( content() .string("FOO")); }
@Before public void setup() { try { SslContext sslContext = SslContextBuilder.forClient() .trustManager(InsecureTrustManagerFactory.INSTANCE).build(); HttpClient httpClient = HttpClient.create().secure(ssl -> { ssl.sslContext(sslContext); }); ClientHttpConnector httpConnector = new ReactorClientHttpConnector( httpClient); baseUri = "https://localhost:" + port; this.webClient = WebClient.builder().clientConnector(httpConnector) .baseUrl(baseUri).build(); this.testClient = WebTestClient.bindToServer(httpConnector).baseUrl(baseUri).build(); } catch (SSLException e) { throw new RuntimeException(e); } }
@Before public void setup() { ClientHttpConnector httpConnector = new ReactorClientHttpConnector(); baseUri = "http://localhost:" + port; this.webClient = WebClient.builder().clientConnector(httpConnector) .baseUrl(baseUri).build(); this.testClient = WebTestClient.bindToServer().baseUrl(baseUri).build(); }
protected WebClient createWebClientForSocketAddress(InetSocketAddress socketAddress) { Builder builder = WebClient.builder().defaultHeaders(it -> it.addAll(getDefaultHeaders())); if (connector != null) { builder = builder.clientConnector(connector); } String baseUrl = String.format("%s://%s:%d", this.scheme, socketAddress.getHostString(), socketAddress.getPort()); return builder.baseUrl(baseUrl).filter((request, next) -> next.exchange(request).doOnError(errorListener)).build(); } }
@Before public void setup() { this.server = new MockWebServer(); this.webClient = WebClient .builder() .clientConnector(this.connector) .baseUrl(this.server.url("/").toString()) .build(); }
@Override @Before public void setup() throws Exception { super.setup(); this.webClient = WebClient .builder() .clientConnector(this.connector) .baseUrl("http://localhost:" + this.port + "/sse") .build(); }
@Before public void setUp() { this.factory = new ReactorResourceFactory(); this.factory.afterPropertiesSet(); this.server = new MockWebServer(); this.webClient = WebClient .builder() .clientConnector(initConnector()) .baseUrl(this.server.url("/").toString()) .build(); }