Skip to content

Commit bc80bf8

Browse files
Mark global flag for curl isInit as false on Shutdown
1 parent 013f936 commit bc80bf8

File tree

5 files changed

+33
-7
lines changed

5 files changed

+33
-7
lines changed

src/aws-cpp-sdk-core/source/http/HttpClientFactory.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55

66
#include <aws/core/http/HttpClientFactory.h>
7+
#include <aws/core/internal/AWSHttpResourceClient.h>
78

89
#if AWS_SDK_USE_CRT_HTTP
910
#include <aws/core/http/crt/CRTHttpClient.h>
@@ -181,15 +182,24 @@ namespace Aws
181182
{
182183
if(GetHttpClientFactory())
183184
{
185+
// EC2 metadata client uses http client from a factory, it will be invalidated
186+
Aws::Internal::CleanupEC2MetadataClient();
187+
184188
GetHttpClientFactory()->CleanupStaticState();
185189
GetHttpClientFactory() = nullptr;
186190
}
187191
}
188192

189193
void SetHttpClientFactory(const std::shared_ptr<HttpClientFactory>& factory)
190194
{
195+
bool recreateEC2Client = Aws::Internal::GetEC2MetadataClient() ? true : false;
191196
CleanupHttp();
192197
GetHttpClientFactory() = factory;
198+
199+
if (recreateEC2Client)
200+
{
201+
Aws::Internal::InitEC2MetadataClient();
202+
}
193203
}
194204

195205
std::shared_ptr<HttpClient> CreateHttpClient(const Aws::Client::ClientConfiguration& clientConfiguration)

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -506,17 +506,23 @@ void CurlHttpClient::InitGlobalState()
506506
<< ", ssl version: " << curlVersionData->ssl_version);
507507
isInit = true;
508508
#ifdef USE_AWS_MEMORY_MANAGEMENT
509-
curl_global_init_mem(CURL_GLOBAL_ALL, &malloc_callback, &free_callback, &realloc_callback, &strdup_callback, &calloc_callback);
509+
CURLcode curlResponseCode = curl_global_init_mem(CURL_GLOBAL_ALL, &malloc_callback, &free_callback, &realloc_callback, &strdup_callback, &calloc_callback);
510510
#else
511-
curl_global_init(CURL_GLOBAL_ALL);
511+
CURLcode curlResponseCode = curl_global_init(CURL_GLOBAL_ALL);
512512
#endif
513+
if (curlResponseCode != CURLE_OK)
514+
{
515+
AWS_LOGSTREAM_FATAL(CURL_HTTP_CLIENT_TAG, "Failed to init curl, return code " << curlResponseCode);
516+
isInit = false;
517+
}
513518
}
514519
}
515520

516521

517522
void CurlHttpClient::CleanupGlobalState()
518523
{
519524
curl_global_cleanup();
525+
isInit = false;
520526
}
521527

522528
Aws::String CurlInfoTypeToString(curl_infotype type)

src/aws-cpp-sdk-core/source/internal/AWSHttpResourceClient.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,20 @@ namespace Aws
131131
AmazonWebServiceResult<Aws::String> AWSHttpResourceClient::GetResourceWithAWSWebServiceResult(const std::shared_ptr<HttpRequest> &httpRequest) const
132132
{
133133
AWS_LOGSTREAM_TRACE(m_logtag.c_str(), "Retrieving credentials from " << httpRequest->GetURIString());
134+
if (!m_httpClient)
135+
{
136+
AWS_LOGSTREAM_FATAL(m_logtag.c_str(), "Unable to get a response: missing http client!");
137+
return {{}, {}, HttpResponseCode::REQUEST_NOT_MADE};
138+
}
134139

135140
for (long retries = 0;; retries++)
136141
{
137142
std::shared_ptr<HttpResponse> response(m_httpClient->MakeRequest(httpRequest));
143+
if (!response)
144+
{
145+
AWS_LOGSTREAM_FATAL(m_logtag.c_str(), "Unable to get a response: http client returned a nullptr!");
146+
return {{}, {}, HttpResponseCode::NO_RESPONSE};
147+
}
138148

139149
if (response->GetResponseCode() == HttpResponseCode::OK)
140150
{

tests/aws-cpp-sdk-ec2-integration-tests/EC2TestsDualStack.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ TEST_F(EC2DualStackTests, TestDualStackMocked)
4343
goodResponse->GetResponseBody() << goodReply;
4444
mockHttpClient->AddResponseToReturn(goodResponse);
4545

46-
Aws::Client::ClientConfiguration clientConfig;
46+
Aws::Client::ClientConfiguration clientConfig("default", true);
4747
clientConfig.region = "us-east-1";
4848
clientConfig.useDualStack = true;
4949

@@ -69,7 +69,7 @@ TEST_F(EC2DualStackTests, TestDualStackMocked)
6969

7070
TEST_F(EC2DualStackTests, TestDualStackEndpoint)
7171
{
72-
Aws::Client::ClientConfiguration clientConfig;
72+
Aws::Client::ClientConfiguration clientConfig("default", true);
7373
clientConfig.region = "us-east-1";
7474
clientConfig.useDualStack = true;
7575

tests/aws-cpp-sdk-eventbridge-tests/EventBridgeTests.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ static std::shared_ptr<Aws::Http::Standard::StandardHttpResponse> buildEventBrid
7474

7575
TEST_F(EventBridgeTests, TestPutEventsBasic)
7676
{
77-
Aws::Client::ClientConfiguration clientConfig;
77+
Aws::Client::ClientConfiguration clientConfig("default", true);
7878
clientConfig.region = "us-east-1";
7979
Aws::Auth::AWSCredentials mockCreds("accessKey", "secretKey", "sessionToken");
8080

@@ -100,7 +100,7 @@ TEST_F(EventBridgeTests, TestPutEventsBasic)
100100

101101
TEST_F(EventBridgeTests, TestPutEventsMultiRegional)
102102
{
103-
Aws::Client::ClientConfiguration clientConfig;
103+
Aws::Client::ClientConfiguration clientConfig("default", true);
104104
clientConfig.region = "us-east-1";
105105
Aws::Auth::AWSCredentials mockCreds("accessKey", "secretKey", "sessionToken");
106106

@@ -168,7 +168,7 @@ TEST_F(EventBridgeTests, TestPutEventsEndpointTests)
168168
for(size_t tcIdx = 0; tcIdx < TEST_CASES.size(); ++tcIdx)
169169
{
170170
const EventBridgeEndpointTestCase& testCase = TEST_CASES[tcIdx];
171-
Aws::Client::ClientConfiguration clientConfig;
171+
Aws::Client::ClientConfiguration clientConfig("default", true);
172172
clientConfig.region = testCase.clientRegion;
173173
clientConfig.useDualStack = testCase.useDualStackEndpoint;
174174
clientConfig.useFIPS = testCase.useFipsEndpoint;

0 commit comments

Comments
 (0)