77#include < aws/core/auth/signer/AWSAuthSignerCommon.h>
88#include < aws/core/auth/signer/AWSAuthSignerHelper.h>
99
10- #include < aws/core/AmazonWebServiceRequest.h>
1110#include < aws/core/auth/AWSCredentialsProvider.h>
1211#include < aws/core/client/UserAgent.h>
1312#include < aws/core/http/HttpRequest.h>
2726
2827#include < iomanip>
2928#include < cstring>
30- #include < map>
3129
3230using namespace Aws ;
3331using namespace Aws ::Client;
@@ -338,16 +336,11 @@ bool AWSAuthV4Signer::SignRequestWithCreds(Aws::Http::HttpRequest& request, cons
338336
339337bool AWSAuthV4Signer::SignRequest (Aws::Http::HttpRequest& request, const char * region, const char * serviceName, bool signBody) const
340338{
341- AWSCredentials credentials = GetCredentials (request.GetServiceSpecificParameters ());
342- return SignRequestWithCreds (request, credentials, region, serviceName, signBody);
343- }
344-
345- bool AWSAuthV4Signer::SignRequest (Aws::Http::HttpRequest& request, Aws::AmazonWebServiceRequest& awsRequest, const char * region, const char * serviceName, bool signBody) const
346- {
347- AWSCredentials credentials = GetCredentials (awsRequest, request.GetServiceSpecificParameters ());
339+ Aws::Auth::CredentialsResolutionContext context;
340+ AWSCredentials credentials = GetCredentials (context, request.GetServiceSpecificParameters ());
348341
349- // Update User-Agent with credential tracking features added during credential resolution
350- UpdateUserAgentWithCredentialFeatures (request, awsRequest );
342+ // Update User-Agent with credential tracking features from context
343+ UpdateUserAgentWithCredentialFeatures (request, context );
351344
352345 return SignRequestWithCreds (request, credentials, region, serviceName, signBody);
353346}
@@ -609,77 +602,38 @@ Aws::Auth::AWSCredentials AWSAuthV4Signer::GetCredentials(const std::shared_ptr<
609602 return m_credentialsProvider->GetAWSCredentials ();
610603}
611604
612- Aws::Auth::AWSCredentials AWSAuthV4Signer::GetCredentials (Aws::AmazonWebServiceRequest& awsRequest , const std::shared_ptr<Aws::Http::ServiceSpecificParameters> &serviceSpecificParameters) const {
605+ Aws::Auth::AWSCredentials AWSAuthV4Signer::GetCredentials (Aws::Auth::CredentialsResolutionContext& context , const std::shared_ptr<Aws::Http::ServiceSpecificParameters> &serviceSpecificParameters) const {
613606 AWS_UNREFERENCED_PARAM (serviceSpecificParameters);
614- return m_credentialsProvider->GetAWSCredentials (awsRequest );
607+ return m_credentialsProvider->GetAWSCredentials (context );
615608}
616609
617- void AWSAuthV4Signer::UpdateUserAgentWithCredentialFeatures (Aws::Http::HttpRequest& request, const Aws::AmazonWebServiceRequest& awsRequest ) const {
610+ void AWSAuthV4Signer::UpdateUserAgentWithCredentialFeatures (Aws::Http::HttpRequest& request, const Aws::Auth::CredentialsResolutionContext& context ) const {
618611 if (!request.HasHeader (USER_AGENT)) {
619612 return ;
620613 }
621614
622- const auto & features = awsRequest .GetUserAgentFeatures ();
615+ const auto & features = context .GetUserAgentFeatures ();
623616 if (features.empty ()) {
624617 return ;
625618 }
626619
627- // Get existing User-Agent
628- Aws::String existingUA = request.GetHeaderValue (USER_AGENT);
629-
630- // Build credential metrics string
631- Aws::StringStream credentialMetrics;
632- bool firstFeature = true ;
633-
620+ // Build credential features string
621+ Aws::StringStream credentialFeatures;
634622 for (const auto & feature : features) {
635- char featureChar = 0 ;
636623 switch (feature) {
637624 case Aws::Client::UserAgentFeature::CREDENTIALS_ENV_VARS:
638- featureChar = ' g ' ;
625+ credentialFeatures << " g " ;
639626 break ;
640- // Add other credential feature mappings as needed
641627 default :
642- continue ; // Skip non-credential features
643- }
644-
645- if (!firstFeature) {
646- credentialMetrics << " ," ;
628+ // Skip non-credential features
629+ break ;
647630 }
648- credentialMetrics << featureChar;
649- firstFeature = false ;
650- }
651-
652- if (credentialMetrics.str ().empty ()) {
653- return ;
654631 }
655632
656- // Parse and update existing User-Agent
657- bool metricsUpdated = false ;
633+ // Append credential features to existing UA
634+ Aws::String existingUA = request. GetHeaderValue (USER_AGENT) ;
658635 Aws::StringStream updatedUA;
659- const auto parts = Aws::Utils::StringUtils::Split (existingUA, ' ' );
636+ updatedUA << existingUA << " m/ " << credentialFeatures. str ( );
660637
661- for (size_t i = 0 ; i < parts.size (); ++i) {
662- if (i > 0 ) {
663- updatedUA << ' ' ;
664- }
665-
666- if (parts[i].find (" m/" ) == 0 ) {
667- // Add credentials to business metrics
668- updatedUA << parts[i];
669- if (!parts[i].empty () && parts[i].back () != ' /' ) {
670- updatedUA << ' ,' ;
671- }
672- updatedUA << credentialMetrics.str ();
673- metricsUpdated = true ;
674- } else {
675- updatedUA << parts[i];
676- }
677- }
678-
679- // If no metrics section found, add one
680- if (!metricsUpdated) {
681- updatedUA << " m/" << credentialMetrics.str ();
682- }
683-
684638 request.SetUserAgent (updatedUA.str ());
685- }
639+ }
0 commit comments