Repository: jclouds Updated Branches: refs/heads/master feae011c4 -> 35c5d7ffc
JCLOUDS-766: Include Content-MD5 in v4 signature Addresses AWSS3BlobIntegrationLiveTest.deleteMultipleObjects test failures. Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/35c5d7ff Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/35c5d7ff Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/35c5d7ff Branch: refs/heads/master Commit: 35c5d7ffc07d08a19584c86135e7418b66d82b0a Parents: feae011 Author: Andrew Gaul <[email protected]> Authored: Fri Mar 18 16:19:12 2016 -0700 Committer: Andrew Gaul <[email protected]> Committed: Fri Mar 18 16:58:03 2016 -0700 ---------------------------------------------------------------------- .../s3/filters/Aws4SignerForAuthorizationHeader.java | 15 ++++++++++++++- .../s3/filters/Aws4SignerForChunkedUpload.java | 13 ++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/35c5d7ff/apis/s3/src/main/java/org/jclouds/s3/filters/Aws4SignerForAuthorizationHeader.java ---------------------------------------------------------------------- diff --git a/apis/s3/src/main/java/org/jclouds/s3/filters/Aws4SignerForAuthorizationHeader.java b/apis/s3/src/main/java/org/jclouds/s3/filters/Aws4SignerForAuthorizationHeader.java index 31525e7..96526b9 100644 --- a/apis/s3/src/main/java/org/jclouds/s3/filters/Aws4SignerForAuthorizationHeader.java +++ b/apis/s3/src/main/java/org/jclouds/s3/filters/Aws4SignerForAuthorizationHeader.java @@ -21,6 +21,8 @@ import com.google.common.base.Strings; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSortedMap; +import com.google.common.hash.HashCode; +import com.google.common.io.BaseEncoding; import com.google.common.net.HttpHeaders; import com.google.inject.Inject; import org.jclouds.aws.domain.SessionCredentials; @@ -69,6 +71,8 @@ public class Aws4SignerForAuthorizationHeader extends Aws4SignerBase { checkNotNull(request, "request is not ready to sign"); checkNotNull(request.getEndpoint(), "request is not ready to sign, request.endpoint not present."); + Payload payload = request.getPayload(); + // get host from request endpoint. String host = request.getEndpoint().getHost(); @@ -82,7 +86,6 @@ public class Aws4SignerForAuthorizationHeader extends Aws4SignerBase { HttpRequest.Builder<?> requestBuilder = request.toBuilder() // .removeHeader(AUTHORIZATION) // remove Authorization - .removeHeader(CONTENT_MD5) // aws s3 not allowed Content-MD5, use specs x-amz-content-sha256 .removeHeader(DATE); // remove date ImmutableMap.Builder<String, String> signedHeadersBuilder = ImmutableSortedMap.<String, String>naturalOrder(); @@ -102,6 +105,16 @@ public class Aws4SignerForAuthorizationHeader extends Aws4SignerBase { signedHeadersBuilder.put(HttpHeaders.CONTENT_LENGTH.toLowerCase(), contentLength); } + // Content MD5 + if (payload != null) { + HashCode md5 = payload.getContentMetadata().getContentMD5AsHashCode(); + if (md5 != null) { + String contentMD5 = BaseEncoding.base64().encode(md5.asBytes()); + requestBuilder.replaceHeader(CONTENT_MD5, contentMD5); + signedHeadersBuilder.put(CONTENT_MD5.toLowerCase(), contentMD5); + } + } + // host requestBuilder.replaceHeader(HttpHeaders.HOST, host); signedHeadersBuilder.put(HttpHeaders.HOST.toLowerCase(), host); http://git-wip-us.apache.org/repos/asf/jclouds/blob/35c5d7ff/apis/s3/src/main/java/org/jclouds/s3/filters/Aws4SignerForChunkedUpload.java ---------------------------------------------------------------------- diff --git a/apis/s3/src/main/java/org/jclouds/s3/filters/Aws4SignerForChunkedUpload.java b/apis/s3/src/main/java/org/jclouds/s3/filters/Aws4SignerForChunkedUpload.java index e4dd6eb..4b6798d 100644 --- a/apis/s3/src/main/java/org/jclouds/s3/filters/Aws4SignerForChunkedUpload.java +++ b/apis/s3/src/main/java/org/jclouds/s3/filters/Aws4SignerForChunkedUpload.java @@ -59,6 +59,8 @@ import com.google.common.base.Strings; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSortedMap; +import com.google.common.hash.HashCode; +import com.google.common.io.BaseEncoding; import com.google.common.io.ByteProcessor; import com.google.common.net.HttpHeaders; import com.google.inject.Inject; @@ -104,7 +106,6 @@ public class Aws4SignerForChunkedUpload extends Aws4SignerBase { HttpRequest.Builder<?> requestBuilder = request.toBuilder() // .removeHeader(AUTHORIZATION) // remove Authorization - .removeHeader(CONTENT_MD5) // aws s3 not allowed Content-MD5, use aws specs x-amz-content-sha256 .removeHeader(DATE) // remove Date .removeHeader(CONTENT_LENGTH); // remove Content-Length @@ -125,6 +126,16 @@ public class Aws4SignerForChunkedUpload extends Aws4SignerBase { requestBuilder.replaceHeader(CONTENT_LENGTH, Long.toString(totalLength)); signedHeadersBuilder.put(CONTENT_LENGTH.toLowerCase(), Long.toString(totalLength)); + // Content MD5 + if (payload != null) { + HashCode md5 = payload.getContentMetadata().getContentMD5AsHashCode(); + if (md5 != null) { + String contentMD5 = BaseEncoding.base64().encode(md5.asBytes()); + requestBuilder.replaceHeader(CONTENT_MD5, contentMD5); + signedHeadersBuilder.put(CONTENT_MD5.toLowerCase(), contentMD5); + } + } + // Content Type // content-type is not a required signing param. However, examples use this, so we include it to ease testing. String contentType = getContentType(request);
