@@ -55,6 +55,18 @@ bool getUpstreamSslAttribute(
5555 return true ;
5656}
5757
58+ // Resolve a dynamic metadata value by filter name and dotted key path. Returns an unset value
59+ // when the path is absent.
60+ const Protobuf::Value& dynamicMetadataValue (const StreamInfo::StreamInfo& stream_info,
61+ envoy_dynamic_module_type_module_buffer filter_name,
62+ envoy_dynamic_module_type_module_buffer path) {
63+ std::string filter_name_str (filter_name.ptr , filter_name.length );
64+ std::string path_str (path.ptr , path.length );
65+ std::vector<std::string> path_parts = absl::StrSplit (path_str, ' .' );
66+ const auto & metadata = stream_info.dynamicMetadata ();
67+ return Envoy::Config::Metadata::metadataValue (&metadata, filter_name_str, path_parts);
68+ }
69+
5870} // namespace
5971
6072HeadersMapOptConstRef
@@ -474,26 +486,37 @@ bool ContextAccessor::getDynamicMetadata(const StreamInfo::StreamInfo& stream_in
474486 envoy_dynamic_module_type_module_buffer filter_name,
475487 envoy_dynamic_module_type_module_buffer path,
476488 envoy_dynamic_module_type_envoy_buffer* result) {
477- std::string filter_name_str (filter_name.ptr , filter_name.length );
478- std::string path_str (path.ptr , path.length );
479- std::vector<std::string> path_parts = absl::StrSplit (path_str, ' .' );
480-
481- const auto & metadata = stream_info.dynamicMetadata ();
482- const auto & value =
483- Envoy::Config::Metadata::metadataValue (&metadata, filter_name_str, path_parts);
484-
485- if (value.kind_case () == Protobuf::Value::KIND_NOT_SET ) {
486- return false ;
487- }
488-
489- // Note: Currently only string values are supported. Complex types would require serialization
490- // to a buffer, but the ABI uses zero-copy pointers to Envoy memory.
489+ // String values are returned zero-copy here. Numbers and bools have dedicated typed accessors.
490+ const auto & value = dynamicMetadataValue (stream_info, filter_name, path);
491491 if (value.kind_case () == Protobuf::Value::kStringValue ) {
492492 const auto & str = value.string_value ();
493493 *result = {const_cast <char *>(str.data ()), str.size ()};
494494 return true ;
495495 }
496+ return false ;
497+ }
498+
499+ bool ContextAccessor::getDynamicMetadataNumber (const StreamInfo::StreamInfo& stream_info,
500+ envoy_dynamic_module_type_module_buffer filter_name,
501+ envoy_dynamic_module_type_module_buffer path,
502+ double * result) {
503+ const auto & value = dynamicMetadataValue (stream_info, filter_name, path);
504+ if (value.kind_case () == Protobuf::Value::kNumberValue ) {
505+ *result = value.number_value ();
506+ return true ;
507+ }
508+ return false ;
509+ }
496510
511+ bool ContextAccessor::getDynamicMetadataBool (const StreamInfo::StreamInfo& stream_info,
512+ envoy_dynamic_module_type_module_buffer filter_name,
513+ envoy_dynamic_module_type_module_buffer path,
514+ bool * result) {
515+ const auto & value = dynamicMetadataValue (stream_info, filter_name, path);
516+ if (value.kind_case () == Protobuf::Value::kBoolValue ) {
517+ *result = value.bool_value ();
518+ return true ;
519+ }
497520 return false ;
498521}
499522
0 commit comments