diff --git a/spring-web/spring-web.gradle b/spring-web/spring-web.gradle index 3745b5201b..6d1ca73a86 100644 --- a/spring-web/spring-web.gradle +++ b/spring-web/spring-web.gradle @@ -7,6 +7,7 @@ dependencies { compile(project(":spring-beans")) compile(project(":spring-core")) compileOnly(project(":kotlin-coroutines")) + compileOnly("io.projectreactor.tools:blockhound") optional(project(":spring-aop")) optional(project(":spring-context")) optional(project(":spring-oxm")) @@ -75,6 +76,7 @@ dependencies { testCompile("org.skyscreamer:jsonassert") testCompile("org.xmlunit:xmlunit-assertj") testCompile("org.xmlunit:xmlunit-matchers") + testCompile("io.projectreactor.tools:blockhound") testRuntime("com.sun.mail:javax.mail") testRuntime("com.sun.xml.bind:jaxb-core") testRuntime("com.sun.xml.bind:jaxb-impl") diff --git a/spring-web/src/main/java/org/springframework/web/server/adapter/WebHttpHandlerBuilder.java b/spring-web/src/main/java/org/springframework/web/server/adapter/WebHttpHandlerBuilder.java index d8ac37c973..a73e682a9f 100644 --- a/spring-web/src/main/java/org/springframework/web/server/adapter/WebHttpHandlerBuilder.java +++ b/spring-web/src/main/java/org/springframework/web/server/adapter/WebHttpHandlerBuilder.java @@ -23,6 +23,9 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; +import reactor.blockhound.BlockHound; +import reactor.blockhound.integration.BlockHoundIntegration; + import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.context.ApplicationContext; import org.springframework.core.annotation.AnnotationAwareOrderComparator; @@ -418,4 +421,20 @@ public final class WebHttpHandlerBuilder { return new WebHttpHandlerBuilder(this); } + + /** + * {@code BlockHoundIntegration} for spring-web classes. + * @since 5.3.6 + */ + public static class SpringWebBlockHoundIntegration implements BlockHoundIntegration { + + @Override + public void applyTo(BlockHound.Builder builder) { + + // Avoid hard references potentially anywhere in spring-web (no need for structural dependency) + + builder.allowBlockingCallsInside("org.springframework.web.util.HtmlUtils", ""); + } + } + } diff --git a/spring-web/src/main/resources/META-INF/services/reactor.blockhound.integration.BlockHoundIntegration b/spring-web/src/main/resources/META-INF/services/reactor.blockhound.integration.BlockHoundIntegration new file mode 100644 index 0000000000..0676bf5e94 --- /dev/null +++ b/spring-web/src/main/resources/META-INF/services/reactor.blockhound.integration.BlockHoundIntegration @@ -0,0 +1,15 @@ +# Copyright 2002-2021 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. + +org.springframework.web.server.adapter.WebHttpHandlerBuilder$SpringWebBlockHoundIntegration \ No newline at end of file