Skip to content

Commit

Permalink
Closes Response.body() in Logger after rebuffering to avoid resources…
Browse files Browse the repository at this point in the history
… leak (#2530)

* Closes Response.body() in Logger after rebuffering to avoid resources leak

Fixes #2529

* Add test

* Update core/src/test/java/feign/LoggerMethodsTest.java

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Update core/src/test/java/feign/LoggerMethodsTest.java

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Make code style changes

---------

Co-authored-by: Dmitrii Nazukin <[email protected]>
Co-authored-by: Marvin <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
  • Loading branch information
4 people authored Sep 2, 2024
1 parent bdd654e commit 3ccdbd3
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 1 deletion.
4 changes: 3 additions & 1 deletion core/src/main/java/feign/Logger.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2012-2023 The Feign Authors
* Copyright 2012-2024 The Feign 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
Expand All @@ -15,6 +15,7 @@

import static feign.Util.UTF_8;
import static feign.Util.decodeOrDefault;
import static feign.Util.ensureClosed;
import static feign.Util.valuesOrEmpty;
import static java.util.Objects.nonNull;
import java.io.IOException;
Expand Down Expand Up @@ -126,6 +127,7 @@ protected Response logAndRebufferResponse(String configKey,
log(configKey, ""); // CRLF
}
byte[] bodyData = Util.toByteArray(response.body().asInputStream());
ensureClosed(response.body());
bodyLength = bodyData.length;
if (logLevel.ordinal() >= Level.FULL.ordinal() && bodyLength > 0) {
log(configKey, "%s", decodeOrDefault(bodyData, UTF_8, "Binary data"));
Expand Down
52 changes: 52 additions & 0 deletions core/src/test/java/feign/LoggerMethodsTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*
* Copyright 2012-2024 The Feign 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
*
* http://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 feign;

import feign.Logger.Level;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.util.Collections;
import static feign.Util.UTF_8;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;

public class LoggerMethodsTest {

Logger logger = new Logger() {
@Override
protected void log(String configKey, String format, Object... args) {}
};

@Test
void responseIsClosedAfterRebuffer() throws IOException {
Request request =
Request.create(Request.HttpMethod.GET, "/api", Collections.emptyMap(), null, UTF_8, null);
Response response = Response.builder()
.status(200)
.reason("OK")
.request(request)
.headers(Collections.emptyMap())
.body("some text", UTF_8)
.build();
Response.Body spyBody = spy(response.body());
response = response.toBuilder().body(spyBody).build();

Response rebufferedResponse =
logger.logAndRebufferResponse("someMethod()", Level.FULL, response, 100);

verify(spyBody).close();
assertThat(rebufferedResponse.body()).isNotSameAs(spyBody);
}
}

0 comments on commit 3ccdbd3

Please sign in to comment.