grpc 1.75.0.pre1 → 1.76.0.pre1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Makefile +18 -5
- data/include/grpc/credentials.h +21 -5
- data/src/core/call/call_filters.cc +4 -4
- data/src/core/call/call_filters.h +36 -36
- data/src/core/call/call_spine.h +27 -27
- data/src/core/call/client_call.cc +6 -5
- data/src/core/call/filter_fusion.h +5 -5
- data/src/core/call/metadata_batch.h +3 -3
- data/src/core/call/security_context.cc +1 -1
- data/src/core/call/server_call.cc +4 -4
- data/src/core/call/server_call.h +1 -1
- data/src/core/channelz/channelz.cc +12 -18
- data/src/core/channelz/channelz.h +32 -16
- data/src/core/channelz/channelz_registry.h +11 -0
- data/src/core/channelz/property_list.cc +18 -0
- data/src/core/channelz/property_list.h +10 -1
- data/src/core/channelz/text_encode.cc +66 -0
- data/src/core/channelz/text_encode.h +29 -0
- data/src/core/channelz/v2tov1/convert.cc +11 -0
- data/src/core/channelz/v2tov1/legacy_api.cc +15 -8
- data/src/core/channelz/ztrace_collector.h +247 -86
- data/src/core/client_channel/backup_poller.cc +5 -6
- data/src/core/client_channel/client_channel.cc +20 -13
- data/src/core/client_channel/client_channel_filter.cc +53 -45
- data/src/core/client_channel/client_channel_filter.h +2 -2
- data/src/core/client_channel/client_channel_internal.h +3 -4
- data/src/core/client_channel/config_selector.h +3 -3
- data/src/core/client_channel/dynamic_filters.cc +3 -3
- data/src/core/client_channel/global_subchannel_pool.cc +0 -37
- data/src/core/client_channel/global_subchannel_pool.h +0 -27
- data/src/core/client_channel/load_balanced_call_destination.cc +7 -7
- data/src/core/client_channel/local_subchannel_pool.cc +4 -4
- data/src/core/client_channel/retry_filter.h +3 -3
- data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -5
- data/src/core/client_channel/subchannel.cc +8 -8
- data/src/core/client_channel/subchannel_stream_client.cc +4 -4
- data/src/core/config/config_vars.cc +30 -1
- data/src/core/config/config_vars.h +21 -0
- data/src/core/config/core_configuration.cc +5 -5
- data/src/core/config/core_configuration.h +7 -7
- data/src/core/config/load_config.cc +12 -0
- data/src/core/config/load_config.h +2 -0
- data/src/core/credentials/call/call_credentials.h +2 -2
- data/src/core/credentials/call/call_creds_util.cc +4 -3
- data/src/core/credentials/call/composite/composite_call_credentials.cc +4 -4
- data/src/core/credentials/call/external/aws_external_account_credentials.cc +3 -3
- data/src/core/credentials/call/external/external_account_credentials.cc +1 -1
- data/src/core/credentials/call/external/url_external_account_credentials.cc +1 -1
- data/src/core/credentials/call/iam/iam_credentials.cc +4 -4
- data/src/core/credentials/call/jwt/json_token.cc +3 -3
- data/src/core/credentials/call/jwt/jwt_credentials.cc +2 -2
- data/src/core/credentials/call/jwt/jwt_verifier.cc +14 -13
- data/src/core/credentials/call/oauth2/oauth2_credentials.cc +20 -12
- data/src/core/credentials/call/plugin/plugin_credentials.cc +2 -2
- data/src/core/credentials/transport/alts/alts_credentials.cc +4 -4
- data/src/core/credentials/transport/alts/alts_security_connector.cc +14 -12
- data/src/core/credentials/transport/alts/grpc_alts_credentials_client_options.cc +22 -2
- data/src/core/credentials/transport/alts/grpc_alts_credentials_options.cc +10 -1
- data/src/core/credentials/transport/alts/grpc_alts_credentials_options.h +31 -0
- data/src/core/credentials/transport/alts/grpc_alts_credentials_server_options.cc +8 -3
- data/src/core/credentials/transport/composite/composite_channel_credentials.cc +5 -5
- data/src/core/credentials/transport/fake/fake_security_connector.cc +2 -2
- data/src/core/credentials/transport/google_default/google_default_credentials.cc +78 -28
- data/src/core/credentials/transport/insecure/insecure_security_connector.cc +3 -3
- data/src/core/credentials/transport/local/local_security_connector.cc +8 -8
- data/src/core/credentials/transport/security_connector.cc +5 -5
- data/src/core/credentials/transport/ssl/ssl_credentials.cc +12 -12
- data/src/core/credentials/transport/ssl/ssl_credentials.h +2 -2
- data/src/core/credentials/transport/ssl/ssl_security_connector.cc +3 -3
- data/src/core/credentials/transport/tls/certificate_provider_registry.cc +2 -2
- data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +24 -24
- data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +5 -5
- data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +2 -2
- data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.cc +2 -2
- data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.h +2 -2
- data/src/core/credentials/transport/tls/grpc_tls_credentials_options.cc +17 -17
- data/src/core/credentials/transport/tls/ssl_utils.cc +14 -9
- data/src/core/credentials/transport/tls/tls_credentials.cc +2 -2
- data/src/core/credentials/transport/tls/tls_security_connector.cc +11 -11
- data/src/core/credentials/transport/transport_credentials.cc +2 -2
- data/src/core/credentials/transport/transport_credentials.h +2 -2
- data/src/core/credentials/transport/xds/xds_credentials.cc +5 -5
- data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +2 -0
- data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +1 -1
- data/src/core/ext/filters/http/message_compress/compression_filter.cc +8 -8
- data/src/core/ext/filters/http/message_compress/compression_filter.h +3 -3
- data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +7 -7
- data/src/core/ext/transport/chttp2/alpn/alpn.cc +2 -2
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +10 -9
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +10 -7
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +5 -5
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +6 -6
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +96 -88
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/flow_control.h +12 -7
- data/src/core/ext/transport/chttp2/transport/flow_control_manager.h +60 -0
- data/src/core/ext/transport/chttp2/transport/frame.cc +32 -10
- data/src/core/ext/transport/chttp2/transport/frame.h +16 -2
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +4 -4
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/header_assembler.h +28 -12
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -2
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +8 -8
- data/src/core/ext/transport/chttp2/transport/hpack_parse_result.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +2 -2
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -27
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -3
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +4 -4
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +543 -366
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +198 -277
- data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +3 -0
- data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +11 -0
- data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +179 -0
- data/src/core/ext/transport/chttp2/transport/http2_transport.cc +51 -23
- data/src/core/ext/transport/chttp2/transport/http2_transport.h +13 -6
- data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +115 -71
- data/src/core/ext/transport/chttp2/transport/internal.h +6 -14
- data/src/core/ext/transport/chttp2/transport/message_assembler.h +7 -7
- data/src/core/ext/transport/chttp2/transport/parsing.cc +17 -15
- data/src/core/ext/transport/chttp2/transport/ping_callbacks.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/ping_promise.cc +62 -26
- data/src/core/ext/transport/chttp2/transport/ping_promise.h +58 -22
- data/src/core/ext/transport/chttp2/transport/stream.h +207 -0
- data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +328 -187
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +7 -7
- data/src/core/ext/transport/chttp2/transport/transport_common.cc +17 -1
- data/src/core/ext/transport/chttp2/transport/transport_common.h +52 -0
- data/src/core/ext/transport/chttp2/transport/varint.h +2 -2
- data/src/core/ext/transport/chttp2/transport/writable_streams.h +181 -79
- data/src/core/ext/transport/chttp2/transport/write_size_policy.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/writing.cc +3 -3
- data/src/core/ext/transport/inproc/inproc_transport.cc +1 -1
- data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +3 -3
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb.h +740 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.c +218 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.h +46 -0
- data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb.h +87 -55
- data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb_minitable.c +23 -21
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.c +80 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.h +47 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.c +129 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.h +72 -0
- data/src/core/filter/auth/server_auth_filter.cc +2 -2
- data/src/core/handshaker/handshaker.cc +3 -3
- data/src/core/handshaker/http_connect/http_proxy_mapper.cc +2 -2
- data/src/core/handshaker/security/legacy_secure_endpoint.cc +2 -2
- data/src/core/handshaker/security/pipelined_secure_endpoint.cc +31 -8
- data/src/core/handshaker/security/secure_endpoint.cc +16 -6
- data/src/core/handshaker/security/security_handshaker.cc +3 -3
- data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +2 -2
- data/src/core/lib/channel/channel_stack.cc +8 -5
- data/src/core/lib/channel/channel_stack.h +3 -0
- data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -0
- data/src/core/lib/channel/connected_channel.cc +2 -2
- data/src/core/lib/channel/promise_based_filter.cc +69 -64
- data/src/core/lib/channel/promise_based_filter.h +16 -15
- data/src/core/lib/compression/compression_internal.cc +2 -2
- data/src/core/lib/compression/message_compress.cc +7 -7
- data/src/core/lib/event_engine/ares_resolver.cc +22 -20
- data/src/core/lib/event_engine/cf_engine/cf_engine.cc +2 -2
- data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +2 -2
- data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +2 -2
- data/src/core/lib/event_engine/extensions/channelz.h +2 -2
- data/src/core/lib/event_engine/extensions/supports_fd.h +5 -5
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +8 -8
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +10 -10
- data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +2 -2
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +23 -22
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +11 -11
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +168 -170
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +33 -54
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +4 -3
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +5 -5
- data/src/core/lib/event_engine/posix_engine/posix_interface.h +1 -1
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1 -1
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +3 -3
- data/src/core/lib/event_engine/resolved_address.cc +3 -3
- data/src/core/lib/event_engine/shim.cc +8 -11
- data/src/core/lib/event_engine/shim.h +2 -1
- data/src/core/lib/event_engine/slice.cc +2 -2
- data/src/core/lib/event_engine/tcp_socket_utils.cc +11 -11
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +7 -7
- data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +31 -31
- data/src/core/lib/event_engine/windows/iocp.cc +10 -10
- data/src/core/lib/event_engine/windows/win_socket.cc +6 -6
- data/src/core/lib/event_engine/windows/windows_endpoint.cc +11 -11
- data/src/core/lib/event_engine/windows/windows_engine.cc +16 -14
- data/src/core/lib/event_engine/windows/windows_listener.cc +7 -7
- data/src/core/lib/experiments/experiments.cc +105 -18
- data/src/core/lib/experiments/experiments.h +43 -11
- data/src/core/lib/iomgr/call_combiner.cc +3 -3
- data/src/core/lib/iomgr/endpoint_cfstream.cc +6 -6
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +5 -5
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +15 -14
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +15 -15
- data/src/core/lib/iomgr/ev_poll_posix.cc +11 -11
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +5 -4
- data/src/core/lib/iomgr/event_engine_shims/endpoint.h +1 -1
- data/src/core/lib/iomgr/iocp_windows.cc +8 -8
- data/src/core/lib/iomgr/iomgr_windows.cc +3 -3
- data/src/core/lib/iomgr/lockfree_event.cc +2 -2
- data/src/core/lib/iomgr/polling_entity.cc +3 -3
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +2 -2
- data/src/core/lib/iomgr/socket_windows.cc +4 -4
- data/src/core/lib/iomgr/tcp_client_posix.cc +4 -4
- data/src/core/lib/iomgr/tcp_client_windows.cc +4 -4
- data/src/core/lib/iomgr/tcp_posix.cc +42 -42
- data/src/core/lib/iomgr/tcp_server.cc +5 -0
- data/src/core/lib/iomgr/tcp_server.h +7 -0
- data/src/core/lib/iomgr/tcp_server_posix.cc +47 -27
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -5
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
- data/src/core/lib/iomgr/tcp_server_windows.cc +68 -29
- data/src/core/lib/iomgr/tcp_windows.cc +7 -7
- data/src/core/lib/iomgr/timer_generic.cc +2 -2
- data/src/core/lib/iomgr/timer_manager.cc +2 -2
- data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -2
- data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +2 -2
- data/src/core/lib/promise/activity.cc +2 -2
- data/src/core/lib/promise/activity.h +6 -6
- data/src/core/lib/promise/context.h +2 -2
- data/src/core/lib/promise/detail/join_state.h +9 -9
- data/src/core/lib/promise/detail/seq_state.h +13 -13
- data/src/core/lib/promise/detail/status.h +2 -2
- data/src/core/lib/promise/for_each.h +5 -5
- data/src/core/lib/promise/interceptor_list.h +2 -2
- data/src/core/lib/promise/latch.h +7 -7
- data/src/core/lib/promise/mpsc.cc +26 -26
- data/src/core/lib/promise/mpsc.h +2 -2
- data/src/core/lib/promise/observable.h +4 -4
- data/src/core/lib/promise/party.cc +32 -25
- data/src/core/lib/promise/party.h +16 -19
- data/src/core/lib/promise/pipe.h +15 -15
- data/src/core/lib/promise/poll.h +5 -4
- data/src/core/lib/promise/promise.h +0 -2
- data/src/core/lib/promise/sleep.cc +3 -1
- data/src/core/lib/promise/status_flag.h +7 -7
- data/src/core/lib/promise/try_join.h +2 -2
- data/src/core/lib/promise/try_seq.h +2 -2
- data/src/core/lib/resource_quota/arena.h +15 -2
- data/src/core/lib/resource_quota/connection_quota.cc +9 -7
- data/src/core/lib/resource_quota/memory_quota.cc +45 -24
- data/src/core/lib/resource_quota/memory_quota.h +48 -16
- data/src/core/lib/resource_quota/telemetry.h +54 -0
- data/src/core/lib/resource_quota/thread_quota.cc +2 -2
- data/src/core/lib/resource_tracker/resource_tracker.cc +33 -0
- data/src/core/lib/resource_tracker/resource_tracker.h +46 -0
- data/src/core/lib/security/authorization/audit_logging.cc +5 -5
- data/src/core/lib/security/authorization/grpc_authorization_engine.cc +2 -2
- data/src/core/lib/security/authorization/stdout_logger.cc +3 -3
- data/src/core/lib/surface/byte_buffer_reader.cc +2 -2
- data/src/core/lib/surface/call.cc +16 -14
- data/src/core/lib/surface/call.h +1 -1
- data/src/core/lib/surface/call_utils.cc +2 -2
- data/src/core/lib/surface/call_utils.h +2 -2
- data/src/core/lib/surface/channel.cc +4 -4
- data/src/core/lib/surface/channel_create.cc +10 -6
- data/src/core/lib/surface/channel_init.cc +80 -23
- data/src/core/lib/surface/channel_init.h +26 -11
- data/src/core/lib/surface/completion_queue.cc +17 -16
- data/src/core/lib/surface/completion_queue_factory.cc +7 -7
- data/src/core/lib/surface/connection_context.h +45 -2
- data/src/core/lib/surface/filter_stack_call.cc +12 -23
- data/src/core/lib/surface/filter_stack_call.h +3 -4
- data/src/core/lib/surface/legacy_channel.cc +7 -7
- data/src/core/lib/surface/validate_metadata.h +2 -2
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/bdp_estimator.cc +2 -2
- data/src/core/lib/transport/bdp_estimator.h +3 -3
- data/src/core/lib/transport/promise_endpoint.cc +3 -3
- data/src/core/lib/transport/promise_endpoint.h +8 -8
- data/src/core/lib/transport/timeout_encoding.cc +4 -4
- data/src/core/load_balancing/child_policy_handler.cc +4 -4
- data/src/core/load_balancing/endpoint_list.cc +2 -2
- data/src/core/load_balancing/grpclb/grpclb.cc +24 -24
- data/src/core/load_balancing/health_check_client.cc +4 -4
- data/src/core/load_balancing/health_check_client_internal.h +2 -2
- data/src/core/load_balancing/lb_policy_registry.cc +2 -2
- data/src/core/load_balancing/oob_backend_metric.cc +4 -4
- data/src/core/load_balancing/oob_backend_metric_internal.h +2 -2
- data/src/core/load_balancing/outlier_detection/outlier_detection.cc +2 -2
- data/src/core/load_balancing/pick_first/pick_first.cc +14 -14
- data/src/core/load_balancing/priority/priority.cc +23 -24
- data/src/core/load_balancing/ring_hash/ring_hash.cc +3 -3
- data/src/core/load_balancing/rls/rls.cc +13 -13
- data/src/core/load_balancing/round_robin/round_robin.cc +9 -9
- data/src/core/load_balancing/weighted_round_robin/static_stride_scheduler.cc +3 -3
- data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +33 -26
- data/src/core/load_balancing/weighted_target/weighted_target.cc +5 -5
- data/src/core/load_balancing/xds/cds.cc +76 -32
- data/src/core/load_balancing/xds/xds_cluster_impl.cc +3 -3
- data/src/core/load_balancing/xds/xds_override_host.cc +4 -4
- data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
- data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +33 -33
- data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +10 -10
- data/src/core/resolver/dns/dns_resolver_plugin.cc +6 -3
- data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +2 -2
- data/src/core/resolver/endpoint_addresses.cc +3 -3
- data/src/core/resolver/endpoint_addresses.h +3 -0
- data/src/core/resolver/fake/fake_resolver.cc +2 -2
- data/src/core/resolver/google_c2p/google_c2p_resolver.cc +41 -54
- data/src/core/resolver/polling_resolver.cc +3 -3
- data/src/core/resolver/resolver_registry.cc +5 -4
- data/src/core/resolver/xds/xds_dependency_manager.cc +5 -5
- data/src/core/resolver/xds/xds_resolver.cc +9 -9
- data/src/core/server/server.cc +38 -38
- data/src/core/server/server_call_tracer_filter.h +4 -4
- data/src/core/server/server_config_selector_filter.cc +2 -2
- data/src/core/server/xds_server_config_fetcher.cc +9 -8
- data/src/core/service_config/service_config_impl.h +2 -2
- data/src/core/telemetry/call_tracer.cc +39 -49
- data/src/core/telemetry/call_tracer.h +199 -22
- data/src/core/telemetry/histogram.h +205 -0
- data/src/core/telemetry/instrument.cc +719 -0
- data/src/core/telemetry/instrument.h +932 -0
- data/src/core/telemetry/metrics.cc +13 -5
- data/src/core/telemetry/metrics.h +3 -1
- data/src/core/telemetry/stats_data.cc +0 -19
- data/src/core/telemetry/stats_data.h +0 -19
- data/src/core/transport/auth_context.cc +2 -2
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +78 -45
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -0
- data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +3 -3
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +39 -31
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +3 -3
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +3 -3
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +7 -7
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +3 -3
- data/src/core/tsi/fake_transport_security.cc +4 -4
- data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +4 -4
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +9 -9
- data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +3 -3
- data/src/core/tsi/ssl_transport_security.cc +26 -25
- data/src/core/tsi/ssl_transport_security_utils.cc +9 -9
- data/src/core/util/chunked_vector.h +4 -4
- data/src/core/util/event_log.cc +2 -2
- data/src/core/util/gcp_metadata_query.cc +2 -2
- data/src/core/util/grpc_check.cc +22 -0
- data/src/core/util/grpc_check.h +103 -0
- data/src/core/util/http_client/httpcli.cc +3 -3
- data/src/core/util/http_client/parser.cc +4 -4
- data/src/core/util/latent_see.h +7 -4
- data/src/core/util/lru_cache.h +4 -4
- data/src/core/util/memory_usage.h +16 -0
- data/src/core/util/posix/directory_reader.cc +3 -2
- data/src/core/util/posix/sync.cc +24 -24
- data/src/core/util/postmortem_emit.cc +52 -0
- data/src/core/util/postmortem_emit.h +30 -0
- data/src/core/util/ref_counted_ptr.h +5 -0
- data/src/core/util/trie_lookup.h +170 -0
- data/src/core/util/unique_ptr_with_bitset.h +5 -5
- data/src/core/xds/grpc/xds_bootstrap_grpc.h +6 -1
- data/src/core/xds/grpc/xds_certificate_provider.cc +3 -3
- data/src/core/xds/grpc/xds_client_grpc.cc +34 -15
- data/src/core/xds/grpc/xds_client_grpc.h +4 -1
- data/src/core/xds/grpc/xds_cluster_parser.cc +2 -2
- data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +2 -2
- data/src/core/xds/grpc/xds_endpoint_parser.cc +2 -2
- data/src/core/xds/grpc/xds_http_filter_registry.cc +4 -3
- data/src/core/xds/grpc/xds_listener_parser.cc +3 -3
- data/src/core/xds/grpc/xds_matcher.cc +277 -0
- data/src/core/xds/grpc/xds_matcher.h +432 -0
- data/src/core/xds/grpc/xds_matcher_action.cc +47 -0
- data/src/core/xds/grpc/xds_matcher_action.h +48 -0
- data/src/core/xds/grpc/xds_matcher_context.cc +29 -0
- data/src/core/xds/grpc/xds_matcher_context.h +46 -0
- data/src/core/xds/grpc/xds_matcher_input.cc +79 -0
- data/src/core/xds/grpc/xds_matcher_input.h +105 -0
- data/src/core/xds/grpc/xds_matcher_parse.cc +356 -0
- data/src/core/xds/grpc/xds_matcher_parse.h +39 -0
- data/src/core/xds/grpc/xds_metadata.cc +4 -3
- data/src/core/xds/grpc/xds_route_config_parser.cc +6 -6
- data/src/core/xds/grpc/xds_routing.cc +3 -3
- data/src/core/xds/grpc/xds_transport_grpc.cc +10 -10
- data/src/core/xds/xds_client/lrs_client.cc +6 -6
- data/src/core/xds/xds_client/xds_client.cc +9 -9
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +2 -2
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/third_party/abseil-cpp/absl/container/internal/node_slot_policy.h +95 -0
- data/third_party/abseil-cpp/absl/container/node_hash_map.h +687 -0
- metadata +37 -2
@@ -0,0 +1,432 @@
|
|
1
|
+
//
|
2
|
+
// Copyright 2025 gRPC authors.
|
3
|
+
//
|
4
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
// you may not use this file except in compliance with the License.
|
6
|
+
// You may obtain a copy of the License at
|
7
|
+
//
|
8
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
//
|
10
|
+
// Unless required by applicable law or agreed to in writing, software
|
11
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
// See the License for the specific language governing permissions and
|
14
|
+
// limitations under the License.
|
15
|
+
//
|
16
|
+
|
17
|
+
#ifndef GRPC_SRC_CORE_XDS_GRPC_XDS_MATCHER_H
|
18
|
+
#define GRPC_SRC_CORE_XDS_GRPC_XDS_MATCHER_H
|
19
|
+
|
20
|
+
#include <memory>
|
21
|
+
#include <optional>
|
22
|
+
#include <string>
|
23
|
+
#include <utility>
|
24
|
+
#include <variant>
|
25
|
+
#include <vector>
|
26
|
+
|
27
|
+
#include "absl/container/flat_hash_map.h"
|
28
|
+
#include "absl/container/inlined_vector.h"
|
29
|
+
#include "absl/strings/str_cat.h"
|
30
|
+
#include "src/core/util/down_cast.h"
|
31
|
+
#include "src/core/util/matchers.h"
|
32
|
+
#include "src/core/util/trie_lookup.h"
|
33
|
+
#include "src/core/util/unique_type_name.h"
|
34
|
+
|
35
|
+
namespace grpc_core {
|
36
|
+
|
37
|
+
//
|
38
|
+
// XdsMatcher
|
39
|
+
//
|
40
|
+
|
41
|
+
// Base class for xDS matchers.
|
42
|
+
class XdsMatcher {
|
43
|
+
public:
|
44
|
+
// An interface implemented by the caller to provide the context from
|
45
|
+
// which the inputs will extract data. There can be different context
|
46
|
+
// implementations for different use cases -- for example, there will
|
47
|
+
// be an implementation that provides data about a data plane RPC for
|
48
|
+
// use in per-RPC matching decisions, but there could also be an
|
49
|
+
// implementation that provides data about incoming TCP connections
|
50
|
+
// for L4 routing decisions.
|
51
|
+
class MatchContext {
|
52
|
+
public:
|
53
|
+
virtual ~MatchContext() = default;
|
54
|
+
// Returns the type of context. The caller will use this to
|
55
|
+
// determine which type to down-cast to.
|
56
|
+
virtual UniqueTypeName type() const = 0;
|
57
|
+
};
|
58
|
+
|
59
|
+
// Produces match input from MatchContext.
|
60
|
+
// There will be one subclass for each proto type that we support in
|
61
|
+
// the input fields.
|
62
|
+
template <typename T>
|
63
|
+
class InputValue {
|
64
|
+
public:
|
65
|
+
using ProducedType = T;
|
66
|
+
|
67
|
+
virtual ~InputValue() = default;
|
68
|
+
virtual UniqueTypeName type() const = 0;
|
69
|
+
virtual bool Equals(const InputValue<T>& other) const = 0;
|
70
|
+
// Gets the value to be matched from context.
|
71
|
+
virtual std::optional<T> GetValue(const MatchContext& context) const = 0;
|
72
|
+
virtual std::string ToString() const = 0;
|
73
|
+
};
|
74
|
+
|
75
|
+
// An action to be returned if the conditions match.
|
76
|
+
// There will be one subclass for each proto type that we support in
|
77
|
+
// the action field.
|
78
|
+
class Action {
|
79
|
+
public:
|
80
|
+
virtual ~Action() = default;
|
81
|
+
virtual bool Equals(const Action& other) const = 0;
|
82
|
+
virtual std::string ToString() const = 0;
|
83
|
+
// The protobuf type of the action.
|
84
|
+
virtual UniqueTypeName type() const = 0;
|
85
|
+
};
|
86
|
+
|
87
|
+
// Actions found while executing the match.
|
88
|
+
using Result = absl::InlinedVector<Action*, 1>;
|
89
|
+
|
90
|
+
// What to do if a match is successful.
|
91
|
+
// If this contains an action, the action will be added to the set of
|
92
|
+
// actions to return. If keep_matching is false, matching will return
|
93
|
+
// true without evaluating any further matches; otherwise, matching
|
94
|
+
// will continue to find a final match.
|
95
|
+
struct OnMatch {
|
96
|
+
// Constructor for Action variant
|
97
|
+
OnMatch(std::unique_ptr<Action> act_ptr, bool km)
|
98
|
+
: action(std::move(act_ptr)), keep_matching(km) {}
|
99
|
+
|
100
|
+
// Constructor for XdsMatcher variant
|
101
|
+
OnMatch(std::unique_ptr<XdsMatcher> matcher_ptr, bool km)
|
102
|
+
: action(std::move(matcher_ptr)), keep_matching(km) {}
|
103
|
+
|
104
|
+
bool operator==(const OnMatch& other) const;
|
105
|
+
bool operator!=(const OnMatch& other) const { return !(*this == other); }
|
106
|
+
|
107
|
+
bool FindMatches(const MatchContext& context, Result& result) const;
|
108
|
+
std::string ToString() const;
|
109
|
+
|
110
|
+
std::variant<std::unique_ptr<Action>, std::unique_ptr<XdsMatcher>> action;
|
111
|
+
bool keep_matching = false;
|
112
|
+
};
|
113
|
+
|
114
|
+
virtual ~XdsMatcher() = default;
|
115
|
+
|
116
|
+
virtual UniqueTypeName type() const = 0;
|
117
|
+
virtual bool Equals(const XdsMatcher& other) const = 0;
|
118
|
+
virtual std::string ToString() const = 0;
|
119
|
+
|
120
|
+
// Finds matching actions, which are added to result.
|
121
|
+
// Returns true if the match is successful, in which case result will
|
122
|
+
// contain at least one action.
|
123
|
+
// Note that if a match is found but has keep_matching=true, the
|
124
|
+
// action will be added to result, but the match will not be
|
125
|
+
// considered successful.
|
126
|
+
virtual bool FindMatches(const MatchContext& context,
|
127
|
+
Result& result) const = 0;
|
128
|
+
};
|
129
|
+
|
130
|
+
//
|
131
|
+
// XdsMatcherList
|
132
|
+
//
|
133
|
+
|
134
|
+
// Evaluates a list of predicates and corresponding actions.
|
135
|
+
// The first matching predicate wins.
|
136
|
+
class XdsMatcherList : public XdsMatcher {
|
137
|
+
public:
|
138
|
+
// Base class for predicates.
|
139
|
+
class Predicate {
|
140
|
+
public:
|
141
|
+
virtual ~Predicate() = default;
|
142
|
+
// Returns true if the predicate is true.
|
143
|
+
virtual bool Match(const XdsMatcher::MatchContext& context) const = 0;
|
144
|
+
virtual UniqueTypeName type() const = 0;
|
145
|
+
virtual bool Equals(const Predicate& other) const = 0;
|
146
|
+
virtual std::string ToString() const = 0;
|
147
|
+
};
|
148
|
+
|
149
|
+
// Interface for matching against an input value.
|
150
|
+
template <typename T>
|
151
|
+
class InputMatcher {
|
152
|
+
public:
|
153
|
+
using ConsumedType = T;
|
154
|
+
|
155
|
+
virtual ~InputMatcher() = default;
|
156
|
+
virtual UniqueTypeName type() const = 0;
|
157
|
+
// Returns true if the matcher matches the input.
|
158
|
+
virtual bool Match(const std::optional<T>& input) const = 0;
|
159
|
+
virtual bool Equals(const InputMatcher<T>& other) const = 0;
|
160
|
+
virtual std::string ToString() const = 0;
|
161
|
+
};
|
162
|
+
|
163
|
+
class StringInputMatcher;
|
164
|
+
|
165
|
+
// Predicate implementations -- see below.
|
166
|
+
class AndPredicate;
|
167
|
+
class OrPredicate;
|
168
|
+
class NotPredicate;
|
169
|
+
|
170
|
+
struct FieldMatcher {
|
171
|
+
FieldMatcher(std::unique_ptr<Predicate> predicate, OnMatch on_match)
|
172
|
+
: predicate(std::move(predicate)), on_match(std::move(on_match)) {}
|
173
|
+
|
174
|
+
bool operator==(const FieldMatcher& other) const {
|
175
|
+
return on_match == other.on_match && predicate->Equals(*other.predicate);
|
176
|
+
}
|
177
|
+
bool operator!=(const FieldMatcher& other) const {
|
178
|
+
return !(*this == other);
|
179
|
+
}
|
180
|
+
|
181
|
+
std::string ToString() const {
|
182
|
+
return absl::StrCat("{predicate=", predicate->ToString(),
|
183
|
+
", on_match=", on_match.ToString(), "}");
|
184
|
+
}
|
185
|
+
|
186
|
+
std::unique_ptr<Predicate> predicate;
|
187
|
+
OnMatch on_match;
|
188
|
+
};
|
189
|
+
|
190
|
+
// Factory method for creating a SinglePredicate.
|
191
|
+
template <typename InputType, typename MatcherType>
|
192
|
+
static absl::enable_if_t<
|
193
|
+
std::is_same<typename InputType::ProducedType,
|
194
|
+
typename MatcherType::ConsumedType>::value,
|
195
|
+
std::unique_ptr<Predicate>>
|
196
|
+
CreateSinglePredicate(std::unique_ptr<InputType> input,
|
197
|
+
std::unique_ptr<MatcherType> matcher) {
|
198
|
+
return std::make_unique<
|
199
|
+
XdsMatcherList::SinglePredicate<typename InputType::ProducedType>>(
|
200
|
+
std::move(input), std::move(matcher));
|
201
|
+
}
|
202
|
+
|
203
|
+
// Alternative template specialization to return null in the case where
|
204
|
+
// the input produces a different type than the matcher consumes.
|
205
|
+
template <typename InputType, typename MatcherType>
|
206
|
+
static absl::enable_if_t<
|
207
|
+
!std::is_same<typename InputType::ProducedType,
|
208
|
+
typename MatcherType::ConsumedType>::value,
|
209
|
+
std::unique_ptr<Predicate>>
|
210
|
+
CreateSinglePredicate(std::unique_ptr<InputType> /*input*/,
|
211
|
+
std::unique_ptr<MatcherType> /*matcher*/) {
|
212
|
+
return nullptr;
|
213
|
+
}
|
214
|
+
|
215
|
+
XdsMatcherList(std::vector<FieldMatcher> matchers,
|
216
|
+
std::optional<OnMatch> on_no_match)
|
217
|
+
: matchers_(std::move(matchers)), on_no_match_(std::move(on_no_match)) {}
|
218
|
+
|
219
|
+
static UniqueTypeName Type() {
|
220
|
+
return GRPC_UNIQUE_TYPE_NAME_HERE("XdsMatcherList");
|
221
|
+
}
|
222
|
+
UniqueTypeName type() const override { return Type(); }
|
223
|
+
bool Equals(const XdsMatcher& other) const override;
|
224
|
+
std::string ToString() const override;
|
225
|
+
bool FindMatches(const MatchContext& context, Result& result) const override;
|
226
|
+
|
227
|
+
private:
|
228
|
+
template <typename T>
|
229
|
+
class SinglePredicate;
|
230
|
+
|
231
|
+
std::vector<FieldMatcher> matchers_;
|
232
|
+
std::optional<OnMatch> on_no_match_;
|
233
|
+
};
|
234
|
+
|
235
|
+
//
|
236
|
+
// Predicates
|
237
|
+
//
|
238
|
+
|
239
|
+
// A predicate that evaluates a single input with a specified matcher.
|
240
|
+
template <typename T>
|
241
|
+
class XdsMatcherList::SinglePredicate : public XdsMatcherList::Predicate {
|
242
|
+
public:
|
243
|
+
SinglePredicate(std::unique_ptr<InputValue<T>> input,
|
244
|
+
std::unique_ptr<InputMatcher<T>> input_matcher)
|
245
|
+
: input_(std::move(input)), input_matcher_(std::move(input_matcher)) {}
|
246
|
+
|
247
|
+
bool Match(const XdsMatcher::MatchContext& context) const override {
|
248
|
+
auto input = input_->GetValue(context);
|
249
|
+
return input_matcher_->Match(input);
|
250
|
+
}
|
251
|
+
static UniqueTypeName Type() {
|
252
|
+
return GRPC_UNIQUE_TYPE_NAME_HERE("XdsMatcherSinglePredicate");
|
253
|
+
}
|
254
|
+
UniqueTypeName type() const override { return Type(); }
|
255
|
+
bool Equals(const Predicate& other) const override {
|
256
|
+
if (type() != other.type()) return false;
|
257
|
+
const auto& o = DownCast<const SinglePredicate<T>&>(other);
|
258
|
+
return input_->Equals(*o.input_) &&
|
259
|
+
input_matcher_->Equals(*o.input_matcher_);
|
260
|
+
}
|
261
|
+
|
262
|
+
std::string ToString() const override {
|
263
|
+
return absl::StrCat("SinglePredicate{input=", input_->ToString(),
|
264
|
+
", matcher=", input_matcher_->ToString(), "}");
|
265
|
+
}
|
266
|
+
|
267
|
+
private:
|
268
|
+
std::unique_ptr<InputValue<T>> input_;
|
269
|
+
std::unique_ptr<InputMatcher<T>> input_matcher_;
|
270
|
+
};
|
271
|
+
|
272
|
+
// Matches against a string.
|
273
|
+
class XdsMatcherList::StringInputMatcher
|
274
|
+
: public XdsMatcherList::InputMatcher<absl::string_view> {
|
275
|
+
public:
|
276
|
+
explicit StringInputMatcher(StringMatcher matcher)
|
277
|
+
: matcher_(std::move(matcher)) {}
|
278
|
+
|
279
|
+
bool Match(const std::optional<absl::string_view>& input) const override {
|
280
|
+
return matcher_.Match(input.value_or(""));
|
281
|
+
}
|
282
|
+
static UniqueTypeName Type() {
|
283
|
+
return GRPC_UNIQUE_TYPE_NAME_HERE("StringInputMatcher");
|
284
|
+
}
|
285
|
+
UniqueTypeName type() const override { return Type(); }
|
286
|
+
bool Equals(const InputMatcher<absl::string_view>& other) const override {
|
287
|
+
if (type() != other.type()) return false;
|
288
|
+
const auto& o = DownCast<const StringInputMatcher&>(other);
|
289
|
+
return matcher_ == o.matcher_;
|
290
|
+
}
|
291
|
+
|
292
|
+
std::string ToString() const override { return matcher_.ToString(); }
|
293
|
+
|
294
|
+
private:
|
295
|
+
StringMatcher matcher_;
|
296
|
+
};
|
297
|
+
|
298
|
+
// A predicate that evaluates a list of predicates, returning true if
|
299
|
+
// all predicates are true.
|
300
|
+
class XdsMatcherList::AndPredicate : public XdsMatcherList::Predicate {
|
301
|
+
public:
|
302
|
+
static std::unique_ptr<AndPredicate> Create(
|
303
|
+
std::vector<std::unique_ptr<Predicate>> predicates) {
|
304
|
+
for (const auto& predicate : predicates) {
|
305
|
+
if (predicate == nullptr) return nullptr;
|
306
|
+
}
|
307
|
+
return std::unique_ptr<AndPredicate>(
|
308
|
+
new AndPredicate(std::move(predicates)));
|
309
|
+
}
|
310
|
+
|
311
|
+
bool Match(const XdsMatcher::MatchContext& context) const override;
|
312
|
+
static UniqueTypeName Type() {
|
313
|
+
return GRPC_UNIQUE_TYPE_NAME_HERE("XdsMatcherListAndPredicate");
|
314
|
+
}
|
315
|
+
UniqueTypeName type() const override { return Type(); }
|
316
|
+
bool Equals(const Predicate& other) const override;
|
317
|
+
std::string ToString() const override;
|
318
|
+
|
319
|
+
private:
|
320
|
+
explicit AndPredicate(std::vector<std::unique_ptr<Predicate>> predicates)
|
321
|
+
: predicates_(std::move(predicates)) {}
|
322
|
+
std::vector<std::unique_ptr<Predicate>> predicates_;
|
323
|
+
};
|
324
|
+
|
325
|
+
// A predicate that evaluates a list of predicates, returning true if
|
326
|
+
// any one predicate is true.
|
327
|
+
class XdsMatcherList::OrPredicate : public XdsMatcherList::Predicate {
|
328
|
+
public:
|
329
|
+
static std::unique_ptr<OrPredicate> Create(
|
330
|
+
std::vector<std::unique_ptr<Predicate>> predicates) {
|
331
|
+
for (const auto& predicate : predicates) {
|
332
|
+
if (predicate == nullptr) return nullptr;
|
333
|
+
}
|
334
|
+
return std::unique_ptr<OrPredicate>(new OrPredicate(std::move(predicates)));
|
335
|
+
}
|
336
|
+
bool Match(const XdsMatcher::MatchContext& context) const override;
|
337
|
+
static UniqueTypeName Type() {
|
338
|
+
return GRPC_UNIQUE_TYPE_NAME_HERE("XdsMatcherListOrPredicate");
|
339
|
+
}
|
340
|
+
UniqueTypeName type() const override { return Type(); }
|
341
|
+
|
342
|
+
bool Equals(const Predicate& other) const override;
|
343
|
+
std::string ToString() const override;
|
344
|
+
|
345
|
+
private:
|
346
|
+
explicit OrPredicate(std::vector<std::unique_ptr<Predicate>> predicates)
|
347
|
+
: predicates_(std::move(predicates)) {}
|
348
|
+
std::vector<std::unique_ptr<Predicate>> predicates_;
|
349
|
+
};
|
350
|
+
|
351
|
+
// A predicate that inverts another predicate.
|
352
|
+
class XdsMatcherList::NotPredicate : public XdsMatcherList::Predicate {
|
353
|
+
public:
|
354
|
+
static std::unique_ptr<NotPredicate> Create(
|
355
|
+
std::unique_ptr<Predicate> predicate) {
|
356
|
+
if (predicate == nullptr) {
|
357
|
+
return nullptr;
|
358
|
+
}
|
359
|
+
return std::unique_ptr<NotPredicate>(
|
360
|
+
new NotPredicate(std::move(predicate)));
|
361
|
+
}
|
362
|
+
bool Match(const XdsMatcher::MatchContext& context) const override {
|
363
|
+
return !predicate_->Match(context);
|
364
|
+
}
|
365
|
+
static UniqueTypeName Type() {
|
366
|
+
return GRPC_UNIQUE_TYPE_NAME_HERE("XdsMatcherListNotPredicate");
|
367
|
+
}
|
368
|
+
UniqueTypeName type() const override { return Type(); }
|
369
|
+
bool Equals(const Predicate& other) const override {
|
370
|
+
const auto& o = DownCast<const NotPredicate&>(other);
|
371
|
+
return predicate_->Equals(*o.predicate_);
|
372
|
+
}
|
373
|
+
|
374
|
+
std::string ToString() const override {
|
375
|
+
return absl::StrCat("Not{", predicate_->ToString(), "}");
|
376
|
+
}
|
377
|
+
|
378
|
+
private:
|
379
|
+
explicit NotPredicate(std::unique_ptr<Predicate> predicate)
|
380
|
+
: predicate_(std::move(predicate)) {}
|
381
|
+
std::unique_ptr<Predicate> predicate_;
|
382
|
+
};
|
383
|
+
|
384
|
+
//
|
385
|
+
// XdsMatcherExactMap
|
386
|
+
//
|
387
|
+
|
388
|
+
class XdsMatcherExactMap : public XdsMatcher {
|
389
|
+
public:
|
390
|
+
XdsMatcherExactMap(std::unique_ptr<InputValue<absl::string_view>> input,
|
391
|
+
absl::flat_hash_map<std::string, OnMatch> map,
|
392
|
+
std::optional<OnMatch> on_no_match)
|
393
|
+
: input_(std::move(input)),
|
394
|
+
map_(std::move(map)),
|
395
|
+
on_no_match_(std::move(on_no_match)) {}
|
396
|
+
|
397
|
+
static UniqueTypeName Type() {
|
398
|
+
return GRPC_UNIQUE_TYPE_NAME_HERE("XdsMatcherExactMap");
|
399
|
+
}
|
400
|
+
UniqueTypeName type() const override { return Type(); }
|
401
|
+
bool Equals(const XdsMatcher& other) const override;
|
402
|
+
std::string ToString() const override;
|
403
|
+
bool FindMatches(const MatchContext& context, Result& result) const override;
|
404
|
+
|
405
|
+
private:
|
406
|
+
std::unique_ptr<InputValue<absl::string_view>> input_;
|
407
|
+
absl::flat_hash_map<std::string, OnMatch> map_;
|
408
|
+
std::optional<OnMatch> on_no_match_;
|
409
|
+
};
|
410
|
+
|
411
|
+
class XdsMatcherPrefixMap : public XdsMatcher {
|
412
|
+
public:
|
413
|
+
XdsMatcherPrefixMap(std::unique_ptr<InputValue<absl::string_view>> input,
|
414
|
+
absl::flat_hash_map<std::string, XdsMatcher::OnMatch> map,
|
415
|
+
std::optional<OnMatch> on_no_match);
|
416
|
+
static UniqueTypeName Type() {
|
417
|
+
return GRPC_UNIQUE_TYPE_NAME_HERE("XdsMatcherPrefixMap");
|
418
|
+
}
|
419
|
+
UniqueTypeName type() const override { return Type(); }
|
420
|
+
bool Equals(const XdsMatcher& other) const override;
|
421
|
+
std::string ToString() const override;
|
422
|
+
bool FindMatches(const MatchContext& context, Result& result) const override;
|
423
|
+
|
424
|
+
private:
|
425
|
+
TrieLookupTree<XdsMatcher::OnMatch> root_;
|
426
|
+
std::unique_ptr<InputValue<absl::string_view>> input_;
|
427
|
+
std::optional<OnMatch> on_no_match_;
|
428
|
+
};
|
429
|
+
|
430
|
+
} // namespace grpc_core
|
431
|
+
|
432
|
+
#endif // GRPC_SRC_CORE_XDS_GRPC_XDS_MATCHER_H
|
@@ -0,0 +1,47 @@
|
|
1
|
+
// Copyright 2025 gRPC authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#include "src/core/xds/grpc/xds_matcher_action.h"
|
16
|
+
|
17
|
+
#include <memory>
|
18
|
+
#include <variant>
|
19
|
+
|
20
|
+
#include "src/core/xds/grpc/xds_common_types.h"
|
21
|
+
|
22
|
+
namespace grpc_core {
|
23
|
+
|
24
|
+
void XdsMatcherActionRegistry::AddActionFactory(
|
25
|
+
std::unique_ptr<XdsMatcherActionFactory> factory) {
|
26
|
+
factories_.emplace(factory->type(), std::move(factory));
|
27
|
+
}
|
28
|
+
|
29
|
+
std::unique_ptr<XdsMatcher::Action>
|
30
|
+
XdsMatcherActionRegistry::ParseAndCreateAction(
|
31
|
+
const XdsResourceType::DecodeContext& context, const XdsExtension& action,
|
32
|
+
ValidationErrors* errors) const {
|
33
|
+
const auto it = factories_.find(action.type);
|
34
|
+
if (it == factories_.cend()) {
|
35
|
+
errors->AddError("Unsupported Action. Not found in registry");
|
36
|
+
return nullptr;
|
37
|
+
}
|
38
|
+
const absl::string_view* serialized_value =
|
39
|
+
std::get_if<absl::string_view>(&action.value);
|
40
|
+
if (serialized_value == nullptr) {
|
41
|
+
errors->AddError("Unsuppored action format (Json found instead of string)");
|
42
|
+
return nullptr;
|
43
|
+
}
|
44
|
+
return it->second->ParseAndCreateAction(context, *serialized_value, errors);
|
45
|
+
}
|
46
|
+
|
47
|
+
} // namespace grpc_core
|
@@ -0,0 +1,48 @@
|
|
1
|
+
// Copyright 2025 gRPC authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#ifndef GRPC_SRC_CORE_XDS_GRPC_XDS_MATCHER_ACTION_H
|
16
|
+
#define GRPC_SRC_CORE_XDS_GRPC_XDS_MATCHER_ACTION_H
|
17
|
+
|
18
|
+
#include "src/core/xds/grpc/xds_common_types.h"
|
19
|
+
#include "src/core/xds/grpc/xds_matcher.h"
|
20
|
+
#include "src/core/xds/xds_client/xds_resource_type.h"
|
21
|
+
|
22
|
+
namespace grpc_core {
|
23
|
+
|
24
|
+
class XdsMatcherActionFactory {
|
25
|
+
public:
|
26
|
+
virtual absl::string_view type() const = 0;
|
27
|
+
virtual std::unique_ptr<XdsMatcher::Action> ParseAndCreateAction(
|
28
|
+
const XdsResourceType::DecodeContext& context,
|
29
|
+
absl::string_view serialized_value, ValidationErrors* errors) const = 0;
|
30
|
+
virtual ~XdsMatcherActionFactory() = default;
|
31
|
+
};
|
32
|
+
|
33
|
+
class XdsMatcherActionRegistry {
|
34
|
+
public:
|
35
|
+
void AddActionFactory(std::unique_ptr<XdsMatcherActionFactory> factory);
|
36
|
+
std::unique_ptr<XdsMatcher::Action> ParseAndCreateAction(
|
37
|
+
const XdsResourceType::DecodeContext& context, const XdsExtension& action,
|
38
|
+
ValidationErrors* errors) const;
|
39
|
+
|
40
|
+
private:
|
41
|
+
using FactoryMap =
|
42
|
+
std::map<absl::string_view, std::unique_ptr<XdsMatcherActionFactory>>;
|
43
|
+
FactoryMap factories_;
|
44
|
+
};
|
45
|
+
|
46
|
+
} // namespace grpc_core
|
47
|
+
|
48
|
+
#endif // GRPC_SRC_CORE_XDS_GRPC_XDS_MATCHER_ACTION_H
|
@@ -0,0 +1,29 @@
|
|
1
|
+
// Copyright 2025 gRPC authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#include "src/core/xds/grpc/xds_matcher_context.h"
|
16
|
+
|
17
|
+
namespace grpc_core {
|
18
|
+
|
19
|
+
std::optional<absl::string_view> RpcMatchContext::GetHeaderValue(
|
20
|
+
absl::string_view header_name) const {
|
21
|
+
if (absl::EndsWith(header_name, "-bin")) {
|
22
|
+
return std::nullopt;
|
23
|
+
} else if (header_name == "content-type") {
|
24
|
+
return "application/grpc";
|
25
|
+
}
|
26
|
+
return initial_metadata_->GetStringValue(header_name, &buffer_);
|
27
|
+
}
|
28
|
+
|
29
|
+
} // namespace grpc_core
|
@@ -0,0 +1,46 @@
|
|
1
|
+
// Copyright 2025 gRPC authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#ifndef GRPC_SRC_CORE_XDS_GRPC_XDS_MATCHER_CONTEXT_H
|
16
|
+
#define GRPC_SRC_CORE_XDS_GRPC_XDS_MATCHER_CONTEXT_H
|
17
|
+
|
18
|
+
#include "src/core/call/metadata_batch.h"
|
19
|
+
#include "src/core/xds/grpc/xds_matcher.h"
|
20
|
+
|
21
|
+
namespace grpc_core {
|
22
|
+
|
23
|
+
class RpcMatchContext : public XdsMatcher::MatchContext {
|
24
|
+
public:
|
25
|
+
explicit RpcMatchContext(grpc_metadata_batch* initial_metadata)
|
26
|
+
: initial_metadata_(initial_metadata) {}
|
27
|
+
|
28
|
+
static UniqueTypeName Type() {
|
29
|
+
return GRPC_UNIQUE_TYPE_NAME_HERE("rpc_context");
|
30
|
+
}
|
31
|
+
UniqueTypeName type() const override { return Type(); }
|
32
|
+
|
33
|
+
// Returns the metadata value(s) for the specified key.
|
34
|
+
// As special cases, binary headers return a value of std::nullopt, and
|
35
|
+
// "content-type" header returns "application/grpc".
|
36
|
+
std::optional<absl::string_view> GetHeaderValue(
|
37
|
+
absl::string_view header_name) const;
|
38
|
+
|
39
|
+
private:
|
40
|
+
grpc_metadata_batch* initial_metadata_;
|
41
|
+
mutable std::string buffer_;
|
42
|
+
};
|
43
|
+
|
44
|
+
} // namespace grpc_core
|
45
|
+
|
46
|
+
#endif // GRPC_SRC_CORE_XDS_GRPC_XDS_MATCHER_CONTEXT_H
|
@@ -0,0 +1,79 @@
|
|
1
|
+
// Copyright 2025 gRPC authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#include "src/core/xds/grpc/xds_matcher_input.h"
|
16
|
+
|
17
|
+
#include "envoy/type/matcher/v3/http_inputs.upb.h"
|
18
|
+
#include "src/core/util/upb_utils.h"
|
19
|
+
#include "src/core/xds/grpc/xds_matcher.h"
|
20
|
+
#include "src/core/xds/grpc/xds_matcher_context.h"
|
21
|
+
|
22
|
+
namespace grpc_core {
|
23
|
+
std::optional<absl::string_view> MetadataInput::GetValue(
|
24
|
+
const XdsMatcher::MatchContext& context) const {
|
25
|
+
CHECK_EQ(context.type(), RpcMatchContext::Type());
|
26
|
+
return DownCast<const RpcMatchContext&>(context).GetHeaderValue(key_);
|
27
|
+
}
|
28
|
+
|
29
|
+
std::unique_ptr<XdsMatcher::InputValue<absl::string_view>>
|
30
|
+
MetadataInputFactory::ParseAndCreateInput(
|
31
|
+
const XdsResourceType::DecodeContext& context,
|
32
|
+
absl::string_view serialized_value, ValidationErrors* errors) const {
|
33
|
+
auto http_header_input =
|
34
|
+
envoy_type_matcher_v3_HttpRequestHeaderMatchInput_parse(
|
35
|
+
serialized_value.data(), serialized_value.size(), context.arena);
|
36
|
+
if (http_header_input == nullptr) {
|
37
|
+
errors->AddError("Failed to parse HttpRequestHeaderMatchInput");
|
38
|
+
return nullptr;
|
39
|
+
}
|
40
|
+
// extract header name (Key for metadata match)
|
41
|
+
auto header_name = UpbStringToStdString(
|
42
|
+
envoy_type_matcher_v3_HttpRequestHeaderMatchInput_header_name(
|
43
|
+
http_header_input));
|
44
|
+
return std::make_unique<MetadataInput>(header_name);
|
45
|
+
}
|
46
|
+
|
47
|
+
template <>
|
48
|
+
XdsMatcherInputRegistry<absl::string_view>::XdsMatcherInputRegistry() {
|
49
|
+
// Add factories
|
50
|
+
factories_.emplace(MetadataInputFactory::Type(),
|
51
|
+
std::make_unique<MetadataInputFactory>());
|
52
|
+
}
|
53
|
+
|
54
|
+
template <>
|
55
|
+
std::unique_ptr<XdsMatcher::InputValue<absl::string_view>>
|
56
|
+
XdsMatcherInputRegistry<absl::string_view>::ParseAndCreateInput(
|
57
|
+
const XdsResourceType::DecodeContext& context, const XdsExtension& input,
|
58
|
+
const UniqueTypeName& matcher_context, ValidationErrors* errors) const {
|
59
|
+
const auto it = factories_.find(input.type);
|
60
|
+
if (it == factories_.cend()) {
|
61
|
+
errors->AddError(absl::StrCat("Unsupported Input type:", input.type));
|
62
|
+
return nullptr;
|
63
|
+
}
|
64
|
+
if (it->second->context_type() != matcher_context) {
|
65
|
+
errors->AddError(
|
66
|
+
absl::StrCat("Unsupported context:", it->second->context_type(),
|
67
|
+
". Parser supported context:", matcher_context));
|
68
|
+
return nullptr;
|
69
|
+
}
|
70
|
+
const absl::string_view* serialized_value =
|
71
|
+
std::get_if<absl::string_view>(&input.value);
|
72
|
+
if (serialized_value == nullptr) {
|
73
|
+
errors->AddError("Unsuppored input format (Json found instead of string)");
|
74
|
+
return nullptr;
|
75
|
+
}
|
76
|
+
return it->second->ParseAndCreateInput(context, *serialized_value, errors);
|
77
|
+
}
|
78
|
+
|
79
|
+
} // namespace grpc_core
|