You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by na...@apache.org on 2020/09/21 13:46:34 UTC
[jclouds] branch master updated: JCLOUDS-1552: Do not attempt to
parse empty payload (#82)
This is an automated email from the ASF dual-hosted git repository.
nacx pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jclouds.git
The following commit(s) were added to refs/heads/master by this push:
new d65047c JCLOUDS-1552: Do not attempt to parse empty payload (#82)
d65047c is described below
commit d65047c87b46717605742057b59847673339e8fe
Author: Tamas Cservenak <ta...@cservenak.net>
AuthorDate: Mon Sep 21 15:46:25 2020 +0200
JCLOUDS-1552: Do not attempt to parse empty payload (#82)
---
.../main/java/org/jclouds/aws/util/AWSUtils.java | 4 ++-
.../java/org/jclouds/aws/util/AWSUtilsTest.java | 29 ++++++++++++++++++++++
core/src/main/java/org/jclouds/http/HttpUtils.java | 3 ++-
3 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/apis/sts/src/main/java/org/jclouds/aws/util/AWSUtils.java b/apis/sts/src/main/java/org/jclouds/aws/util/AWSUtils.java
index a93f845..235e90f 100644
--- a/apis/sts/src/main/java/org/jclouds/aws/util/AWSUtils.java
+++ b/apis/sts/src/main/java/org/jclouds/aws/util/AWSUtils.java
@@ -19,6 +19,7 @@ package org.jclouds.aws.util;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.jclouds.aws.reference.AWSConstants.PROPERTY_HEADER_TAG;
+import static org.jclouds.http.HttpUtils.closeClientButKeepContentStream;
import java.util.Collection;
import java.util.Map;
@@ -82,7 +83,8 @@ public class AWSUtils {
}
public AWSError parseAWSErrorFromContent(HttpRequest request, HttpResponse response) {
- if (response.getPayload() == null)
+ byte[] actualPayload = response.getPayload() != null ? closeClientButKeepContentStream(response) : null;
+ if (actualPayload == null || actualPayload.length == 0)
return null;
if ("text/plain".equals(response.getPayload().getContentMetadata().getContentType()))
return null;
diff --git a/apis/sts/src/test/java/org/jclouds/aws/util/AWSUtilsTest.java b/apis/sts/src/test/java/org/jclouds/aws/util/AWSUtilsTest.java
index 33014d4..821fa5c 100644
--- a/apis/sts/src/test/java/org/jclouds/aws/util/AWSUtilsTest.java
+++ b/apis/sts/src/test/java/org/jclouds/aws/util/AWSUtilsTest.java
@@ -17,6 +17,7 @@
package org.jclouds.aws.util;
import static javax.ws.rs.core.MediaType.TEXT_PLAIN;
import static javax.ws.rs.core.Response.Status.BAD_REQUEST;
+import static javax.ws.rs.core.Response.Status.NOT_FOUND;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
@@ -26,12 +27,17 @@ import static org.testng.Assert.assertNull;
import java.io.IOException;
import java.io.InputStream;
+import javax.inject.Provider;
+
import org.jclouds.aws.domain.AWSError;
import org.jclouds.aws.filters.FormSignerV2Test;
import org.jclouds.domain.Credentials;
import org.jclouds.http.HttpCommand;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.HttpResponse;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.io.payloads.StringPayload;
+import org.jclouds.rest.RequestSigner;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
@@ -88,6 +94,29 @@ public class AWSUtilsTest {
assertNull(utils.parseAWSErrorFromContent(command.getCurrentRequest(), response));
}
+ /**
+ * Do not attempt to parse empty payload.
+ */
+ @Test
+ public void testNoExceptionEmptyPayload() {
+ RequestSigner requestSigner = createMock(RequestSigner.class);
+ ParseSax.Factory factory = createMock(ParseSax.Factory.class);
+ Provider provider = createMock(Provider.class);
+ // these all will throw UnexpectedInvocationEx if touched
+ replay(requestSigner, factory, provider);
+
+ AWSUtils riggedUtil = new AWSUtils(
+ "ignore",
+ requestSigner,
+ factory,
+ provider
+ );
+
+ HttpResponse response = HttpResponse.builder().statusCode(NOT_FOUND.getStatusCode()).payload(new StringPayload("")).build();
+ response.getPayload().getContentMetadata().setContentType("application/unknown");
+ assertNull(riggedUtil.parseAWSErrorFromContent(command.getCurrentRequest(), response));
+ }
+
@Test
public void testParseAWSErrorFromContentHttpCommandHttpResponseInputStream() {
AWSError error = utils.parseAWSErrorFromContent(command.getCurrentRequest(), response(getClass()
diff --git a/core/src/main/java/org/jclouds/http/HttpUtils.java b/core/src/main/java/org/jclouds/http/HttpUtils.java
index 5b636a9..0d41d7c 100644
--- a/core/src/main/java/org/jclouds/http/HttpUtils.java
+++ b/core/src/main/java/org/jclouds/http/HttpUtils.java
@@ -121,8 +121,9 @@ public class HttpUtils {
public static byte[] toByteArrayOrNull(PayloadEnclosing response) {
if (response.getPayload() != null) {
- InputStream input = response.getPayload().getInput();
+ InputStream input = null;
try {
+ input = response.getPayload().openStream();
return toByteArray(input);
} catch (IOException e) {
propagate(e);