Repository: jclouds Updated Branches: refs/heads/master 7cbc16d99 -> e331a000d
JCLOUDS-1322: Remove Expect header for requests with empty body Signed-off-by: Chaithanya Ganta <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/e331a000 Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/e331a000 Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/e331a000 Branch: refs/heads/master Commit: e331a000d17d36043165cf79c505a7c0a7370f05 Parents: 7cbc16d Author: Chaithanya Ganta <[email protected]> Authored: Mon Jul 17 14:50:16 2017 +0530 Committer: Andrew Gaul <[email protected]> Committed: Mon Aug 21 21:05:02 2017 -0700 ---------------------------------------------------------------------- .../test/java/org/jclouds/s3/S3ClientMockTest.java | 3 ++- .../rest/internal/RestAnnotationProcessor.java | 15 +++++++++++++++ .../rest/internal/RestAnnotationProcessorTest.java | 12 ++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/e331a000/apis/s3/src/test/java/org/jclouds/s3/S3ClientMockTest.java ---------------------------------------------------------------------- diff --git a/apis/s3/src/test/java/org/jclouds/s3/S3ClientMockTest.java b/apis/s3/src/test/java/org/jclouds/s3/S3ClientMockTest.java index c91b316..cf31df3 100644 --- a/apis/s3/src/test/java/org/jclouds/s3/S3ClientMockTest.java +++ b/apis/s3/src/test/java/org/jclouds/s3/S3ClientMockTest.java @@ -20,6 +20,7 @@ import static com.google.common.net.HttpHeaders.CONTENT_LENGTH; import static com.google.common.net.HttpHeaders.ETAG; import static com.google.common.net.HttpHeaders.EXPECT; import static com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor; +import static org.assertj.core.api.Assertions.assertThat; import static org.jclouds.Constants.PROPERTY_MAX_RETRIES; import static org.testng.Assert.assertEquals; @@ -73,7 +74,7 @@ public class S3ClientMockTest { RecordedRequest request = server.takeRequest(); assertEquals(request.getRequestLine(), "PUT /bucket/object HTTP/1.1"); assertEquals(request.getHeaders(CONTENT_LENGTH), ImmutableList.of("0")); - assertEquals(request.getHeaders(EXPECT), ImmutableList.of("100-continue")); + assertThat(request.getHeaders(EXPECT)).isEmpty(); server.shutdown(); } http://git-wip-us.apache.org/repos/asf/jclouds/blob/e331a000/core/src/main/java/org/jclouds/rest/internal/RestAnnotationProcessor.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/rest/internal/RestAnnotationProcessor.java b/core/src/main/java/org/jclouds/rest/internal/RestAnnotationProcessor.java index 010f3b6..0ee891a 100644 --- a/core/src/main/java/org/jclouds/rest/internal/RestAnnotationProcessor.java +++ b/core/src/main/java/org/jclouds/rest/internal/RestAnnotationProcessor.java @@ -357,6 +357,9 @@ public class RestAnnotationProcessor implements Function<Invocation, HttpRequest if (request.getPayload() != null) { contentMetadataCodec.fromHeaders(request.getPayload().getContentMetadata(), headers); } + + request = stripExpectHeaderIfContentZero(request); + utils.checkRequestHasRequiredProperties(request); return request; } @@ -779,6 +782,18 @@ public class RestAnnotationProcessor implements Function<Invocation, HttpRequest return parts.build(); } + private static GeneratedHttpRequest stripExpectHeaderIfContentZero(GeneratedHttpRequest request) { + boolean isBodyEmpty = true; + if (request.getPayload() != null) { + Long length = request.getPayload().getContentMetadata().getContentLength(); + isBodyEmpty = length != null && length == 0; + } + if (isBodyEmpty) { + request = request.toBuilder().removeHeader("Expect").build(); + } + return request; + } + private boolean isEncodedUsed(Invocation invocation) { return !parametersWithAnnotation(invocation.getInvokable(), Encoded.class).isEmpty(); } http://git-wip-us.apache.org/repos/asf/jclouds/blob/e331a000/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java b/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java index 8e942d8..73355ad 100644 --- a/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java +++ b/core/src/test/java/org/jclouds/rest/internal/RestAnnotationProcessorTest.java @@ -21,6 +21,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import static javax.ws.rs.core.MediaType.APPLICATION_JSON; import static javax.ws.rs.core.MediaType.APPLICATION_XML; import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown; +import static org.assertj.core.api.Assertions.assertThat; import static org.jclouds.io.Payloads.newInputStreamPayload; import static org.jclouds.io.Payloads.newStringPayload; import static org.jclouds.providers.AnonymousProviderMetadata.forApiOnEndpoint; @@ -1559,6 +1560,17 @@ public class RestAnnotationProcessorTest extends BaseRestApiTest { assertEquals(request.getFilters().get(1).getClass(), ConnectionCloseHeader.class); } + @Test + public void testZeroContentStripExpectHeader() { + Invokable<?, ?> method = method(TestRequestFilter.class, "post"); + Invocation invocation = Invocation.create(method, + ImmutableList.<Object>of(HttpRequest.builder().method("POST").endpoint("http://localhost") + .payload(new byte[0]).addHeader(HttpHeaders.EXPECT, "100-Continue") + .build())); + GeneratedHttpRequest request = processor.apply(invocation); + assertThat(request.getFirstHeaderOrNull(HttpHeaders.EXPECT)).isNull(); + } + public static class TestEncoding { @GET @Path("/{path1}/{path2}")
