From d46b4d5478ac81d8e5757c942e884e8702488ccf Mon Sep 17 00:00:00 2001 From: sbaluja Date: Fri, 10 Oct 2025 12:47:07 -0400 Subject: [PATCH 1/7] Fix CryptoBuffer bug with Cbor code gen --- .../awsclientgenerator/velocity/cpp/cbor/CborDecodeListValue.vm | 2 +- .../awsclientgenerator/velocity/cpp/cbor/CborDecodeMapValue.vm | 2 +- .../awsclientgenerator/velocity/cpp/cbor/CborDecodeValue.vm | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/cbor/CborDecodeListValue.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/cbor/CborDecodeListValue.vm index c6749db2804..9a47a159e28 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/cbor/CborDecodeListValue.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/cbor/CborDecodeListValue.vm @@ -70,7 +70,7 @@ if(peekType_${recursionDepth}.has_value()){ ss_${recursionDepth} << Aws::String(reinterpret_cast(${containerVar}.value().ptr), ${containerVar}.value().len); } } - ${value}.push_back(ss_${recursionDepth}.str()); + ${value}.push_back(Aws::Utils::ByteBuffer(ss_${recursionDepth}.str())); ss_${recursionDepth}.clear(); } } diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/cbor/CborDecodeMapValue.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/cbor/CborDecodeMapValue.vm index 7a0fa89d32e..29bd1683e13 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/cbor/CborDecodeMapValue.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/cbor/CborDecodeMapValue.vm @@ -73,7 +73,7 @@ if(peekType_${recursionDepth}){ ss_${recursionDepth} << Aws::String(reinterpret_cast(${containerVar}.value().ptr), ${containerVar}.value().len); } } - ${value}[keyStr_${recursionDepth}] = ss_${recursionDepth}.str(); + ${value}[keyStr_${recursionDepth}] = Aws::Utils::ByteBuffer(ss_${recursionDepth}.str()); ss_${recursionDepth}.clear(); } } diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/cbor/CborDecodeValue.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/cbor/CborDecodeValue.vm index fce4ca2d9dc..889f8cc1fb7 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/cbor/CborDecodeValue.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/cbor/CborDecodeValue.vm @@ -69,7 +69,7 @@ if (peekType.has_value()) { ss << Aws::String(reinterpret_cast(${containerVar}.value().ptr), ${containerVar}.value().len); } } - ${memberVarName} = ss.str(); + ${memberVarName} = Aws::Utils::ByteBuffer(ss.str()); ss.clear(); } } From 32fadb75faa9ca501273fcb5b426e769067eae4c Mon Sep 17 00:00:00 2001 From: sbaluja Date: Fri, 10 Oct 2025 12:47:36 -0400 Subject: [PATCH 2/7] Fix timestamp bug with Cbor code gen --- .../awsclientgenerator/velocity/cpp/cbor/CborEncodeValue.vm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/cbor/CborEncodeValue.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/cbor/CborEncodeValue.vm index 0f22e3523aa..279d4d3dc78 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/cbor/CborEncodeValue.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/cbor/CborEncodeValue.vm @@ -37,7 +37,7 @@ encoder.WriteFloat(${value}); #end #elseif($shapeMember.timeStamp) encoder.WriteTag(1); //1 represents Epoch-based date/time. See https://www.rfc-editor.org/rfc/rfc8949.html#tags -encoder.WriteUInt(${value}.Millis()); +encoder.WriteUInt(${value}.Seconds()); #else (${value} >= 0) ? encoder.WriteUInt(${value}) : encoder.WriteNegInt(${value}); #end \ No newline at end of file From 15eeb3dc57592dee3908229c0b001aed1653a011 Mon Sep 17 00:00:00 2001 From: sbaluja Date: Fri, 10 Oct 2025 12:51:44 -0400 Subject: [PATCH 3/7] Feature ID tracking for CBOR Removed magic strings "smithy-protocol" and "rpc-v2-cbor" and placed into Aws::Http::SMITHY_PROTOCOL_HEADER & Aws::RPC_V2_CBOR --- .../include/aws/core/AmazonSerializableWebServiceRequest.h | 1 + src/aws-cpp-sdk-core/include/aws/core/client/UserAgent.h | 1 + src/aws-cpp-sdk-core/include/aws/core/http/HttpRequest.h | 1 + src/aws-cpp-sdk-core/source/client/AWSClient.cpp | 5 +++++ src/aws-cpp-sdk-core/source/http/HttpRequest.cpp | 1 + .../generators/cpp/CborCppClientGenerator.java | 4 ++-- 6 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/aws-cpp-sdk-core/include/aws/core/AmazonSerializableWebServiceRequest.h b/src/aws-cpp-sdk-core/include/aws/core/AmazonSerializableWebServiceRequest.h index 15d576562ab..af85f4bf76b 100644 --- a/src/aws-cpp-sdk-core/include/aws/core/AmazonSerializableWebServiceRequest.h +++ b/src/aws-cpp-sdk-core/include/aws/core/AmazonSerializableWebServiceRequest.h @@ -21,6 +21,7 @@ namespace Aws static const char AMZN_XML_CONTENT_TYPE[] = "application/xml"; static const char AMZN_EVENTSTREAM_CONTENT_TYPE[] = "application/vnd.amazon.eventstream"; static const char CBOR_CONTENT_TYPE[] = "application/cbor"; + static const char RPC_V2_CBOR[] = "rpc-v2-cbor"; /** * High-level abstraction over AWS requests. GetBody() calls SerializePayload() and uses a stringbuf under the hood. diff --git a/src/aws-cpp-sdk-core/include/aws/core/client/UserAgent.h b/src/aws-cpp-sdk-core/include/aws/core/client/UserAgent.h index bbecace81fe..9d6120a3f69 100644 --- a/src/aws-cpp-sdk-core/include/aws/core/client/UserAgent.h +++ b/src/aws-cpp-sdk-core/include/aws/core/client/UserAgent.h @@ -42,6 +42,7 @@ enum class UserAgentFeature { CREDENTIALS_SSO, CREDENTIALS_SSO_LEGACY, CREDENTIALS_PROFILE_SOURCE_PROFILE, + PROTOCOL_RPC_V2_CBOR, }; class AWS_CORE_API UserAgent { diff --git a/src/aws-cpp-sdk-core/include/aws/core/http/HttpRequest.h b/src/aws-cpp-sdk-core/include/aws/core/http/HttpRequest.h index e73bfefe3d5..b7c431a30f3 100644 --- a/src/aws-cpp-sdk-core/include/aws/core/http/HttpRequest.h +++ b/src/aws-cpp-sdk-core/include/aws/core/http/HttpRequest.h @@ -59,6 +59,7 @@ namespace Aws extern AWS_CORE_API const char AWS_TRAILER_HEADER[]; extern AWS_CORE_API const char SDK_INVOCATION_ID_HEADER[]; extern AWS_CORE_API const char SDK_REQUEST_HEADER[]; + extern AWS_CORE_API const char SMITHY_PROTOCOL_HEADER[]; extern AWS_CORE_API const char X_AMZN_TRACE_ID_HEADER[]; extern AWS_CORE_API const char CHUNKED_VALUE[]; extern AWS_CORE_API const char AWS_CHUNKED_VALUE[]; diff --git a/src/aws-cpp-sdk-core/source/client/AWSClient.cpp b/src/aws-cpp-sdk-core/source/client/AWSClient.cpp index e91e84dbd22..1d4733f6eb6 100644 --- a/src/aws-cpp-sdk-core/source/client/AWSClient.cpp +++ b/src/aws-cpp-sdk-core/source/client/AWSClient.cpp @@ -927,6 +927,11 @@ void AWSClient::BuildHttpRequest(const Aws::AmazonWebServiceRequest& request, co } } + if (httpRequest->HasHeader(Aws::Http::SMITHY_PROTOCOL_HEADER)) + { + request.AddUserAgentFeature(Aws::Client::UserAgentFeature::PROTOCOL_RPC_V2_CBOR); + } + // Pass along handlers for processing data sent/received in bytes httpRequest->SetHeadersReceivedEventHandler(request.GetHeadersReceivedEventHandler()); httpRequest->SetDataReceivedEventHandler(request.GetDataReceivedEventHandler()); diff --git a/src/aws-cpp-sdk-core/source/http/HttpRequest.cpp b/src/aws-cpp-sdk-core/source/http/HttpRequest.cpp index 00a9bda9bfe..b4bfd5435c6 100644 --- a/src/aws-cpp-sdk-core/source/http/HttpRequest.cpp +++ b/src/aws-cpp-sdk-core/source/http/HttpRequest.cpp @@ -37,6 +37,7 @@ namespace Aws const char AWS_TRAILER_HEADER[] = "x-amz-trailer"; const char SDK_INVOCATION_ID_HEADER[] = "amz-sdk-invocation-id"; const char SDK_REQUEST_HEADER[] = "amz-sdk-request"; + const char SMITHY_PROTOCOL_HEADER[] = "smithy-protocol"; const char CHUNKED_VALUE[] = "chunked"; const char AWS_CHUNKED_VALUE[] = "aws-chunked"; const char X_AMZN_TRACE_ID_HEADER[] = "X-Amzn-Trace-Id"; diff --git a/tools/code-generation/generator/src/main/java/com/amazonaws/util/awsclientgenerator/generators/cpp/CborCppClientGenerator.java b/tools/code-generation/generator/src/main/java/com/amazonaws/util/awsclientgenerator/generators/cpp/CborCppClientGenerator.java index 7f1152f7631..737c3c989ad 100644 --- a/tools/code-generation/generator/src/main/java/com/amazonaws/util/awsclientgenerator/generators/cpp/CborCppClientGenerator.java +++ b/tools/code-generation/generator/src/main/java/com/amazonaws/util/awsclientgenerator/generators/cpp/CborCppClientGenerator.java @@ -122,7 +122,7 @@ protected SdkFileEntry generateModelSourceFile(ServiceModel serviceModel, Map.En HashMap headersMap = new HashMap<>(10); headersMap.put("Aws::Http::CONTENT_TYPE_HEADER", "Aws::AMZN_EVENTSTREAM_CONTENT_TYPE"); headersMap.put("Aws::Http::ACCEPT_HEADER", "Aws::AMZN_EVENTSTREAM_CONTENT_TYPE"); - headersMap.put("\"smithy-protocol\"", "\"rpc-v2-cbor\""); + headersMap.put("Aws::Http::SMITHY_PROTOCOL_HEADER", "Aws::RPC_V2_CBOR"); context.put("requestSpecificHeaders", headersMap); } template = velocityEngine.getTemplate("/com/amazonaws/util/awsclientgenerator/velocity/cpp/StreamRequestSource.vm", StandardCharsets.UTF_8.name()); @@ -130,7 +130,7 @@ protected SdkFileEntry generateModelSourceFile(ServiceModel serviceModel, Map.En else if (shape.isRequest()) { Map cborSpecificHeaders = new HashMap<>(); cborSpecificHeaders.put("Aws::Http::ACCEPT_HEADER", "Aws::CBOR_CONTENT_TYPE"); - cborSpecificHeaders.put("\"smithy-protocol\"", "\"rpc-v2-cbor\""); + cborSpecificHeaders.put("Aws::Http::SMITHY_PROTOCOL_HEADER", "Aws::RPC_V2_CBOR"); if(shape.hasMembers()){ cborSpecificHeaders.put("Aws::Http::CONTENT_TYPE_HEADER", "Aws::CBOR_CONTENT_TYPE"); } From f57b8cbc45f4ff50b1ae9ba798f7ee4d46e32780 Mon Sep 17 00:00:00 2001 From: sbaluja Date: Fri, 10 Oct 2025 12:53:16 -0400 Subject: [PATCH 4/7] Protocol selection priority update --- .../domainmodels/codegeneration/Metadata.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tools/code-generation/generator/src/main/java/com/amazonaws/util/awsclientgenerator/domainmodels/codegeneration/Metadata.java b/tools/code-generation/generator/src/main/java/com/amazonaws/util/awsclientgenerator/domainmodels/codegeneration/Metadata.java index ec498f77706..13de1f104b4 100644 --- a/tools/code-generation/generator/src/main/java/com/amazonaws/util/awsclientgenerator/domainmodels/codegeneration/Metadata.java +++ b/tools/code-generation/generator/src/main/java/com/amazonaws/util/awsclientgenerator/domainmodels/codegeneration/Metadata.java @@ -17,12 +17,12 @@ @Data public class Metadata { private static List supportedProtocols = ImmutableList.of( + "smithy-rpc-v2-cbor", "json", "rest-json", "rest-xml", "query", - "ec2", - "smithy-rpc-v2-cbor" + "ec2" ); private String apiVersion; @@ -72,6 +72,11 @@ public String findFirstSupportedProtocol() { return protocol; } + //We're releasing CBOR so current services (only arc-region-switch) need to opt into the new protocol priority + if (serviceFullName != null && serviceFullName.equalsIgnoreCase("ARC - Region switch")){ + return "json"; + } + return protocols.stream().filter(supportedProtocols::contains) .min(Comparator.comparingInt(protocolName -> supportedProtocols.indexOf(protocolName))) .orElseThrow(() -> new RuntimeException(String.format("No supported protocol found for %s", serviceFullName))); From abd0897eb1d936d1a90bb4e9f4e1f2bc8edd6364 Mon Sep 17 00:00:00 2001 From: sbaluja Date: Fri, 10 Oct 2025 13:00:54 -0400 Subject: [PATCH 5/7] Updated protocol tests --- .../aws-cpp-sdk-ec2-protocol/source/EC2ProtocolClient.cpp | 1 + .../source/JsonProtocolClient.cpp | 1 + .../aws-cpp-sdk-json-rpc-10/source/JSONRPC10Client.cpp | 1 + .../source/ProtocolMockClient.cpp | 1 + .../source/QueryCompatibleJSONRPC10Client.cpp | 1 + .../source/QueryProtocolClient.cpp | 1 + .../source/RestJsonProtocolClient.cpp | 1 + .../source/RestXmlProtocolClient.cpp | 1 + .../source/RpcV2ProtocolClient.cpp | 1 + .../source/model/EmptyInputOutputRequest.cpp | 2 +- .../source/model/Float16Request.cpp | 2 +- .../source/model/FractionalSecondsRequest.cpp | 2 +- .../source/model/GreetingWithErrorsRequest.cpp | 2 +- .../source/model/NoInputOutputRequest.cpp | 2 +- .../source/model/OptionalInputOutputRequest.cpp | 2 +- .../source/model/RecursiveShapesRequest.cpp | 2 +- .../source/model/RpcV2CborDenseMapsRequest.cpp | 2 +- .../source/model/RpcV2CborListsRequest.cpp | 4 ++-- .../source/model/RpcV2CborListsResult.cpp | 8 ++++---- .../source/model/SimpleScalarPropertiesRequest.cpp | 2 +- .../source/model/SimpleScalarPropertiesResult.cpp | 4 ++-- 21 files changed, 26 insertions(+), 17 deletions(-) diff --git a/generated/protocol-tests/test-clients/aws-cpp-sdk-ec2-protocol/source/EC2ProtocolClient.cpp b/generated/protocol-tests/test-clients/aws-cpp-sdk-ec2-protocol/source/EC2ProtocolClient.cpp index b20600c275d..00d6d2eeefe 100644 --- a/generated/protocol-tests/test-clients/aws-cpp-sdk-ec2-protocol/source/EC2ProtocolClient.cpp +++ b/generated/protocol-tests/test-clients/aws-cpp-sdk-ec2-protocol/source/EC2ProtocolClient.cpp @@ -157,6 +157,7 @@ void EC2ProtocolClient::init(const EC2Protocol::EC2ProtocolClientConfiguration& void EC2ProtocolClient::OverrideEndpoint(const Aws::String& endpoint) { AWS_CHECK_PTR(SERVICE_NAME, m_endpointProvider); + m_clientConfiguration.endpointOverride = endpoint; m_endpointProvider->OverrideEndpoint(endpoint); } diff --git a/generated/protocol-tests/test-clients/aws-cpp-sdk-json-protocol/source/JsonProtocolClient.cpp b/generated/protocol-tests/test-clients/aws-cpp-sdk-json-protocol/source/JsonProtocolClient.cpp index c3743c917db..e2b56d26e61 100644 --- a/generated/protocol-tests/test-clients/aws-cpp-sdk-json-protocol/source/JsonProtocolClient.cpp +++ b/generated/protocol-tests/test-clients/aws-cpp-sdk-json-protocol/source/JsonProtocolClient.cpp @@ -150,6 +150,7 @@ void JsonProtocolClient::init(const JsonProtocol::JsonProtocolClientConfiguratio void JsonProtocolClient::OverrideEndpoint(const Aws::String& endpoint) { AWS_CHECK_PTR(SERVICE_NAME, m_endpointProvider); + m_clientConfiguration.endpointOverride = endpoint; m_endpointProvider->OverrideEndpoint(endpoint); } diff --git a/generated/protocol-tests/test-clients/aws-cpp-sdk-json-rpc-10/source/JSONRPC10Client.cpp b/generated/protocol-tests/test-clients/aws-cpp-sdk-json-rpc-10/source/JSONRPC10Client.cpp index 26a486f810b..eaa643ff282 100644 --- a/generated/protocol-tests/test-clients/aws-cpp-sdk-json-rpc-10/source/JSONRPC10Client.cpp +++ b/generated/protocol-tests/test-clients/aws-cpp-sdk-json-rpc-10/source/JSONRPC10Client.cpp @@ -143,6 +143,7 @@ void JSONRPC10Client::init(const JSONRPC10::JSONRPC10ClientConfiguration& config void JSONRPC10Client::OverrideEndpoint(const Aws::String& endpoint) { AWS_CHECK_PTR(SERVICE_NAME, m_endpointProvider); + m_clientConfiguration.endpointOverride = endpoint; m_endpointProvider->OverrideEndpoint(endpoint); } diff --git a/generated/protocol-tests/test-clients/aws-cpp-sdk-protocol-mock/source/ProtocolMockClient.cpp b/generated/protocol-tests/test-clients/aws-cpp-sdk-protocol-mock/source/ProtocolMockClient.cpp index b5438904563..d0f97e56291 100644 --- a/generated/protocol-tests/test-clients/aws-cpp-sdk-protocol-mock/source/ProtocolMockClient.cpp +++ b/generated/protocol-tests/test-clients/aws-cpp-sdk-protocol-mock/source/ProtocolMockClient.cpp @@ -138,6 +138,7 @@ void ProtocolMockClient::init(const ProtocolMock::ProtocolMockClientConfiguratio void ProtocolMockClient::OverrideEndpoint(const Aws::String& endpoint) { AWS_CHECK_PTR(SERVICE_NAME, m_endpointProvider); + m_clientConfiguration.endpointOverride = endpoint; m_endpointProvider->OverrideEndpoint(endpoint); } diff --git a/generated/protocol-tests/test-clients/aws-cpp-sdk-query-compatible-json-rpc-10/source/QueryCompatibleJSONRPC10Client.cpp b/generated/protocol-tests/test-clients/aws-cpp-sdk-query-compatible-json-rpc-10/source/QueryCompatibleJSONRPC10Client.cpp index fa167389714..da371311f6e 100644 --- a/generated/protocol-tests/test-clients/aws-cpp-sdk-query-compatible-json-rpc-10/source/QueryCompatibleJSONRPC10Client.cpp +++ b/generated/protocol-tests/test-clients/aws-cpp-sdk-query-compatible-json-rpc-10/source/QueryCompatibleJSONRPC10Client.cpp @@ -142,6 +142,7 @@ void QueryCompatibleJSONRPC10Client::init(const QueryCompatibleJSONRPC10::QueryC void QueryCompatibleJSONRPC10Client::OverrideEndpoint(const Aws::String& endpoint) { AWS_CHECK_PTR(SERVICE_NAME, m_endpointProvider); + m_clientConfiguration.endpointOverride = endpoint; m_endpointProvider->OverrideEndpoint(endpoint); } diff --git a/generated/protocol-tests/test-clients/aws-cpp-sdk-query-protocol/source/QueryProtocolClient.cpp b/generated/protocol-tests/test-clients/aws-cpp-sdk-query-protocol/source/QueryProtocolClient.cpp index c4afd94e99c..c662f8adaa5 100644 --- a/generated/protocol-tests/test-clients/aws-cpp-sdk-query-protocol/source/QueryProtocolClient.cpp +++ b/generated/protocol-tests/test-clients/aws-cpp-sdk-query-protocol/source/QueryProtocolClient.cpp @@ -166,6 +166,7 @@ void QueryProtocolClient::init(const QueryProtocol::QueryProtocolClientConfigura void QueryProtocolClient::OverrideEndpoint(const Aws::String& endpoint) { AWS_CHECK_PTR(SERVICE_NAME, m_endpointProvider); + m_clientConfiguration.endpointOverride = endpoint; m_endpointProvider->OverrideEndpoint(endpoint); } diff --git a/generated/protocol-tests/test-clients/aws-cpp-sdk-rest-json-protocol/source/RestJsonProtocolClient.cpp b/generated/protocol-tests/test-clients/aws-cpp-sdk-rest-json-protocol/source/RestJsonProtocolClient.cpp index c48dc94ea33..b7cf08057a9 100644 --- a/generated/protocol-tests/test-clients/aws-cpp-sdk-rest-json-protocol/source/RestJsonProtocolClient.cpp +++ b/generated/protocol-tests/test-clients/aws-cpp-sdk-rest-json-protocol/source/RestJsonProtocolClient.cpp @@ -200,6 +200,7 @@ void RestJsonProtocolClient::init(const RestJsonProtocol::RestJsonProtocolClient void RestJsonProtocolClient::OverrideEndpoint(const Aws::String& endpoint) { AWS_CHECK_PTR(SERVICE_NAME, m_endpointProvider); + m_clientConfiguration.endpointOverride = endpoint; m_endpointProvider->OverrideEndpoint(endpoint); } diff --git a/generated/protocol-tests/test-clients/aws-cpp-sdk-rest-xml-protocol/source/RestXmlProtocolClient.cpp b/generated/protocol-tests/test-clients/aws-cpp-sdk-rest-xml-protocol/source/RestXmlProtocolClient.cpp index dae739c42f8..105515835c3 100644 --- a/generated/protocol-tests/test-clients/aws-cpp-sdk-rest-xml-protocol/source/RestXmlProtocolClient.cpp +++ b/generated/protocol-tests/test-clients/aws-cpp-sdk-rest-xml-protocol/source/RestXmlProtocolClient.cpp @@ -200,6 +200,7 @@ void RestXmlProtocolClient::init(const RestXmlProtocol::RestXmlProtocolClientCon void RestXmlProtocolClient::OverrideEndpoint(const Aws::String& endpoint) { AWS_CHECK_PTR(SERVICE_NAME, m_endpointProvider); + m_clientConfiguration.endpointOverride = endpoint; m_endpointProvider->OverrideEndpoint(endpoint); } diff --git a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/RpcV2ProtocolClient.cpp b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/RpcV2ProtocolClient.cpp index 6516e8bf568..11434b064fb 100644 --- a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/RpcV2ProtocolClient.cpp +++ b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/RpcV2ProtocolClient.cpp @@ -143,6 +143,7 @@ void RpcV2ProtocolClient::init(const RpcV2Protocol::RpcV2ProtocolClientConfigura void RpcV2ProtocolClient::OverrideEndpoint(const Aws::String& endpoint) { AWS_CHECK_PTR(SERVICE_NAME, m_endpointProvider); + m_clientConfiguration.endpointOverride = endpoint; m_endpointProvider->OverrideEndpoint(endpoint); } diff --git a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/EmptyInputOutputRequest.cpp b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/EmptyInputOutputRequest.cpp index d23680bd1e6..b8ab3636772 100644 --- a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/EmptyInputOutputRequest.cpp +++ b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/EmptyInputOutputRequest.cpp @@ -27,8 +27,8 @@ Aws::String EmptyInputOutputRequest::SerializePayload() const { Aws::Http::HeaderValueCollection EmptyInputOutputRequest::GetRequestSpecificHeaders() const { Aws::Http::HeaderValueCollection headers; - headers.emplace("smithy-protocol", "rpc-v2-cbor"); headers.emplace(Aws::Http::CONTENT_TYPE_HEADER, Aws::CBOR_CONTENT_TYPE); + headers.emplace(Aws::Http::SMITHY_PROTOCOL_HEADER, Aws::RPC_V2_CBOR); headers.emplace(Aws::Http::ACCEPT_HEADER, Aws::CBOR_CONTENT_TYPE); Aws::StringStream ss; if (m_requestIdHasBeenSet) { diff --git a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/Float16Request.cpp b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/Float16Request.cpp index 62ec8be55d3..81a6a52362d 100644 --- a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/Float16Request.cpp +++ b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/Float16Request.cpp @@ -16,7 +16,7 @@ Aws::String Float16Request::SerializePayload() const { return {}; } Aws::Http::HeaderValueCollection Float16Request::GetRequestSpecificHeaders() const { Aws::Http::HeaderValueCollection headers; - headers.emplace("smithy-protocol", "rpc-v2-cbor"); + headers.emplace(Aws::Http::SMITHY_PROTOCOL_HEADER, Aws::RPC_V2_CBOR); headers.emplace(Aws::Http::ACCEPT_HEADER, Aws::CBOR_CONTENT_TYPE); return headers; } diff --git a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/FractionalSecondsRequest.cpp b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/FractionalSecondsRequest.cpp index 63935e05541..da40c4ec6b6 100644 --- a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/FractionalSecondsRequest.cpp +++ b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/FractionalSecondsRequest.cpp @@ -16,7 +16,7 @@ Aws::String FractionalSecondsRequest::SerializePayload() const { return {}; } Aws::Http::HeaderValueCollection FractionalSecondsRequest::GetRequestSpecificHeaders() const { Aws::Http::HeaderValueCollection headers; - headers.emplace("smithy-protocol", "rpc-v2-cbor"); + headers.emplace(Aws::Http::SMITHY_PROTOCOL_HEADER, Aws::RPC_V2_CBOR); headers.emplace(Aws::Http::ACCEPT_HEADER, Aws::CBOR_CONTENT_TYPE); return headers; } diff --git a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/GreetingWithErrorsRequest.cpp b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/GreetingWithErrorsRequest.cpp index 73e9186a9e4..84600f78512 100644 --- a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/GreetingWithErrorsRequest.cpp +++ b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/GreetingWithErrorsRequest.cpp @@ -16,7 +16,7 @@ Aws::String GreetingWithErrorsRequest::SerializePayload() const { return {}; } Aws::Http::HeaderValueCollection GreetingWithErrorsRequest::GetRequestSpecificHeaders() const { Aws::Http::HeaderValueCollection headers; - headers.emplace("smithy-protocol", "rpc-v2-cbor"); + headers.emplace(Aws::Http::SMITHY_PROTOCOL_HEADER, Aws::RPC_V2_CBOR); headers.emplace(Aws::Http::ACCEPT_HEADER, Aws::CBOR_CONTENT_TYPE); return headers; } diff --git a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/NoInputOutputRequest.cpp b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/NoInputOutputRequest.cpp index 078573e0181..0cdf7ae540e 100644 --- a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/NoInputOutputRequest.cpp +++ b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/NoInputOutputRequest.cpp @@ -16,7 +16,7 @@ Aws::String NoInputOutputRequest::SerializePayload() const { return {}; } Aws::Http::HeaderValueCollection NoInputOutputRequest::GetRequestSpecificHeaders() const { Aws::Http::HeaderValueCollection headers; - headers.emplace("smithy-protocol", "rpc-v2-cbor"); + headers.emplace(Aws::Http::SMITHY_PROTOCOL_HEADER, Aws::RPC_V2_CBOR); headers.emplace(Aws::Http::ACCEPT_HEADER, Aws::CBOR_CONTENT_TYPE); return headers; } diff --git a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/OptionalInputOutputRequest.cpp b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/OptionalInputOutputRequest.cpp index 8b3b156856b..485a444bb26 100644 --- a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/OptionalInputOutputRequest.cpp +++ b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/OptionalInputOutputRequest.cpp @@ -35,8 +35,8 @@ Aws::String OptionalInputOutputRequest::SerializePayload() const { Aws::Http::HeaderValueCollection OptionalInputOutputRequest::GetRequestSpecificHeaders() const { Aws::Http::HeaderValueCollection headers; - headers.emplace("smithy-protocol", "rpc-v2-cbor"); headers.emplace(Aws::Http::CONTENT_TYPE_HEADER, Aws::CBOR_CONTENT_TYPE); + headers.emplace(Aws::Http::SMITHY_PROTOCOL_HEADER, Aws::RPC_V2_CBOR); headers.emplace(Aws::Http::ACCEPT_HEADER, Aws::CBOR_CONTENT_TYPE); Aws::StringStream ss; if (m_requestIdHasBeenSet) { diff --git a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/RecursiveShapesRequest.cpp b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/RecursiveShapesRequest.cpp index e38d14736a1..39098a1481a 100644 --- a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/RecursiveShapesRequest.cpp +++ b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/RecursiveShapesRequest.cpp @@ -35,8 +35,8 @@ Aws::String RecursiveShapesRequest::SerializePayload() const { Aws::Http::HeaderValueCollection RecursiveShapesRequest::GetRequestSpecificHeaders() const { Aws::Http::HeaderValueCollection headers; - headers.emplace("smithy-protocol", "rpc-v2-cbor"); headers.emplace(Aws::Http::CONTENT_TYPE_HEADER, Aws::CBOR_CONTENT_TYPE); + headers.emplace(Aws::Http::SMITHY_PROTOCOL_HEADER, Aws::RPC_V2_CBOR); headers.emplace(Aws::Http::ACCEPT_HEADER, Aws::CBOR_CONTENT_TYPE); Aws::StringStream ss; if (m_requestIdHasBeenSet) { diff --git a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/RpcV2CborDenseMapsRequest.cpp b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/RpcV2CborDenseMapsRequest.cpp index 5bf051f3145..09618eed06c 100644 --- a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/RpcV2CborDenseMapsRequest.cpp +++ b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/RpcV2CborDenseMapsRequest.cpp @@ -90,8 +90,8 @@ Aws::String RpcV2CborDenseMapsRequest::SerializePayload() const { Aws::Http::HeaderValueCollection RpcV2CborDenseMapsRequest::GetRequestSpecificHeaders() const { Aws::Http::HeaderValueCollection headers; - headers.emplace("smithy-protocol", "rpc-v2-cbor"); headers.emplace(Aws::Http::CONTENT_TYPE_HEADER, Aws::CBOR_CONTENT_TYPE); + headers.emplace(Aws::Http::SMITHY_PROTOCOL_HEADER, Aws::RPC_V2_CBOR); headers.emplace(Aws::Http::ACCEPT_HEADER, Aws::CBOR_CONTENT_TYPE); Aws::StringStream ss; if (m_requestIdHasBeenSet) { diff --git a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/RpcV2CborListsRequest.cpp b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/RpcV2CborListsRequest.cpp index d7039632c98..01f776f7b7b 100644 --- a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/RpcV2CborListsRequest.cpp +++ b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/RpcV2CborListsRequest.cpp @@ -89,7 +89,7 @@ Aws::String RpcV2CborListsRequest::SerializePayload() const { encoder.WriteArrayStart(m_timestampList.size()); for (const auto& item_0 : m_timestampList) { encoder.WriteTag(1); // 1 represents Epoch-based date/time. See https://www.rfc-editor.org/rfc/rfc8949.html#tags - encoder.WriteUInt(item_0.Millis()); + encoder.WriteUInt(item_0.Seconds()); } } @@ -142,8 +142,8 @@ Aws::String RpcV2CborListsRequest::SerializePayload() const { Aws::Http::HeaderValueCollection RpcV2CborListsRequest::GetRequestSpecificHeaders() const { Aws::Http::HeaderValueCollection headers; - headers.emplace("smithy-protocol", "rpc-v2-cbor"); headers.emplace(Aws::Http::CONTENT_TYPE_HEADER, Aws::CBOR_CONTENT_TYPE); + headers.emplace(Aws::Http::SMITHY_PROTOCOL_HEADER, Aws::RPC_V2_CBOR); headers.emplace(Aws::Http::ACCEPT_HEADER, Aws::CBOR_CONTENT_TYPE); Aws::StringStream ss; if (m_requestIdHasBeenSet) { diff --git a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/RpcV2CborListsResult.cpp b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/RpcV2CborListsResult.cpp index 6a1177812b0..75afa15e390 100644 --- a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/RpcV2CborListsResult.cpp +++ b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/RpcV2CborListsResult.cpp @@ -692,7 +692,7 @@ RpcV2CborListsResult& RpcV2CborListsResult::operator=(const Aws::AmazonWebServic ss_1 << Aws::String(reinterpret_cast(val.value().ptr), val.value().len); } } - m_blobList.push_back(ss_1.str()); + m_blobList.push_back(Aws::Utils::ByteBuffer(ss_1.str())); ss_1.clear(); } } @@ -732,7 +732,7 @@ RpcV2CborListsResult& RpcV2CborListsResult::operator=(const Aws::AmazonWebServic ss_1 << Aws::String(reinterpret_cast(val.value().ptr), val.value().len); } } - m_blobList.push_back(ss_1.str()); + m_blobList.push_back(Aws::Utils::ByteBuffer(ss_1.str())); ss_1.clear(); } } @@ -1453,7 +1453,7 @@ RpcV2CborListsResult& RpcV2CborListsResult::operator=(const Aws::AmazonWebServic ss_1 << Aws::String(reinterpret_cast(val.value().ptr), val.value().len); } } - m_blobList.push_back(ss_1.str()); + m_blobList.push_back(Aws::Utils::ByteBuffer(ss_1.str())); ss_1.clear(); } } @@ -1493,7 +1493,7 @@ RpcV2CborListsResult& RpcV2CborListsResult::operator=(const Aws::AmazonWebServic ss_1 << Aws::String(reinterpret_cast(val.value().ptr), val.value().len); } } - m_blobList.push_back(ss_1.str()); + m_blobList.push_back(Aws::Utils::ByteBuffer(ss_1.str())); ss_1.clear(); } } diff --git a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/SimpleScalarPropertiesRequest.cpp b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/SimpleScalarPropertiesRequest.cpp index 3936ac6dc54..828b291f01d 100644 --- a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/SimpleScalarPropertiesRequest.cpp +++ b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/SimpleScalarPropertiesRequest.cpp @@ -108,8 +108,8 @@ Aws::String SimpleScalarPropertiesRequest::SerializePayload() const { Aws::Http::HeaderValueCollection SimpleScalarPropertiesRequest::GetRequestSpecificHeaders() const { Aws::Http::HeaderValueCollection headers; - headers.emplace("smithy-protocol", "rpc-v2-cbor"); headers.emplace(Aws::Http::CONTENT_TYPE_HEADER, Aws::CBOR_CONTENT_TYPE); + headers.emplace(Aws::Http::SMITHY_PROTOCOL_HEADER, Aws::RPC_V2_CBOR); headers.emplace(Aws::Http::ACCEPT_HEADER, Aws::CBOR_CONTENT_TYPE); Aws::StringStream ss; if (m_requestIdHasBeenSet) { diff --git a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/SimpleScalarPropertiesResult.cpp b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/SimpleScalarPropertiesResult.cpp index fa3bd20cbb9..a8bf8f3c51e 100644 --- a/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/SimpleScalarPropertiesResult.cpp +++ b/generated/protocol-tests/test-clients/aws-cpp-sdk-rpcv2protocol/source/model/SimpleScalarPropertiesResult.cpp @@ -199,7 +199,7 @@ SimpleScalarPropertiesResult& SimpleScalarPropertiesResult::operator=( ss << Aws::String(reinterpret_cast(val.value().ptr), val.value().len); } } - m_blobValue = ss.str(); + m_blobValue = Aws::Utils::ByteBuffer(ss.str()); ss.clear(); } } @@ -421,7 +421,7 @@ SimpleScalarPropertiesResult& SimpleScalarPropertiesResult::operator=( ss << Aws::String(reinterpret_cast(val.value().ptr), val.value().len); } } - m_blobValue = ss.str(); + m_blobValue = Aws::Utils::ByteBuffer(ss.str()); ss.clear(); } } From 685ce86f489b0eda0da18d7a2ae2e1dd12ac0797 Mon Sep 17 00:00:00 2001 From: sbaluja Date: Mon, 13 Oct 2025 13:48:50 -0400 Subject: [PATCH 6/7] user agent metric mapping for CBOR --- src/aws-cpp-sdk-core/source/client/UserAgent.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/aws-cpp-sdk-core/source/client/UserAgent.cpp b/src/aws-cpp-sdk-core/source/client/UserAgent.cpp index a3853061677..58a1cce077a 100644 --- a/src/aws-cpp-sdk-core/source/client/UserAgent.cpp +++ b/src/aws-cpp-sdk-core/source/client/UserAgent.cpp @@ -52,6 +52,7 @@ const std::pair BUSINESS_METRIC_MAPPING[] = { {UserAgentFeature::CREDENTIALS_SSO, "s"}, {UserAgentFeature::CREDENTIALS_SSO_LEGACY, "u"}, {UserAgentFeature::CREDENTIALS_PROFILE_SOURCE_PROFILE, "p"}, + {UserAgentFeature::PROTOCOL_RPC_V2_CBOR, "M"}, }; const std::pair RETRY_FEATURE_MAPPING[] = { From 6c9b368947b63453e3974bee63d374ff01cc9985 Mon Sep 17 00:00:00 2001 From: sbaluja Date: Mon, 13 Oct 2025 13:49:24 -0400 Subject: [PATCH 7/7] User agent test for CBOR --- .../aws/client/AWSClientTest.cpp | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/tests/aws-cpp-sdk-core-tests/aws/client/AWSClientTest.cpp b/tests/aws-cpp-sdk-core-tests/aws/client/AWSClientTest.cpp index fe09669f3a0..b5e3cf741a5 100644 --- a/tests/aws-cpp-sdk-core-tests/aws/client/AWSClientTest.cpp +++ b/tests/aws-cpp-sdk-core-tests/aws/client/AWSClientTest.cpp @@ -24,6 +24,7 @@ #include #include #include +#include using namespace Aws; @@ -519,6 +520,30 @@ TEST_F(AWSClientTestSuite, TestRecursionDetection) mockHttpClient->Reset(); } } + +TEST_F(AWSClientTestSuite, TestCborUserAgent) +{ + HeaderValueCollection responseHeaders; + AmazonWebServiceRequestMock request; + request.SetAdditionalCustomHeaderValue(Aws::Http::SMITHY_PROTOCOL_HEADER, Aws::RPC_V2_CBOR); + QueueMockResponse(HttpResponseCode::OK, responseHeaders); + auto outcome = client->MakeRequest(request); + + auto lastRequest = mockHttpClient->GetMostRecentHttpRequest(); + EXPECT_TRUE(lastRequest.HasUserAgent()); + const auto& userAgent = lastRequest.GetUserAgent(); + EXPECT_TRUE(!userAgent.empty()); + + const auto userAgentParsed = Aws::Utils::StringUtils::Split(userAgent, ' '); + + EXPECT_TRUE(!Aws::Client::UserAgent::BusinessMetricForFeature(UserAgentFeature::PROTOCOL_RPC_V2_CBOR).empty()); + // Check for CBOR protocol business metric (M) in user agent + auto businessMetrics = std::find_if(userAgentParsed.begin(), userAgentParsed.end(), + [](const Aws::String& value) { return value.find("m/") != Aws::String::npos && value.find(Aws::Client::UserAgent::BusinessMetricForFeature(UserAgentFeature::PROTOCOL_RPC_V2_CBOR)) != Aws::String::npos; }); + + EXPECT_TRUE(businessMetrics != userAgentParsed.end()); + +} using namespace Aws::Utils::Xml; TEST_F(XMLClientTestSuite, TestErrorInBodyOfResponse) {