From 54c37ffd6fd19cf8b798ed56a5ca79006d2d9cd5 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Tue, 18 Jun 2024 12:33:56 +0200 Subject: [PATCH] Check response code in SimpleClientHttpResponse::getBody The error stream can be null with an empty body, so check the response code instead. Closes gh-33020 --- .../http/client/SimpleClientHttpResponse.java | 13 ++++++++++--- .../http/client/SimpleClientHttpResponseTests.java | 8 +++++--- 2 files changed, 15 insertions(+), 6 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 04be39a040..728871cddd 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-2023 the original author or authors. + * Copyright 2002-2024 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. @@ -85,8 +85,15 @@ final class SimpleClientHttpResponse implements ClientHttpResponse { @Override public InputStream getBody() throws IOException { - InputStream errorStream = this.connection.getErrorStream(); - this.responseStream = (errorStream != null ? errorStream : this.connection.getInputStream()); + if (this.responseStream == null) { + if (this.connection.getResponseCode() >= 400) { + InputStream errorStream = this.connection.getErrorStream(); + this.responseStream = (errorStream != null) ? errorStream : InputStream.nullInputStream(); + } + else { + this.responseStream = this.connection.getInputStream(); + } + } return this.responseStream; } 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 1dd50d93cd..3737091774 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 @@ -49,7 +49,7 @@ class SimpleClientHttpResponseTests { @Test // SPR-14040 public void shouldNotCloseConnectionWhenResponseClosed() throws Exception { TestByteArrayInputStream is = new TestByteArrayInputStream("Spring".getBytes(StandardCharsets.UTF_8)); - given(this.connection.getErrorStream()).willReturn(null); + given(this.connection.getResponseCode()).willReturn(200); given(this.connection.getInputStream()).willReturn(is); InputStream responseStream = this.response.getBody(); @@ -64,7 +64,7 @@ class SimpleClientHttpResponseTests { public void shouldDrainStreamWhenResponseClosed() throws Exception { byte[] buf = new byte[6]; TestByteArrayInputStream is = new TestByteArrayInputStream("SpringSpring".getBytes(StandardCharsets.UTF_8)); - given(this.connection.getErrorStream()).willReturn(null); + given(this.connection.getResponseCode()).willReturn(200); given(this.connection.getInputStream()).willReturn(is); InputStream responseStream = this.response.getBody(); @@ -82,6 +82,7 @@ class SimpleClientHttpResponseTests { public void shouldDrainErrorStreamWhenResponseClosed() throws Exception { byte[] buf = new byte[6]; TestByteArrayInputStream is = new TestByteArrayInputStream("SpringSpring".getBytes(StandardCharsets.UTF_8)); + given(this.connection.getResponseCode()).willReturn(404); given(this.connection.getErrorStream()).willReturn(is); InputStream responseStream = this.response.getBody(); @@ -98,6 +99,7 @@ class SimpleClientHttpResponseTests { @Test // SPR-16773 public void shouldNotDrainWhenErrorStreamClosed() throws Exception { InputStream is = mock(); + given(this.connection.getResponseCode()).willReturn(404); given(this.connection.getErrorStream()).willReturn(is); willDoNothing().given(is).close(); given(is.transferTo(any())).willCallRealMethod(); @@ -115,7 +117,7 @@ class SimpleClientHttpResponseTests { @Test // SPR-17181 public void shouldDrainResponseEvenIfResponseNotRead() throws Exception { TestByteArrayInputStream is = new TestByteArrayInputStream("SpringSpring".getBytes(StandardCharsets.UTF_8)); - given(this.connection.getErrorStream()).willReturn(null); + given(this.connection.getResponseCode()).willReturn(200); given(this.connection.getInputStream()).willReturn(is); this.response.close();