Repository: jclouds Updated Branches: refs/heads/master 3c050e0e9 -> 7869d92b2
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. Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/e1a5c521 Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/e1a5c521 Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/e1a5c521 Branch: refs/heads/master Commit: e1a5c521c58a611272a18e488e870215469d82a6 Parents: 3c050e0 Author: Andrew Gaul <[email protected]> Authored: Fri Sep 5 16:16:07 2014 -0700 Committer: Andrew Gaul <[email protected]> Committed: Fri Sep 5 17:53:50 2014 -0700 ---------------------------------------------------------------------- core/src/main/java/org/jclouds/http/functions/ParseSax.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/e1a5c521/core/src/main/java/org/jclouds/http/functions/ParseSax.java ---------------------------------------------------------------------- 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 31fb7d6..3650344 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<T> implements Function<HttpResponse, T>, 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); }
