From f949d8515a7ab586150e84a7c5d8397992dfda9c Mon Sep 17 00:00:00 2001 From: Sidd Date: Thu, 21 Apr 2022 00:15:01 -0700 Subject: [PATCH] fix: ensure error response body stream is closed --- .../util/TwitchExtensionsErrorDecoder.java | 10 ++++++---- .../twitch4j/helix/TwitchHelixErrorDecoder.java | 5 +++-- .../kraken/TwitchKrakenErrorDecoder.java | 16 +++++++++------- .../TwitchMessagingInterfaceErrorDecoder.java | 10 ++++++---- 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/rest-extensions/src/main/java/com/github/twitch4j/extensions/util/TwitchExtensionsErrorDecoder.java b/rest-extensions/src/main/java/com/github/twitch4j/extensions/util/TwitchExtensionsErrorDecoder.java index e6abb64c2..c8734d198 100644 --- a/rest-extensions/src/main/java/com/github/twitch4j/extensions/util/TwitchExtensionsErrorDecoder.java +++ b/rest-extensions/src/main/java/com/github/twitch4j/extensions/util/TwitchExtensionsErrorDecoder.java @@ -14,6 +14,7 @@ import org.apache.commons.lang3.exception.ContextedRuntimeException; import java.io.IOException; +import java.io.InputStream; import java.nio.charset.StandardCharsets; @RequiredArgsConstructor @@ -39,8 +40,8 @@ public class TwitchExtensionsErrorDecoder implements ErrorDecoder { public Exception decode(String methodKey, Response response) { Exception ex; - try { - String responseBody = response.body() == null ? "" : IOUtils.toString(response.body().asInputStream(), StandardCharsets.UTF_8.name()); + try (InputStream is = response.body() == null ? null : response.body().asInputStream()) { + String responseBody = is == null ? "" : IOUtils.toString(is, StandardCharsets.UTF_8); if (response.status() == 401) { ex = new UnauthorizedException() @@ -53,7 +54,7 @@ public Exception decode(String methodKey, Response response) { .addContextValue("requestMethod", response.request().httpMethod()) .addContextValue("responseBody", responseBody); } else if (response.status() == 429) { - ex = new ContextedRuntimeException("To many requests!") + ex = new ContextedRuntimeException("Too many requests!") .addContextValue("requestUrl", response.request().url()) .addContextValue("requestMethod", response.request().httpMethod()) .addContextValue("responseBody", responseBody); @@ -70,7 +71,8 @@ public Exception decode(String methodKey, Response response) { .addContextValue("responseBody", responseBody) .addContextValue("errorType", error.getError()) .addContextValue("errorStatus", error.getStatus()) - .addContextValue("errorType", error.getMessage()); + .addContextValue("errorType", error.getMessage()) + .addContextValue("errorMessage", error.getMessage()); } } catch (IOException fallbackToDefault) { ex = defaultDecoder.decode(methodKey, response); diff --git a/rest-helix/src/main/java/com/github/twitch4j/helix/TwitchHelixErrorDecoder.java b/rest-helix/src/main/java/com/github/twitch4j/helix/TwitchHelixErrorDecoder.java index a87df111a..dac1068d4 100644 --- a/rest-helix/src/main/java/com/github/twitch4j/helix/TwitchHelixErrorDecoder.java +++ b/rest-helix/src/main/java/com/github/twitch4j/helix/TwitchHelixErrorDecoder.java @@ -17,6 +17,7 @@ import org.apache.commons.lang3.exception.ContextedRuntimeException; import java.io.IOException; +import java.io.InputStream; import java.nio.charset.StandardCharsets; @Slf4j @@ -56,8 +57,8 @@ public TwitchHelixErrorDecoder(Decoder decoder, TwitchHelixRateLimitTracker rate public Exception decode(String methodKey, Response response) { Exception ex; - try { - String responseBody = response.body() == null ? "" : IOUtils.toString(response.body().asInputStream(), StandardCharsets.UTF_8.name()); + try (InputStream is = response.body() == null ? null : response.body().asInputStream()) { + String responseBody = is == null ? "" : IOUtils.toString(is, StandardCharsets.UTF_8); if (response.status() == 401) { ex = new UnauthorizedException() diff --git a/rest-kraken/src/main/java/com/github/twitch4j/kraken/TwitchKrakenErrorDecoder.java b/rest-kraken/src/main/java/com/github/twitch4j/kraken/TwitchKrakenErrorDecoder.java index 73c2b1b31..7eb6a3c48 100644 --- a/rest-kraken/src/main/java/com/github/twitch4j/kraken/TwitchKrakenErrorDecoder.java +++ b/rest-kraken/src/main/java/com/github/twitch4j/kraken/TwitchKrakenErrorDecoder.java @@ -15,6 +15,7 @@ import org.apache.commons.lang3.exception.ContextedRuntimeException; import java.io.IOException; +import java.io.InputStream; import java.nio.charset.StandardCharsets; @Slf4j @@ -42,15 +43,15 @@ public TwitchKrakenErrorDecoder(Decoder decoder) { * Overwrite the Decode Method to handle custom error cases * * @param methodKey Method Key - * @param response Response + * @param response Response * @return Exception */ @Override public Exception decode(String methodKey, Response response) { - Exception ex = null; + Exception ex; - try { - String responseBody = response.body() == null ? "" : IOUtils.toString(response.body().asInputStream(), StandardCharsets.UTF_8.name()); + try (InputStream is = response.body() == null ? null : response.body().asInputStream()) { + String responseBody = is == null ? "" : IOUtils.toString(is, StandardCharsets.UTF_8); if (response.status() == 401) { ex = new UnauthorizedException() @@ -63,10 +64,10 @@ public Exception decode(String methodKey, Response response) { .addContextValue("requestMethod", response.request().httpMethod()) .addContextValue("responseBody", responseBody); } else if (response.status() == 429) { - ex = new ContextedRuntimeException("To many requests!") + ex = new ContextedRuntimeException("Too many requests!") .addContextValue("requestUrl", response.request().url()) .addContextValue("requestMethod", response.request().httpMethod()) - .addContextValue("responseBody", responseBody);; + .addContextValue("responseBody", responseBody); } else if (response.status() == 503) { // If you get an HTTP 503 (Service Unavailable) error, retry once. // If that retry also results in an HTTP 503, there probably is something wrong with the downstream service. @@ -80,7 +81,8 @@ public Exception decode(String methodKey, Response response) { .addContextValue("responseBody", responseBody) .addContextValue("errorType", error.getError()) .addContextValue("errorStatus", error.getStatus()) - .addContextValue("errorType", error.getMessage()); + .addContextValue("errorType", error.getMessage()) + .addContextValue("errorMessage", error.getMessage()); } } catch (IOException fallbackToDefault) { ex = defaultDecoder.decode(methodKey, response); diff --git a/rest-tmi/src/main/java/com/github/twitch4j/tmi/TwitchMessagingInterfaceErrorDecoder.java b/rest-tmi/src/main/java/com/github/twitch4j/tmi/TwitchMessagingInterfaceErrorDecoder.java index 94bd8ea6b..bfb7c0fd4 100644 --- a/rest-tmi/src/main/java/com/github/twitch4j/tmi/TwitchMessagingInterfaceErrorDecoder.java +++ b/rest-tmi/src/main/java/com/github/twitch4j/tmi/TwitchMessagingInterfaceErrorDecoder.java @@ -14,6 +14,7 @@ import org.apache.commons.lang3.exception.ContextedRuntimeException; import java.io.IOException; +import java.io.InputStream; import java.nio.charset.StandardCharsets; public class TwitchMessagingInterfaceErrorDecoder implements ErrorDecoder { @@ -40,13 +41,13 @@ public TwitchMessagingInterfaceErrorDecoder(Decoder decoder) { * Overwrite the Decode Method to handle custom error cases * * @param methodKey Method Key - * @param response Response + * @param response Response * @return Exception */ @Override public Exception decode(String methodKey, Response response) { - try { - String responseBody = IOUtils.toString(response.body().asInputStream(), StandardCharsets.UTF_8.name()); + try (InputStream is = response.body() == null ? null : response.body().asInputStream()) { + String responseBody = is == null ? "" : IOUtils.toString(is, StandardCharsets.UTF_8); if (response.status() == 401) { throw new UnauthorizedException() @@ -72,7 +73,8 @@ public Exception decode(String methodKey, Response response) { .addContextValue("responseBody", responseBody) .addContextValue("errorType", error.getError()) .addContextValue("errorStatus", error.getStatus()) - .addContextValue("errorType", error.getMessage()); + .addContextValue("errorType", error.getMessage()) + .addContextValue("errorMessage", error.getMessage()); } catch (IOException fallbackToDefault) { return defaultDecoder.decode(methodKey, response); }