From 21fad8e205572caf05b93d593bc9924999895108 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 1 May 2018 23:51:05 +0200 Subject: [PATCH] SimpleClientHttpResponse catches any Exception on close Issue: SPR-16773 --- .../http/client/SimpleClientHttpResponse.java | 4 +-- .../client/SimpleClientHttpResponseTests.java | 32 ++++++++++++------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/client/SimpleClientHttpResponse.java b/spring-web/src/main/java/org/springframework/http/client/SimpleClientHttpResponse.java index caa7a38f10..70f169c2a5 100644 --- a/spring-web/src/main/java/org/springframework/http/client/SimpleClientHttpResponse.java +++ b/spring-web/src/main/java/org/springframework/http/client/SimpleClientHttpResponse.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 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. @@ -96,7 +96,7 @@ final class SimpleClientHttpResponse extends AbstractClientHttpResponse { StreamUtils.drain(this.responseStream); this.responseStream.close(); } - catch (IOException ex) { + catch (Exception ex) { // ignore } } diff --git a/spring-web/src/test/java/org/springframework/http/client/SimpleClientHttpResponseTests.java b/spring-web/src/test/java/org/springframework/http/client/SimpleClientHttpResponseTests.java index 93d84a2044..9025b3d9ea 100644 --- a/spring-web/src/test/java/org/springframework/http/client/SimpleClientHttpResponseTests.java +++ b/spring-web/src/test/java/org/springframework/http/client/SimpleClientHttpResponseTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 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. @@ -22,7 +22,6 @@ import java.io.InputStream; import java.net.HttpURLConnection; import java.nio.charset.StandardCharsets; -import org.junit.Before; import org.junit.Test; import org.springframework.util.StreamUtils; @@ -30,23 +29,18 @@ import org.springframework.util.StreamUtils; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; +import static org.mockito.BDDMockito.any; import static org.mockito.BDDMockito.*; /** * @author Brian Clozel + * @author Juergen Hoeller */ public class SimpleClientHttpResponseTests { - private SimpleClientHttpResponse response; + private final HttpURLConnection connection = mock(HttpURLConnection.class); - private HttpURLConnection connection; - - - @Before - public void setup() throws Exception { - this.connection = mock(HttpURLConnection.class); - this.response = new SimpleClientHttpResponse(this.connection); - } + private final SimpleClientHttpResponse response = new SimpleClientHttpResponse(this.connection); @Test // SPR-14040 @@ -98,8 +92,22 @@ public class SimpleClientHttpResponseTests { verify(this.connection, never()).disconnect(); } + @Test // SPR-16773 + public void shouldNotDrainWhenErrorStreamClosed() throws Exception { + InputStream is = mock(InputStream.class); + given(this.connection.getErrorStream()).willReturn(is); + doNothing().when(is).close(); + given(is.read(any())).willThrow(new NullPointerException("from HttpURLConnection#ErrorStream")); + + InputStream responseStream = this.response.getBody(); + responseStream.close(); + this.response.close(); + + verify(is).close(); + } + - class TestByteArrayInputStream extends ByteArrayInputStream { + private static class TestByteArrayInputStream extends ByteArrayInputStream { private boolean closed;