Skip to content

Commit 82f91fa

Browse files
authored
Set response code after receiving header (#3241)
1 parent 43cc553 commit 82f91fa

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,17 +129,20 @@ static char* strdup_callback(const char* str)
129129
struct CurlWriteCallbackContext
130130
{
131131
CurlWriteCallbackContext(const CurlHttpClient* client,
132+
CURL* curlHandle,
132133
HttpRequest* request,
133134
HttpResponse* response,
134135
Aws::Utils::RateLimits::RateLimiterInterface* rateLimiter) :
135136
m_client(client),
137+
m_curlHandle(curlHandle),
136138
m_request(request),
137139
m_response(response),
138140
m_rateLimiter(rateLimiter),
139141
m_numBytesResponseReceived(0)
140142
{}
141143

142144
const CurlHttpClient* m_client;
145+
CURL* m_curlHandle{nullptr};
143146
HttpRequest* m_request;
144147
HttpResponse* m_response;
145148
Aws::Utils::RateLimits::RateLimiterInterface* m_rateLimiter;
@@ -272,6 +275,14 @@ static size_t WriteHeader(char* ptr, size_t size, size_t nmemb, void* userdata)
272275
{
273276
response->AddHeader(StringUtils::Trim(keyValuePair[0].c_str()), StringUtils::Trim(keyValuePair[1].c_str()));
274277
}
278+
//checking for end of all the headers before setting response code
279+
else if (headerLine == "\r\n" && context->m_curlHandle)
280+
{
281+
long responseCode{-1};
282+
curl_easy_getinfo(context->m_curlHandle, CURLINFO_RESPONSE_CODE, &responseCode);
283+
response->SetResponseCode(static_cast<HttpResponseCode>(responseCode));
284+
AWS_LOGSTREAM_DEBUG(CURL_HTTP_CLIENT_TAG, "Returned http response code " << responseCode);
285+
}
275286

276287
return size * nmemb;
277288
}
@@ -683,7 +694,7 @@ std::shared_ptr<HttpResponse> CurlHttpClient::MakeRequest(const std::shared_ptr<
683694
curl_easy_setopt(connectionHandle, CURLOPT_HTTPHEADER, headers);
684695
}
685696

686-
CurlWriteCallbackContext writeContext(this, request.get(), response.get(), readLimiter);
697+
CurlWriteCallbackContext writeContext(this, connectionHandle ,request.get(), response.get(), readLimiter);
687698

688699
const auto readContext = [this, &connectionHandle, &request, &writeLimiter]() -> CurlReadCallbackContext {
689700
if (request->GetContentBody() != nullptr) {

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2580,4 +2580,38 @@ namespace
25802580
AWS_EXPECT_SUCCESS(headOutcome);
25812581
EXPECT_EQ(headOutcome.GetResult().GetContentEncoding(), "gzip");
25822582
}
2583+
2584+
TEST_F(BucketAndObjectOperationTest, TestHeaderResponse) {
2585+
ClientConfiguration configuration;
2586+
configuration.region = "us-east-1";
2587+
configuration.enableHttpClientTrace = true;
2588+
std::shared_ptr<Aws::S3::S3Client> client = Aws::MakeShared<Aws::S3::S3Client>("test",configuration);
2589+
2590+
const String fullBucketName = CalculateBucketName(BASE_CONTENT_ENCODING_BUCKET_NAME.c_str());
2591+
CreateBucketRequest createBucketRequest;
2592+
createBucketRequest.SetBucket(fullBucketName);
2593+
createBucketRequest.SetACL(BucketCannedACL::private_);
2594+
CreateBucketOutcome createBucketOutcome = CreateBucket(createBucketRequest,client);
2595+
AWS_EXPECT_SUCCESS(createBucketOutcome);
2596+
2597+
Aws::S3::Model::GetObjectRequest request;
2598+
request.SetBucket(fullBucketName);
2599+
request.SetKey("one_object_that_does_not_exist_in_the_bucket"); // <== we should get 404 when calling GetResponseCode
2600+
request.SetHeadersReceivedEventHandler (
2601+
[] (
2602+
const Aws::Http::HttpRequest * ,
2603+
Aws::Http::HttpResponse * response
2604+
) {
2605+
::std::cout << "response headers received: "
2606+
<< response->GetResponseCode ( )
2607+
<< ::std::endl;
2608+
EXPECT_EQ(response->GetResponseCode(), Aws::Http::HttpResponseCode::NOT_FOUND );
2609+
}
2610+
);
2611+
2612+
Aws::S3::Model::GetObjectOutcome outcome =
2613+
client->GetObject(request);
2614+
EXPECT_FALSE(outcome.IsSuccess());
2615+
2616+
}
25832617
}

0 commit comments

Comments
 (0)