From dd6a33aed7bec47b8f27ceb9bc5c2129f235236e Mon Sep 17 00:00:00 2001 From: Elliot Date: Sat, 14 Mar 2026 13:06:09 -0400 Subject: [PATCH 1/2] reduce size of generated client libraries --- .../aws/core/client/AWSProtocolClient.h | 3 + .../include/aws/core/client/AWSXmlClient.h | 3 + .../include/aws/core/utils/Outcome.h | 2 + .../aws/core/utils/logging/ErrorMacros.h | 27 ++++++ .../cpp/cbor/CborServiceClientHeader.vm | 2 + .../cpp/cbor/CborServiceClientSource.vm | 2 + ...tOperationRequestRequiredMemberValidate.vm | 2 +- .../common/ServiceInvokeOperationHeader.vm | 13 +++ .../common/ServiceInvokeOperationMethod.vm | 26 +++++ .../common/ServiceInvokeOperationSource.vm | 66 +++++++++++++ .../cpp/common/UriRequestPathSegments.vm | 94 +++++++++++++++++++ .../cpp/common/UriRequestQueryParams.vm | 88 +---------------- .../cpp/json/JsonServiceClientHeader.vm | 2 + .../cpp/json/JsonServiceClientSource.vm | 1 + .../withrequest/OperationOutcome.vm | 4 + .../velocity/cpp/rds/RDSClientHeader.vm | 2 + .../velocity/cpp/s3/S3ClientHeader.vm | 5 +- .../velocity/cpp/s3/SmithyS3ClientHeader.vm | 5 +- .../velocity/cpp/s3/SmithyS3ClientSource.vm | 2 + .../cpp/s3control/S3ControlClientHeader.vm | 2 + .../SmithyRestXmlServiceClientOperations.vm | 6 +- .../cpp/xml/XmlServiceClientHeader.vm | 2 + .../rest/RestXmlServiceClientOperations.vm | 4 + .../xml/rest/RestXmlServiceClientSource.vm | 1 + 24 files changed, 273 insertions(+), 91 deletions(-) create mode 100644 tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationHeader.vm create mode 100644 tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationMethod.vm create mode 100644 tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationSource.vm create mode 100644 tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/UriRequestPathSegments.vm diff --git a/src/aws-cpp-sdk-core/include/aws/core/client/AWSProtocolClient.h b/src/aws-cpp-sdk-core/include/aws/core/client/AWSProtocolClient.h index 8cdd7d38051b..bf095a609a7d 100644 --- a/src/aws-cpp-sdk-core/include/aws/core/client/AWSProtocolClient.h +++ b/src/aws-cpp-sdk-core/include/aws/core/client/AWSProtocolClient.h @@ -24,6 +24,9 @@ namespace Aws public: typedef AWSClient BASECLASS; + typedef OutcomeType OUTCOME; + typedef ResponseType RESPONSE; + AWSProtocolClient(const Aws::Client::ClientConfiguration& configuration, const std::shared_ptr& signer, const std::shared_ptr& errorMarshaller) diff --git a/src/aws-cpp-sdk-core/include/aws/core/client/AWSXmlClient.h b/src/aws-cpp-sdk-core/include/aws/core/client/AWSXmlClient.h index f2bb9d2ed132..3f382b69f571 100644 --- a/src/aws-cpp-sdk-core/include/aws/core/client/AWSXmlClient.h +++ b/src/aws-cpp-sdk-core/include/aws/core/client/AWSXmlClient.h @@ -36,6 +36,9 @@ namespace Aws public: typedef AWSClient BASECLASS; + typedef XmlOutcome OUTCOME; + typedef Utils::Xml::XmlDocument RESPONSE; + AWSXMLClient(const Aws::Client::ClientConfiguration& configuration, const std::shared_ptr& signer, const std::shared_ptr& errorMarshaller); diff --git a/src/aws-cpp-sdk-core/include/aws/core/utils/Outcome.h b/src/aws-cpp-sdk-core/include/aws/core/utils/Outcome.h index 950f85ba9cff..3025a06dedfe 100644 --- a/src/aws-cpp-sdk-core/include/aws/core/utils/Outcome.h +++ b/src/aws-cpp-sdk-core/include/aws/core/utils/Outcome.h @@ -27,6 +27,8 @@ namespace Aws class Outcome { public: + typedef R RESULT; + typedef E ERROR; Outcome() : result(), error(), success(false) { diff --git a/src/aws-cpp-sdk-core/include/aws/core/utils/logging/ErrorMacros.h b/src/aws-cpp-sdk-core/include/aws/core/utils/logging/ErrorMacros.h index d167d598fe38..2c527ed26967 100644 --- a/src/aws-cpp-sdk-core/include/aws/core/utils/logging/ErrorMacros.h +++ b/src/aws-cpp-sdk-core/include/aws/core/utils/logging/ErrorMacros.h @@ -22,6 +22,16 @@ do { \ } \ } while (0) +#define AWS_OPERATION_CHECK_PTR_DYNAMIC(PTR, OPERATION, ERROR_TYPE, ERROR) \ +do { \ + if (PTR == nullptr) \ + { \ + AWS_LOGSTREAM_FATAL(OPERATION, "Unexpected nullptr: " #PTR); \ + return Aws::Client::AWSError(ERROR, #ERROR, "Unexpected nullptr: " #PTR, false); \ + } \ +} while (0) + + #define AWS_CHECK(LOG_TAG, CONDITION, ERROR_MESSAGE, RETURN) \ do { \ if (!(CONDITION)) \ @@ -49,6 +59,15 @@ do { \ } \ } while (0) +#define AWS_OPERATION_CHECK_SUCCESS_DYNAMIC(OUTCOME, OPERATION, ERROR_TYPE, ERROR, ERROR_MESSAGE) \ +do { \ + if (!OUTCOME.IsSuccess()) \ + { \ + AWS_LOGSTREAM_ERROR(OPERATION, ERROR_MESSAGE); \ + return Aws::Client::AWSError(ERROR, #ERROR, ERROR_MESSAGE, false); \ + } \ +} while (0) + #define AWS_OPERATION_CHECK_PARAMETER_PRESENT(REQUEST, FIELD, OPERATION, CLIENT_NAMESPACE) \ do { \ if (!REQUEST##.##FIELD##HasBeenSet()) \ @@ -66,6 +85,14 @@ if(!m_isInitialized) \ } \ Aws::Utils::RAIICounter raiiGuard(this->m_operationsProcessed, &this->m_shutdownSignal) +#define AWS_OPERATION_GUARD_DYNAMIC(OPERATION) \ +if(!m_isInitialized) \ +{ \ + AWS_LOGSTREAM_ERROR(OPERATION, "Unable to call " << OPERATION << ": client is not initialized (or already terminated)"); \ + return Aws::Client::AWSError(CoreErrors::NOT_INITIALIZED, "NOT_INITIALIZED", "Client is not initialized or already terminated", false); \ +} \ +Aws::Utils::RAIICounter raiiGuard(this->m_operationsProcessed, &this->m_shutdownSignal) + #define AWS_ASYNC_OPERATION_GUARD(OPERATION) \ if(!m_isInitialized) \ { \ diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/cbor/CborServiceClientHeader.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/cbor/CborServiceClientHeader.vm index f8163a2cf7aa..c0be93d64418 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/cbor/CborServiceClientHeader.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/cbor/CborServiceClientHeader.vm @@ -58,6 +58,8 @@ ${cbor_virtual}std::shared_ptr<${metadata.classNamePrefix}EndpointProviderBase>& void Load${metadata.classNamePrefix}SpecificConfig(const Aws::Client::ClientConfiguration& clientConfiguration); #end +#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationHeader.vm") + #if(!$serviceModel.endpointRules) #if($metadata.hasEndpointTrait) Aws::String m_baseUri; diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/cbor/CborServiceClientSource.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/cbor/CborServiceClientSource.vm index 60e3a3925b5c..00211ac0c74d 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/cbor/CborServiceClientSource.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/cbor/CborServiceClientSource.vm @@ -55,4 +55,6 @@ const char* ${className}::GetAllocationTag() {return ALLOCATION_TAG;} #parseOverrideOrDefault( "ServiceClientSourceInit_template" "com/amazonaws/util/awsclientgenerator/velocity/cpp/ServiceClientSourceInit.vm") #end +#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationSource.vm") + #parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/json/serviceoperations/JsonServiceOperationsSource.vm") diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceClientOperationRequestRequiredMemberValidate.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceClientOperationRequestRequiredMemberValidate.vm index dbc0e9b5bbf7..b189e6d5dbce 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceClientOperationRequestRequiredMemberValidate.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceClientOperationRequestRequiredMemberValidate.vm @@ -10,7 +10,7 @@ return handler(this, ${operation.name}Outcome(Aws::Client::AWSError<${metadata.classNamePrefix}Errors>(${metadata.classNamePrefix}Errors::INTERNAL_FAILURE, "INTERNAL_FAILURE", "Endpoint provider is not initialized", false)), handlerContext); } #end -#else +#elseif(!$emitGenericOperation) AWS_OPERATION_CHECK_PTR(m_endpointProvider, ${operation.name}, CoreErrors, CoreErrors::ENDPOINT_RESOLUTION_FAILURE); #end #else##-#if(!$operation.request.shape.hasEventStreamMembers()) diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationHeader.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationHeader.vm new file mode 100644 index 000000000000..bb0993cbc2c8 --- /dev/null +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationHeader.vm @@ -0,0 +1,13 @@ + +typedef Aws::Utils::Outcome, ${metadata.classNamePrefix}Error> InvokeOutcome; + +InvokeOutcome InvokeServiceOperation( + const AmazonWebServiceRequest& request, +#if($metadata.protocol == "rest-json" || $metadata.protocol == "rest-xml") + const std::function& resolveUri, +#end +#if($serviceModel.metadata.namespace == "S3" || $serviceModel.metadata.namespace == "S3Crt") + Aws::String bucketName, +#end + Aws::Http::HttpMethod httpMethod +) const; diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationMethod.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationMethod.vm new file mode 100644 index 000000000000..32497e47db55 --- /dev/null +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationMethod.vm @@ -0,0 +1,26 @@ +#if($metadata.protocol == "ec2" || $metadata.protocol == "json" || $metadata.protocol == "query" || $metadata.protocol == "smithy-rpc-v2-cbor") + #set($emitGenericOperation = true) + #parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceClientOperationRequestRequiredMemberValidate.vm") + + return ${operation.name}Outcome{InvokeServiceOperation(request, Aws::Http::HttpMethod::HTTP_${operation.http.method})}; +#elseif($metadata.protocol == "rest-json" || $metadata.protocol == "rest-xml") + #set($emitGenericOperation = true) + #parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceClientOperationRequestRequiredMemberValidate.vm") + + auto uriResolver = [&](Aws::Endpoint::ResolveEndpointOutcome& endpointResolutionOutcome) { + (void)endpointResolutionOutcome; + #parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/UriRequestPathSegments.vm") + }; + + #if($serviceModel.metadata.namespace == "S3" || $serviceModel.metadata.namespace == "S3Crt") + #if(($serviceModel.metadata.namespace == "S3" || ($serviceModel.metadata.namespace == "S3Crt" && !$operation.s3CrtEnabled)) && $operation.shouldUsePropertyBag) + return ${operation.name}Outcome{InvokeServiceOperation(request, uriResolver, request.GetBucket(), Aws::Http::HttpMethod::HTTP_${operation.http.method})}; + #else + return ${operation.name}Outcome{InvokeServiceOperation(request, uriResolver, "", Aws::Http::HttpMethod::HTTP_${operation.http.method})}; + #end + #else + return ${operation.name}Outcome{InvokeServiceOperation(request, uriResolver, Aws::Http::HttpMethod::HTTP_${operation.http.method})}; + #end +#end + +#set($emitGenericOperation = false) diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationSource.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationSource.vm new file mode 100644 index 000000000000..030f10b7791f --- /dev/null +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationSource.vm @@ -0,0 +1,66 @@ +${className}::InvokeOutcome ${className}::InvokeServiceOperation( + const AmazonWebServiceRequest& request, +#if($metadata.protocol == "rest-json" || $metadata.protocol == "rest-xml") + const std::function& resolveUri, +#end +#if($serviceModel.metadata.namespace == "S3" || $serviceModel.metadata.namespace == "S3Crt") + Aws::String bucketName, +#end + Aws::Http::HttpMethod httpMethod +) const +{ + auto operationName = request.GetServiceRequestName(); + auto serviceName = GetServiceClientName(); + + AWS_OPERATION_GUARD_DYNAMIC(operationName); + + AWS_OPERATION_CHECK_PTR_DYNAMIC(m_endpointProvider, operationName, CoreErrors, CoreErrors::ENDPOINT_RESOLUTION_FAILURE); + AWS_OPERATION_CHECK_PTR_DYNAMIC(m_telemetryProvider, operationName, CoreErrors, CoreErrors::NOT_INITIALIZED); + + auto tracer = m_telemetryProvider->getTracer(serviceName, {}); + auto meter = m_telemetryProvider->getMeter(serviceName, {}); + AWS_OPERATION_CHECK_PTR_DYNAMIC(meter, operationName, CoreErrors, CoreErrors::NOT_INITIALIZED); + + auto span = tracer->CreateSpan(Aws::String(serviceName) + "." + operationName, + {{TracingUtils::SMITHY_METHOD_DIMENSION, operationName}, + {TracingUtils::SMITHY_SERVICE_DIMENSION, serviceName}, + {TracingUtils::SMITHY_SYSTEM_DIMENSION, TracingUtils::SMITHY_METHOD_AWS_VALUE}}, + smithy::components::tracing::SpanKind::CLIENT); + +#if($serviceModel.metadata.namespace == "S3" || $serviceModel.metadata.namespace == "S3Crt") + if (!bucketName.empty()) { + request.SetServiceSpecificParameters([bucketName]() -> std::shared_ptr { + Aws::Map params; + params.emplace("bucketName", bucketName); + ServiceSpecificParameters serviceSpecificParameters{params}; + return Aws::MakeShared(ALLOCATION_TAG, serviceSpecificParameters); + }()); + } +#end + + return TracingUtils::MakeCallWithTiming( + [&]() -> InvokeOutcome { + auto endpointResolutionOutcome = TracingUtils::MakeCallWithTiming( + [&]() -> ResolveEndpointOutcome { return m_endpointProvider->ResolveEndpoint(request.GetEndpointContextParams()); }, + TracingUtils::SMITHY_CLIENT_ENDPOINT_RESOLUTION_METRIC, *meter, + {{TracingUtils::SMITHY_METHOD_DIMENSION, operationName}, + {TracingUtils::SMITHY_SERVICE_DIMENSION, serviceName}}); + + AWS_OPERATION_CHECK_SUCCESS_DYNAMIC(endpointResolutionOutcome, operationName, CoreErrors, + CoreErrors::ENDPOINT_RESOLUTION_FAILURE, endpointResolutionOutcome.GetError().GetMessage()); + +#if($metadata.findFirstSupportedProtocol() == "smithy-rpc-v2-cbor") + endpointResolutionOutcome.GetResult().AddPathSegments("/service/${serviceModel.metadata.targetPrefix}/operation/"); + endpointResolutionOutcome.GetResult().AddPathSegment(operationName); +#end + +#if($metadata.protocol == "rest-json" || $metadata.protocol == "rest-xml") + resolveUri(endpointResolutionOutcome); +#end + + return MakeRequest(request, endpointResolutionOutcome.GetResult(), httpMethod, Aws::Auth::SIGV4_SIGNER); + }, + TracingUtils::SMITHY_CLIENT_DURATION_METRIC, *meter, + {{TracingUtils::SMITHY_METHOD_DIMENSION, operationName}, + {TracingUtils::SMITHY_SERVICE_DIMENSION, serviceName}}); +} diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/UriRequestPathSegments.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/UriRequestPathSegments.vm new file mode 100644 index 000000000000..4344103d0609 --- /dev/null +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/UriRequestPathSegments.vm @@ -0,0 +1,94 @@ +#if(($serviceNamespace == "S3Crt" && $operation.s3CrtEnabled) || $operation.getRequest().getShape().hasEventStreamMembers()) +#set($meterNeeded = true) +#set($indent = "") +#else +#set($meterNeeded = false) +#set($indent = " ") +#end +#if($metadata.findFirstSupportedProtocol() == "smithy-rpc-v2-cbor") +${indent} endpointResolutionOutcome.GetResult().AddPathSegments("/service/${serviceModel.metadata.targetPrefix}/operation/${operation.name}"); +#end +#if($operation.http.requestUri.contains("?")) +${indent} Aws::StringStream ss; +#end +#set($uriParts = $operation.http.requestUriParts) +#set($uriVars = $operation.http.requestParameters) +#if(!$startIndex) +#set($startIndex = 0) +#end +#set($partIndex = 1) +#set($queryStart = false) +#if($uriParts.size() > $startIndex) +#set($uriPartString = ${uriParts.get($startIndex)}) +#if($uriPartString.contains("?"))## if (request uri contains query) ---------- +#set($queryStart = true) +#set($pathAndQuery = $operation.http.splitUriPartIntoPathAndQuery($uriPartString)) +#if(!$pathAndQuery.get(0).isEmpty()) +#if($pathAndQuery.get(0).toLowerCase().contains("resourcearn")) +${indent} endpointResolutionOutcome.GetResult().SetRfc3986Encoded(true); +#end +${indent} endpointResolutionOutcome.GetResult().AddPathSegments("${pathAndQuery.get(0)}"); +#end +${indent} ss.str("${pathAndQuery.get(1)}"); +#elseif(!$uriPartString.equals("/")) +#if($uriPartString.get(0).toLowerCase().contains("resourcearn")) +${indent} endpointResolutionOutcome.GetResult().SetRfc3986Encoded(true); +#end +${indent} endpointResolutionOutcome.GetResult().AddPathSegments("$uriPartString"); +#end## ---------------------------- if (request uri contains query) end ------ +#foreach($var in $uriVars)## for (parameter in request uri parameters) ------- +#set($varIndex = $partIndex - 1) +#set($uriVar = $uriVars.get($varIndex).replace('+', '')) +#set($greedySyntax = $uriVars.get($varIndex).contains("+")) +#if(!$skipFirst) +#set($partShapeMember = $operation.request.shape.getMemberByLocationName($uriVar)) +#if($partShapeMember.shape.enum) +#set($parameter = "${partShapeMember.shape.name}Mapper::GetNameFor${partShapeMember.shape.name}(request.Get${CppViewHelper.convertToUpperCamel($operation.request.shape.getMemberNameByLocationName($uriVar))}())") +#elseif($partShapeMember.shape.timeStamp) +#if($partShapeMember.shape.timestampFormat != "unixTimestamp") +#set($parameter = "request.Get${CppViewHelper.convertToUpperCamel($operation.request.shape.getMemberNameByLocationName($uriVar))}().ToGmtString(Aws::Utils::DateFormat::$CppViewHelper.computeTimestampFormatInQueryString($partShapeMember.shape))") +#else +#set($parameter = "request.Get${CppViewHelper.convertToUpperCamel($operation.request.shape.getMemberNameByLocationName($uriVar))}().Seconds()") +#end +#else +#set($parameter = "request.Get${CppViewHelper.convertToUpperCamel($operation.request.shape.getMemberNameByLocationName($uriVar))}()") +#end +#if($queryStart) +${indent} ss << $parameter; +#else +#if($greedySyntax) +#if($parameter.toLowerCase().contains("resourcearn")) +${indent} endpointResolutionOutcome.GetResult().SetRfc3986Encoded(true); +#end +${indent} endpointResolutionOutcome.GetResult().AddPathSegments($parameter); +#else +${indent} endpointResolutionOutcome.GetResult().AddPathSegment($parameter); +#end +#end +#if($uriParts.size() > $partIndex) +#set($uriPartString = "${uriParts.get($partIndex)}") +#if(!$queryStart && $uriPartString.contains("?")) +#set($queryStart = true) +#set($pathAndQuery = $operation.http.splitUriPartIntoPathAndQuery($uriPartString)) +#if(!$pathAndQuery.get(0).isEmpty()) +#if($pathAndQuery.get(0).toLowerCase().contains("resourcearn")) +${indent} endpointResolutionOutcome.GetResult().SetRfc3986Encoded(true); +#end +${indent} endpointResolutionOutcome.GetResult().AddPathSegments("${pathAndQuery.get(0)}"); +#end +${indent} ss.str("${pathAndQuery.get(1)}"); +#elseif(!$uriPartString.equals("/")) +#if($uriPartString.toLowerCase().contains("resourcearn")) +${indent} endpointResolutionOutcome.GetResult().SetRfc3986Encoded(true); +#end +${indent} endpointResolutionOutcome.GetResult().AddPathSegments("$uriPartString"); +#end +#end +#end## --------------------- if !skipFirst end --- +#set($partIndex = $partIndex + 1) +#set($skipFirst = false) +#end## --------------------- if uriParts.size() > startIndex end --- +#end## --------------------- for (parameter in request uri parameters) end --- +#if($queryStart) +${indent} endpointResolutionOutcome.GetResult().SetQueryString(ss.str()); +#end \ No newline at end of file diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/UriRequestQueryParams.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/UriRequestQueryParams.vm index 948c5a2f1e0e..a23322a7cea4 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/UriRequestQueryParams.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/UriRequestQueryParams.vm @@ -36,90 +36,4 @@ ${indent} CoreErrors::ENDPOINT_RESOLUTION_FAILURE, "ENDPOINT_RESOLUTION ${indent} return; ${indent} } #end -#if($metadata.findFirstSupportedProtocol() == "smithy-rpc-v2-cbor") -${indent} endpointResolutionOutcome.GetResult().AddPathSegments("/service/${serviceModel.metadata.targetPrefix}/operation/${operation.name}"); -#end -#if($operation.http.requestUri.contains("?")) -${indent} Aws::StringStream ss; -#end -#set($uriParts = $operation.http.requestUriParts) -#set($uriVars = $operation.http.requestParameters) -#if(!$startIndex) -#set($startIndex = 0) -#end -#set($partIndex = 1) -#set($queryStart = false) -#if($uriParts.size() > $startIndex) -#set($uriPartString = ${uriParts.get($startIndex)}) -#if($uriPartString.contains("?"))## if (request uri contains query) ---------- -#set($queryStart = true) -#set($pathAndQuery = $operation.http.splitUriPartIntoPathAndQuery($uriPartString)) -#if(!$pathAndQuery.get(0).isEmpty()) -#if($pathAndQuery.get(0).toLowerCase().contains("resourcearn")) -${indent} endpointResolutionOutcome.GetResult().SetRfc3986Encoded(true); -#end -${indent} endpointResolutionOutcome.GetResult().AddPathSegments("${pathAndQuery.get(0)}"); -#end -${indent} ss.str("${pathAndQuery.get(1)}"); -#elseif(!$uriPartString.equals("/")) -#if($uriPartString.get(0).toLowerCase().contains("resourcearn")) -${indent} endpointResolutionOutcome.GetResult().SetRfc3986Encoded(true); -#end -${indent} endpointResolutionOutcome.GetResult().AddPathSegments("$uriPartString"); -#end## ---------------------------- if (request uri contains query) end ------ -#foreach($var in $uriVars)## for (parameter in request uri parameters) ------- -#set($varIndex = $partIndex - 1) -#set($uriVar = $uriVars.get($varIndex).replace('+', '')) -#set($greedySyntax = $uriVars.get($varIndex).contains("+")) -#if(!$skipFirst) -#set($partShapeMember = $operation.request.shape.getMemberByLocationName($uriVar)) -#if($partShapeMember.shape.enum) -#set($parameter = "${partShapeMember.shape.name}Mapper::GetNameFor${partShapeMember.shape.name}(request.Get${CppViewHelper.convertToUpperCamel($operation.request.shape.getMemberNameByLocationName($uriVar))}())") -#elseif($partShapeMember.shape.timeStamp) -#if($partShapeMember.shape.timestampFormat != "unixTimestamp") -#set($parameter = "request.Get${CppViewHelper.convertToUpperCamel($operation.request.shape.getMemberNameByLocationName($uriVar))}().ToGmtString(Aws::Utils::DateFormat::$CppViewHelper.computeTimestampFormatInQueryString($partShapeMember.shape))") -#else -#set($parameter = "request.Get${CppViewHelper.convertToUpperCamel($operation.request.shape.getMemberNameByLocationName($uriVar))}().Seconds()") -#end -#else -#set($parameter = "request.Get${CppViewHelper.convertToUpperCamel($operation.request.shape.getMemberNameByLocationName($uriVar))}()") -#end -#if($queryStart) -${indent} ss << $parameter; -#else -#if($greedySyntax) -#if($parameter.toLowerCase().contains("resourcearn")) -${indent} endpointResolutionOutcome.GetResult().SetRfc3986Encoded(true); -#end -${indent} endpointResolutionOutcome.GetResult().AddPathSegments($parameter); -#else -${indent} endpointResolutionOutcome.GetResult().AddPathSegment($parameter); -#end -#end -#if($uriParts.size() > $partIndex) -#set($uriPartString = "${uriParts.get($partIndex)}") -#if(!$queryStart && $uriPartString.contains("?")) -#set($queryStart = true) -#set($pathAndQuery = $operation.http.splitUriPartIntoPathAndQuery($uriPartString)) -#if(!$pathAndQuery.get(0).isEmpty()) -#if($pathAndQuery.get(0).toLowerCase().contains("resourcearn")) -${indent} endpointResolutionOutcome.GetResult().SetRfc3986Encoded(true); -#end -${indent} endpointResolutionOutcome.GetResult().AddPathSegments("${pathAndQuery.get(0)}"); -#end -${indent} ss.str("${pathAndQuery.get(1)}"); -#elseif(!$uriPartString.equals("/")) -#if($uriPartString.toLowerCase().contains("resourcearn")) -${indent} endpointResolutionOutcome.GetResult().SetRfc3986Encoded(true); -#end -${indent} endpointResolutionOutcome.GetResult().AddPathSegments("$uriPartString"); -#end -#end -#end## --------------------- if !skipFirst end --- -#set($partIndex = $partIndex + 1) -#set($skipFirst = false) -#end## --------------------- if uriParts.size() > startIndex end --- -#end## --------------------- for (parameter in request uri parameters) end --- -#if($queryStart) -${indent} endpointResolutionOutcome.GetResult().SetQueryString(ss.str()); -#end \ No newline at end of file +#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/UriRequestPathSegments.vm") diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/JsonServiceClientHeader.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/JsonServiceClientHeader.vm index 7443ba3fcc0d..8e23af794316 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/JsonServiceClientHeader.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/JsonServiceClientHeader.vm @@ -65,6 +65,8 @@ namespace ${serviceNamespace} void Load${metadata.classNamePrefix}SpecificConfig(const Aws::Client::ClientConfiguration& clientConfiguration); #end +#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationHeader.vm") + #if(!$serviceModel.endpointRules) #if($metadata.hasEndpointTrait) Aws::String m_baseUri; diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/JsonServiceClientSource.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/JsonServiceClientSource.vm index ad76a6a595ba..66f10d5bf636 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/JsonServiceClientSource.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/JsonServiceClientSource.vm @@ -53,6 +53,7 @@ const char* ${className}::GetServiceName() {return SERVICE_NAME;} const char* ${className}::GetAllocationTag() {return ALLOCATION_TAG;} #parseOverrideOrDefault( "ServiceClientSourceInit_template" "com/amazonaws/util/awsclientgenerator/velocity/cpp/ServiceClientSourceInit.vm") +#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationSource.vm") #end #parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/json/serviceoperations/JsonServiceOperationsSource.vm") diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/serviceoperations/withrequest/OperationOutcome.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/serviceoperations/withrequest/OperationOutcome.vm index 893f25b2404c..3d32632ef4b4 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/serviceoperations/withrequest/OperationOutcome.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/serviceoperations/withrequest/OperationOutcome.vm @@ -1,5 +1,8 @@ ${operation.name}Outcome ${className}::${operation.name}(${constText}${operation.request.shape.name}& request) const { +#if(!$operation.result.shape.hasEventStreamMembers() && !$operation.result.shape.hasStreamMembers()) + #parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationMethod.vm") +#else AWS_OPERATION_GUARD(${operation.name}); #parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceClientOperationRequestRequiredMemberValidate.vm") AWS_OPERATION_CHECK_PTR(m_telemetryProvider, ${operation.name}, CoreErrors, CoreErrors::NOT_INITIALIZED); @@ -47,4 +50,5 @@ ${operation.name}Outcome ${className}::${operation.name}(${constText}${operation TracingUtils::SMITHY_CLIENT_DURATION_METRIC, *meter, {{TracingUtils::SMITHY_METHOD_DIMENSION, request.GetServiceRequestName()}, {TracingUtils::SMITHY_SERVICE_DIMENSION, this->GetServiceClientName()}}); +#end } diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/rds/RDSClientHeader.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/rds/RDSClientHeader.vm index a307e775dbdd..2cef4ed87c6f 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/rds/RDSClientHeader.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/rds/RDSClientHeader.vm @@ -70,6 +70,8 @@ namespace ${rootNamespace} void Load${metadata.classNamePrefix}SpecificConfig(const Aws::Client::ClientConfiguration& clientConfiguration); #end +#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationHeader.vm") + #if(!$serviceModel.endpointRules) #if($metadata.hasEndpointTrait) Aws::String m_baseUri; diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/S3ClientHeader.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/S3ClientHeader.vm index c36eba7b1425..a0467a6dfb23 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/S3ClientHeader.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/S3ClientHeader.vm @@ -248,7 +248,7 @@ namespace ${rootNamespace} static void S3CrtRequestFinishCallback(struct aws_s3_meta_request *meta_request, const struct aws_s3_meta_request_result *meta_request_result, void *user_data); void InitCrtEndpointFromUri(aws_uri &endpoint_uri, const Aws::Http::URI &uri) const; - + void InitCommonCrtRequestOption(CrtRequestCallbackUserData *userData, aws_s3_meta_request_options *options, const Aws::AmazonWebServiceRequest *request, @@ -260,6 +260,9 @@ namespace ${rootNamespace} void init(const ${metadata.classNamePrefix}ClientConfiguration& clientConfiguration); #end #end + +#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationHeader.vm") + #if(!$serviceModel.endpointRules) void Load${metadata.classNamePrefix}SpecificConfig(const Aws::String& profile); ComputeEndpointOutcome ComputeEndpointString(const Aws::String& bucket) const; diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/SmithyS3ClientHeader.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/SmithyS3ClientHeader.vm index 9c06cbef8c38..b7efc350f766 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/SmithyS3ClientHeader.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/SmithyS3ClientHeader.vm @@ -261,7 +261,7 @@ namespace ${rootNamespace} static void S3CrtRequestFinishCallback(struct aws_s3_meta_request *meta_request, const struct aws_s3_meta_request_result *meta_request_result, void *user_data); void InitCrtEndpointFromUri(aws_uri &endpoint_uri, const Aws::Http::URI &uri) const; - + void InitCommonCrtRequestOption(CrtRequestCallbackUserData *userData, aws_s3_meta_request_options *options, const Aws::AmazonWebServiceRequest *request, @@ -273,6 +273,9 @@ namespace ${rootNamespace} void init(const ${metadata.classNamePrefix}ClientConfiguration& clientConfiguration); #end #end + +#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationHeader.vm") + #if(!$serviceModel.endpointRules) void Load${metadata.classNamePrefix}SpecificConfig(const Aws::String& profile); ComputeEndpointOutcome ComputeEndpointString(const Aws::String& bucket) const; diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/SmithyS3ClientSource.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/SmithyS3ClientSource.vm index 19ce697058ac..47d2d17ea39f 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/SmithyS3ClientSource.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/SmithyS3ClientSource.vm @@ -345,4 +345,6 @@ bool ${className}::MultipartUploadSupported() const { return true; } + +#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationSource.vm") #end diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3control/S3ControlClientHeader.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3control/S3ControlClientHeader.vm index 181dcb351dc4..45f919a4637b 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3control/S3ControlClientHeader.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3control/S3ControlClientHeader.vm @@ -97,6 +97,8 @@ namespace ${metadata.namespace} bool m_enableHostPrefixInjection = false; Aws::String m_configScheme; #end##-#if(!$serviceModel.endpointRules) +#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationHeader.vm") + #if($serviceModel.endpointRules) ${metadata.classNamePrefix}ClientConfiguration m_clientConfiguration; #end diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/smithy/SmithyRestXmlServiceClientOperations.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/smithy/SmithyRestXmlServiceClientOperations.vm index b18923213178..36d53f3baf4b 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/smithy/SmithyRestXmlServiceClientOperations.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/smithy/SmithyRestXmlServiceClientOperations.vm @@ -29,6 +29,9 @@ #if($operation.request) ${operation.name}Outcome ${className}::${operation.name}(${constText}${operation.request.shape.name}& request) const { +#if(!$operation.result.shape.hasEventStreamMembers() && !$operation.result.shape.hasStreamMembers()) + #parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationMethod.vm") +#else AWS_OPERATION_GUARD(${operation.name}); #parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceClientOperationRequestRequiredMemberValidate.vm") AWS_OPERATION_CHECK_PTR(m_clientConfiguration.telemetryProvider, ${operation.name}, CoreErrors, CoreErrors::NOT_INITIALIZED); @@ -61,7 +64,7 @@ ${operation.name}Outcome ${className}::${operation.name}(${constText}${operation ); return ${operation.name}Outcome(MakeRequestDeserialize(&${requestText}, ${requestText}.GetServiceRequestName(), Aws::Http::HttpMethod::HTTP_${operation.http.method}, [&](Aws::Endpoint::AWSEndpoint& resolvedEndpoint) -> void { #parse("/com/amazonaws/util/awsclientgenerator/velocity/cpp/smithy/SmithyEndpointClosure.vm") - })); + })); #elseif($operation.result && $operation.result.shape.hasStreamMembers()) return ${operation.name}Outcome(MakeRequestWithUnparsedResponse(&${requestText}, ${requestText}.GetServiceRequestName(), Aws::Http::HttpMethod::HTTP_${operation.http.method}, [&](Aws::Endpoint::AWSEndpoint& resolvedEndpoint) -> void { #parse("/com/amazonaws/util/awsclientgenerator/velocity/cpp/smithy/SmithyEndpointClosure.vm") @@ -75,6 +78,7 @@ ${operation.name}Outcome ${className}::${operation.name}(${constText}${operation TracingUtils::SMITHY_CLIENT_DURATION_METRIC, *meter, {{TracingUtils::SMITHY_METHOD_DIMENSION, request.GetServiceRequestName()}, {TracingUtils::SMITHY_SERVICE_DIMENSION, this->GetServiceClientName()}}); +#end } #parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/operation/withrequest/OperationOutcomeCallable.vm") diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/XmlServiceClientHeader.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/XmlServiceClientHeader.vm index cf41f98ab1a3..ee8cfb959f6e 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/XmlServiceClientHeader.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/XmlServiceClientHeader.vm @@ -72,6 +72,8 @@ namespace ${serviceNamespace} void Load${metadata.classNamePrefix}SpecificConfig(const Aws::Client::ClientConfiguration& clientConfiguration); #end +#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationHeader.vm") + #if(!$serviceModel.endpointRules) #if($metadata.hasEndpointTrait) Aws::String m_baseUri; diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/rest/RestXmlServiceClientOperations.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/rest/RestXmlServiceClientOperations.vm index 48c3c303fe71..9d812cfce115 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/rest/RestXmlServiceClientOperations.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/rest/RestXmlServiceClientOperations.vm @@ -28,6 +28,9 @@ #if($operation.request) ${operation.name}Outcome ${className}::${operation.name}(${constText}${operation.request.shape.name}& request) const { +#if(!$operation.result.shape.hasEventStreamMembers() && !$operation.result.shape.hasStreamMembers()) + #parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationMethod.vm") +#else AWS_OPERATION_GUARD(${operation.name}); #parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceClientOperationRequestRequiredMemberValidate.vm") AWS_OPERATION_CHECK_PTR(m_telemetryProvider, ${operation.name}, CoreErrors, CoreErrors::NOT_INITIALIZED); @@ -81,6 +84,7 @@ ${operation.name}Outcome ${className}::${operation.name}(${constText}${operation TracingUtils::SMITHY_CLIENT_DURATION_METRIC, *meter, {{TracingUtils::SMITHY_METHOD_DIMENSION, request.GetServiceRequestName()}, {TracingUtils::SMITHY_SERVICE_DIMENSION, this->GetServiceClientName()}}); +#end } #parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/operation/withrequest/OperationOutcomeCallable.vm") diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/rest/RestXmlServiceClientSource.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/rest/RestXmlServiceClientSource.vm index 5f6c18137b34..3aef6f1e91b8 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/rest/RestXmlServiceClientSource.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/rest/RestXmlServiceClientSource.vm @@ -83,6 +83,7 @@ Aws::String ${className}::ConvertRequestToPresignedUrl(const AmazonSerializableW } #end +#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationSource.vm") #end #if($serviceNamespace == "S3Crt") #parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/s3-crt/S3CrtSpecificOperations.vm") From 08656a7c7546e0f727a7bd849e24f29b2a793252 Mon Sep 17 00:00:00 2001 From: Elliot Date: Mon, 16 Mar 2026 21:22:48 -0400 Subject: [PATCH 2/2] Fix crashes in lambda integration test and fix presigned urls --- .../common/ServiceInvokeOperationHeader.vm | 5 ++- .../common/ServiceInvokeOperationMethod.vm | 44 +++++++++++++++---- .../common/ServiceInvokeOperationSource.vm | 8 ++-- 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationHeader.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationHeader.vm index bb0993cbc2c8..f6797c02ef0c 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationHeader.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationHeader.vm @@ -1,7 +1,8 @@ -typedef Aws::Utils::Outcome, ${metadata.classNamePrefix}Error> InvokeOutcome; +## Be careful to not have this outcome name clash with an operation outcome name (specifically lambda:Invoke) +typedef Aws::Utils::Outcome, ${metadata.classNamePrefix}Error> InvokeOperationOutcome; -InvokeOutcome InvokeServiceOperation( +InvokeOperationOutcome InvokeServiceOperation( const AmazonWebServiceRequest& request, #if($metadata.protocol == "rest-json" || $metadata.protocol == "rest-xml") const std::function& resolveUri, diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationMethod.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationMethod.vm index 32497e47db55..99e7e989af8e 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationMethod.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationMethod.vm @@ -1,12 +1,42 @@ -#if($metadata.protocol == "ec2" || $metadata.protocol == "json" || $metadata.protocol == "query" || $metadata.protocol == "smithy-rpc-v2-cbor") - #set($emitGenericOperation = true) - #parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceClientOperationRequestRequiredMemberValidate.vm") +#set($emitGenericOperation = true) +#parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceClientOperationRequestRequiredMemberValidate.vm") +#set($emitGenericOperation = false) + +#if($serviceModel.metadata.serviceId == "EC2") +#set($presignSpelling = "PresignedUrl") +#set($shouldGenerateUrl = "request.SourceRegionHasBeenSet()") +#else +#set($presignSpelling = "PreSignedUrl") +#set($shouldGenerateUrl = "request.SourceRegionHasBeenSet() && !request.${presignSpelling}HasBeenSet()") +#end + +## +## Handle presigned URL generation if the operation requires it +## + +#if($operation.hasPreSignedUrl) + if (${shouldGenerateUrl}) { + ${operation.request.shape.name} newRequest = request; + Aws::Endpoint::EndpointParameters endpointParameters; +#if($operation.staticContextParams) +#foreach($staticParamPair in $operation.staticContextParams.entrySet()) + parameters.emplace_back(Aws::String("${staticParamPair.key}"), ${staticParamPair.value.get("value").getValue()}); +#end +#end + endpointParameters.emplace_back(Aws::Endpoint::EndpointParameter("Region", request.GetSourceRegion())); + ResolveEndpointOutcome presignedEndpointResolutionOutcome = m_endpointProvider->ResolveEndpoint(endpointParameters); + AWS_OPERATION_CHECK_SUCCESS(presignedEndpointResolutionOutcome, ${operation.name}, CoreErrors, CoreErrors::ENDPOINT_RESOLUTION_FAILURE, presignedEndpointResolutionOutcome.GetError().GetMessage()); + newRequest.Set${presignSpelling}(GeneratePresignedUrl(request, presignedEndpointResolutionOutcome.GetResult().GetURI(), + Aws::Http::HttpMethod::HTTP_GET, request.GetSourceRegion().c_str(), + {{ "DestinationRegion", m_region }}, 3600)); + + return ${operation.name}Outcome{InvokeServiceOperation(newRequest, Aws::Http::HttpMethod::HTTP_${operation.http.method})}; + } +#end +#if($metadata.protocol == "ec2" || $metadata.protocol == "json" || $metadata.protocol == "query" || $metadata.protocol == "smithy-rpc-v2-cbor") return ${operation.name}Outcome{InvokeServiceOperation(request, Aws::Http::HttpMethod::HTTP_${operation.http.method})}; #elseif($metadata.protocol == "rest-json" || $metadata.protocol == "rest-xml") - #set($emitGenericOperation = true) - #parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceClientOperationRequestRequiredMemberValidate.vm") - auto uriResolver = [&](Aws::Endpoint::ResolveEndpointOutcome& endpointResolutionOutcome) { (void)endpointResolutionOutcome; #parse("com/amazonaws/util/awsclientgenerator/velocity/cpp/common/UriRequestPathSegments.vm") @@ -22,5 +52,3 @@ return ${operation.name}Outcome{InvokeServiceOperation(request, uriResolver, Aws::Http::HttpMethod::HTTP_${operation.http.method})}; #end #end - -#set($emitGenericOperation = false) diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationSource.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationSource.vm index 030f10b7791f..2f055aac4170 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationSource.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/common/ServiceInvokeOperationSource.vm @@ -1,4 +1,4 @@ -${className}::InvokeOutcome ${className}::InvokeServiceOperation( +${className}::InvokeOperationOutcome ${className}::InvokeServiceOperation( const AmazonWebServiceRequest& request, #if($metadata.protocol == "rest-json" || $metadata.protocol == "rest-xml") const std::function& resolveUri, @@ -38,8 +38,8 @@ ${className}::InvokeOutcome ${className}::InvokeServiceOperation( } #end - return TracingUtils::MakeCallWithTiming( - [&]() -> InvokeOutcome { + return TracingUtils::MakeCallWithTiming( + [&]() -> InvokeOperationOutcome { auto endpointResolutionOutcome = TracingUtils::MakeCallWithTiming( [&]() -> ResolveEndpointOutcome { return m_endpointProvider->ResolveEndpoint(request.GetEndpointContextParams()); }, TracingUtils::SMITHY_CLIENT_ENDPOINT_RESOLUTION_METRIC, *meter, @@ -58,7 +58,7 @@ ${className}::InvokeOutcome ${className}::InvokeServiceOperation( resolveUri(endpointResolutionOutcome); #end - return MakeRequest(request, endpointResolutionOutcome.GetResult(), httpMethod, Aws::Auth::SIGV4_SIGNER); + return InvokeOperationOutcome{MakeRequest(request, endpointResolutionOutcome.GetResult(), httpMethod, Aws::Auth::SIGV4_SIGNER)}; }, TracingUtils::SMITHY_CLIENT_DURATION_METRIC, *meter, {{TracingUtils::SMITHY_METHOD_DIMENSION, operationName},