@@ -2690,6 +2690,40 @@ namespace
26902690 EXPECT_FALSE (outcome.IsSuccess ());
26912691 }
26922692
2693+ TEST_F (BucketAndObjectOperationTest, TestHeadersReceivedEventHandlerFiresOnEmptyBodyResponse) {
2694+ const String fullBucketName = CalculateBucketName (BASE_PUT_OBJECTS_BUCKET_NAME .c_str ());
2695+ SCOPED_TRACE (Aws::String (" FullBucket"
2696+ " Name " ) + fullBucketName);
2697+ CreateBucketRequest createBucketRequest;
2698+ createBucketRequest.SetBucket (fullBucketName);
2699+ createBucketRequest.SetACL (BucketCannedACL::private_);
2700+ CreateBucketOutcome createBucketOutcome = CreateBucket (createBucketRequest);
2701+ AWS_ASSERT_SUCCESS (createBucketOutcome);
2702+ ASSERT_TRUE (WaitForBucketToPropagate (fullBucketName, Client));
2703+ TagTestBucket (fullBucketName, Client);
2704+
2705+ // PutObject returns 200 with headers but an empty body
2706+ Aws::S3 ::Model::PutObjectRequest request;
2707+ request.SetBucket (fullBucketName);
2708+ request.SetKey (" headers-received-handler-test" );
2709+
2710+ auto body = Aws::MakeShared<Aws::StringStream>(ALLOCATION_TAG , " test content" );
2711+ request.SetBody (body);
2712+
2713+ std::atomic<bool > handlerFired{false };
2714+ Aws::Http::HttpResponseCode capturedCode{Aws::Http::HttpResponseCode::REQUEST_NOT_MADE };
2715+ request.SetHeadersReceivedEventHandler (
2716+ [&handlerFired, &capturedCode](const Aws::Http::HttpRequest*, Aws::Http::HttpResponse* response) {
2717+ handlerFired = true ;
2718+ capturedCode = response->GetResponseCode ();
2719+ });
2720+
2721+ auto outcome = Client->PutObject (request);
2722+ AWS_EXPECT_SUCCESS (outcome);
2723+ EXPECT_TRUE (handlerFired.load ()) << " HeadersReceivedEventHandler must fire even when response body is empty" ;
2724+ EXPECT_EQ (Aws::Http::HttpResponseCode::OK , capturedCode);
2725+ }
2726+
26932727 TEST_F (BucketAndObjectOperationTest, ShouldSkipResponseValidationOnCompositeChecksums) {
26942728 const auto fullBucketName = CalculateBucketName (BASE_PUT_MULTIPART_COMPOSITE_CHECKSUM_BUCKET_NAME .c_str ());
26952729 m_bucketsToDelete.insert (fullBucketName);
0 commit comments