From 2010582057f991ea0d5d5703304ad07397f9c3b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Ar=C3=A8s?= Date: Mon, 15 Jul 2019 15:58:10 -0400 Subject: [PATCH] ResponseStatusExceptionFilter: Fix unwrap of JSON message Reading the entity stream a second time without resetting it was causing the ObjectMapper to return null then a NullPointerExceptions when calling get('message') method on it. Fix the issue by creating the ObjectMapper from the String representation of the entity stream instead of resetting the stream to read it a second time. Also check to make sure the returned JsonNode is not null and that the content is text. Closes #1222 --- .../filter/ResponseStatusExceptionFilter.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/github/dockerjava/jaxrs/filter/ResponseStatusExceptionFilter.java b/src/main/java/com/github/dockerjava/jaxrs/filter/ResponseStatusExceptionFilter.java index 6c2476291..bac31fc81 100644 --- a/src/main/java/com/github/dockerjava/jaxrs/filter/ResponseStatusExceptionFilter.java +++ b/src/main/java/com/github/dockerjava/jaxrs/filter/ResponseStatusExceptionFilter.java @@ -10,6 +10,8 @@ import javax.ws.rs.core.MediaType; import org.apache.commons.io.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -31,6 +33,8 @@ */ public class ResponseStatusExceptionFilter implements ClientResponseFilter { + private static final Logger LOG = LoggerFactory.getLogger(ResponseStatusExceptionFilter.class); + @Override public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException { int status = responseContext.getStatus(); @@ -79,13 +83,19 @@ private String getBodyAsMessage(ClientResponseContext responseContext) { String message = IOUtils.toString(entityStream, charset); if (MediaType.APPLICATION_JSON_TYPE.equals(mediaType)) { - ObjectMapper mapper = new ObjectMapper(); - JsonNode node = mapper.readTree(entityStream).get("message"); - if (node != null) { - message = node.textValue(); + try { + JsonNode node = new ObjectMapper().readTree(message); + if (node != null) { + JsonNode messageNode = node.get("message"); + if (messageNode != null && messageNode.isTextual()) { + message = messageNode.textValue(); + } + } + } catch (IOException e) { + // ignore parsing errors and return the message as is + LOG.debug("Failed to unwrap error message: {}", e.getMessage(), e); } } - return message; } catch (Exception ignored) { } }