diff --git a/spring-web/src/main/java/org/springframework/web/util/DisconnectedClientHelper.java b/spring-web/src/main/java/org/springframework/web/util/DisconnectedClientHelper.java index e4658f914c68..1506f9bbd291 100644 --- a/spring-web/src/main/java/org/springframework/web/util/DisconnectedClientHelper.java +++ b/spring-web/src/main/java/org/springframework/web/util/DisconnectedClientHelper.java @@ -42,7 +42,8 @@ public class DisconnectedClientHelper { private static final Set EXCEPTION_PHRASES = - Set.of("broken pipe", "connection reset by peer"); + Set.of("broken pipe", "connection reset by peer", + "response may not be written"); private static final Set EXCEPTION_TYPE_NAMES = Set.of("AbortedException", "ClientAbortException", diff --git a/spring-web/src/test/java/org/springframework/web/util/DisconnectedClientHelperTests.java b/spring-web/src/test/java/org/springframework/web/util/DisconnectedClientHelperTests.java index c0ff6ecc39dd..48aa1923e25f 100644 --- a/spring-web/src/test/java/org/springframework/web/util/DisconnectedClientHelperTests.java +++ b/spring-web/src/test/java/org/springframework/web/util/DisconnectedClientHelperTests.java @@ -34,6 +34,7 @@ import org.springframework.web.client.ResourceAccessException; import org.springframework.web.context.request.async.AsyncRequestNotUsableException; import org.springframework.web.testfixture.http.MockHttpInputMessage; +import org.springframework.http.converter.HttpMessageNotWritableException; import static org.assertj.core.api.Assertions.assertThat; @@ -99,4 +100,11 @@ void nullException() { assertThat(DisconnectedClientHelper.isClientDisconnectedException(null)).isFalse(); } + @Test // gh-36421 + void httpMessageNotWritableFromClosedConnection() { + IOException cause = new IOException("The response may not be written to once it has been closed"); + Exception ex = new HttpMessageNotWritableException("Could not write JSON", cause); + assertThat(DisconnectedClientHelper.isClientDisconnectedException(ex)).isTrue(); + } + }