grpc 1.83.1 → 1.84.0
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 +21 -17
- data/include/grpc/credentials.h +10 -0
- data/include/grpc/grpc_security_constants.h +2 -0
- data/include/grpc/impl/channel_arg_names.h +9 -0
- data/src/core/call/call_filters.h +4 -2
- data/src/core/call/client_call.cc +20 -8
- data/src/core/call/client_call.h +4 -0
- data/src/core/call/interception_chain.cc +2 -0
- data/src/core/call/interception_chain.h +14 -1
- data/src/core/call/metadata.cc +1 -3
- data/src/core/call/metadata_batch.h +13 -5
- data/src/core/call/server_call.cc +31 -14
- data/src/core/call/server_call.h +4 -0
- data/src/core/channelz/text_encode.cc +9 -4
- data/src/core/channelz/v2tov1/convert.cc +2 -2
- data/src/core/client_channel/backup_poller.cc +1 -2
- data/src/core/client_channel/client_channel.cc +6 -33
- data/src/core/client_channel/client_channel_filter.cc +22 -55
- data/src/core/client_channel/client_channel_filter.h +2 -2
- data/src/core/client_channel/client_channel_service_config.cc +3 -19
- data/src/core/client_channel/direct_channel.cc +7 -1
- data/src/core/client_channel/direct_channel.h +2 -2
- data/src/core/client_channel/load_balanced_call_destination.cc +5 -3
- data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -12
- data/src/core/client_channel/subchannel.cc +310 -1058
- data/src/core/client_channel/subchannel.h +44 -329
- data/src/core/client_channel/subchannel_metrics.cc +48 -0
- data/src/core/client_channel/subchannel_metrics.h +60 -0
- data/src/core/credentials/call/external/file_external_account_credentials.cc +1 -1
- data/src/core/credentials/call/external/url_external_account_credentials.cc +2 -3
- data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +8 -24
- data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.h +3 -6
- data/src/core/credentials/call/gdch_service_account/gdch_service_account_credentials.cc +525 -0
- data/src/core/credentials/call/gdch_service_account/gdch_service_account_credentials.h +138 -0
- data/src/core/credentials/call/json_util.h +1 -0
- data/src/core/credentials/call/jwt/json_token.cc +10 -2
- data/src/core/credentials/call/jwt/jwt_verifier.cc +15 -1
- data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +1 -1
- data/src/core/credentials/call/oauth2/oauth2_credentials.cc +42 -79
- data/src/core/credentials/call/oauth2/oauth2_credentials.h +2 -5
- data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.cc +52 -31
- data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.h +21 -8
- data/src/core/credentials/transport/google_default/google_default_credentials.cc +3 -4
- data/src/core/credentials/transport/ssl/ssl_credentials.cc +59 -72
- data/src/core/credentials/transport/ssl/ssl_credentials.h +9 -8
- data/src/core/credentials/transport/ssl/ssl_security_connector.cc +12 -6
- data/src/core/credentials/transport/ssl/ssl_security_connector.h +4 -4
- data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +29 -18
- data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +9 -6
- data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +45 -56
- data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +5 -4
- data/src/core/credentials/transport/tls/grpc_tls_certificate_selector.h +26 -0
- data/src/core/credentials/transport/tls/grpc_tls_crl_provider.cc +1 -1
- data/src/core/credentials/transport/tls/load_system_roots.h +2 -6
- data/src/core/credentials/transport/tls/load_system_roots_fallback.cc +2 -4
- data/src/core/credentials/transport/tls/load_system_roots_supported.cc +13 -15
- data/src/core/credentials/transport/tls/load_system_roots_supported.h +3 -2
- data/src/core/credentials/transport/tls/load_system_roots_windows.cc +5 -8
- data/src/core/credentials/transport/tls/spiffe_utils.cc +1 -1
- data/src/core/credentials/transport/tls/ssl_utils.cc +39 -28
- data/src/core/credentials/transport/tls/ssl_utils.h +12 -49
- data/src/core/credentials/transport/tls/tls_security_connector.cc +48 -33
- data/src/core/credentials/transport/tls/tls_security_connector.h +31 -10
- data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +15 -11
- data/src/core/ext/filters/http/http_filters_plugin.cc +20 -9
- data/src/core/ext/filters/rbac/rbac_filter.cc +43 -21
- data/src/core/ext/filters/rbac/rbac_filter.h +21 -3
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +2 -2
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +1 -1
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +6 -20
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +32 -67
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -0
- data/src/core/ext/transport/chttp2/transport/flow_control.h +78 -4
- data/src/core/ext/transport/chttp2/transport/frame.h +2 -0
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +3 -4
- data/src/core/ext/transport/chttp2/transport/goaway.h +7 -0
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +5 -3
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +3 -1
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +141 -130
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +22 -22
- data/src/core/ext/transport/chttp2/transport/http2_server_transport.cc +402 -269
- data/src/core/ext/transport/chttp2/transport/http2_server_transport.h +80 -49
- data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +1 -2
- data/src/core/ext/transport/chttp2/transport/http2_status.h +38 -37
- data/src/core/ext/transport/chttp2/transport/http2_transport.cc +178 -5
- data/src/core/ext/transport/chttp2/transport/http2_transport.h +345 -5
- data/src/core/ext/transport/chttp2/transport/parsing.cc +5 -5
- data/src/core/ext/transport/chttp2/transport/ping_promise.cc +3 -2
- data/src/core/ext/transport/chttp2/transport/ping_promise.h +25 -5
- data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +3 -4
- data/src/core/ext/transport/chttp2/transport/read_context.h +30 -3
- data/src/core/ext/transport/chttp2/transport/stream.h +65 -23
- data/src/core/ext/transport/chttp2/transport/writing.cc +0 -3
- data/src/core/ext/transport/inproc/inproc_transport.cc +1 -5
- data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +4 -17
- data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upb.h +1912 -0
- data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upb_minitable.c +300 -0
- data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upb_minitable.h +37 -0
- data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upb.h +187 -0
- data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upb_minitable.c +64 -0
- data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upb_minitable.h +31 -0
- data/src/core/ext/upb-gen/envoy/service/ext_proc/v3/external_processor.upb.h +2362 -0
- data/src/core/ext/upb-gen/envoy/service/ext_proc/v3/external_processor.upb_minitable.c +556 -0
- data/src/core/ext/upb-gen/envoy/service/ext_proc/v3/external_processor.upb_minitable.h +47 -0
- data/src/core/ext/upb-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upb.h +5 -5
- data/src/core/ext/upb-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upb_minitable.c +3 -3
- data/src/core/ext/upb-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upb_minitable.h +5 -5
- data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upbdefs.c +453 -0
- data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upbdefs.h +67 -0
- data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upbdefs.c +142 -0
- data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upbdefs.h +37 -0
- data/src/core/ext/upbdefs-gen/grpc/channelz/v1/channelz.upbdefs.c +715 -0
- data/src/core/ext/upbdefs-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upbdefs.h +44 -44
- data/src/core/filter/auth/server_auth_filter.cc +2 -3
- data/src/core/filter/composite/composite_filter.cc +45 -33
- data/src/core/filter/composite/composite_filter.h +5 -4
- data/src/core/filter/ext_proc/ext_proc_filter.cc +224 -0
- data/src/core/filter/ext_proc/ext_proc_filter.h +155 -0
- data/src/core/filter/ext_proc/ext_proc_messages.cc +701 -0
- data/src/core/filter/ext_proc/ext_proc_messages.h +297 -0
- data/src/core/filter/filter_args.h +13 -2
- data/src/core/handshaker/http_connect/http_proxy_mapper.cc +30 -3
- data/src/core/handshaker/security/security_handshaker.cc +9 -6
- data/src/core/lib/channel/channel_stack.cc +3 -0
- data/src/core/lib/channel/channel_stack.h +2 -0
- data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -2
- data/src/core/lib/channel/promise_based_filter.cc +132 -20
- data/src/core/lib/channel/promise_based_filter.h +42 -12
- data/src/core/lib/compression/compression_internal.cc +4 -5
- data/src/core/lib/debug/trace_flags.cc +8 -0
- data/src/core/lib/debug/trace_flags.h +3 -0
- data/src/core/lib/event_engine/ares_resolver.cc +54 -50
- data/src/core/lib/event_engine/ares_resolver.h +3 -2
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +3 -3
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +4 -10
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +74 -33
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +4 -4
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +6 -2
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +3 -0
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +3 -0
- data/src/core/lib/event_engine/windows/windows_endpoint.cc +1 -3
- data/src/core/lib/experiments/experiments.cc +60 -96
- data/src/core/lib/experiments/experiments.h +34 -50
- data/src/core/lib/iomgr/cfstream_handle.cc +2 -6
- data/src/core/lib/iomgr/endpoint_cfstream.cc +3 -10
- data/src/core/lib/iomgr/error.cc +2 -6
- data/src/core/lib/iomgr/error_cfstream.cc +1 -1
- data/src/core/lib/iomgr/ev_poll_posix.cc +5 -9
- data/src/core/lib/iomgr/event_engine_shims/closure.cc +1 -1
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +1 -2
- data/src/core/lib/iomgr/event_engine_shims/tcp_client.cc +1 -2
- data/src/core/lib/iomgr/iomgr_posix.cc +0 -4
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +0 -4
- data/src/core/lib/iomgr/iomgr_windows.cc +0 -4
- data/src/core/lib/iomgr/socket_factory_posix.h +1 -1
- data/src/core/lib/iomgr/socket_utils_posix.cc +3 -0
- data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
- data/src/core/lib/iomgr/systemd_utils.cc +0 -1
- data/src/core/lib/iomgr/tcp_client.h +1 -1
- data/src/core/lib/iomgr/tcp_posix.cc +23 -15
- data/src/core/lib/iomgr/tcp_server.h +1 -1
- data/src/core/lib/iomgr/tcp_server_posix.cc +2 -3
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +0 -1
- data/src/core/lib/iomgr/tcp_server_windows.cc +0 -1
- data/src/core/lib/iomgr/tcp_windows.cc +5 -10
- data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -4
- data/src/core/lib/iomgr/unix_sockets_posix.h +3 -1
- data/src/core/lib/iomgr/vsock.h +3 -1
- data/src/core/lib/resource_quota/memory_quota.cc +1 -1
- data/src/core/lib/security/authorization/rbac_policy.cc +139 -56
- data/src/core/lib/security/authorization/rbac_policy.h +21 -3
- data/src/core/lib/surface/call.cc +3 -9
- data/src/core/lib/surface/call_utils.h +113 -0
- data/src/core/lib/surface/channel_create.cc +1 -1
- data/src/core/lib/surface/channel_create.h +0 -2
- data/src/core/lib/surface/channel_init.cc +77 -38
- data/src/core/lib/surface/channel_init.h +30 -16
- data/src/core/lib/surface/filter_stack_call.cc +5 -10
- data/src/core/lib/surface/init.cc +13 -27
- data/src/core/lib/surface/version.cc +1 -1
- data/src/core/lib/transport/error_utils.cc +0 -27
- data/src/core/lib/transport/error_utils.h +0 -16
- data/src/core/lib/transport/transport.h +7 -5
- data/src/core/load_balancing/pick_first/pick_first.cc +2 -0
- data/src/core/load_balancing/rls/rls.cc +28 -11
- data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +33 -42
- data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.h +0 -2
- data/src/core/load_balancing/xds/cds.cc +3 -1
- data/src/core/load_balancing/xds/xds_cluster_impl.cc +0 -1
- data/src/core/mitigation_engine/mitigation.h +14 -5
- data/src/core/mitigation_engine/mitigation_engine.h +7 -3
- data/src/core/mitigation_engine/mitigation_provider.h +2 -1
- data/src/core/plugin_registry/grpc_plugin_registry.cc +39 -8
- data/src/core/resolver/dns/{event_engine/event_engine_client_channel_resolver.cc → dns_resolver.cc} +42 -41
- data/src/core/resolver/dns/{event_engine/event_engine_client_channel_resolver.h → dns_resolver.h} +8 -5
- data/src/core/resolver/dns/{event_engine/service_config_helper.cc → service_config_helper.cc} +1 -1
- data/src/core/resolver/dns/{event_engine/service_config_helper.h → service_config_helper.h} +3 -3
- data/src/core/resolver/endpoint_addresses.h +3 -0
- data/src/core/resolver/google_c2p/google_c2p_resolver.cc +2 -1
- data/src/core/resolver/xds/xds_resolver.cc +35 -9
- data/src/core/server/server.cc +2 -6
- data/src/core/server/server_config_selector.h +18 -3
- data/src/core/server/server_config_selector_filter.cc +178 -91
- data/src/core/server/server_config_selector_filter.h +58 -3
- data/src/core/server/xds_server_config_fetcher.cc +196 -129
- data/src/core/server/xds_server_config_fetcher.h +49 -0
- data/src/core/server/xds_server_config_fetcher_legacy.cc +41 -37
- data/src/core/telemetry/histogram.h +94 -14
- data/src/core/telemetry/instrument.cc +179 -74
- data/src/core/telemetry/instrument.h +78 -30
- data/src/core/telemetry/metrics.h +5 -0
- data/src/core/{resolver/dns/dns_resolver_plugin.h → telemetry/telemetry_label.h} +12 -8
- data/src/core/tsi/alts/crypt/aes_gcm.cc +10 -13
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +2 -2
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +3 -1
- data/src/core/tsi/ssl_telemetry_utils.cc +216 -259
- data/src/core/tsi/ssl_telemetry_utils.h +12 -2
- data/src/core/tsi/ssl_transport_security.cc +238 -80
- data/src/core/tsi/ssl_transport_security.h +63 -33
- data/src/core/tsi/tls_telemetry.cc +31 -0
- data/src/core/tsi/tls_telemetry.h +47 -0
- data/src/core/tsi/transport_security.cc +2 -2
- data/src/core/tsi/transport_security.h +1 -1
- data/src/core/tsi/transport_security_interface.h +1 -1
- data/src/core/{resolver/dns/native/dns_resolver.h → util/address_sorting_init.cc} +21 -8
- data/src/core/{resolver/dns/c_ares/grpc_ares_wrapper_posix.cc → util/address_sorting_init.h} +7 -8
- data/src/core/util/http_client/httpcli.cc +16 -53
- data/src/core/util/http_client/httpcli.h +0 -7
- data/src/core/util/http_client/httpcli_security_connector.cc +13 -8
- data/src/core/util/linux/cpu.cc +1 -1
- data/src/core/util/load_file.cc +3 -9
- data/src/core/util/load_file.h +3 -4
- data/src/core/util/matchers.h +8 -0
- data/src/core/util/posix/cpu.cc +1 -1
- data/src/core/util/status_helper.cc +0 -20
- data/src/core/util/status_helper.h +3 -14
- data/src/core/xds/grpc/xds_audit_logger_registry.cc +51 -31
- data/src/core/xds/grpc/xds_audit_logger_registry.h +17 -3
- data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -10
- data/src/core/xds/grpc/xds_bootstrap_grpc.h +8 -6
- data/src/core/xds/grpc/xds_bootstrap_grpc_builder.cc +488 -0
- data/src/core/xds/grpc/xds_bootstrap_grpc_builder.h +97 -0
- data/src/core/xds/grpc/xds_certificate_provider.cc +7 -7
- data/src/core/xds/grpc/xds_client_grpc.cc +4 -8
- data/src/core/xds/grpc/xds_client_grpc.h +0 -4
- data/src/core/xds/grpc/xds_cluster.h +1 -0
- data/src/core/xds/grpc/xds_cluster_parser.cc +1 -5
- data/src/core/xds/grpc/xds_cluster_parser.h +0 -2
- data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +0 -2
- data/src/core/xds/grpc/xds_cluster_specifier_plugin.h +0 -2
- data/src/core/xds/grpc/xds_common_types.cc +0 -91
- data/src/core/xds/grpc/xds_common_types.h +1 -47
- data/src/core/xds/grpc/xds_common_types_parser.cc +84 -378
- data/src/core/xds/grpc/xds_common_types_parser.h +9 -11
- data/src/core/xds/grpc/xds_endpoint_parser.cc +0 -2
- data/src/core/xds/grpc/xds_grpc_service_parser.cc +177 -0
- data/src/core/{resolver/dns/c_ares/dns_resolver_ares.h → xds/grpc/xds_grpc_service_parser.h} +14 -9
- data/src/core/xds/grpc/xds_http_composite_filter.cc +26 -21
- data/src/core/xds/grpc/xds_http_composite_filter.h +4 -3
- data/src/core/xds/grpc/xds_http_ext_proc_filter.cc +418 -0
- data/src/core/xds/grpc/xds_http_ext_proc_filter.h +89 -0
- data/src/core/xds/grpc/xds_http_fault_filter.cc +9 -12
- data/src/core/xds/grpc/xds_http_fault_filter.h +1 -4
- data/src/core/xds/grpc/xds_http_filter.cc +2 -1
- data/src/core/xds/grpc/xds_http_filter.h +6 -5
- data/src/core/xds/grpc/xds_http_filter_registry.cc +10 -127
- data/src/core/xds/grpc/xds_http_filter_registry.h +7 -59
- data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +13 -14
- data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +3 -2
- data/src/core/xds/grpc/xds_http_rbac_filter.cc +403 -25
- data/src/core/xds/grpc/xds_http_rbac_filter.h +1 -3
- data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +8 -13
- data/src/core/xds/grpc/xds_http_stateful_session_filter.h +1 -4
- data/src/core/xds/grpc/xds_lb_policy_registry.cc +0 -292
- data/src/core/xds/grpc/xds_lb_policy_registry.h +7 -3
- data/src/core/xds/grpc/xds_listener.cc +2 -0
- data/src/core/xds/grpc/xds_listener.h +5 -0
- data/src/core/xds/grpc/xds_listener_parser.cc +16 -11
- data/src/core/xds/grpc/xds_matcher_parse.h +3 -1
- data/src/core/xds/grpc/xds_metadata_parser.cc +6 -1
- data/src/core/xds/grpc/xds_metadata_parser.h +2 -0
- data/src/core/xds/grpc/xds_route_config.cc +2 -0
- data/src/core/xds/grpc/xds_route_config.h +3 -1
- data/src/core/xds/grpc/xds_route_config_parser.cc +13 -79
- data/src/core/xds/grpc/xds_route_config_parser.h +0 -3
- data/src/core/xds/grpc/xds_routing.cc +116 -69
- data/src/core/xds/grpc/xds_routing.h +19 -8
- data/src/core/xds/grpc/xds_tls_context.cc +117 -0
- data/src/core/xds/grpc/xds_tls_context.h +76 -0
- data/src/core/xds/grpc/xds_tls_context_parser.cc +275 -0
- data/src/core/xds/grpc/xds_tls_context_parser.h +35 -0
- data/src/core/xds/grpc/xds_transport_grpc.cc +41 -38
- data/src/core/xds/grpc/xds_transport_grpc.h +4 -2
- data/src/ruby/ext/grpc/rb_call.c +26 -15
- data/src/ruby/ext/grpc/rb_completion_queue.c +6 -5
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/test/client.rb +5 -4
- data/src/ruby/spec/call_spec.rb +14 -0
- data/src/ruby/spec/generic/server_interceptors_spec.rb +3 -6
- metadata +50 -35
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.c +0 -716
- data/src/core/lib/iomgr/resolve_address.cc +0 -59
- data/src/core/lib/iomgr/resolve_address.h +0 -125
- data/src/core/lib/iomgr/resolve_address_impl.h +0 -58
- data/src/core/lib/iomgr/resolve_address_posix.cc +0 -184
- data/src/core/lib/iomgr/resolve_address_posix.h +0 -78
- data/src/core/lib/iomgr/resolve_address_windows.cc +0 -169
- data/src/core/lib/iomgr/resolve_address_windows.h +0 -76
- data/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +0 -781
- data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +0 -93
- data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +0 -203
- data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +0 -838
- data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +0 -1237
- data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +0 -130
- data/src/core/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +0 -35
- data/src/core/resolver/dns/dns_resolver_plugin.cc +0 -64
- data/src/core/resolver/dns/native/dns_resolver.cc +0 -173
- data/src/core/util/json/json_util.cc +0 -101
- data/src/core/util/json/json_util.h +0 -163
|
@@ -0,0 +1,701 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 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
|
+
#include "src/core/filter/ext_proc/ext_proc_messages.h"
|
|
18
|
+
|
|
19
|
+
#include <grpc/status.h>
|
|
20
|
+
|
|
21
|
+
#include <cstddef>
|
|
22
|
+
#include <cstdint>
|
|
23
|
+
#include <optional>
|
|
24
|
+
#include <string>
|
|
25
|
+
#include <utility>
|
|
26
|
+
#include <vector>
|
|
27
|
+
|
|
28
|
+
#include "envoy/config/core/v3/base.upb.h"
|
|
29
|
+
#include "envoy/extensions/filters/http/ext_proc/v3/processing_mode.upb.h"
|
|
30
|
+
#include "envoy/service/ext_proc/v3/external_processor.upb.h"
|
|
31
|
+
#include "google/protobuf/struct.upb.h"
|
|
32
|
+
#include "src/core/call/metadata_batch.h"
|
|
33
|
+
#include "src/core/call/status_util.h"
|
|
34
|
+
#include "src/core/lib/slice/slice.h"
|
|
35
|
+
#include "src/core/util/matchers.h"
|
|
36
|
+
#include "src/core/util/string.h"
|
|
37
|
+
#include "src/core/util/upb_utils.h"
|
|
38
|
+
#include "src/core/util/validation_errors.h"
|
|
39
|
+
#include "src/core/xds/grpc/xds_common_types_parser.h"
|
|
40
|
+
#include "upb/base/string_view.h"
|
|
41
|
+
#include "upb/mem/arena.h"
|
|
42
|
+
#include "upb/mem/arena.hpp"
|
|
43
|
+
#include "absl/functional/function_ref.h"
|
|
44
|
+
#include "absl/status/status.h"
|
|
45
|
+
#include "absl/status/statusor.h"
|
|
46
|
+
#include "absl/strings/str_cat.h"
|
|
47
|
+
#include "absl/strings/string_view.h"
|
|
48
|
+
|
|
49
|
+
namespace grpc_core {
|
|
50
|
+
|
|
51
|
+
//
|
|
52
|
+
// ExtProcProcessingMode
|
|
53
|
+
//
|
|
54
|
+
|
|
55
|
+
std::string ExtProcProcessingMode::ToString() const {
|
|
56
|
+
std::string result = "{";
|
|
57
|
+
StrAppend(result, "send_request_headers=");
|
|
58
|
+
StrAppend(result, send_request_headers ? "true" : "false");
|
|
59
|
+
StrAppend(result, ", send_response_headers=");
|
|
60
|
+
StrAppend(result, send_response_headers ? "true" : "false");
|
|
61
|
+
StrAppend(result, ", send_response_trailers=");
|
|
62
|
+
StrAppend(result, send_response_trailers ? "true" : "false");
|
|
63
|
+
StrAppend(result, ", send_request_body=");
|
|
64
|
+
StrAppend(result, send_request_body ? "true" : "false");
|
|
65
|
+
StrAppend(result, ", send_response_body=");
|
|
66
|
+
StrAppend(result, send_response_body ? "true" : "false");
|
|
67
|
+
StrAppend(result, "}");
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
//
|
|
72
|
+
// ExtProcResponse::Parse()
|
|
73
|
+
//
|
|
74
|
+
|
|
75
|
+
namespace {
|
|
76
|
+
|
|
77
|
+
absl::StatusOr<ExtProcResponse::HeaderMutation> ParseExtProcHeaderMutation(
|
|
78
|
+
const envoy_service_ext_proc_v3_HeaderMutation* header_mutation) {
|
|
79
|
+
if (header_mutation == nullptr) {
|
|
80
|
+
return ExtProcResponse::HeaderMutation{};
|
|
81
|
+
}
|
|
82
|
+
ExtProcResponse::HeaderMutation header_mutation_response;
|
|
83
|
+
size_t set_headers_size = 0;
|
|
84
|
+
const envoy_config_core_v3_HeaderValueOption* const* set_headers =
|
|
85
|
+
envoy_service_ext_proc_v3_HeaderMutation_set_headers(header_mutation,
|
|
86
|
+
&set_headers_size);
|
|
87
|
+
for (size_t i = 0; i < set_headers_size; ++i) {
|
|
88
|
+
ValidationErrors errors;
|
|
89
|
+
auto parsed = ParseXdsHeaderValueOption(set_headers[i], &errors);
|
|
90
|
+
if (!errors.ok()) {
|
|
91
|
+
return errors.status(absl::StatusCode::kInternal,
|
|
92
|
+
"Failed to parse XdsHeaderValueOption");
|
|
93
|
+
}
|
|
94
|
+
header_mutation_response.set_headers.push_back(std::move(parsed));
|
|
95
|
+
}
|
|
96
|
+
size_t remove_headers_size = 0;
|
|
97
|
+
upb_StringView const* remove_headers =
|
|
98
|
+
envoy_service_ext_proc_v3_HeaderMutation_remove_headers(
|
|
99
|
+
header_mutation, &remove_headers_size);
|
|
100
|
+
for (size_t i = 0; i < remove_headers_size; ++i) {
|
|
101
|
+
header_mutation_response.remove_headers.emplace_back(
|
|
102
|
+
UpbStringToStdString(remove_headers[i]));
|
|
103
|
+
}
|
|
104
|
+
return header_mutation_response;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
absl::Status ValidateCommonResponse(
|
|
108
|
+
const envoy_service_ext_proc_v3_CommonResponse* common_response) {
|
|
109
|
+
if (common_response == nullptr) {
|
|
110
|
+
return absl::InternalError("common_response is not set");
|
|
111
|
+
}
|
|
112
|
+
int32_t status =
|
|
113
|
+
envoy_service_ext_proc_v3_CommonResponse_status(common_response);
|
|
114
|
+
if (status == envoy_service_ext_proc_v3_CommonResponse_CONTINUE_AND_REPLACE) {
|
|
115
|
+
return absl::InternalError("CONTINUE_AND_REPLACE is not supported");
|
|
116
|
+
}
|
|
117
|
+
return absl::OkStatus();
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
absl::StatusOr<ExtProcResponse::HeaderMutation> ParseExtProcHeaders(
|
|
121
|
+
const envoy_service_ext_proc_v3_CommonResponse* common_response) {
|
|
122
|
+
auto status = ValidateCommonResponse(common_response);
|
|
123
|
+
if (!status.ok()) return status;
|
|
124
|
+
const envoy_service_ext_proc_v3_HeaderMutation* header_mutation =
|
|
125
|
+
envoy_service_ext_proc_v3_CommonResponse_header_mutation(common_response);
|
|
126
|
+
return ParseExtProcHeaderMutation(header_mutation);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
absl::StatusOr<ExtProcResponse::BodyMutation> ParseExtProcBodyMutation(
|
|
130
|
+
const envoy_service_ext_proc_v3_CommonResponse* common_response) {
|
|
131
|
+
auto status = ValidateCommonResponse(common_response);
|
|
132
|
+
if (!status.ok()) return status;
|
|
133
|
+
const envoy_service_ext_proc_v3_BodyMutation* body_mutation =
|
|
134
|
+
envoy_service_ext_proc_v3_CommonResponse_body_mutation(common_response);
|
|
135
|
+
if (body_mutation == nullptr) {
|
|
136
|
+
return absl::InternalError("body_mutation is not set");
|
|
137
|
+
}
|
|
138
|
+
auto streamed_response =
|
|
139
|
+
envoy_service_ext_proc_v3_BodyMutation_streamed_response(body_mutation);
|
|
140
|
+
if (streamed_response == nullptr) {
|
|
141
|
+
return absl::InternalError("streamed_response is not set");
|
|
142
|
+
}
|
|
143
|
+
if (envoy_service_ext_proc_v3_StreamedBodyResponse_grpc_message_compressed(
|
|
144
|
+
streamed_response)) {
|
|
145
|
+
return absl::InternalError("grpc_message_compressed is not supported");
|
|
146
|
+
}
|
|
147
|
+
auto body =
|
|
148
|
+
envoy_service_ext_proc_v3_StreamedBodyResponse_body(streamed_response);
|
|
149
|
+
bool end_of_stream =
|
|
150
|
+
envoy_service_ext_proc_v3_StreamedBodyResponse_end_of_stream(
|
|
151
|
+
streamed_response);
|
|
152
|
+
bool end_of_stream_without_message =
|
|
153
|
+
envoy_service_ext_proc_v3_StreamedBodyResponse_end_of_stream_without_message(
|
|
154
|
+
streamed_response);
|
|
155
|
+
return ExtProcResponse::BodyMutation{
|
|
156
|
+
UpbStringToStdString(body), end_of_stream, end_of_stream_without_message};
|
|
157
|
+
}
|
|
158
|
+
} // namespace
|
|
159
|
+
|
|
160
|
+
absl::StatusOr<ExtProcResponse> ExtProcResponse::Parse(
|
|
161
|
+
absl::string_view serialized_response) {
|
|
162
|
+
upb::Arena arena;
|
|
163
|
+
const auto* response = envoy_service_ext_proc_v3_ProcessingResponse_parse(
|
|
164
|
+
serialized_response.data(), serialized_response.size(), arena.ptr());
|
|
165
|
+
if (response == nullptr) {
|
|
166
|
+
return absl::InternalError("Failed to parse ProcessingResponse");
|
|
167
|
+
}
|
|
168
|
+
ExtProcResponse ext_proc_response;
|
|
169
|
+
// parse request_drain
|
|
170
|
+
ext_proc_response.request_drain =
|
|
171
|
+
envoy_service_ext_proc_v3_ProcessingResponse_request_drain(response);
|
|
172
|
+
switch (
|
|
173
|
+
envoy_service_ext_proc_v3_ProcessingResponse_response_case(response)) {
|
|
174
|
+
case envoy_service_ext_proc_v3_ProcessingResponse_response_request_headers: {
|
|
175
|
+
const envoy_service_ext_proc_v3_HeadersResponse* request_headers =
|
|
176
|
+
envoy_service_ext_proc_v3_ProcessingResponse_request_headers(
|
|
177
|
+
response);
|
|
178
|
+
if (request_headers == nullptr) {
|
|
179
|
+
return absl::InternalError("request_headers is not set");
|
|
180
|
+
}
|
|
181
|
+
const envoy_service_ext_proc_v3_CommonResponse* common_response =
|
|
182
|
+
envoy_service_ext_proc_v3_HeadersResponse_response(request_headers);
|
|
183
|
+
auto mutation = ParseExtProcHeaders(common_response);
|
|
184
|
+
if (!mutation.ok()) return mutation.status();
|
|
185
|
+
ext_proc_response.response = RequestHeaders{std::move(*mutation)};
|
|
186
|
+
break;
|
|
187
|
+
}
|
|
188
|
+
case envoy_service_ext_proc_v3_ProcessingResponse_response_response_headers: {
|
|
189
|
+
const envoy_service_ext_proc_v3_HeadersResponse* response_headers =
|
|
190
|
+
envoy_service_ext_proc_v3_ProcessingResponse_response_headers(
|
|
191
|
+
response);
|
|
192
|
+
if (response_headers == nullptr) {
|
|
193
|
+
return absl::InternalError("response_headers is not set");
|
|
194
|
+
}
|
|
195
|
+
const envoy_service_ext_proc_v3_CommonResponse* common_response =
|
|
196
|
+
envoy_service_ext_proc_v3_HeadersResponse_response(response_headers);
|
|
197
|
+
auto mutation = ParseExtProcHeaders(common_response);
|
|
198
|
+
if (!mutation.ok()) return mutation.status();
|
|
199
|
+
ext_proc_response.response = ResponseHeaders{std::move(*mutation)};
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
case envoy_service_ext_proc_v3_ProcessingResponse_response_response_trailers: {
|
|
203
|
+
const envoy_service_ext_proc_v3_TrailersResponse* response_trailer =
|
|
204
|
+
envoy_service_ext_proc_v3_ProcessingResponse_response_trailers(
|
|
205
|
+
response);
|
|
206
|
+
if (response_trailer == nullptr) {
|
|
207
|
+
return absl::InternalError("response_trailer is not set");
|
|
208
|
+
}
|
|
209
|
+
const envoy_service_ext_proc_v3_HeaderMutation* header_mutation =
|
|
210
|
+
envoy_service_ext_proc_v3_TrailersResponse_header_mutation(
|
|
211
|
+
response_trailer);
|
|
212
|
+
auto mutation = ParseExtProcHeaderMutation(header_mutation);
|
|
213
|
+
if (!mutation.ok()) return mutation.status();
|
|
214
|
+
ext_proc_response.response = ResponseTrailers{std::move(*mutation)};
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
case envoy_service_ext_proc_v3_ProcessingResponse_response_request_body: {
|
|
218
|
+
const envoy_service_ext_proc_v3_BodyResponse* request_body =
|
|
219
|
+
envoy_service_ext_proc_v3_ProcessingResponse_request_body(response);
|
|
220
|
+
if (request_body == nullptr) {
|
|
221
|
+
return absl::InternalError("request_body is not set");
|
|
222
|
+
}
|
|
223
|
+
const envoy_service_ext_proc_v3_CommonResponse* common_response =
|
|
224
|
+
envoy_service_ext_proc_v3_BodyResponse_response(request_body);
|
|
225
|
+
auto mutation = ParseExtProcBodyMutation(common_response);
|
|
226
|
+
if (!mutation.ok()) return mutation.status();
|
|
227
|
+
ext_proc_response.response = RequestBody{std::move(*mutation)};
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
case envoy_service_ext_proc_v3_ProcessingResponse_response_response_body: {
|
|
231
|
+
const envoy_service_ext_proc_v3_BodyResponse* response_body =
|
|
232
|
+
envoy_service_ext_proc_v3_ProcessingResponse_response_body(response);
|
|
233
|
+
if (response_body == nullptr) {
|
|
234
|
+
return absl::InternalError("response_body is not set");
|
|
235
|
+
}
|
|
236
|
+
const envoy_service_ext_proc_v3_CommonResponse* common_response =
|
|
237
|
+
envoy_service_ext_proc_v3_BodyResponse_response(response_body);
|
|
238
|
+
auto mutation = ParseExtProcBodyMutation(common_response);
|
|
239
|
+
if (!mutation.ok()) return mutation.status();
|
|
240
|
+
if (mutation->end_of_stream || mutation->end_of_stream_without_message) {
|
|
241
|
+
return absl::InternalError(
|
|
242
|
+
"end_of_stream / end_of_stream_without_message is not supported "
|
|
243
|
+
"for response_body");
|
|
244
|
+
}
|
|
245
|
+
ext_proc_response.response = ResponseBody{std::move(*mutation)};
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
case envoy_service_ext_proc_v3_ProcessingResponse_response_immediate_response: {
|
|
249
|
+
const envoy_service_ext_proc_v3_ImmediateResponse* immediate_response =
|
|
250
|
+
envoy_service_ext_proc_v3_ProcessingResponse_immediate_response(
|
|
251
|
+
response);
|
|
252
|
+
if (immediate_response == nullptr) {
|
|
253
|
+
return absl::InternalError("immediate_response is not set");
|
|
254
|
+
}
|
|
255
|
+
ExtProcResponse::ImmediateResponse immediate_response_value;
|
|
256
|
+
immediate_response_value.details = UpbStringToStdString(
|
|
257
|
+
envoy_service_ext_proc_v3_ImmediateResponse_details(
|
|
258
|
+
immediate_response));
|
|
259
|
+
auto header_mutation = ParseExtProcHeaderMutation(
|
|
260
|
+
envoy_service_ext_proc_v3_ImmediateResponse_headers(
|
|
261
|
+
immediate_response));
|
|
262
|
+
if (!header_mutation.ok()) return header_mutation.status();
|
|
263
|
+
immediate_response_value.header_mutation = std::move(*header_mutation);
|
|
264
|
+
auto grpc_status =
|
|
265
|
+
envoy_service_ext_proc_v3_ImmediateResponse_grpc_status(
|
|
266
|
+
immediate_response);
|
|
267
|
+
if (grpc_status == nullptr) {
|
|
268
|
+
return absl::InternalError(
|
|
269
|
+
"grpc_status is not set in ImmediateResponse");
|
|
270
|
+
}
|
|
271
|
+
grpc_status_code status_code;
|
|
272
|
+
if (!grpc_status_code_from_int(
|
|
273
|
+
envoy_service_ext_proc_v3_GrpcStatus_status(grpc_status),
|
|
274
|
+
&status_code)) {
|
|
275
|
+
return absl::InternalError(
|
|
276
|
+
"Invalid grpc status code in ImmediateResponse");
|
|
277
|
+
}
|
|
278
|
+
immediate_response_value.status = status_code;
|
|
279
|
+
ext_proc_response.response = std::move(immediate_response_value);
|
|
280
|
+
break;
|
|
281
|
+
}
|
|
282
|
+
case envoy_service_ext_proc_v3_ProcessingResponse_response_NOT_SET:
|
|
283
|
+
break;
|
|
284
|
+
default:
|
|
285
|
+
return absl::InternalError(absl::StrCat(
|
|
286
|
+
"Unsupported ProcessingResponse response case: ",
|
|
287
|
+
envoy_service_ext_proc_v3_ProcessingResponse_response_case(
|
|
288
|
+
response)));
|
|
289
|
+
}
|
|
290
|
+
return ext_proc_response;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
//
|
|
294
|
+
// CreateExtProcRequest()
|
|
295
|
+
//
|
|
296
|
+
|
|
297
|
+
namespace {
|
|
298
|
+
|
|
299
|
+
// An encoder class used with grpc_metadata_batch::Encode() to iterate over all
|
|
300
|
+
// metadata entries in a batch and populate a upb envoy.config.core.v3.HeaderMap
|
|
301
|
+
// message.
|
|
302
|
+
//
|
|
303
|
+
// Filters metadata entries against allowed and disallowed StringMatcher lists:
|
|
304
|
+
// - If disallowed matchers are specified and a header key matches, it is
|
|
305
|
+
// skipped.
|
|
306
|
+
// - If allowed matchers are specified, only matching header keys are included.
|
|
307
|
+
// - In accordance with gRFC A102, for each forwarded header, the raw_value
|
|
308
|
+
// field is
|
|
309
|
+
// populated instead of the value field to preserve exact binary/raw header
|
|
310
|
+
// bytes.
|
|
311
|
+
class UpbHeaderMapEncoder {
|
|
312
|
+
public:
|
|
313
|
+
UpbHeaderMapEncoder(envoy_config_core_v3_HeaderMap* header_map,
|
|
314
|
+
upb_Arena* arena,
|
|
315
|
+
const std::vector<StringMatcher>& allowed_headers,
|
|
316
|
+
const std::vector<StringMatcher>& disallowed_headers)
|
|
317
|
+
: header_map_(header_map),
|
|
318
|
+
arena_(arena),
|
|
319
|
+
allowed_headers_(allowed_headers),
|
|
320
|
+
disallowed_headers_(disallowed_headers) {}
|
|
321
|
+
|
|
322
|
+
void Encode(const Slice& key, const Slice& value) {
|
|
323
|
+
Append(key.as_string_view(), value.as_string_view());
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
template <typename Which>
|
|
327
|
+
void Encode(Which, const typename Which::ValueType& value) {
|
|
328
|
+
Append(Which::key(), Which::Encode(value).as_string_view());
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
private:
|
|
332
|
+
ABSL_ATTRIBUTE_NOINLINE static bool HeaderInMatcher(
|
|
333
|
+
absl::string_view key, const std::vector<StringMatcher>& matchers) {
|
|
334
|
+
for (const auto& matcher : matchers) {
|
|
335
|
+
if (matcher.Match(key)) return true;
|
|
336
|
+
}
|
|
337
|
+
return false;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
ABSL_ATTRIBUTE_NOINLINE bool ShouldForwardHeader(
|
|
341
|
+
absl::string_view key) const {
|
|
342
|
+
if (disallowed_headers_.empty()) {
|
|
343
|
+
return allowed_headers_.empty() || HeaderInMatcher(key, allowed_headers_);
|
|
344
|
+
}
|
|
345
|
+
if (HeaderInMatcher(key, disallowed_headers_)) {
|
|
346
|
+
return false;
|
|
347
|
+
}
|
|
348
|
+
return allowed_headers_.empty() || HeaderInMatcher(key, allowed_headers_);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
ABSL_ATTRIBUTE_NOINLINE void Append(absl::string_view key,
|
|
352
|
+
absl::string_view value) {
|
|
353
|
+
if (!ShouldForwardHeader(key)) {
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
auto* value_msg =
|
|
357
|
+
envoy_config_core_v3_HeaderMap_add_headers(header_map_, arena_);
|
|
358
|
+
envoy_config_core_v3_HeaderValue_set_key(
|
|
359
|
+
value_msg, upb_StringView_FromDataAndSize(key.data(), key.size()));
|
|
360
|
+
// Per gRFC A102, when writing, we always set the raw_value field and never
|
|
361
|
+
// the value field.
|
|
362
|
+
envoy_config_core_v3_HeaderValue_set_raw_value(
|
|
363
|
+
value_msg, upb_StringView_FromDataAndSize(value.data(), value.size()));
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
envoy_config_core_v3_HeaderMap* header_map_;
|
|
367
|
+
upb_Arena* arena_;
|
|
368
|
+
const std::vector<StringMatcher>& allowed_headers_;
|
|
369
|
+
const std::vector<StringMatcher>& disallowed_headers_;
|
|
370
|
+
};
|
|
371
|
+
|
|
372
|
+
void PopulateMetadataBatchToHeaderMap(
|
|
373
|
+
grpc_metadata_batch& batch,
|
|
374
|
+
const std::vector<StringMatcher>& allowed_headers,
|
|
375
|
+
const std::vector<StringMatcher>& disallowed_headers, upb_Arena* arena,
|
|
376
|
+
envoy_config_core_v3_HeaderMap* header_map) {
|
|
377
|
+
UpbHeaderMapEncoder encoder(header_map, arena, allowed_headers,
|
|
378
|
+
disallowed_headers);
|
|
379
|
+
batch.Encode(&encoder);
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
void SetExtProcRequestHeaders(
|
|
383
|
+
upb_Arena* arena, envoy_config_core_v3_HeaderMap* headers,
|
|
384
|
+
envoy_service_ext_proc_v3_ProcessingRequest* request) {
|
|
385
|
+
auto http_headers = envoy_service_ext_proc_v3_HttpHeaders_new(arena);
|
|
386
|
+
envoy_service_ext_proc_v3_HttpHeaders_set_headers(http_headers, headers);
|
|
387
|
+
envoy_service_ext_proc_v3_HttpHeaders_set_end_of_stream(http_headers, false);
|
|
388
|
+
envoy_service_ext_proc_v3_ProcessingRequest_set_request_headers(request,
|
|
389
|
+
http_headers);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
void SetExtProcResponseHeaders(
|
|
393
|
+
upb_Arena* arena, envoy_config_core_v3_HeaderMap* headers,
|
|
394
|
+
bool end_of_stream, envoy_service_ext_proc_v3_ProcessingRequest* request) {
|
|
395
|
+
auto http_headers = envoy_service_ext_proc_v3_HttpHeaders_new(arena);
|
|
396
|
+
envoy_service_ext_proc_v3_HttpHeaders_set_headers(http_headers, headers);
|
|
397
|
+
if (end_of_stream) {
|
|
398
|
+
envoy_service_ext_proc_v3_HttpHeaders_set_end_of_stream(http_headers,
|
|
399
|
+
end_of_stream);
|
|
400
|
+
}
|
|
401
|
+
envoy_service_ext_proc_v3_ProcessingRequest_set_response_headers(
|
|
402
|
+
request, http_headers);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
void SetExtProcRequestBody(
|
|
406
|
+
upb_Arena* arena, upb_StringView buf, bool end_of_stream,
|
|
407
|
+
bool end_of_stream_without_message,
|
|
408
|
+
envoy_service_ext_proc_v3_ProcessingRequest* request) {
|
|
409
|
+
envoy_service_ext_proc_v3_HttpBody* body =
|
|
410
|
+
envoy_service_ext_proc_v3_HttpBody_new(arena);
|
|
411
|
+
envoy_service_ext_proc_v3_HttpBody_set_body(body, buf);
|
|
412
|
+
if (end_of_stream) {
|
|
413
|
+
envoy_service_ext_proc_v3_HttpBody_set_end_of_stream(body, end_of_stream);
|
|
414
|
+
}
|
|
415
|
+
if (end_of_stream_without_message) {
|
|
416
|
+
envoy_service_ext_proc_v3_HttpBody_set_end_of_stream_without_message(body,
|
|
417
|
+
true);
|
|
418
|
+
}
|
|
419
|
+
envoy_service_ext_proc_v3_ProcessingRequest_set_request_body(request, body);
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
void SetExtProcResponseBody(
|
|
423
|
+
upb_Arena* arena, upb_StringView buf,
|
|
424
|
+
envoy_service_ext_proc_v3_ProcessingRequest* request) {
|
|
425
|
+
envoy_service_ext_proc_v3_HttpBody* body =
|
|
426
|
+
envoy_service_ext_proc_v3_HttpBody_new(arena);
|
|
427
|
+
envoy_service_ext_proc_v3_HttpBody_set_body(body, buf);
|
|
428
|
+
envoy_service_ext_proc_v3_ProcessingRequest_set_response_body(request, body);
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
void SetExtProcResponseTrailers(
|
|
432
|
+
upb_Arena* arena, envoy_config_core_v3_HeaderMap* trailer,
|
|
433
|
+
envoy_service_ext_proc_v3_ProcessingRequest* request) {
|
|
434
|
+
auto http_trailers = envoy_service_ext_proc_v3_HttpTrailers_new(arena);
|
|
435
|
+
envoy_service_ext_proc_v3_HttpTrailers_set_trailers(http_trailers, trailer);
|
|
436
|
+
envoy_service_ext_proc_v3_ProcessingRequest_set_response_trailers(
|
|
437
|
+
request, http_trailers);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
void SetExtProcAttributes(
|
|
441
|
+
upb_Arena* arena, ::google_protobuf_Struct* attributes,
|
|
442
|
+
envoy_service_ext_proc_v3_ProcessingRequest* request) {
|
|
443
|
+
if (attributes == nullptr) return;
|
|
444
|
+
constexpr absl::string_view kAttributeKey = "envoy.filters.http.ext_proc";
|
|
445
|
+
envoy_service_ext_proc_v3_ProcessingRequest_attributes_set(
|
|
446
|
+
request,
|
|
447
|
+
upb_StringView_FromDataAndSize(kAttributeKey.data(),
|
|
448
|
+
kAttributeKey.size()),
|
|
449
|
+
attributes, arena);
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
void SetExtProcProtocolConfig(
|
|
453
|
+
upb_Arena* arena, const ExtProcProcessingMode& processing_mode,
|
|
454
|
+
envoy_service_ext_proc_v3_ProcessingRequest* request) {
|
|
455
|
+
auto* protocol_config =
|
|
456
|
+
envoy_service_ext_proc_v3_ProcessingRequest_mutable_protocol_config(
|
|
457
|
+
request, arena);
|
|
458
|
+
envoy_service_ext_proc_v3_ProtocolConfiguration_set_request_body_mode(
|
|
459
|
+
protocol_config,
|
|
460
|
+
processing_mode.send_request_body
|
|
461
|
+
? envoy_extensions_filters_http_ext_proc_v3_ProcessingMode_GRPC
|
|
462
|
+
: envoy_extensions_filters_http_ext_proc_v3_ProcessingMode_NONE);
|
|
463
|
+
envoy_service_ext_proc_v3_ProtocolConfiguration_set_response_body_mode(
|
|
464
|
+
protocol_config,
|
|
465
|
+
processing_mode.send_response_body
|
|
466
|
+
? envoy_extensions_filters_http_ext_proc_v3_ProcessingMode_GRPC
|
|
467
|
+
: envoy_extensions_filters_http_ext_proc_v3_ProcessingMode_NONE);
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
absl::StatusOr<std::string> SerializeExtProcMessage(
|
|
471
|
+
envoy_service_ext_proc_v3_ProcessingRequest* request, upb_Arena* arena) {
|
|
472
|
+
size_t size;
|
|
473
|
+
auto message = envoy_service_ext_proc_v3_ProcessingRequest_serialize(
|
|
474
|
+
request, arena, &size);
|
|
475
|
+
if (message == nullptr) {
|
|
476
|
+
return absl::InternalError("Failed to serialize ProcessingRequest");
|
|
477
|
+
}
|
|
478
|
+
return std::string(message, size);
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
envoy_service_ext_proc_v3_ProcessingRequest* CreateCommonRequest(
|
|
482
|
+
upb_Arena* arena, ::google_protobuf_Struct* attributes,
|
|
483
|
+
bool observability_mode,
|
|
484
|
+
std::optional<ExtProcProcessingMode> processing_mode) {
|
|
485
|
+
auto* request = envoy_service_ext_proc_v3_ProcessingRequest_new(arena);
|
|
486
|
+
SetExtProcAttributes(arena, attributes, request);
|
|
487
|
+
envoy_service_ext_proc_v3_ProcessingRequest_set_observability_mode(
|
|
488
|
+
request, observability_mode);
|
|
489
|
+
if (processing_mode.has_value()) {
|
|
490
|
+
SetExtProcProtocolConfig(arena, *processing_mode, request);
|
|
491
|
+
}
|
|
492
|
+
return request;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
// An encoder class used with grpc_metadata_batch::Encode() to iterate over all
|
|
496
|
+
// metadata entries in a batch and insert them as key-value pairs into a upb
|
|
497
|
+
// google.protobuf.Struct message.
|
|
498
|
+
//
|
|
499
|
+
// For each metadata entry encountered, it converts the key and value to string
|
|
500
|
+
// views and creates a google.protobuf.Value string field in the target Struct
|
|
501
|
+
// message on the arena.
|
|
502
|
+
class UpbStructHeadersEncoder {
|
|
503
|
+
public:
|
|
504
|
+
UpbStructHeadersEncoder(::google_protobuf_Struct* struct_msg,
|
|
505
|
+
upb_Arena* arena)
|
|
506
|
+
: struct_msg_(struct_msg), arena_(arena) {}
|
|
507
|
+
|
|
508
|
+
void Encode(const Slice& key, const Slice& value) {
|
|
509
|
+
Append(key.as_string_view(), value.as_string_view());
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
template <typename Which>
|
|
513
|
+
void Encode(Which, const typename Which::ValueType& value) {
|
|
514
|
+
Append(Which::key(), Which::Encode(value).as_string_view());
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
private:
|
|
518
|
+
ABSL_ATTRIBUTE_NOINLINE void Append(absl::string_view key,
|
|
519
|
+
absl::string_view value) {
|
|
520
|
+
::google_protobuf_Value* val_msg = ::google_protobuf_Value_new(arena_);
|
|
521
|
+
::google_protobuf_Value_set_string_value(
|
|
522
|
+
val_msg, upb_StringView_FromDataAndSize(value.data(), value.size()));
|
|
523
|
+
::google_protobuf_Struct_fields_set(
|
|
524
|
+
struct_msg_, upb_StringView_FromDataAndSize(key.data(), key.size()),
|
|
525
|
+
val_msg, arena_);
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
::google_protobuf_Struct* struct_msg_;
|
|
529
|
+
upb_Arena* arena_;
|
|
530
|
+
};
|
|
531
|
+
|
|
532
|
+
} // namespace
|
|
533
|
+
|
|
534
|
+
//
|
|
535
|
+
// CreateExtProcAttributesProtoStruct()
|
|
536
|
+
//
|
|
537
|
+
|
|
538
|
+
// TODO(rishesh): Support CEL attributes from A103 (except
|
|
539
|
+
// xds.cluster_metadata.filter_metadata) when adding support for ext_proc on
|
|
540
|
+
// the server side. See
|
|
541
|
+
// https://github.com/grpc/proposal/blob/master/A103-xds-composite-filter.md#cel-attributes
|
|
542
|
+
::google_protobuf_Struct* CreateExtProcAttributesProtoStruct(
|
|
543
|
+
upb_Arena* arena, const std::vector<std::string>& attributes,
|
|
544
|
+
const grpc_metadata_batch& metadata) {
|
|
545
|
+
if (attributes.empty()) return nullptr;
|
|
546
|
+
::google_protobuf_Struct* struct_msg = ::google_protobuf_Struct_new(arena);
|
|
547
|
+
auto add_field = [&](absl::string_view name, absl::string_view value) {
|
|
548
|
+
::google_protobuf_Value* val_msg = ::google_protobuf_Value_new(arena);
|
|
549
|
+
::google_protobuf_Value_set_string_value(
|
|
550
|
+
val_msg, upb_StringView_FromDataAndSize(value.data(), value.size()));
|
|
551
|
+
::google_protobuf_Struct_fields_set(
|
|
552
|
+
struct_msg, upb_StringView_FromDataAndSize(name.data(), name.size()),
|
|
553
|
+
val_msg, arena);
|
|
554
|
+
};
|
|
555
|
+
for (const auto& attr : attributes) {
|
|
556
|
+
if (attr == "request.path" || attr == "request.url_path") {
|
|
557
|
+
if (const Slice* path = metadata.get_pointer(HttpPathMetadata())) {
|
|
558
|
+
add_field(attr, path->as_string_view());
|
|
559
|
+
}
|
|
560
|
+
} else if (attr == "request.host") {
|
|
561
|
+
if (const Slice* auth = metadata.get_pointer(HttpAuthorityMetadata())) {
|
|
562
|
+
add_field(attr, auth->as_string_view());
|
|
563
|
+
} else if (const Slice* host = metadata.get_pointer(HostMetadata())) {
|
|
564
|
+
add_field(attr, host->as_string_view());
|
|
565
|
+
}
|
|
566
|
+
} else if (attr == "request.method") {
|
|
567
|
+
if (auto* method = metadata.get_pointer(HttpMethodMetadata())) {
|
|
568
|
+
add_field(attr, HttpMethodMetadata::Encode(*method).as_string_view());
|
|
569
|
+
} else {
|
|
570
|
+
add_field(attr, "POST");
|
|
571
|
+
}
|
|
572
|
+
} else if (attr == "request.headers") {
|
|
573
|
+
::google_protobuf_Struct* headers_struct =
|
|
574
|
+
::google_protobuf_Struct_new(arena);
|
|
575
|
+
UpbStructHeadersEncoder encoder(headers_struct, arena);
|
|
576
|
+
metadata.Encode(&encoder);
|
|
577
|
+
::google_protobuf_Value* val_msg = ::google_protobuf_Value_new(arena);
|
|
578
|
+
::google_protobuf_Value_set_struct_value(val_msg, headers_struct);
|
|
579
|
+
::google_protobuf_Struct_fields_set(
|
|
580
|
+
struct_msg, upb_StringView_FromDataAndSize(attr.data(), attr.size()),
|
|
581
|
+
val_msg, arena);
|
|
582
|
+
} else if (attr == "request.referer" || attr == "request.useragent" ||
|
|
583
|
+
attr == "request.id") {
|
|
584
|
+
absl::string_view key;
|
|
585
|
+
if (attr == "request.referer") {
|
|
586
|
+
key = "referer";
|
|
587
|
+
} else if (attr == "request.useragent") {
|
|
588
|
+
key = "user-agent";
|
|
589
|
+
} else {
|
|
590
|
+
key = "x-request-id";
|
|
591
|
+
}
|
|
592
|
+
std::string backing_str;
|
|
593
|
+
std::optional<absl::string_view> val =
|
|
594
|
+
metadata.GetStringValue(key, &backing_str);
|
|
595
|
+
if (val.has_value()) add_field(attr, *val);
|
|
596
|
+
} else if (attr == "request.query") {
|
|
597
|
+
add_field(attr, "");
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
return struct_msg;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
namespace {
|
|
604
|
+
|
|
605
|
+
envoy_config_core_v3_HeaderMap* CreateUpbHeaderMap(
|
|
606
|
+
upb_Arena* arena, grpc_metadata_batch& metadata,
|
|
607
|
+
const std::vector<StringMatcher>& allowed_headers,
|
|
608
|
+
const std::vector<StringMatcher>& disallowed_headers) {
|
|
609
|
+
auto* upb_headers = envoy_config_core_v3_HeaderMap_new(arena);
|
|
610
|
+
PopulateMetadataBatchToHeaderMap(metadata, allowed_headers,
|
|
611
|
+
disallowed_headers, arena, upb_headers);
|
|
612
|
+
return upb_headers;
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
absl::StatusOr<std::string> CreateRequestAndSerialize(
|
|
616
|
+
upb_Arena* arena, ::google_protobuf_Struct* attributes,
|
|
617
|
+
bool observability_mode,
|
|
618
|
+
std::optional<ExtProcProcessingMode> processing_mode,
|
|
619
|
+
absl::FunctionRef<void(envoy_service_ext_proc_v3_ProcessingRequest*)>
|
|
620
|
+
populate_payload) {
|
|
621
|
+
auto* request = CreateCommonRequest(arena, attributes, observability_mode,
|
|
622
|
+
processing_mode);
|
|
623
|
+
populate_payload(request);
|
|
624
|
+
return SerializeExtProcMessage(request, arena);
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
} // namespace
|
|
628
|
+
|
|
629
|
+
absl::StatusOr<std::string> CreateExtProcClientHeadersRequest(
|
|
630
|
+
upb_Arena* arena, grpc_metadata_batch* metadata,
|
|
631
|
+
const std::vector<StringMatcher>& allowed_headers,
|
|
632
|
+
const std::vector<StringMatcher>& disallowed_headers,
|
|
633
|
+
::google_protobuf_Struct* attributes, bool observability_mode,
|
|
634
|
+
std::optional<ExtProcProcessingMode> processing_mode) {
|
|
635
|
+
return CreateRequestAndSerialize(
|
|
636
|
+
arena, attributes, observability_mode, processing_mode,
|
|
637
|
+
[&](envoy_service_ext_proc_v3_ProcessingRequest* request) {
|
|
638
|
+
auto* upb_headers = CreateUpbHeaderMap(
|
|
639
|
+
arena, *metadata, allowed_headers, disallowed_headers);
|
|
640
|
+
SetExtProcRequestHeaders(arena, upb_headers, request);
|
|
641
|
+
});
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
absl::StatusOr<std::string> CreateExtProcServerHeadersRequest(
|
|
645
|
+
upb_Arena* arena, grpc_metadata_batch* metadata,
|
|
646
|
+
const std::vector<StringMatcher>& allowed_headers,
|
|
647
|
+
const std::vector<StringMatcher>& disallowed_headers,
|
|
648
|
+
::google_protobuf_Struct* attributes, bool observability_mode,
|
|
649
|
+
std::optional<ExtProcProcessingMode> processing_mode, bool end_of_stream) {
|
|
650
|
+
return CreateRequestAndSerialize(
|
|
651
|
+
arena, attributes, observability_mode, processing_mode,
|
|
652
|
+
[&](envoy_service_ext_proc_v3_ProcessingRequest* request) {
|
|
653
|
+
auto* upb_headers = CreateUpbHeaderMap(
|
|
654
|
+
arena, *metadata, allowed_headers, disallowed_headers);
|
|
655
|
+
SetExtProcResponseHeaders(arena, upb_headers, end_of_stream, request);
|
|
656
|
+
});
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
absl::StatusOr<std::string> CreateExtProcClientBodyRequest(
|
|
660
|
+
upb_Arena* arena, absl::string_view body,
|
|
661
|
+
::google_protobuf_Struct* attributes, bool observability_mode,
|
|
662
|
+
std::optional<ExtProcProcessingMode> processing_mode, bool end_of_stream,
|
|
663
|
+
bool end_of_stream_without_message) {
|
|
664
|
+
return CreateRequestAndSerialize(
|
|
665
|
+
arena, attributes, observability_mode, processing_mode,
|
|
666
|
+
[&](envoy_service_ext_proc_v3_ProcessingRequest* request) {
|
|
667
|
+
SetExtProcRequestBody(
|
|
668
|
+
arena, upb_StringView_FromDataAndSize(body.data(), body.size()),
|
|
669
|
+
end_of_stream, end_of_stream_without_message, request);
|
|
670
|
+
});
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
absl::StatusOr<std::string> CreateExtProcServerBodyRequest(
|
|
674
|
+
upb_Arena* arena, absl::string_view body,
|
|
675
|
+
::google_protobuf_Struct* attributes, bool observability_mode,
|
|
676
|
+
std::optional<ExtProcProcessingMode> processing_mode) {
|
|
677
|
+
return CreateRequestAndSerialize(
|
|
678
|
+
arena, attributes, observability_mode, processing_mode,
|
|
679
|
+
[&](envoy_service_ext_proc_v3_ProcessingRequest* request) {
|
|
680
|
+
SetExtProcResponseBody(
|
|
681
|
+
arena, upb_StringView_FromDataAndSize(body.data(), body.size()),
|
|
682
|
+
request);
|
|
683
|
+
});
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
absl::StatusOr<std::string> CreateExtProcServerTrailersRequest(
|
|
687
|
+
upb_Arena* arena, grpc_metadata_batch* trailers,
|
|
688
|
+
const std::vector<StringMatcher>& allowed_headers,
|
|
689
|
+
const std::vector<StringMatcher>& disallowed_headers,
|
|
690
|
+
::google_protobuf_Struct* attributes, bool observability_mode,
|
|
691
|
+
std::optional<ExtProcProcessingMode> processing_mode) {
|
|
692
|
+
return CreateRequestAndSerialize(
|
|
693
|
+
arena, attributes, observability_mode, processing_mode,
|
|
694
|
+
[&](envoy_service_ext_proc_v3_ProcessingRequest* request) {
|
|
695
|
+
auto* upb_trailers = CreateUpbHeaderMap(
|
|
696
|
+
arena, *trailers, allowed_headers, disallowed_headers);
|
|
697
|
+
SetExtProcResponseTrailers(arena, upb_trailers, request);
|
|
698
|
+
});
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
} // namespace grpc_core
|