From 5330699fe771deccaa115975e52e1795d1a32d0d Mon Sep 17 00:00:00 2001 From: Andrew Gaul Date: Fri, 5 Sep 2014 16:16:07 -0700 Subject: [PATCH] Improve XML compatibility with trace-level logging Some providers, notably Azure, include a byte-order mark in their XML responses. ParseSax.apply buffers these responses in a String when users enable trace-level logging to include the response in any thrown exceptions. InputSource(InputStream) skips these byte-order marks while InputSource(Reader) does not, yielding a SAXParseException. --- .../src/main/java/org/jclouds/http/functions/ParseSax.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/jclouds/http/functions/ParseSax.java b/core/src/main/java/org/jclouds/http/functions/ParseSax.java index 31fb7d6c1a..36503444c9 100644 --- a/core/src/main/java/org/jclouds/http/functions/ParseSax.java +++ b/core/src/main/java/org/jclouds/http/functions/ParseSax.java @@ -21,6 +21,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import static org.jclouds.http.HttpUtils.closeClientButKeepContentStream; import static org.jclouds.util.Closeables2.closeQuietly; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.StringReader; @@ -91,9 +92,11 @@ public class ParseSax implements Function, InvocationContext private T convertStreamToStringAndParse(HttpResponse response) { String from = null; try { - from = new String(closeClientButKeepContentStream(response)); + byte[] fromBytes = closeClientButKeepContentStream(response); + from = new String(fromBytes); validateXml(from); - return doParse(new InputSource(new StringReader(from))); + // Use InputStream to skip over byte order mark. + return doParse(new InputSource(new ByteArrayInputStream(fromBytes))); } catch (Exception e) { return addDetailsAndPropagate(response, e, from); }