Skip to content

Commit d37bb0d

Browse files
authored
Merge branch 'main' into smithyCodegen
2 parents c7e170e + 82e32be commit d37bb0d

3 files changed

Lines changed: 45 additions & 11 deletions

File tree

src/aws-cpp-sdk-core/source/http/curl/CurlHttpClient.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -194,11 +194,6 @@ static size_t WriteData(char* ptr, size_t size, size_t nmemb, void* userdata)
194194
}
195195

196196
HttpResponse* response = context->m_response;
197-
auto& headersHandler = context->m_request->GetHeadersReceivedEventHandler();
198-
if (context->m_numBytesResponseReceived == 0 && headersHandler)
199-
{
200-
headersHandler(context->m_request, context->m_response);
201-
}
202197

203198
size_t sizeToWrite = size * nmemb;
204199
if (context->m_rateLimiter)
@@ -284,6 +279,11 @@ static size_t WriteHeader(char* ptr, size_t size, size_t nmemb, void* userdata)
284279
curl_easy_getinfo(context->m_curlHandle, CURLINFO_RESPONSE_CODE, &responseCode);
285280
response->SetResponseCode(static_cast<HttpResponseCode>(responseCode));
286281
AWS_LOGSTREAM_DEBUG(CURL_HTTP_CLIENT_TAG, "Returned http response code " << responseCode);
282+
auto& headersHandler = context->m_request->GetHeadersReceivedEventHandler();
283+
if (headersHandler)
284+
{
285+
headersHandler(context->m_request, context->m_response);
286+
}
287287
}
288288

289289
return size * nmemb;

src/aws-cpp-sdk-core/source/http/windows/WinSyncHttpClient.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,12 @@ bool WinSyncHttpClient::BuildSuccessResponse(const std::shared_ptr<HttpRequest>&
209209
}
210210
}
211211

212+
auto& headersHandler = request->GetHeadersReceivedEventHandler();
213+
if (headersHandler)
214+
{
215+
headersHandler(request.get(), response.get());
216+
}
217+
212218
if (request->GetMethod() != HttpMethod::HTTP_HEAD)
213219
{
214220
if(!ContinueRequest(*request) || !IsRequestProcessingEnabled())
@@ -252,12 +258,6 @@ bool WinSyncHttpClient::BuildSuccessResponse(const std::shared_ptr<HttpRequest>&
252258
}
253259
}
254260

255-
auto& headersHandler = request->GetHeadersReceivedEventHandler();
256-
if (headersHandler)
257-
{
258-
headersHandler(request.get(), response.get());
259-
}
260-
261261
if (readLimiter != nullptr)
262262
{
263263
readLimiter->ApplyAndPayForCost(read);

tests/aws-cpp-sdk-s3-integration-tests/BucketAndObjectOperationTest.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)