@Test public void nonStandardHeadersInResponse() { URI uri = UriComponentsBuilder .fromUriString(this.baseUri + "/get-image") .build(true) .toUri(); String contentType = WebClient.builder() .baseUrl(baseUri) .build() .get() .uri(uri) .exchange() .map(clientResponse -> clientResponse.headers().asHttpHeaders().getFirst(HttpHeaders.CONTENT_TYPE)) .block(); assertEquals(CONTENT_TYPE_IMAGE, contentType); }
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(); } }
public InstanceWebClient build() { WebClient.Builder webClientBuilder; if (this.webClient == null) { webClientBuilder = createDefaultWebClient(this.connectTimeout, this.readTimeout); } else { webClientBuilder = this.webClient.mutate(); } webClientBuilder.filters(webClientFilters -> { webClientFilters.add(InstanceExchangeFilterFunctions.addHeaders(this.httpHeadersProvider)); webClientFilters.add(InstanceExchangeFilterFunctions.rewriteEndpointUrl()); webClientFilters.add(InstanceExchangeFilterFunctions.setDefaultAcceptHeader()); webClientFilters.add(InstanceExchangeFilterFunctions.convertLegacyEndpoint(LegacyEndpointConverters.health())); webClientFilters.add(InstanceExchangeFilterFunctions.convertLegacyEndpoint(LegacyEndpointConverters.info())); webClientFilters.add(InstanceExchangeFilterFunctions.convertLegacyEndpoint(LegacyEndpointConverters.env())); webClientFilters.add(InstanceExchangeFilterFunctions.convertLegacyEndpoint(LegacyEndpointConverters.httptrace())); webClientFilters.add(InstanceExchangeFilterFunctions.convertLegacyEndpoint(LegacyEndpointConverters.threaddump())); webClientFilters.add(InstanceExchangeFilterFunctions.convertLegacyEndpoint(LegacyEndpointConverters.liquibase())); webClientFilters.add(InstanceExchangeFilterFunctions.convertLegacyEndpoint(LegacyEndpointConverters.flyway())); webClientFilters.add(InstanceExchangeFilterFunctions.retry(this.defaultRetries, this.retriesPerEndpoint)); this.filters.forEach(filter -> webClientFilters.add(InstanceExchangeFilterFunctions.toExchangeFilterFunction( filter))); }); webClientCustomizer.customize(webClientBuilder); return new InstanceWebClient(webClientBuilder.build()); }
return WebClient.builder().uriBuilderFactory(uriBuilderFactory) .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; }
/** * Create a session-bound {@link WebClient} to be used by {@link VaultTemplate} for * Vault communication given {@link VaultEndpointProvider} and * {@link ClientHttpConnector} for calls that require an authenticated context. * {@link VaultEndpointProvider} is used to contribute host and port details for * relative URLs typically used by the Template API. Subclasses may override this * method to customize the {@link WebClient}. * * @param endpointProvider must not be {@literal null}. * @param connector must not be {@literal null}. * @return the {@link WebClient} used for Vault communication. * @since 2.1 */ protected WebClient doCreateSessionWebClient(VaultEndpointProvider endpointProvider, ClientHttpConnector connector) { Assert.notNull(endpointProvider, "VaultEndpointProvider must not be null"); Assert.notNull(connector, "ClientHttpConnector must not be null"); ExchangeFilterFunction filter = ofRequestProcessor(request -> vaultTokenSupplier .getVaultToken().map(token -> { return ClientRequest.from(request).headers(headers -> { headers.set(VaultHttpHeaders.VAULT_TOKEN, token.getToken()); }).build(); })); return doCreateWebClient(endpointProvider, connector).mutate().filter(filter) .build(); }
@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; }
@Bean WebClient client(WebClient.Builder build) { return build.build(); }
@Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof WebClient) { WebClient webClient = (WebClient) bean; return webClient.mutate() .filters(addTraceExchangeFilterFunctionIfNotPresent()).build(); } else if (bean instanceof WebClient.Builder) { WebClient.Builder webClientBuilder = (WebClient.Builder) bean; return webClientBuilder.filters(addTraceExchangeFilterFunctionIfNotPresent()); } return bean; }
@Bean public WebClient webClient(WebClient.Builder builder) { return builder.build(); }
@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); }
@Override public WebTestClient.Builder filters(Consumer<List<ExchangeFilterFunction>> filtersConsumer) { this.webClientBuilder.filters(filtersConsumer); return this; }
@Override public WebTestClient.Builder defaultHeader(String headerName, String... headerValues) { this.webClientBuilder.defaultHeader(headerName, headerValues); return this; }
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; }
public MeasuresCollector(DashboardProperties properties, WebClient.Builder webClientBuilder) { WebClient webClient = webClientBuilder .baseUrl(properties.getGenerator().getServiceUrl()).build(); this.electricityMeasures = webClient .get().uri("/measures/firehose") .retrieve().bodyToFlux(ElectricityMeasure.class) .share(); }
@Override public WebTestClient.Builder filter(ExchangeFilterFunction filter) { this.webClientBuilder.filter(filter); return this; }