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(); } }
@Test public void defaultRequest() { ThreadLocal<String> context = new NamedThreadLocal<>("foo"); Map<String, Object> actual = new HashMap<>(); ExchangeFilterFunction filter = (request, next) -> { actual.putAll(request.attributes()); return next.exchange(request); }; WebClient client = this.builder .defaultRequest(spec -> spec.attribute("foo", context.get())) .filter(filter) .build(); try { context.set("bar"); client.get().uri("/path").attribute("foo", "bar").exchange(); } finally { context.remove(); } assertEquals("bar", actual.get("foo")); }
@Test public void withNullAttribute() { Map<String, Object> actual = new HashMap<>(); ExchangeFilterFunction filter = (request, next) -> { actual.putAll(request.attributes()); return next.exchange(request); }; this.builder.filter(filter).build() .get().uri("/path") .attribute("foo", null) .exchange(); assertNull(actual.get("foo")); ClientRequest request = verifyAndGetRequest(); assertFalse(request.attribute("foo").isPresent()); }
/** * Configures the builder with {@link #defaultRequest()} and adds this as a {@link ExchangeFilterFunction} * @return the {@link Consumer} to configure the builder */ public Consumer<WebClient.Builder> oauth2Configuration() { return builder -> builder.defaultRequest(defaultRequest()).filter(this); }
@Override public WebTestClient.Builder filter(ExchangeFilterFunction filter) { this.webClientBuilder.filter(filter); return this; }
@Bean WebClient githubWebClient(final GithubProperties props) { return WebClient.builder() .baseUrl(props.getBaseUrl()) .filter((request, next) -> next.exchange( ClientRequest.from(request) .header(AUTHORIZATION, basicAuthorization(props.getToken())) .build())) .build(); }
@Bean public WebClient webClient() { return WebClient.builder().baseUrl("http://trace-b") .filter(lbFunction) .build(); }
@Bean //TODO the LoadBalanceExchangeFilterFunction can be removed once we have a load balanced WebClient public WebClient webClient(WebClient.Builder webClientBuilder, LoadBalancerExchangeFilterFunction lbef) { return webClientBuilder.filter(lbef).build(); }
@Override public WebTestClient.Builder filter(ExchangeFilterFunction filter) { this.webClientBuilder.filter(filter); return this; }
@Test public void testFilterFunctionWorks() { String value = WebClient.builder() .baseUrl("http://testservice") .filter(lbFunction) .build() .get() .uri("/hello") .retrieve() .bodyToMono(String.class).block(); assertThat(value).isEqualTo("Hello World"); }
@Bean public WebClient webClient(ReactiveClientRegistrationRepository clientRegistrationRepo, ServerOAuth2AuthorizedClientRepository authorizedClientRepo) { ServerOAuth2AuthorizedClientExchangeFilterFunction filter = new ServerOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrationRepo, authorizedClientRepo); return WebClient.builder() .filter(filter) .build(); } }
@Test public void testNoHostName() { ClientResponse clientResponse = WebClient.builder() .baseUrl("http:///foobar") .filter(lbFunction) .build() .get().exchange().block(); assertThat(clientResponse.statusCode()).isEqualTo(HttpStatus.BAD_REQUEST); }
@Test public void testNoInstance() { ClientResponse clientResponse = WebClient.builder() .baseUrl("http://foobar") .filter(lbFunction) .build() .get().exchange().block(); assertThat(clientResponse.statusCode()).isEqualTo(HttpStatus.SERVICE_UNAVAILABLE); }
@Bean public WebClientCustomizer loadbalanceClientWebClientCustomizer(LoadBalancerExchangeFilterFunction filterFunction) { return builder -> builder.filter(filterFunction); }
/** * Configures the builder with {@link #defaultRequest()} and adds this as a {@link ExchangeFilterFunction} * @return the {@link Consumer} to configure the builder */ public Consumer<WebClient.Builder> oauth2Configuration() { return builder -> builder.defaultRequest(defaultRequest()).filter(this); }
WebClient filteredClient = this.webClient.mutate().filter(filter).build();
.filter((request, next) -> next.exchange(request)) .defaultHeader("foo", "bar") .defaultCookie("foo", "bar"); WebClient client2 = builder.filter((request, next) -> next.exchange(request)) .defaultHeader("baz", "qux") .defaultCookie("baz", "qux") .filter((request, next) -> next.exchange(request)) .defaultHeader("baz", "qux") .defaultCookie("baz", "qux")
@Test public void shouldApplyExchangeFilter() { prepareResponse(response -> response.setHeader("Content-Type", "text/plain") .setBody("Hello Spring!")); WebClient filteredClient = this.webClient.mutate() .filter((request, next) -> { ClientRequest filteredRequest = ClientRequest.from(request).header("foo", "bar").build(); return next.exchange(filteredRequest); }) .build(); Mono<String> result = filteredClient.get() .uri("/greeting?name=Spring") .retrieve() .bodyToMono(String.class); StepVerifier.create(result) .expectNext("Hello Spring!") .expectComplete() .verify(Duration.ofSeconds(3)); expectRequestCount(1); expectRequest(request -> assertEquals("bar", request.getHeader("foo"))); }
@Test public void withStringAttribute() { Map<String, Object> actual = new HashMap<>(); ExchangeFilterFunction filter = (request, next) -> { actual.putAll(request.attributes()); return next.exchange(request); }; this.builder.filter(filter).build() .get().uri("/path") .attribute("foo", "bar") .exchange(); assertEquals("bar", actual.get("foo")); ClientRequest request = verifyAndGetRequest(); assertEquals("bar", request.attribute("foo").get()); }
@Override public WebTestClient.Builder filter(ExchangeFilterFunction filter) { this.webClientBuilder.filter(filter); return this; }