From 711391cf2f27dd2637a1bb4d7847a2323b6c4e16 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Tue, 14 Jan 2020 10:45:31 +0100 Subject: [PATCH] Move spring.http.* config properties namespace Closes gh-18827 --- .../autoconfigure/codec/CodecProperties.java | 15 +- ...ttpMessageConvertersAutoConfiguration.java | 11 +- .../autoconfigure/http/HttpProperties.java | 154 ------------------ .../http/codec/CodecsAutoConfiguration.java | 9 +- .../autoconfigure/web/ServerProperties.java | 8 + .../DispatcherServletAutoConfiguration.java | 9 +- .../HttpEncodingAutoConfiguration.java | 24 +-- .../web/servlet/WebMvcProperties.java | 16 +- ...itional-spring-configuration-metadata.json | 84 +++++++++- ...ssageConvertersAutoConfigurationTests.java | 6 +- .../codec/CodecsAutoConfigurationTests.java | 7 +- .../HttpEncodingAutoConfigurationTests.java | 24 +-- .../src/docs/asciidoc/using-spring-boot.adoc | 2 +- ...generateConfigurationPropertyTables.groovy | 2 +- .../boot/web/servlet/server/Encoding.java | 134 +++++++++++++++ 15 files changed, 300 insertions(+), 205 deletions(-) delete mode 100644 spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/HttpProperties.java create mode 100644 spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/server/Encoding.java diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/codec/CodecProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/codec/CodecProperties.java index dcec543919..cdf52f598c 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/codec/CodecProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/codec/CodecProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,6 +28,11 @@ import org.springframework.util.unit.DataSize; @ConfigurationProperties(prefix = "spring.codec") public class CodecProperties { + /** + * Whether to log form data at DEBUG level, and headers at TRACE level. + */ + private boolean logRequestDetails; + /** * Limit on the number of bytes that can be buffered whenever the input stream needs * to be aggregated. By default this is not set, in which case individual codec @@ -35,6 +40,14 @@ public class CodecProperties { */ private DataSize maxInMemorySize; + public boolean isLogRequestDetails() { + return this.logRequestDetails; + } + + public void setLogRequestDetails(boolean logRequestDetails) { + this.logRequestDetails = logRequestDetails; + } + public DataSize getMaxInMemorySize() { return this.maxInMemorySize; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfiguration.java index cf98f5719a..96c3db64b7 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,6 +30,7 @@ import org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration; import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration.NotReactiveWebApplicationCondition; import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; import org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration; +import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; @@ -60,7 +61,7 @@ import org.springframework.http.converter.StringHttpMessageConverter; JsonbHttpMessageConvertersConfiguration.class }) public class HttpMessageConvertersAutoConfiguration { - static final String PREFERRED_MAPPER_PROPERTY = "spring.http.converters.preferred-json-mapper"; + static final String PREFERRED_MAPPER_PROPERTY = "spring.mvc.converters.preferred-json-mapper"; @Bean @ConditionalOnMissingBean @@ -70,14 +71,14 @@ public class HttpMessageConvertersAutoConfiguration { @Configuration(proxyBeanMethods = false) @ConditionalOnClass(StringHttpMessageConverter.class) - @EnableConfigurationProperties(HttpProperties.class) + @EnableConfigurationProperties(ServerProperties.class) protected static class StringHttpMessageConverterConfiguration { @Bean @ConditionalOnMissingBean - public StringHttpMessageConverter stringHttpMessageConverter(HttpProperties httpProperties) { + public StringHttpMessageConverter stringHttpMessageConverter(ServerProperties serverProperties) { StringHttpMessageConverter converter = new StringHttpMessageConverter( - httpProperties.getEncoding().getCharset()); + serverProperties.getServlet().getEncoding().getCharset()); converter.setWriteAcceptCharset(false); return converter; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/HttpProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/HttpProperties.java deleted file mode 100644 index 0b36c5b47f..0000000000 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/HttpProperties.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright 2012-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.boot.autoconfigure.http; - -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.util.Locale; -import java.util.Map; - -import org.springframework.boot.context.properties.ConfigurationProperties; - -/** - * HTTP properties. - * - * @author Phillip Webb - * @author Stephane Nicoll - * @author Brian Clozel - * @since 2.1.0 - */ -@ConfigurationProperties(prefix = "spring.http") -public class HttpProperties { - - /** - * Whether logging of (potentially sensitive) request details at DEBUG and TRACE level - * is allowed. - */ - private boolean logRequestDetails; - - /** - * HTTP encoding properties. - */ - private final Encoding encoding = new Encoding(); - - public boolean isLogRequestDetails() { - return this.logRequestDetails; - } - - public void setLogRequestDetails(boolean logRequestDetails) { - this.logRequestDetails = logRequestDetails; - } - - public Encoding getEncoding() { - return this.encoding; - } - - /** - * Configuration properties for http encoding. - */ - public static class Encoding { - - public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8; - - /** - * Charset of HTTP requests and responses. Added to the "Content-Type" header if - * not set explicitly. - */ - private Charset charset = DEFAULT_CHARSET; - - /** - * Whether to force the encoding to the configured charset on HTTP requests and - * responses. - */ - private Boolean force; - - /** - * Whether to force the encoding to the configured charset on HTTP requests. - * Defaults to true when "force" has not been specified. - */ - private Boolean forceRequest; - - /** - * Whether to force the encoding to the configured charset on HTTP responses. - */ - private Boolean forceResponse; - - /** - * Locale in which to encode mapping. - */ - private Map mapping; - - public Charset getCharset() { - return this.charset; - } - - public void setCharset(Charset charset) { - this.charset = charset; - } - - public boolean isForce() { - return Boolean.TRUE.equals(this.force); - } - - public void setForce(boolean force) { - this.force = force; - } - - public boolean isForceRequest() { - return Boolean.TRUE.equals(this.forceRequest); - } - - public void setForceRequest(boolean forceRequest) { - this.forceRequest = forceRequest; - } - - public boolean isForceResponse() { - return Boolean.TRUE.equals(this.forceResponse); - } - - public void setForceResponse(boolean forceResponse) { - this.forceResponse = forceResponse; - } - - public Map getMapping() { - return this.mapping; - } - - public void setMapping(Map mapping) { - this.mapping = mapping; - } - - public boolean shouldForce(Type type) { - Boolean force = (type != Type.REQUEST) ? this.forceResponse : this.forceRequest; - if (force == null) { - force = this.force; - } - if (force == null) { - force = (type == Type.REQUEST); - } - return force; - } - - public enum Type { - - REQUEST, RESPONSE - - } - - } - -} diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/codec/CodecsAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/codec/CodecsAutoConfiguration.java index 9fbc6be3b8..7a9f658393 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/codec/CodecsAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/codec/CodecsAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,7 +23,6 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.codec.CodecProperties; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.http.HttpProperties; import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.PropertyMapper; @@ -49,7 +48,7 @@ import org.springframework.web.reactive.function.client.WebClient; @Configuration(proxyBeanMethods = false) @ConditionalOnClass({ CodecConfigurer.class, WebClient.class }) @AutoConfigureAfter(JacksonAutoConfiguration.class) -@EnableConfigurationProperties({ HttpProperties.class, CodecProperties.class }) +@EnableConfigurationProperties(CodecProperties.class) public class CodecsAutoConfiguration { private static final MimeType[] EMPTY_MIME_TYPES = {}; @@ -76,11 +75,11 @@ public class CodecsAutoConfiguration { @Bean @Order(0) - CodecCustomizer defaultCodecCustomizer(HttpProperties httpProperties, CodecProperties codecProperties) { + CodecCustomizer defaultCodecCustomizer(CodecProperties codecProperties) { return (configurer) -> { PropertyMapper map = PropertyMapper.get(); CodecConfigurer.DefaultCodecs defaultCodecs = configurer.defaultCodecs(); - defaultCodecs.enableLoggingRequestDetails(httpProperties.isLogRequestDetails()); + defaultCodecs.enableLoggingRequestDetails(codecProperties.isLogRequestDetails()); map.from(codecProperties.getMaxInMemorySize()).whenNonNull().asInt(DataSize::toBytes) .to(defaultCodecs::maxInMemorySize); }; diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java index 53f26dfdce..e7117df38a 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java @@ -37,6 +37,7 @@ import org.springframework.boot.convert.DurationUnit; import org.springframework.boot.web.server.Compression; import org.springframework.boot.web.server.Http2; import org.springframework.boot.web.server.Ssl; +import org.springframework.boot.web.servlet.server.Encoding; import org.springframework.boot.web.servlet.server.Jsp; import org.springframework.boot.web.servlet.server.Session; import org.springframework.util.StringUtils; @@ -246,6 +247,9 @@ public class ServerProperties { */ private String applicationDisplayName = "application"; + @NestedConfigurationProperty + private final Encoding encoding = new Encoding(); + @NestedConfigurationProperty private final Jsp jsp = new Jsp(); @@ -280,6 +284,10 @@ public class ServerProperties { return this.contextParameters; } + public Encoding getEncoding() { + return this.encoding; + } + public Jsp getJsp() { return this.jsp; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/DispatcherServletAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/DispatcherServletAutoConfiguration.java index e84453ec75..6a4c61c956 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/DispatcherServletAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/DispatcherServletAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,7 +36,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type; import org.springframework.boot.autoconfigure.condition.SpringBootCondition; -import org.springframework.boot.autoconfigure.http.HttpProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; @@ -83,17 +82,17 @@ public class DispatcherServletAutoConfiguration { @Configuration(proxyBeanMethods = false) @Conditional(DefaultDispatcherServletCondition.class) @ConditionalOnClass(ServletRegistration.class) - @EnableConfigurationProperties({ HttpProperties.class, WebMvcProperties.class }) + @EnableConfigurationProperties(WebMvcProperties.class) protected static class DispatcherServletConfiguration { @Bean(name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME) - public DispatcherServlet dispatcherServlet(HttpProperties httpProperties, WebMvcProperties webMvcProperties) { + public DispatcherServlet dispatcherServlet(WebMvcProperties webMvcProperties) { DispatcherServlet dispatcherServlet = new DispatcherServlet(); dispatcherServlet.setDispatchOptionsRequest(webMvcProperties.isDispatchOptionsRequest()); dispatcherServlet.setDispatchTraceRequest(webMvcProperties.isDispatchTraceRequest()); dispatcherServlet.setThrowExceptionIfNoHandlerFound(webMvcProperties.isThrowExceptionIfNoHandlerFound()); dispatcherServlet.setPublishEvents(webMvcProperties.isPublishRequestHandledEvents()); - dispatcherServlet.setEnableLoggingRequestDetails(httpProperties.isLogRequestDetails()); + dispatcherServlet.setEnableLoggingRequestDetails(webMvcProperties.isLogRequestDetails()); return dispatcherServlet; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/HttpEncodingAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/HttpEncodingAutoConfiguration.java index 5baf68f1fd..2c9b3aef02 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/HttpEncodingAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/HttpEncodingAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,12 +21,12 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; -import org.springframework.boot.autoconfigure.http.HttpProperties; -import org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type; +import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.boot.web.servlet.filter.OrderedCharacterEncodingFilter; import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; +import org.springframework.boot.web.servlet.server.Encoding; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; @@ -41,16 +41,16 @@ import org.springframework.web.filter.CharacterEncodingFilter; * @since 2.0.0 */ @Configuration(proxyBeanMethods = false) -@EnableConfigurationProperties(HttpProperties.class) +@EnableConfigurationProperties(ServerProperties.class) @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) @ConditionalOnClass(CharacterEncodingFilter.class) -@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true) +@ConditionalOnProperty(prefix = "server.servlet.encoding", value = "enabled", matchIfMissing = true) public class HttpEncodingAutoConfiguration { - private final HttpProperties.Encoding properties; + private final Encoding properties; - public HttpEncodingAutoConfiguration(HttpProperties properties) { - this.properties = properties.getEncoding(); + public HttpEncodingAutoConfiguration(ServerProperties properties) { + this.properties = properties.getServlet().getEncoding(); } @Bean @@ -58,8 +58,8 @@ public class HttpEncodingAutoConfiguration { public CharacterEncodingFilter characterEncodingFilter() { CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter(); filter.setEncoding(this.properties.getCharset().name()); - filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST)); - filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE)); + filter.setForceRequestEncoding(this.properties.shouldForce(Encoding.Type.REQUEST)); + filter.setForceResponseEncoding(this.properties.shouldForce(Encoding.Type.RESPONSE)); return filter; } @@ -71,9 +71,9 @@ public class HttpEncodingAutoConfiguration { static class LocaleCharsetMappingsCustomizer implements WebServerFactoryCustomizer, Ordered { - private final HttpProperties.Encoding properties; + private final Encoding properties; - LocaleCharsetMappingsCustomizer(HttpProperties.Encoding properties) { + LocaleCharsetMappingsCustomizer(Encoding properties) { this.properties = properties; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcProperties.java index 60ea3c919e..fa34062be0 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/WebMvcProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -87,6 +87,12 @@ public class WebMvcProperties { */ private boolean throwExceptionIfNoHandlerFound = false; + /** + * Whether logging of (potentially sensitive) request details at DEBUG and TRACE level + * is allowed. + */ + private boolean logRequestDetails; + /** * Whether to enable warn logging of exceptions resolved by a * "HandlerExceptionResolver", except for "DefaultHandlerExceptionResolver". @@ -164,6 +170,14 @@ public class WebMvcProperties { this.throwExceptionIfNoHandlerFound = throwExceptionIfNoHandlerFound; } + public boolean isLogRequestDetails() { + return this.logRequestDetails; + } + + public void setLogRequestDetails(boolean logRequestDetails) { + this.logRequestDetails = logRequestDetails; + } + public boolean isLogResolvedException() { return this.logResolvedException; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 260e251f30..9e939af9c0 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -473,16 +473,94 @@ "defaultValue": ".tpl" }, { - "name": "spring.http.encoding.enabled", + "name": "server.servlet.encoding.enabled", "type": "java.lang.Boolean", "description": "Whether to enable http encoding support.", "defaultValue": true }, { - "name": "spring.http.converters.preferred-json-mapper", + "name": "spring.http.encoding.enabled", + "type": "java.lang.Boolean", + "description": "Whether to enable http encoding support.", + "defaultValue": true, + "deprecation" : { + "replacement" : "server.servlet.encoding.enabled", + "level" : "error" + } + }, + { + "name" : "spring.http.encoding.charset", + "type": "java.nio.charset.Charset", + "description" : "Charset of HTTP requests and responses. Added to the Content-Type header if not set explicitly.", + "deprecation" : { + "replacement" : "server.servlet.encoding.charset", + "level" : "error" + } + }, + { + "name": "spring.http.encoding.force", + "type": "java.lang.Boolean", + "description": "Whether to force the encoding to the configured charset on HTTP requests and responses.", + "defaultValue": false, + "deprecation" : { + "replacement" : "server.servlet.encoding.force", + "level" : "error" + } + }, + { + "name": "spring.http.encoding.force-request", + "type": "java.lang.Boolean", + "description": "Whether to force the encoding to the configured charset on HTTP requests. Defaults to true when force has not been specified.", + "defaultValue": true, + "deprecation" : { + "replacement" : "server.servlet.encoding.force-request", + "level" : "error" + } + }, + { + "name": "spring.http.encoding.force-response", + "type": "java.lang.Boolean", + "description": "Whether to force the encoding to the configured charset on HTTP responses.", + "defaultValue": false, + "deprecation" : { + "replacement" : "server.servlet.encoding.force-response", + "level" : "error" + } + }, + + { + "name" : "spring.http.encoding.mapping", + "type" : "java.util.Map", + "description" : "Locale in which to encode mapping.", + "deprecation" : { + "replacement" : "server.servlet.encoding.mapping", + "level" : "error" + } + }, + { + "name": "spring.http.log-request-details", + "type": "java.lang.Boolean", + "description": "Whether logging of (potentially sensitive) request details at DEBUG and TRACE level is allowed.", + "defaultValue": false, + "deprecation" : { + "replacement" : "spring.mvc.log-request-details", + "level" : "error" + } + }, + { + "name": "spring.mvc.converters.preferred-json-mapper", "type": "java.lang.String", "description": "Preferred JSON mapper to use for HTTP message conversion. By default, auto-detected according to the environment." }, + { + "name": "spring.http.converters.preferred-json-mapper", + "type": "java.lang.String", + "description": "Preferred JSON mapper to use for HTTP message conversion. By default, auto-detected according to the environment.", + "deprecation" : { + "replacement" : "spring.mvc.converters.preferred-json-mapper", + "level" : "error" + } + }, { "name": "spring.integration.jdbc.initialize-schema", "defaultValue": "embedded" @@ -2356,7 +2434,7 @@ ] }, { - "name": "spring.http.converters.preferred-json-mapper", + "name": "spring.mvc.converters.preferred-json-mapper", "values": [ { "value": "gson" diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfigurationTests.java index 85af1e0b0e..4b8286d986 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -121,7 +121,7 @@ class HttpMessageConvertersAutoConfigurationTests { @Test void gsonCanBePreferred() { - allOptionsRunner().withPropertyValues("spring.http.converters.preferred-json-mapper:gson").run((context) -> { + allOptionsRunner().withPropertyValues("spring.mvc.converters.preferred-json-mapper:gson").run((context) -> { assertConverterBeanExists(context, GsonHttpMessageConverter.class, "gsonHttpMessageConverter"); assertConverterBeanRegisteredWithHttpMessageConverters(context, GsonHttpMessageConverter.class); assertThat(context).doesNotHaveBean(JsonbHttpMessageConverter.class); @@ -152,7 +152,7 @@ class HttpMessageConvertersAutoConfigurationTests { @Test void jsonbCanBePreferred() { - allOptionsRunner().withPropertyValues("spring.http.converters.preferred-json-mapper:jsonb").run((context) -> { + allOptionsRunner().withPropertyValues("spring.mvc.converters.preferred-json-mapper:jsonb").run((context) -> { assertConverterBeanExists(context, JsonbHttpMessageConverter.class, "jsonbHttpMessageConverter"); assertConverterBeanRegisteredWithHttpMessageConverters(context, JsonbHttpMessageConverter.class); assertThat(context).doesNotHaveBean(GsonHttpMessageConverter.class); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/codec/CodecsAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/codec/CodecsAutoConfigurationTests.java index fcd5b78359..d72ce0bad8 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/codec/CodecsAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/codec/CodecsAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,7 +23,6 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.codec.CodecProperties; -import org.springframework.boot.autoconfigure.http.HttpProperties; import org.springframework.boot.test.context.runner.WebApplicationContextRunner; import org.springframework.boot.web.codec.CodecCustomizer; import org.springframework.context.annotation.Bean; @@ -59,7 +58,7 @@ class CodecsAutoConfigurationTests { @Test void loggingRequestDetailsCustomizerShouldUseHttpProperties() { - this.contextRunner.withPropertyValues("spring.http.log-request-details=true").run((context) -> { + this.contextRunner.withPropertyValues("spring.codec.log-request-details=true").run((context) -> { CodecCustomizer customizer = context.getBean(CodecCustomizer.class); CodecConfigurer configurer = new DefaultClientCodecConfigurer(); customizer.customize(configurer); @@ -72,7 +71,7 @@ class CodecsAutoConfigurationTests { this.contextRunner.run((context) -> { Method customizerMethod = ReflectionUtils.findMethod( CodecsAutoConfiguration.DefaultCodecsConfiguration.class, "defaultCodecCustomizer", - HttpProperties.class, CodecProperties.class); + CodecProperties.class); Integer order = new TestAnnotationAwareOrderComparator().findOrder(customizerMethod); assertThat(order).isEqualTo(0); }); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/HttpEncodingAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/HttpEncodingAutoConfigurationTests.java index c31e851908..eaa3a05b1c 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/HttpEncodingAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/HttpEncodingAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -69,49 +69,53 @@ class HttpEncodingAutoConfigurationTests { @Test void disableConfiguration() { - load(EmptyConfiguration.class, "spring.http.encoding.enabled:false"); + load(EmptyConfiguration.class, "server.servlet.encoding.enabled:false"); assertThatExceptionOfType(NoSuchBeanDefinitionException.class) .isThrownBy(() -> this.context.getBean(CharacterEncodingFilter.class)); } @Test void customConfiguration() { - load(EmptyConfiguration.class, "spring.http.encoding.charset:ISO-8859-15", "spring.http.encoding.force:false"); + load(EmptyConfiguration.class, "server.servlet.encoding.charset:ISO-8859-15", + "server.servlet.encoding.force:false"); CharacterEncodingFilter filter = this.context.getBean(CharacterEncodingFilter.class); assertCharacterEncodingFilter(filter, "ISO-8859-15", false, false); } @Test void customFilterConfiguration() { - load(FilterConfiguration.class, "spring.http.encoding.charset:ISO-8859-15", "spring.http.encoding.force:false"); + load(FilterConfiguration.class, "server.servlet.encoding.charset:ISO-8859-15", + "server.servlet.encoding.force:false"); CharacterEncodingFilter filter = this.context.getBean(CharacterEncodingFilter.class); assertCharacterEncodingFilter(filter, "US-ASCII", false, false); } @Test void forceRequest() { - load(EmptyConfiguration.class, "spring.http.encoding.force-request:false"); + load(EmptyConfiguration.class, "server.servlet.encoding.force-request:false"); CharacterEncodingFilter filter = this.context.getBean(CharacterEncodingFilter.class); assertCharacterEncodingFilter(filter, "UTF-8", false, false); } @Test void forceResponse() { - load(EmptyConfiguration.class, "spring.http.encoding.force-response:true"); + load(EmptyConfiguration.class, "server.servlet.encoding.force-response:true"); CharacterEncodingFilter filter = this.context.getBean(CharacterEncodingFilter.class); assertCharacterEncodingFilter(filter, "UTF-8", true, true); } @Test void forceRequestOverridesForce() { - load(EmptyConfiguration.class, "spring.http.encoding.force:true", "spring.http.encoding.force-request:false"); + load(EmptyConfiguration.class, "server.servlet.encoding.force:true", + "server.servlet.encoding.force-request:false"); CharacterEncodingFilter filter = this.context.getBean(CharacterEncodingFilter.class); assertCharacterEncodingFilter(filter, "UTF-8", false, true); } @Test void forceResponseOverridesForce() { - load(EmptyConfiguration.class, "spring.http.encoding.force:true", "spring.http.encoding.force-response:false"); + load(EmptyConfiguration.class, "server.servlet.encoding.force:true", + "server.servlet.encoding.force-response:false"); CharacterEncodingFilter filter = this.context.getBean(CharacterEncodingFilter.class); assertCharacterEncodingFilter(filter, "UTF-8", true, false); } @@ -135,8 +139,8 @@ class HttpEncodingAutoConfigurationTests { @Test void customLocaleCharsetMappings() { - load(EmptyConfiguration.class, "spring.http.encoding.mapping.en:UTF-8", - "spring.http.encoding.mapping.fr_FR:UTF-8"); + load(EmptyConfiguration.class, "server.servlet.encoding.mapping.en:UTF-8", + "server.servlet.encoding.mapping.fr_FR:UTF-8"); Map> beans = getWebServerFactoryCustomizerBeans(); assertThat(beans.size()).isEqualTo(1); assertThat(this.context.getBean(MockServletWebServerFactory.class).getLocaleCharsetMappings().size()) diff --git a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/using-spring-boot.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/using-spring-boot.adoc index 04a6b817a9..3de9ba1694 100644 --- a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/using-spring-boot.adoc +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/using-spring-boot.adoc @@ -689,7 +689,7 @@ Rather than needing to set these properties manually, the `spring-boot-devtools` Because you need more information about web requests while developing Spring MVC and Spring WebFlux applications, developer tools will enable `DEBUG` logging for the `web` logging group. This will give you information about the incoming request, which handler is processing it, the response outcome, etc. -If you wish to log all request details (including potentially sensitive information), you can turn on the configprop:spring.http.log-request-details[] configuration property. +If you wish to log all request details (including potentially sensitive information), you can turn on the configprop:spring.mvc.log-request-details[] or configprop:spring.codec.log-request-details[] configuration properties. NOTE: If you don't want property defaults to be applied you can set configprop:spring.devtools.add-properties[] to `false` in your `application.properties`. diff --git a/spring-boot-project/spring-boot-docs/src/main/groovy/generateConfigurationPropertyTables.groovy b/spring-boot-project/spring-boot-docs/src/main/groovy/generateConfigurationPropertyTables.groovy index 1b5baa2fdc..50c31b55dd 100644 --- a/spring-boot-project/spring-boot-docs/src/main/groovy/generateConfigurationPropertyTables.groovy +++ b/spring-boot-project/spring-boot-docs/src/main/groovy/generateConfigurationPropertyTables.groovy @@ -36,7 +36,7 @@ def generateConfigMetadataDocumentation() { .withKeyPrefixes("server") .addSection("web") .withKeyPrefixes("spring.hateoas", - "spring.http", "spring.servlet", "spring.jersey", + "spring.servlet", "spring.jersey", "spring.mvc", "spring.resources", "spring.webflux") .addSection("json") .withKeyPrefixes("spring.jackson", "spring.gson") diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/server/Encoding.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/server/Encoding.java new file mode 100644 index 0000000000..ee3ec73830 --- /dev/null +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/server/Encoding.java @@ -0,0 +1,134 @@ +/* + * Copyright 2012-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.web.servlet.server; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.Locale; +import java.util.Map; + +/** + * Configuration properties for server HTTP encoding. + * + * @author Phillip Webb + * @author Stephane Nicoll + * @author Brian Clozel + * @since 2.3.0 + */ +public class Encoding { + + /** + * Default HTTP encoding for Servlet applications. + */ + public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8; + + /** + * Charset of HTTP requests and responses. Added to the "Content-Type" header if not + * set explicitly. + */ + private Charset charset = DEFAULT_CHARSET; + + /** + * Whether to force the encoding to the configured charset on HTTP requests and + * responses. + */ + private Boolean force; + + /** + * Whether to force the encoding to the configured charset on HTTP requests. Defaults + * to true when "force" has not been specified. + */ + private Boolean forceRequest; + + /** + * Whether to force the encoding to the configured charset on HTTP responses. + */ + private Boolean forceResponse; + + /** + * Locale in which to encode mapping. + */ + private Map mapping; + + public Charset getCharset() { + return this.charset; + } + + public void setCharset(Charset charset) { + this.charset = charset; + } + + public boolean isForce() { + return Boolean.TRUE.equals(this.force); + } + + public void setForce(boolean force) { + this.force = force; + } + + public boolean isForceRequest() { + return Boolean.TRUE.equals(this.forceRequest); + } + + public void setForceRequest(boolean forceRequest) { + this.forceRequest = forceRequest; + } + + public boolean isForceResponse() { + return Boolean.TRUE.equals(this.forceResponse); + } + + public void setForceResponse(boolean forceResponse) { + this.forceResponse = forceResponse; + } + + public Map getMapping() { + return this.mapping; + } + + public void setMapping(Map mapping) { + this.mapping = mapping; + } + + public boolean shouldForce(Type type) { + Boolean force = (type != Type.REQUEST) ? this.forceResponse : this.forceRequest; + if (force == null) { + force = this.force; + } + if (force == null) { + force = (type == Type.REQUEST); + } + return force; + } + + /** + * Type of HTTP message to consider for encoding configuration. + */ + public enum Type { + + /** + * HTTP request message. + */ + REQUEST, + /** + * HTTP response message. + */ + RESPONSE + + } + +}