Browse Source

Uses new JDK http client support in ClientHttpRequestFactories

See gh-2949
pull/3006/head
sgibb 2 years ago
parent
commit
a628d24fae
No known key found for this signature in database
GPG Key ID: 7788A47380690861
  1. 52
      spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfiguration.java
  2. 73
      spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/config/GatewayMvcProperties.java

52
spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/GatewayServerMvcAutoConfiguration.java

@ -21,8 +21,11 @@ import org.springframework.boot.autoconfigure.AutoConfiguration; @@ -21,8 +21,11 @@ import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
import org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration;
import org.springframework.boot.ssl.SslBundle;
import org.springframework.boot.ssl.SslBundles;
import org.springframework.boot.web.client.ClientHttpRequestFactories;
import org.springframework.boot.web.client.ClientHttpRequestFactorySettings;
import org.springframework.boot.web.client.RestClientCustomizer;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.gateway.server.mvc.config.GatewayMvcProperties;
import org.springframework.cloud.gateway.server.mvc.config.GatewayMvcPropertiesBeanDefinitionRegistrar;
import org.springframework.cloud.gateway.server.mvc.filter.ForwardedRequestHeadersFilter;
@ -74,32 +77,33 @@ public class GatewayServerMvcAutoConfiguration { @@ -74,32 +77,33 @@ public class GatewayServerMvcAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public ClientHttpRequestFactory gatewayClientHttpRequestFactory(RestTemplateBuilder restTemplateBuilder) {
// TODO: set property if jdk HttpClient
// TODO: temporarily force Jdk HttpClient, copied from
// https://github.com/spring-projects/spring-boot/pull/36118
String restrictedHeaders = System.getProperty("jdk.httpclient.allowRestrictedHeaders");
if (!StringUtils.hasText(restrictedHeaders)) {
System.setProperty("jdk.httpclient.allowRestrictedHeaders", "host");
}
else if (StringUtils.hasText(restrictedHeaders) && !restrictedHeaders.contains("host")) {
System.setProperty("jdk.httpclient.allowRestrictedHeaders", restrictedHeaders + ",host");
public ClientHttpRequestFactory gatewayClientHttpRequestFactory(GatewayMvcProperties gatewayMvcProperties,
SslBundles sslBundles) {
GatewayMvcProperties.HttpClient properties = gatewayMvcProperties.getHttpClient();
SslBundle sslBundle = null;
if (StringUtils.hasText(properties.getSslBundle())) {
sslBundle = sslBundles.getBundle(properties.getSslBundle());
}
return restTemplateBuilder.requestFactory(settings -> {
java.net.http.HttpClient.Builder builder = java.net.http.HttpClient.newBuilder();
if (settings.connectTimeout() != null) {
builder.connectTimeout(settings.connectTimeout());
}
if (settings.sslBundle() != null) {
builder.sslContext(settings.sslBundle().createSslContext());
ClientHttpRequestFactorySettings settings = new ClientHttpRequestFactorySettings(properties.getConnectTimeout(),
properties.getReadTimeout(), sslBundle);
if (properties.getType() == GatewayMvcProperties.HttpClientType.JDK) {
// TODO: customize restricted headers
// https://github.com/spring-projects/spring-boot/pull/36118
String restrictedHeaders = System.getProperty("jdk.httpclient.allowRestrictedHeaders");
if (!StringUtils.hasText(restrictedHeaders)) {
System.setProperty("jdk.httpclient.allowRestrictedHeaders", "host");
}
java.net.http.HttpClient httpClient = builder.build();
JdkClientHttpRequestFactory requestFactory = new JdkClientHttpRequestFactory(httpClient);
if (settings.readTimeout() != null) {
requestFactory.setReadTimeout(settings.readTimeout());
else if (StringUtils.hasText(restrictedHeaders) && !restrictedHeaders.contains("host")) {
System.setProperty("jdk.httpclient.allowRestrictedHeaders", restrictedHeaders + ",host");
}
return requestFactory;
}).buildRequestFactory();
return ClientHttpRequestFactories.get(JdkClientHttpRequestFactory.class, settings);
}
// Autodetect
return ClientHttpRequestFactories.get(settings);
}
@Bean

73
spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/config/GatewayMvcProperties.java

@ -16,6 +16,7 @@ @@ -16,6 +16,7 @@
package org.springframework.cloud.gateway.server.mvc.config;
import java.time.Duration;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
@ -48,6 +49,8 @@ public class GatewayMvcProperties { @@ -48,6 +49,8 @@ public class GatewayMvcProperties {
@Valid
private LinkedHashMap<String, RouteProperties> routesMap = new LinkedHashMap<>();
private HttpClient httpClient = new HttpClient();
public List<RouteProperties> getRoutes() {
return routes;
}
@ -64,9 +67,77 @@ public class GatewayMvcProperties { @@ -64,9 +67,77 @@ public class GatewayMvcProperties {
this.routesMap = routesMap;
}
public HttpClient getHttpClient() {
return httpClient;
}
@Override
public String toString() {
return new ToStringCreator(this).append("routes", routes).append("routesMap", routesMap).toString();
return new ToStringCreator(this).append("httpClient", httpClient).append("routes", routes)
.append("routesMap", routesMap).toString();
}
public static class HttpClient {
private Duration connectTimeout;
private Duration readTimeout;
private String sslBundle;
private HttpClientType type = HttpClientType.JDK;
public Duration getConnectTimeout() {
return connectTimeout;
}
public void setConnectTimeout(Duration connectTimeout) {
this.connectTimeout = connectTimeout;
}
public Duration getReadTimeout() {
return readTimeout;
}
public void setReadTimeout(Duration readTimeout) {
this.readTimeout = readTimeout;
}
public String getSslBundle() {
return sslBundle;
}
public void setSslBundle(String sslBundle) {
this.sslBundle = sslBundle;
}
public HttpClientType getType() {
return type;
}
public void setType(HttpClientType type) {
this.type = type;
}
@Override
public String toString() {
return new ToStringCreator(this).append("connectTimeout", connectTimeout).append("readTimeout", readTimeout)
.append("sslBundle", sslBundle).append("type", type).toString();
}
}
public enum HttpClientType {
/**
* Use JDK HttpClient.
*/
JDK,
/**
* Auto-detect the HttpClient.
*/
AUTODETECT
}

Loading…
Cancel
Save