diff --git a/aws-cpp-sdk-core/include/aws/core/client/AWSClient.h b/aws-cpp-sdk-core/include/aws/core/client/AWSClient.h index d7839f2d28f..4cc9e5e9279 100644 --- a/aws-cpp-sdk-core/include/aws/core/client/AWSClient.h +++ b/aws-cpp-sdk-core/include/aws/core/client/AWSClient.h @@ -320,6 +320,7 @@ namespace Aws void InitializeGlobalStatics(); std::shared_ptr ConvertToRequestForPresigning(const Aws::AmazonWebServiceRequest& request, Aws::Http::URI& uri, Aws::Http::HttpMethod method, const Aws::Http::QueryStringParameterCollection& extraParams) const; + std::shared_ptr GetBodyStream(const Aws::AmazonWebServiceRequest& request) const; std::shared_ptr m_httpClient; std::shared_ptr m_signerProvider; diff --git a/aws-cpp-sdk-core/source/client/AWSClient.cpp b/aws-cpp-sdk-core/source/client/AWSClient.cpp index cc60511ba1f..7285246b83b 100644 --- a/aws-cpp-sdk-core/source/client/AWSClient.cpp +++ b/aws-cpp-sdk-core/source/client/AWSClient.cpp @@ -669,7 +669,7 @@ void AWSClient::AddChecksumToRequest(const std::shared_ptrSetHeaderValue("x-amz-checksum-crc32", HashingUtils::Base64Encode(HashingUtils::CalculateCRC32(*(request.GetBody())))); + httpRequest->SetHeaderValue("x-amz-checksum-crc32", HashingUtils::Base64Encode(HashingUtils::CalculateCRC32(*(GetBodyStream(request))))); } } else if (checksumAlgorithmName == "crc32c") @@ -680,7 +680,7 @@ void AWSClient::AddChecksumToRequest(const std::shared_ptrSetHeaderValue("x-amz-checksum-crc32c", HashingUtils::Base64Encode(HashingUtils::CalculateCRC32C(*(request.GetBody())))); + httpRequest->SetHeaderValue("x-amz-checksum-crc32c", HashingUtils::Base64Encode(HashingUtils::CalculateCRC32C(*(GetBodyStream(request))))); } } else if (checksumAlgorithmName == "sha256") @@ -691,7 +691,7 @@ void AWSClient::AddChecksumToRequest(const std::shared_ptrSetHeaderValue("x-amz-checksum-sha256", HashingUtils::Base64Encode(HashingUtils::CalculateSHA256(*(request.GetBody())))); + httpRequest->SetHeaderValue("x-amz-checksum-sha256", HashingUtils::Base64Encode(HashingUtils::CalculateSHA256(*(GetBodyStream(request))))); } } else if (checksumAlgorithmName == "sha1") @@ -702,12 +702,12 @@ void AWSClient::AddChecksumToRequest(const std::shared_ptrSetHeaderValue("x-amz-checksum-sha1", HashingUtils::Base64Encode(HashingUtils::CalculateSHA1(*(request.GetBody())))); + httpRequest->SetHeaderValue("x-amz-checksum-sha1", HashingUtils::Base64Encode(HashingUtils::CalculateSHA1(*(GetBodyStream(request))))); } } else if (checksumAlgorithmName == "md5") { - httpRequest->SetHeaderValue(Http::CONTENT_MD5_HEADER, HashingUtils::Base64Encode(HashingUtils::CalculateMD5(*(request.GetBody())))); + httpRequest->SetHeaderValue(Http::CONTENT_MD5_HEADER, HashingUtils::Base64Encode(HashingUtils::CalculateMD5(*(GetBodyStream(request))))); } else { @@ -1027,6 +1027,13 @@ std::shared_ptr AWSClient::ConvertToRequestForPresigning return httpRequest; } +std::shared_ptr AWSClient::GetBodyStream(const Aws::AmazonWebServiceRequest& request) const { + if (request.GetBody() != nullptr) { + return request.GetBody(); + } + return Aws::MakeShared(AWS_CLIENT_LOG_TAG, nullptr); +} + std::shared_ptr AWSClient::MakeHttpRequest(std::shared_ptr& request) const { return m_httpClient->MakeRequest(request, m_readRateLimiter.get(), m_writeRateLimiter.get()); diff --git a/aws-cpp-sdk-s3-crt-integration-tests/BucketAndObjectOperationTest.cpp b/aws-cpp-sdk-s3-crt-integration-tests/BucketAndObjectOperationTest.cpp index 5a511931668..684e616e0d2 100644 --- a/aws-cpp-sdk-s3-crt-integration-tests/BucketAndObjectOperationTest.cpp +++ b/aws-cpp-sdk-s3-crt-integration-tests/BucketAndObjectOperationTest.cpp @@ -1514,4 +1514,25 @@ namespace ASSERT_STREQ("s3-object-lambda-fips.us-gov-east-1.amazonaws.com", S3CrtEndpoint::ForRegion("fips-us-gov-east-1", false, true, "s3-object-lambda").c_str()); ASSERT_STREQ("s3-object-lambda-fips.us-gov-west-1.amazonaws.com", S3CrtEndpoint::ForRegion("us-gov-west-1-fips", false, true, "s3-object-lambda").c_str()); } + + TEST_F(BucketAndObjectOperationTest, TestEmptyBody) { + Aws::String fullBucketName = CalculateBucketName(BASE_PUT_OBJECTS_BUCKET_NAME.c_str()); + + CreateBucketRequest createBucketRequest; + createBucketRequest.SetBucket(fullBucketName); + createBucketRequest.SetACL(BucketCannedACL::private_); + + CreateBucketOutcome createBucketOutcome = Client->CreateBucket(createBucketRequest); + ASSERT_TRUE(createBucketOutcome.IsSuccess()); + const CreateBucketResult& createBucketResult = createBucketOutcome.GetResult(); + ASSERT_TRUE(!createBucketResult.GetLocation().empty()); + ASSERT_TRUE(WaitForBucketToPropagate(fullBucketName)); + TagTestBucket(fullBucketName, Client); + + PutObjectRequest putObjectRequest; + putObjectRequest.SetBucket(fullBucketName); + putObjectRequest.SetKey("sbiscigl_was_here"); + PutObjectOutcome putObjectOutcome = Client->PutObject(putObjectRequest); + ASSERT_TRUE(putObjectOutcome.IsSuccess()); + } } diff --git a/aws-cpp-sdk-s3-integration-tests/BucketAndObjectOperationTest.cpp b/aws-cpp-sdk-s3-integration-tests/BucketAndObjectOperationTest.cpp index 0e6bebf6ffe..311fd22f901 100644 --- a/aws-cpp-sdk-s3-integration-tests/BucketAndObjectOperationTest.cpp +++ b/aws-cpp-sdk-s3-integration-tests/BucketAndObjectOperationTest.cpp @@ -2890,4 +2890,25 @@ namespace ASSERT_STREQ("s3-object-lambda-fips.us-gov-east-1.amazonaws.com", S3Endpoint::ForRegion("fips-us-gov-east-1", false, true, "s3-object-lambda").c_str()); ASSERT_STREQ("s3-object-lambda-fips.us-gov-west-1.amazonaws.com", S3Endpoint::ForRegion("us-gov-west-1-fips", false, true, "s3-object-lambda").c_str()); } + + TEST_F(BucketAndObjectOperationTest, TestEmptyBody) { + Aws::String fullBucketName = CalculateBucketName(BASE_PUT_OBJECTS_BUCKET_NAME.c_str()); + + CreateBucketRequest createBucketRequest; + createBucketRequest.SetBucket(fullBucketName); + createBucketRequest.SetACL(BucketCannedACL::private_); + + CreateBucketOutcome createBucketOutcome = Client->CreateBucket(createBucketRequest); + ASSERT_TRUE(createBucketOutcome.IsSuccess()); + const CreateBucketResult& createBucketResult = createBucketOutcome.GetResult(); + ASSERT_TRUE(!createBucketResult.GetLocation().empty()); + ASSERT_TRUE(WaitForBucketToPropagate(fullBucketName)); + TagTestBucket(fullBucketName, Client); + + PutObjectRequest putObjectRequest; + putObjectRequest.SetBucket(fullBucketName); + putObjectRequest.SetKey("sbiscigl_was_here"); + PutObjectOutcome putObjectOutcome = Client->PutObject(putObjectRequest); + ASSERT_TRUE(putObjectOutcome.IsSuccess()); + } }