grpc 1.41.1 → 1.42.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +55 -43
- data/include/grpc/event_engine/event_engine.h +82 -42
- data/include/grpc/event_engine/internal/memory_allocator_impl.h +98 -0
- data/include/grpc/event_engine/memory_allocator.h +210 -0
- data/include/grpc/grpc.h +4 -0
- data/include/grpc/grpc_security.h +18 -0
- data/include/grpc/grpc_security_constants.h +1 -0
- data/include/grpc/impl/codegen/port_platform.h +7 -0
- data/src/core/ext/filters/client_channel/backend_metric.cc +18 -19
- data/src/core/ext/filters/client_channel/backup_poller.cc +2 -1
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +71 -89
- data/src/core/ext/filters/client_channel/client_channel.cc +187 -252
- data/src/core/ext/filters/client_channel/client_channel.h +74 -27
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +1 -1
- data/src/core/ext/filters/client_channel/client_channel_factory.h +17 -19
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +8 -14
- data/src/core/ext/filters/client_channel/config_selector.cc +1 -1
- data/src/core/ext/filters/client_channel/config_selector.h +4 -5
- data/src/core/ext/filters/client_channel/connector.h +18 -18
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +1 -1
- data/src/core/ext/filters/client_channel/global_subchannel_pool.h +0 -1
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +12 -11
- data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -15
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +166 -82
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +4 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -4
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +23 -7
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -10
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -3
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +2502 -0
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +6 -1
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +7 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +6 -2
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +7 -16
- data/src/core/ext/filters/client_channel/lb_policy.h +11 -1
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -0
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +139 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +11 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +12 -39
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +21 -1
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -2
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +3 -1
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +77 -68
- data/src/core/ext/filters/client_channel/resolver.h +1 -1
- data/src/core/ext/filters/client_channel/resolver_factory.h +2 -0
- data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -8
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +1 -1
- data/src/core/ext/filters/client_channel/retry_filter.cc +48 -86
- data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
- data/src/core/ext/filters/client_channel/retry_throttle.cc +17 -48
- data/src/core/ext/filters/client_channel/server_address.h +1 -1
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +49 -36
- data/src/core/ext/filters/client_channel/subchannel.cc +85 -143
- data/src/core/ext/filters/client_channel/subchannel.h +29 -49
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +22 -7
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +11 -2
- data/src/core/ext/filters/client_idle/client_idle_filter.cc +27 -210
- data/src/core/ext/filters/client_idle/idle_filter_state.cc +96 -0
- data/src/core/ext/filters/client_idle/idle_filter_state.h +66 -0
- data/src/core/ext/filters/deadline/deadline_filter.cc +23 -26
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -19
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -1
- data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
- data/src/core/ext/filters/http/client/http_client_filter.cc +41 -44
- data/src/core/ext/filters/http/client_authority_filter.cc +14 -15
- data/src/core/ext/filters/http/http_filters_plugin.cc +53 -71
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +17 -12
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +1 -1
- data/src/core/ext/filters/http/server/http_server_filter.cc +72 -69
- data/src/core/ext/filters/max_age/max_age_filter.cc +24 -26
- data/src/core/ext/filters/message_size/message_size_filter.cc +19 -16
- data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
- data/src/core/ext/{filters/client_channel → service_config}/service_config.cc +2 -2
- data/src/core/ext/{filters/client_channel → service_config}/service_config.h +4 -4
- data/src/core/ext/service_config/service_config_call_data.h +72 -0
- data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.cc +3 -3
- data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.h +8 -6
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -5
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +19 -24
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +27 -50
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +14 -16
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +59 -58
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +19 -16
- data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -4
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -4
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -3
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/hpack_constants.h +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +41 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -4
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +136 -98
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +27 -8
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +12 -25
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +37 -30
- data/src/core/ext/transport/chttp2/transport/internal.h +4 -3
- data/src/core/ext/transport/chttp2/transport/parsing.cc +30 -173
- data/src/core/ext/transport/chttp2/transport/popularity_count.h +1 -1
- data/src/core/ext/transport/chttp2/transport/writing.cc +29 -22
- data/src/core/ext/transport/inproc/inproc_transport.cc +105 -109
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +68 -34
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +139 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +16 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +53 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +3 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +15 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +13 -8
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +23 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +0 -1
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +14 -11
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +17 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +15 -12
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +49 -19
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +55 -0
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +154 -0
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +0 -2
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +58 -0
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +182 -0
- data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +58 -0
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +130 -0
- data/src/core/ext/upb-generated/{udpa/type/v1 → xds/type/v3}/typed_struct.upb.c +7 -7
- data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +83 -0
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +310 -286
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +10 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +101 -88
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +59 -56
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +59 -46
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +78 -82
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +323 -316
- data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +5 -4
- data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +19 -23
- data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +4 -3
- data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +5 -3
- data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +5 -4
- data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +75 -0
- data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +50 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +13 -12
- data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +25 -24
- data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +16 -15
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +17 -16
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +33 -32
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +19 -18
- data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +45 -0
- data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +35 -0
- data/src/core/ext/xds/xds_api.cc +325 -362
- data/src/core/ext/xds/xds_api.h +134 -82
- data/src/core/ext/xds/xds_bootstrap.h +10 -0
- data/src/core/ext/xds/xds_certificate_provider.cc +3 -3
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +113 -0
- data/src/core/ext/xds/xds_channel_stack_modifier.h +52 -0
- data/src/core/ext/xds/xds_client.cc +527 -314
- data/src/core/ext/xds/xds_client.h +42 -37
- data/src/core/ext/xds/xds_client_stats.h +1 -1
- data/src/core/ext/xds/xds_server_config_fetcher.cc +5 -7
- data/src/core/lib/address_utils/parse_address.cc +2 -0
- data/src/core/lib/avl/avl.cc +5 -5
- data/src/core/lib/backoff/backoff.cc +1 -1
- data/src/core/lib/channel/channel_args.cc +24 -6
- data/src/core/lib/channel/channel_args.h +9 -0
- data/src/core/lib/channel/channel_stack_builder.cc +3 -3
- data/src/core/lib/channel/channel_trace.cc +1 -1
- data/src/core/lib/channel/channel_trace.h +1 -1
- data/src/core/lib/channel/channelz.cc +3 -3
- data/src/core/lib/channel/channelz.h +2 -2
- data/src/core/lib/channel/channelz_registry.cc +1 -1
- data/src/core/lib/channel/channelz_registry.h +1 -1
- data/src/core/lib/channel/connected_channel.cc +1 -3
- data/src/core/lib/channel/connected_channel.h +1 -2
- data/src/core/lib/compression/compression.cc +2 -2
- data/src/core/lib/compression/compression_args.cc +6 -4
- data/src/core/lib/compression/compression_internal.cc +2 -2
- data/src/core/lib/compression/compression_internal.h +1 -1
- data/src/core/lib/config/core_configuration.cc +44 -2
- data/src/core/lib/config/core_configuration.h +39 -1
- data/src/core/lib/debug/stats.cc +1 -1
- data/src/core/lib/debug/stats_data.cc +13 -13
- data/src/core/lib/gpr/atm.cc +1 -1
- data/src/core/lib/gpr/cpu_posix.cc +1 -1
- data/src/core/lib/gpr/string.cc +2 -2
- data/src/core/lib/gpr/tls.h +1 -1
- data/src/core/lib/gpr/useful.h +79 -32
- data/src/core/lib/gprpp/arena.h +10 -0
- data/src/core/lib/gprpp/bitset.h +38 -16
- data/src/core/lib/gprpp/chunked_vector.h +211 -0
- data/src/core/lib/gprpp/construct_destruct.h +1 -1
- data/src/core/lib/gprpp/match.h +1 -1
- data/src/core/lib/gprpp/memory.h +6 -0
- data/src/core/lib/gprpp/overload.h +1 -1
- data/src/core/lib/gprpp/status_helper.cc +23 -3
- data/src/core/lib/gprpp/status_helper.h +12 -1
- data/src/core/lib/gprpp/table.h +411 -0
- data/src/core/lib/http/httpcli.cc +200 -182
- data/src/core/lib/http/parser.cc +2 -2
- data/src/core/lib/iomgr/call_combiner.cc +28 -10
- data/src/core/lib/iomgr/combiner.cc +6 -21
- data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -6
- data/src/core/lib/iomgr/error.cc +113 -52
- data/src/core/lib/iomgr/error.h +50 -9
- data/src/core/lib/iomgr/error_cfstream.cc +5 -0
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -2
- data/src/core/lib/iomgr/ev_epollex_linux.cc +7 -7
- data/src/core/lib/iomgr/ev_poll_posix.cc +29 -20
- data/src/core/lib/iomgr/event_engine/closure.cc +41 -18
- data/src/core/lib/iomgr/event_engine/closure.h +10 -1
- data/src/core/lib/iomgr/event_engine/endpoint.cc +3 -3
- data/src/core/lib/iomgr/event_engine/iomgr.cc +1 -1
- data/src/core/lib/iomgr/event_engine/pollset.cc +5 -4
- data/src/core/lib/iomgr/event_engine/resolver.cc +10 -7
- data/src/core/lib/iomgr/event_engine/tcp.cc +9 -8
- data/src/core/lib/iomgr/event_engine/timer.cc +7 -2
- data/src/core/lib/iomgr/exec_ctx.cc +1 -9
- data/src/core/lib/iomgr/executor/mpmcqueue.cc +5 -7
- data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -8
- data/src/core/lib/iomgr/executor.cc +6 -20
- data/src/core/lib/iomgr/iomgr.cc +3 -1
- data/src/core/lib/iomgr/iomgr_internal.cc +4 -9
- data/src/core/lib/iomgr/iomgr_internal.h +3 -2
- data/src/core/lib/iomgr/load_file.cc +2 -2
- data/src/core/lib/iomgr/lockfree_event.cc +18 -0
- data/src/core/lib/iomgr/pollset_custom.cc +1 -1
- data/src/core/lib/iomgr/pollset_custom.h +1 -1
- data/src/core/lib/iomgr/resolve_address_posix.cc +5 -7
- data/src/core/lib/iomgr/resource_quota.cc +13 -11
- data/src/core/lib/iomgr/socket_factory_posix.cc +2 -2
- data/src/core/lib/iomgr/socket_mutator.cc +2 -2
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -2
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -3
- data/src/core/lib/iomgr/tcp_client_custom.cc +1 -1
- data/src/core/lib/iomgr/tcp_client_posix.cc +9 -18
- data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
- data/src/core/lib/iomgr/tcp_posix.cc +4 -5
- data/src/core/lib/iomgr/tcp_server_custom.cc +2 -1
- data/src/core/lib/iomgr/tcp_server_posix.cc +3 -4
- data/src/core/lib/iomgr/tcp_server_windows.cc +4 -5
- data/src/core/lib/iomgr/tcp_windows.cc +2 -2
- data/src/core/lib/iomgr/timer_generic.cc +13 -13
- data/src/core/lib/iomgr/timer_heap.cc +1 -1
- data/src/core/lib/json/json_util.cc +68 -0
- data/src/core/lib/json/json_util.h +57 -99
- data/src/core/lib/json/json_writer.cc +0 -3
- data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
- data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
- data/src/core/lib/security/authorization/evaluate_args.cc +14 -12
- data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +13 -1
- data/src/core/lib/security/context/security_context.cc +4 -2
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
- data/src/core/lib/security/credentials/credentials.cc +4 -2
- data/src/core/lib/security/credentials/credentials.h +6 -1
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +47 -11
- data/src/core/lib/security/credentials/external/external_account_credentials.h +1 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -9
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -2
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +2 -2
- data/src/core/lib/security/security_connector/security_connector.cc +9 -4
- data/src/core/lib/security/security_connector/security_connector.h +1 -1
- data/src/core/lib/security/security_connector/ssl_utils.cc +1 -1
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +1 -0
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +0 -2
- data/src/core/lib/security/transport/client_auth_filter.cc +5 -5
- data/src/core/lib/security/transport/security_handshaker.cc +73 -43
- data/src/core/lib/security/transport/server_auth_filter.cc +3 -5
- data/src/core/lib/security/transport/tsi_error.cc +3 -5
- data/src/core/lib/slice/slice.cc +0 -16
- data/src/core/lib/slice/slice_api.cc +39 -0
- data/src/core/lib/slice/slice_buffer.cc +5 -5
- data/src/core/lib/slice/slice_intern.cc +8 -13
- data/src/core/lib/slice/slice_internal.h +1 -244
- data/src/core/lib/slice/slice_refcount.cc +17 -0
- data/src/core/lib/slice/slice_refcount.h +121 -0
- data/src/core/lib/slice/slice_refcount_base.h +173 -0
- data/src/core/lib/slice/slice_split.cc +100 -0
- data/src/core/lib/slice/slice_split.h +40 -0
- data/src/core/lib/slice/slice_string_helpers.cc +0 -83
- data/src/core/lib/slice/slice_string_helpers.h +0 -11
- data/src/core/lib/slice/static_slice.cc +529 -0
- data/src/core/lib/slice/static_slice.h +331 -0
- data/src/core/lib/surface/builtins.cc +49 -0
- data/src/core/{ext/filters/workarounds/workaround_cronet_compression_filter.h → lib/surface/builtins.h} +8 -9
- data/src/core/lib/surface/call.cc +103 -120
- data/src/core/lib/surface/call.h +0 -6
- data/src/core/lib/surface/channel.cc +19 -32
- data/src/core/lib/surface/channel.h +0 -9
- data/src/core/lib/surface/channel_init.cc +23 -76
- data/src/core/lib/surface/channel_init.h +52 -44
- data/src/core/lib/surface/completion_queue.cc +6 -5
- data/src/core/lib/surface/init.cc +0 -39
- data/src/core/lib/surface/init_secure.cc +17 -14
- data/src/core/lib/surface/lame_client.cc +18 -11
- data/src/core/lib/surface/lame_client.h +1 -1
- data/src/core/lib/surface/server.cc +25 -17
- data/src/core/lib/surface/server.h +17 -10
- data/src/core/lib/surface/validate_metadata.cc +5 -2
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/bdp_estimator.cc +1 -1
- data/src/core/lib/transport/error_utils.cc +42 -17
- data/src/core/lib/transport/error_utils.h +1 -1
- data/src/core/lib/transport/metadata.cc +31 -10
- data/src/core/lib/transport/metadata.h +2 -1
- data/src/core/lib/transport/metadata_batch.cc +35 -371
- data/src/core/lib/transport/metadata_batch.h +905 -71
- data/src/core/lib/transport/parsed_metadata.h +263 -0
- data/src/core/lib/transport/pid_controller.cc +4 -4
- data/src/core/lib/transport/static_metadata.cc +714 -846
- data/src/core/lib/transport/static_metadata.h +115 -379
- data/src/core/lib/transport/status_metadata.cc +1 -0
- data/src/core/lib/transport/transport.cc +4 -5
- data/src/core/lib/transport/transport_op_string.cc +40 -20
- data/src/core/plugin_registry/grpc_plugin_registry.cc +64 -43
- data/src/core/tsi/alts/crypt/aes_gcm.cc +3 -1
- data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +13 -12
- data/src/core/tsi/alts/frame_protector/frame_handler.cc +10 -11
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -2
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +12 -2
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +2 -2
- data/src/core/tsi/fake_transport_security.cc +15 -7
- data/src/core/tsi/local_transport_security.cc +36 -73
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +16 -50
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -3
- data/src/core/tsi/ssl_transport_security.cc +10 -2
- data/src/core/tsi/transport_security.cc +12 -0
- data/src/core/tsi/transport_security.h +16 -1
- data/src/core/tsi/transport_security_interface.h +26 -0
- data/src/ruby/ext/grpc/extconf.rb +12 -9
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -2
- data/src/ruby/spec/client_server_spec.rb +1 -1
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +4 -4
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +11 -6
- data/third_party/address_sorting/address_sorting_posix.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +20 -21
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +104 -114
- data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +13 -0
- data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +4 -6
- data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +38 -47
- data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +32 -34
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +5 -9
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c +10 -11
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h +1 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +3 -6
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +4 -7
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +35 -35
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +11 -10
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +10 -37
- data/third_party/boringssl-with-bazel/src/crypto/internal.h +39 -0
- data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +6 -6
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +0 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +72 -45
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +5 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +2 -2
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +479 -15
- data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +16 -564
- data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +0 -1
- data/third_party/re2/re2/compile.cc +91 -109
- data/third_party/re2/re2/dfa.cc +27 -39
- data/third_party/re2/re2/filtered_re2.cc +18 -2
- data/third_party/re2/re2/filtered_re2.h +10 -5
- data/third_party/re2/re2/nfa.cc +1 -1
- data/third_party/re2/re2/parse.cc +42 -23
- data/third_party/re2/re2/perl_groups.cc +34 -34
- data/third_party/re2/re2/prefilter.cc +3 -2
- data/third_party/re2/re2/prog.cc +182 -4
- data/third_party/re2/re2/prog.h +28 -9
- data/third_party/re2/re2/re2.cc +87 -118
- data/third_party/re2/re2/re2.h +156 -141
- data/third_party/re2/re2/regexp.cc +12 -5
- data/third_party/re2/re2/regexp.h +8 -2
- data/third_party/re2/re2/set.cc +31 -9
- data/third_party/re2/re2/set.h +9 -4
- data/third_party/re2/re2/simplify.cc +11 -3
- data/third_party/re2/re2/tostring.cc +1 -1
- data/third_party/re2/re2/walker-inl.h +1 -1
- data/third_party/re2/util/mutex.h +2 -2
- data/third_party/re2/util/pcre.h +3 -3
- metadata +78 -66
- data/include/grpc/event_engine/slice_allocator.h +0 -71
- data/src/core/ext/filters/client_channel/service_config_call_data.h +0 -126
- data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +0 -211
- data/src/core/ext/filters/workarounds/workaround_utils.cc +0 -53
- data/src/core/ext/filters/workarounds/workaround_utils.h +0 -39
- data/src/core/ext/transport/chttp2/client/authority.cc +0 -42
- data/src/core/ext/transport/chttp2/client/authority.h +0 -36
- data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +0 -67
- data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +0 -74
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +0 -66
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +0 -58
- data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +0 -58
- data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +0 -130
- data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +0 -83
- data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +0 -44
- data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +0 -35
- data/src/core/lib/iomgr/udp_server.cc +0 -747
- data/src/core/lib/iomgr/udp_server.h +0 -103
- data/src/core/lib/transport/authority_override.cc +0 -40
- data/src/core/lib/transport/authority_override.h +0 -37
@@ -23,15 +23,22 @@
|
|
23
23
|
|
24
24
|
#include <stdbool.h>
|
25
25
|
|
26
|
+
#include "absl/strings/match.h"
|
27
|
+
#include "absl/strings/str_join.h"
|
26
28
|
#include "absl/types/optional.h"
|
27
29
|
|
28
30
|
#include <grpc/grpc.h>
|
29
31
|
#include <grpc/slice.h>
|
30
32
|
#include <grpc/support/time.h>
|
31
33
|
|
34
|
+
#include "src/core/lib/gprpp/chunked_vector.h"
|
35
|
+
#include "src/core/lib/gprpp/table.h"
|
32
36
|
#include "src/core/lib/iomgr/exec_ctx.h"
|
37
|
+
#include "src/core/lib/surface/validate_metadata.h"
|
33
38
|
#include "src/core/lib/transport/metadata.h"
|
39
|
+
#include "src/core/lib/transport/parsed_metadata.h"
|
34
40
|
#include "src/core/lib/transport/static_metadata.h"
|
41
|
+
#include "src/core/lib/transport/timeout_encoding.h"
|
35
42
|
|
36
43
|
typedef struct grpc_linked_mdelem {
|
37
44
|
grpc_linked_mdelem() {}
|
@@ -49,42 +56,877 @@ typedef struct grpc_mdelem_list {
|
|
49
56
|
grpc_linked_mdelem* tail;
|
50
57
|
} grpc_mdelem_list;
|
51
58
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
59
|
+
struct grpc_filtered_mdelem {
|
60
|
+
grpc_error_handle error;
|
61
|
+
grpc_mdelem md;
|
62
|
+
};
|
63
|
+
#define GRPC_FILTERED_ERROR(error) \
|
64
|
+
{ (error), GRPC_MDNULL }
|
65
|
+
#define GRPC_FILTERED_MDELEM(md) \
|
66
|
+
{ GRPC_ERROR_NONE, (md) }
|
67
|
+
#define GRPC_FILTERED_REMOVE() \
|
68
|
+
{ GRPC_ERROR_NONE, GRPC_MDNULL }
|
69
|
+
|
70
|
+
grpc_error_handle grpc_attach_md_to_error(grpc_error_handle src,
|
71
|
+
grpc_mdelem md);
|
72
|
+
|
73
|
+
namespace grpc_core {
|
74
|
+
|
75
|
+
// grpc-timeout metadata trait.
|
76
|
+
// ValueType is defined as grpc_millis - an absolute timestamp (i.e. a
|
77
|
+
// deadline!), that is converted to a duration by transports before being
|
78
|
+
// sent.
|
79
|
+
// TODO(ctiller): Move this elsewhere. During the transition we need to be able
|
80
|
+
// to name this in MetadataMap, but ultimately once the transition is done we
|
81
|
+
// should not need to.
|
82
|
+
struct GrpcTimeoutMetadata {
|
83
|
+
using ValueType = grpc_millis;
|
84
|
+
using MementoType = grpc_millis;
|
85
|
+
static const char* key() { return "grpc-timeout"; }
|
86
|
+
static MementoType ParseMemento(const grpc_slice& value) {
|
87
|
+
grpc_millis timeout;
|
88
|
+
if (GPR_UNLIKELY(!grpc_http2_decode_timeout(value, &timeout))) {
|
89
|
+
timeout = GRPC_MILLIS_INF_FUTURE;
|
90
|
+
}
|
91
|
+
grpc_slice_unref_internal(value);
|
92
|
+
return timeout;
|
93
|
+
}
|
94
|
+
static ValueType MementoToValue(MementoType timeout) {
|
95
|
+
if (timeout == GRPC_MILLIS_INF_FUTURE) {
|
96
|
+
return GRPC_MILLIS_INF_FUTURE;
|
97
|
+
}
|
98
|
+
return grpc_core::ExecCtx::Get()->Now() + timeout;
|
99
|
+
}
|
100
|
+
static grpc_slice Encode(ValueType x) {
|
101
|
+
char timeout[GRPC_HTTP2_TIMEOUT_ENCODE_MIN_BUFSIZE];
|
102
|
+
grpc_http2_encode_timeout(x, timeout);
|
103
|
+
return grpc_slice_from_copied_string(timeout);
|
104
|
+
}
|
105
|
+
static MementoType DisplayValue(MementoType x) { return x; }
|
106
|
+
};
|
107
|
+
|
108
|
+
// TE metadata trait.
|
109
|
+
struct TeMetadata {
|
110
|
+
// HTTP2 says that TE can either be empty or "trailers".
|
111
|
+
// Empty means this trait is not included, "trailers" means kTrailers, and
|
112
|
+
// kInvalid is used to remember an invalid value.
|
113
|
+
enum ValueType : uint8_t {
|
114
|
+
kTrailers,
|
115
|
+
kInvalid,
|
116
|
+
};
|
117
|
+
using MementoType = ValueType;
|
118
|
+
static const char* key() { return "te"; }
|
119
|
+
static MementoType ParseMemento(const grpc_slice& value) {
|
120
|
+
auto out = kInvalid;
|
121
|
+
if (grpc_slice_eq(value, GRPC_MDSTR_TRAILERS)) {
|
122
|
+
out = kTrailers;
|
123
|
+
}
|
124
|
+
grpc_slice_unref_internal(value);
|
125
|
+
return out;
|
126
|
+
}
|
127
|
+
static ValueType MementoToValue(MementoType te) { return te; }
|
128
|
+
static grpc_slice Encode(ValueType x) {
|
129
|
+
GPR_ASSERT(x == kTrailers);
|
130
|
+
return GRPC_MDSTR_TRAILERS;
|
131
|
+
}
|
132
|
+
static const char* DisplayValue(MementoType te) {
|
133
|
+
switch (te) {
|
134
|
+
case ValueType::kTrailers:
|
135
|
+
return "trailers";
|
136
|
+
default:
|
137
|
+
return "<discarded-invalid-value>";
|
138
|
+
}
|
139
|
+
}
|
140
|
+
};
|
141
|
+
|
142
|
+
namespace metadata_detail {
|
60
143
|
|
144
|
+
// Inner implementation of MetadataMap<Container>::Parse()
|
145
|
+
// Recursive in terms of metadata trait, tries each known type in order by doing
|
146
|
+
// a string comparison on key, and if that key is found parses it. If not found,
|
147
|
+
// calls not_found to generate the result value.
|
148
|
+
template <typename Container, typename... Traits>
|
149
|
+
struct ParseHelper;
|
150
|
+
|
151
|
+
template <typename Container, typename Trait, typename... Traits>
|
152
|
+
struct ParseHelper<Container, Trait, Traits...> {
|
153
|
+
template <typename NotFound>
|
154
|
+
static ParsedMetadata<Container> Parse(absl::string_view key,
|
155
|
+
const grpc_slice& value,
|
156
|
+
NotFound not_found) {
|
157
|
+
if (key == Trait::key()) {
|
158
|
+
return ParsedMetadata<Container>(
|
159
|
+
Trait(), Trait::ParseMemento(value),
|
160
|
+
ParsedMetadata<Container>::TransportSize(key.size(),
|
161
|
+
GRPC_SLICE_LENGTH(value)));
|
162
|
+
}
|
163
|
+
return ParseHelper<Container, Traits...>::Parse(key, value, not_found);
|
164
|
+
}
|
165
|
+
};
|
166
|
+
|
167
|
+
template <typename Container>
|
168
|
+
struct ParseHelper<Container> {
|
169
|
+
template <typename NotFound>
|
170
|
+
static ParsedMetadata<Container> Parse(absl::string_view, const grpc_slice&,
|
171
|
+
NotFound not_found) {
|
172
|
+
return not_found();
|
173
|
+
}
|
174
|
+
};
|
175
|
+
|
176
|
+
// Inner implementation of MetadataMap<Container>::Append()
|
177
|
+
// Recursive in terms of metadata trait, tries each known type in order by doing
|
178
|
+
// a string comparison on key, and if that key is found sets it. If not found,
|
179
|
+
// calls not_found to append generically.
|
180
|
+
template <typename Container, typename... Traits>
|
181
|
+
struct AppendHelper;
|
182
|
+
|
183
|
+
template <typename Container, typename Trait, typename... Traits>
|
184
|
+
struct AppendHelper<Container, Trait, Traits...> {
|
185
|
+
template <typename NotFound>
|
186
|
+
static void Append(Container* container, absl::string_view key,
|
187
|
+
const grpc_slice& value, NotFound not_found) {
|
188
|
+
if (key == Trait::key()) {
|
189
|
+
container->Set(Trait(),
|
190
|
+
Trait::MementoToValue(Trait::ParseMemento(value)));
|
191
|
+
return;
|
192
|
+
}
|
193
|
+
AppendHelper<Container, Traits...>::Append(container, key, value,
|
194
|
+
not_found);
|
195
|
+
}
|
196
|
+
};
|
197
|
+
|
198
|
+
template <typename Container>
|
199
|
+
struct AppendHelper<Container> {
|
200
|
+
template <typename NotFound>
|
201
|
+
static void Append(Container*, absl::string_view, const grpc_slice&,
|
202
|
+
NotFound not_found) {
|
203
|
+
not_found();
|
204
|
+
}
|
205
|
+
};
|
206
|
+
|
207
|
+
} // namespace metadata_detail
|
208
|
+
|
209
|
+
// MetadataMap encodes the mapping of metadata keys to metadata values.
|
210
|
+
// Right now the API presented is the minimal one that will allow us to
|
211
|
+
// substitute this type for grpc_metadata_batch in a relatively easy fashion. At
|
212
|
+
// that point we'll start iterating this API into something that's ergonomic
|
213
|
+
// again, whilst minimally holding the performance bar already set (and
|
214
|
+
// hopefully improving some things).
|
215
|
+
// In the meantime, we're not going to invest much time in ephemeral API
|
216
|
+
// documentation, so if you must use one of these APIs and it's not obvious
|
217
|
+
// how, reach out to ctiller.
|
218
|
+
//
|
219
|
+
// MetadataMap takes a list of traits. Each of these trait objects defines
|
220
|
+
// one metadata field that is used by core, and so should have more specialized
|
221
|
+
// handling than just using the generic APIs.
|
222
|
+
//
|
223
|
+
// Each trait object has the following signature:
|
224
|
+
// // Traits for the grpc-xyz metadata field:
|
225
|
+
// struct GrpcXyzMetadata {
|
226
|
+
// // The type that's stored on MetadataBatch
|
227
|
+
// using ValueType = ...;
|
228
|
+
// // The type that's stored in compression/decompression tables
|
229
|
+
// using MementoType = ...;
|
230
|
+
// // The string key for this metadata type (for transports that require it)
|
231
|
+
// static constexpr char* key() { return "grpc-xyz"; }
|
232
|
+
// // Parse a memento from a slice
|
233
|
+
// // Takes ownership of value
|
234
|
+
// static MementoType ParseMemento(const grpc_slice& value) { ... }
|
235
|
+
// // Convert a memento to a value
|
236
|
+
// static ValueType MementoToValue(MementoType memento) { ... }
|
237
|
+
// // Convert a value to its canonical text wire format (the format that
|
238
|
+
// // ParseMemento will accept!)
|
239
|
+
// static grpc_slice Encode(ValueType value);
|
240
|
+
// // Convert a value to something that can be passed to StrCat and displayed
|
241
|
+
// // for debugging
|
242
|
+
// static SomeStrCatableType DisplayValue(MementoType value) { ... }
|
243
|
+
// };
|
244
|
+
//
|
245
|
+
// About parsing and mementos:
|
246
|
+
//
|
247
|
+
// Many gRPC transports exchange metadata as key/value strings, but also allow
|
248
|
+
// for a more efficient representation as a single integer. We can use this
|
249
|
+
// integer representation to avoid reparsing too, by storing the parsed value
|
250
|
+
// in the compression table. This is what mementos are used for.
|
251
|
+
//
|
252
|
+
// A trait offers the capability to turn a slice into a memento via
|
253
|
+
// ParseMemento. This is exposed to users of MetadataMap via the Parse() method,
|
254
|
+
// that returns a ParsedMetadata object. That ParsedMetadata object can in turn
|
255
|
+
// be used to set the same value on many different MetadataMaps without having
|
256
|
+
// to reparse.
|
257
|
+
//
|
258
|
+
// Implementation wise, ParsedMetadata is a type erased wrapper around
|
259
|
+
// MementoType. When we set a value on MetadataMap, we first turn that memento
|
260
|
+
// into a value. For most types, this is going to be a no-op, but for example
|
261
|
+
// for grpc-timeout we make the memento the timeout expressed on the wire, but
|
262
|
+
// we make the value the timestamp of when the timeout will expire (i.e. the
|
263
|
+
// deadline).
|
264
|
+
template <typename... Traits>
|
265
|
+
class MetadataMap {
|
266
|
+
public:
|
267
|
+
explicit MetadataMap(Arena* arena);
|
268
|
+
~MetadataMap();
|
269
|
+
|
270
|
+
MetadataMap(const MetadataMap&) = delete;
|
271
|
+
MetadataMap& operator=(const MetadataMap&) = delete;
|
272
|
+
MetadataMap(MetadataMap&&) noexcept;
|
273
|
+
MetadataMap& operator=(MetadataMap&&) noexcept;
|
274
|
+
|
275
|
+
// Encode this metadata map into some encoder.
|
276
|
+
// For each field that is set in the MetadataMap, call
|
277
|
+
// encoder->Encode.
|
278
|
+
//
|
279
|
+
// For fields for which we have traits, this will be a method with
|
280
|
+
// the signature:
|
281
|
+
// void Encode(TraitsType, typename TraitsType::ValueType value);
|
282
|
+
// For fields for which we do not have traits, this will be a method
|
283
|
+
// with the signature:
|
284
|
+
// void Encode(grpc_mdelem md);
|
285
|
+
// TODO(ctiller): It's expected that the latter Encode method will
|
286
|
+
// become Encode(Slice, Slice) by the end of the current metadata API
|
287
|
+
// transitions.
|
61
288
|
template <typename Encoder>
|
62
289
|
void Encode(Encoder* encoder) const {
|
63
|
-
for (auto* l =
|
290
|
+
for (auto* l = list_.head; l; l = l->next) {
|
64
291
|
encoder->Encode(l->md);
|
65
292
|
}
|
66
|
-
|
293
|
+
table_.ForEach(EncodeWrapper<Encoder>{encoder});
|
294
|
+
}
|
295
|
+
|
296
|
+
// Get the pointer to the value of some known metadata.
|
297
|
+
// Returns nullptr if the metadata is not present.
|
298
|
+
// Causes a compilation error if Which is not an element of Traits.
|
299
|
+
template <typename Which>
|
300
|
+
const typename Which::ValueType* get_pointer(Which) const {
|
301
|
+
if (auto* p = table_.template get<Value<Which>>()) return &p->value;
|
302
|
+
return nullptr;
|
303
|
+
}
|
304
|
+
|
305
|
+
// Get the pointer to the value of some known metadata.
|
306
|
+
// Returns nullptr if the metadata is not present.
|
307
|
+
// Causes a compilation error if Which is not an element of Traits.
|
308
|
+
template <typename Which>
|
309
|
+
typename Which::ValueType* get_pointer(Which) {
|
310
|
+
if (auto* p = table_.template get<Value<Which>>()) return &p->value;
|
311
|
+
return nullptr;
|
312
|
+
}
|
313
|
+
|
314
|
+
// Get the value of some known metadata.
|
315
|
+
// Returns nullopt if the metadata is not present.
|
316
|
+
// Causes a compilation error if Which is not an element of Traits.
|
317
|
+
template <typename Which>
|
318
|
+
absl::optional<typename Which::ValueType> get(Which) const {
|
319
|
+
if (auto* p = table_.template get<Value<Which>>()) return p->value;
|
320
|
+
return absl::nullopt;
|
321
|
+
}
|
322
|
+
|
323
|
+
// Set the value of some known metadata.
|
324
|
+
// Returns a pointer to the new value.
|
325
|
+
template <typename Which, typename... Args>
|
326
|
+
typename Which::ValueType* Set(Which, Args&&... args) {
|
327
|
+
return &table_.template set<Value<Which>>(std::forward<Args>(args)...)
|
328
|
+
->value;
|
329
|
+
}
|
330
|
+
|
331
|
+
// Remove a specific piece of known metadata.
|
332
|
+
template <typename Which>
|
333
|
+
void Remove(Which) {
|
334
|
+
table_.template clear<Value<Which>>();
|
335
|
+
}
|
336
|
+
|
337
|
+
// Extract a piece of known metadata.
|
338
|
+
// Returns nullopt if the metadata was not present, or the value if it was.
|
339
|
+
// The same as:
|
340
|
+
// auto value = m.get(T());
|
341
|
+
// m.Remove(T());
|
342
|
+
template <typename Which>
|
343
|
+
absl::optional<typename Which::ValueType> Take(Which which) {
|
344
|
+
auto value = get(which);
|
345
|
+
Remove(which);
|
346
|
+
return value;
|
347
|
+
}
|
348
|
+
|
349
|
+
// Parse metadata from a key/value pair, and return an object representing
|
350
|
+
// that result.
|
351
|
+
// TODO(ctiller): key should probably be an absl::string_view.
|
352
|
+
// Once we don't care about interning anymore, make that change!
|
353
|
+
template <class KeySlice, class ValueSlice>
|
354
|
+
static ParsedMetadata<MetadataMap> Parse(const KeySlice& key,
|
355
|
+
const ValueSlice& value) {
|
356
|
+
bool parsed = true;
|
357
|
+
auto out = metadata_detail::ParseHelper<MetadataMap, Traits...>::Parse(
|
358
|
+
StringViewFromSlice(key), value, [&] {
|
359
|
+
parsed = false;
|
360
|
+
return ParsedMetadata<MetadataMap>(
|
361
|
+
grpc_mdelem_from_slices(key, value));
|
362
|
+
});
|
363
|
+
if (parsed) {
|
364
|
+
grpc_slice_unref_internal(key);
|
365
|
+
}
|
366
|
+
return out;
|
367
|
+
}
|
368
|
+
|
369
|
+
// Set a value from a parsed metadata object.
|
370
|
+
GRPC_MUST_USE_RESULT grpc_error_handle
|
371
|
+
Set(const ParsedMetadata<MetadataMap>& m) {
|
372
|
+
return m.SetOnContainer(this);
|
373
|
+
}
|
374
|
+
|
375
|
+
// Append a key/value pair - takes ownership of value
|
376
|
+
void Append(absl::string_view key, const grpc_slice& value) {
|
377
|
+
metadata_detail::AppendHelper<MetadataMap, Traits...>::Append(
|
378
|
+
this, key, value, [&] {
|
379
|
+
GPR_ASSERT(GRPC_ERROR_NONE ==
|
380
|
+
Append(grpc_mdelem_from_slices(
|
381
|
+
grpc_slice_intern(grpc_slice_from_static_buffer(
|
382
|
+
key.data(), key.length())),
|
383
|
+
value)));
|
384
|
+
});
|
385
|
+
}
|
386
|
+
|
387
|
+
//
|
388
|
+
// All APIs below this point are subject to change.
|
389
|
+
//
|
390
|
+
|
391
|
+
template <typename F>
|
392
|
+
void ForEach(F f) const {
|
393
|
+
for (auto* l = list_.head; l; l = l->next) {
|
394
|
+
f(l->md);
|
395
|
+
}
|
396
|
+
}
|
397
|
+
|
398
|
+
template <typename F>
|
399
|
+
grpc_error_handle Filter(F f, const char* composite_error_string) {
|
400
|
+
grpc_linked_mdelem* l = list_.head;
|
401
|
+
grpc_error_handle error = GRPC_ERROR_NONE;
|
402
|
+
auto add_error = [&](grpc_error_handle new_error) {
|
403
|
+
if (new_error == GRPC_ERROR_NONE) return;
|
404
|
+
if (error == GRPC_ERROR_NONE) {
|
405
|
+
error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(composite_error_string);
|
406
|
+
}
|
407
|
+
error = grpc_error_add_child(error, new_error);
|
408
|
+
};
|
409
|
+
while (l) {
|
410
|
+
grpc_linked_mdelem* next = l->next;
|
411
|
+
grpc_filtered_mdelem new_mdelem = f(l->md);
|
412
|
+
add_error(new_mdelem.error);
|
413
|
+
if (GRPC_MDISNULL(new_mdelem.md)) {
|
414
|
+
Remove(l);
|
415
|
+
} else if (new_mdelem.md.payload != l->md.payload) {
|
416
|
+
add_error(Substitute(l, new_mdelem.md));
|
417
|
+
}
|
418
|
+
l = next;
|
419
|
+
}
|
420
|
+
return error;
|
421
|
+
}
|
422
|
+
|
423
|
+
GRPC_MUST_USE_RESULT grpc_error_handle Append(grpc_mdelem md) {
|
424
|
+
return AddTail(elem_storage_.EmplaceBack(), md);
|
425
|
+
}
|
426
|
+
|
427
|
+
GRPC_MUST_USE_RESULT grpc_error_handle ReplaceOrAppend(grpc_slice key,
|
428
|
+
grpc_slice value) {
|
429
|
+
if (ReplaceIfExists(key, value)) return GRPC_ERROR_NONE;
|
430
|
+
return Append(grpc_mdelem_from_slices(key, value));
|
431
|
+
}
|
432
|
+
|
433
|
+
// Set key to value if it exists and return true, otherwise return false.
|
434
|
+
// If this function returns true, it takes ownership of key and value.
|
435
|
+
// If this function returns false, it does not take ownership of key nor
|
436
|
+
// value.
|
437
|
+
bool ReplaceIfExists(grpc_slice key, grpc_slice value);
|
438
|
+
|
439
|
+
void Clear();
|
440
|
+
bool empty() const { return count() == 0; }
|
441
|
+
|
442
|
+
size_t count() const { return list_.count + table_.count(); }
|
443
|
+
size_t non_deadline_count() const { return list_.count; }
|
444
|
+
size_t default_count() const { return list_.default_count; }
|
445
|
+
|
446
|
+
size_t TransportSize() const;
|
447
|
+
|
448
|
+
void Remove(grpc_linked_mdelem* storage);
|
449
|
+
void Remove(grpc_metadata_batch_callouts_index idx);
|
450
|
+
|
451
|
+
absl::optional<grpc_slice> Remove(grpc_slice key);
|
452
|
+
|
453
|
+
grpc_error_handle Substitute(grpc_linked_mdelem* storage,
|
454
|
+
grpc_mdelem new_mdelem);
|
455
|
+
|
456
|
+
absl::optional<absl::string_view> GetValue(
|
457
|
+
absl::string_view target_key, std::string* concatenated_value) const;
|
458
|
+
|
459
|
+
grpc_error_handle LinkHead(grpc_linked_mdelem* storage) GRPC_MUST_USE_RESULT;
|
460
|
+
grpc_error_handle LinkHead(grpc_linked_mdelem* storage,
|
461
|
+
grpc_metadata_batch_callouts_index idx)
|
462
|
+
GRPC_MUST_USE_RESULT;
|
463
|
+
grpc_error_handle LinkTail(grpc_linked_mdelem* storage) GRPC_MUST_USE_RESULT;
|
464
|
+
grpc_error_handle LinkTail(grpc_linked_mdelem* storage,
|
465
|
+
grpc_metadata_batch_callouts_index idx)
|
466
|
+
GRPC_MUST_USE_RESULT;
|
467
|
+
|
468
|
+
grpc_error_handle AddHead(grpc_linked_mdelem* storage) GRPC_MUST_USE_RESULT;
|
469
|
+
grpc_error_handle AddHead(grpc_linked_mdelem* storage,
|
470
|
+
grpc_mdelem elem_to_add) GRPC_MUST_USE_RESULT;
|
471
|
+
grpc_error_handle AddTail(grpc_linked_mdelem* storage) GRPC_MUST_USE_RESULT;
|
472
|
+
grpc_error_handle AddTail(grpc_linked_mdelem* storage,
|
473
|
+
grpc_mdelem elem_to_add) GRPC_MUST_USE_RESULT;
|
474
|
+
|
475
|
+
void CopyFrom(MetadataMap* src, grpc_linked_mdelem* storage);
|
476
|
+
|
477
|
+
#ifndef NDEBUG
|
478
|
+
void AssertOk();
|
479
|
+
#else
|
480
|
+
void AssertOk() {}
|
481
|
+
#endif
|
482
|
+
|
483
|
+
// TODO(ctiller): the following explicit deadline handling methods are
|
484
|
+
// deprecated in terms of the traits based APIs.
|
485
|
+
grpc_millis deadline() const {
|
486
|
+
return get(GrpcTimeoutMetadata()).value_or(GRPC_MILLIS_INF_FUTURE);
|
487
|
+
};
|
488
|
+
|
489
|
+
const grpc_metadata_batch_callouts* legacy_index() const { return &idx_; }
|
490
|
+
|
491
|
+
private:
|
492
|
+
// Generate a strong type for metadata values per trait.
|
493
|
+
template <typename Which>
|
494
|
+
struct Value {
|
495
|
+
Value() = default;
|
496
|
+
explicit Value(const typename Which::ValueType& value) : value(value) {}
|
497
|
+
Value(const Value&) = default;
|
498
|
+
Value& operator=(const Value&) = default;
|
499
|
+
Value(Value&&) noexcept = default;
|
500
|
+
Value& operator=(Value&&) noexcept = default;
|
501
|
+
GPR_NO_UNIQUE_ADDRESS typename Which::ValueType value;
|
502
|
+
};
|
503
|
+
// Callable for the ForEach in Encode() -- for each value, call the
|
504
|
+
// appropriate encoder method.
|
505
|
+
template <typename Encoder>
|
506
|
+
struct EncodeWrapper {
|
507
|
+
Encoder* encoder;
|
508
|
+
template <typename Which>
|
509
|
+
void operator()(const Value<Which>& which) {
|
510
|
+
encoder->Encode(Which(), which.value);
|
511
|
+
}
|
512
|
+
};
|
513
|
+
|
514
|
+
void AssertValidCallouts();
|
515
|
+
grpc_error_handle LinkCallout(grpc_linked_mdelem* storage,
|
516
|
+
grpc_metadata_batch_callouts_index idx)
|
517
|
+
GRPC_MUST_USE_RESULT;
|
518
|
+
grpc_error_handle MaybeLinkCallout(grpc_linked_mdelem* storage)
|
519
|
+
GRPC_MUST_USE_RESULT;
|
520
|
+
void MaybeUnlinkCallout(grpc_linked_mdelem* storage);
|
521
|
+
|
522
|
+
static void assert_valid_list(grpc_mdelem_list* list) {
|
523
|
+
#ifndef NDEBUG
|
524
|
+
grpc_linked_mdelem* l;
|
525
|
+
|
526
|
+
GPR_ASSERT((list->head == nullptr) == (list->tail == nullptr));
|
527
|
+
if (!list->head) return;
|
528
|
+
GPR_ASSERT(list->head->prev == nullptr);
|
529
|
+
GPR_ASSERT(list->tail->next == nullptr);
|
530
|
+
GPR_ASSERT((list->head == list->tail) == (list->head->next == nullptr));
|
531
|
+
|
532
|
+
size_t verified_count = 0;
|
533
|
+
for (l = list->head; l; l = l->next) {
|
534
|
+
GPR_ASSERT(!GRPC_MDISNULL(l->md));
|
535
|
+
GPR_ASSERT((l->prev == nullptr) == (l == list->head));
|
536
|
+
GPR_ASSERT((l->next == nullptr) == (l == list->tail));
|
537
|
+
if (l->next) GPR_ASSERT(l->next->prev == l);
|
538
|
+
if (l->prev) GPR_ASSERT(l->prev->next == l);
|
539
|
+
verified_count++;
|
540
|
+
}
|
541
|
+
GPR_ASSERT(list->count == verified_count);
|
542
|
+
#else
|
543
|
+
// Avoid unused-parameter warning for debug-only parameter
|
544
|
+
(void)list;
|
545
|
+
#endif /* NDEBUG */
|
546
|
+
}
|
547
|
+
|
548
|
+
static grpc_error_handle GPR_ATTRIBUTE_NOINLINE
|
549
|
+
error_with_md(grpc_mdelem md) {
|
550
|
+
return grpc_attach_md_to_error(
|
551
|
+
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Unallowed duplicate metadata"),
|
552
|
+
md);
|
553
|
+
}
|
554
|
+
|
555
|
+
static void link_head(grpc_mdelem_list* list, grpc_linked_mdelem* storage) {
|
556
|
+
assert_valid_list(list);
|
557
|
+
GPR_DEBUG_ASSERT(!GRPC_MDISNULL(storage->md));
|
558
|
+
storage->prev = nullptr;
|
559
|
+
storage->next = list->head;
|
560
|
+
storage->reserved = nullptr;
|
561
|
+
if (list->head != nullptr) {
|
562
|
+
list->head->prev = storage;
|
563
|
+
} else {
|
564
|
+
list->tail = storage;
|
565
|
+
}
|
566
|
+
list->head = storage;
|
567
|
+
list->count++;
|
568
|
+
assert_valid_list(list);
|
569
|
+
}
|
570
|
+
|
571
|
+
static void link_tail(grpc_mdelem_list* list, grpc_linked_mdelem* storage) {
|
572
|
+
assert_valid_list(list);
|
573
|
+
GPR_DEBUG_ASSERT(!GRPC_MDISNULL(storage->md));
|
574
|
+
storage->prev = list->tail;
|
575
|
+
storage->next = nullptr;
|
576
|
+
storage->reserved = nullptr;
|
577
|
+
if (list->tail != nullptr) {
|
578
|
+
list->tail->next = storage;
|
579
|
+
} else {
|
580
|
+
list->head = storage;
|
581
|
+
}
|
582
|
+
list->tail = storage;
|
583
|
+
list->count++;
|
584
|
+
assert_valid_list(list);
|
585
|
+
}
|
586
|
+
|
587
|
+
static void unlink_storage(grpc_mdelem_list* list,
|
588
|
+
grpc_linked_mdelem* storage) {
|
589
|
+
assert_valid_list(list);
|
590
|
+
if (storage->prev != nullptr) {
|
591
|
+
storage->prev->next = storage->next;
|
592
|
+
} else {
|
593
|
+
list->head = storage->next;
|
594
|
+
}
|
595
|
+
if (storage->next != nullptr) {
|
596
|
+
storage->next->prev = storage->prev;
|
597
|
+
} else {
|
598
|
+
list->tail = storage->prev;
|
599
|
+
}
|
600
|
+
list->count--;
|
601
|
+
assert_valid_list(list);
|
602
|
+
}
|
603
|
+
|
604
|
+
// Table of known metadata types.
|
605
|
+
Table<Value<Traits>...> table_;
|
606
|
+
/** Metadata elements in this batch */
|
607
|
+
grpc_mdelem_list list_;
|
608
|
+
grpc_metadata_batch_callouts idx_;
|
609
|
+
// Backing store for added metadata.
|
610
|
+
ChunkedVector<grpc_linked_mdelem, 10> elem_storage_;
|
611
|
+
};
|
612
|
+
|
613
|
+
template <typename... Traits>
|
614
|
+
void MetadataMap<Traits...>::AssertValidCallouts() {
|
615
|
+
#ifndef NDEBUG
|
616
|
+
for (grpc_linked_mdelem* l = list_.head; l != nullptr; l = l->next) {
|
617
|
+
grpc_slice key_interned = grpc_slice_intern(GRPC_MDKEY(l->md));
|
618
|
+
grpc_metadata_batch_callouts_index callout_idx =
|
619
|
+
GRPC_BATCH_INDEX_OF(key_interned);
|
620
|
+
if (callout_idx != GRPC_BATCH_CALLOUTS_COUNT) {
|
621
|
+
GPR_ASSERT(idx_.array[callout_idx] == l);
|
622
|
+
}
|
623
|
+
grpc_slice_unref_internal(key_interned);
|
624
|
+
}
|
625
|
+
#endif
|
626
|
+
}
|
627
|
+
|
628
|
+
#ifndef NDEBUG
|
629
|
+
template <typename... Traits>
|
630
|
+
void MetadataMap<Traits...>::AssertOk() {
|
631
|
+
assert_valid_list(&list_);
|
632
|
+
}
|
633
|
+
#endif /* NDEBUG */
|
634
|
+
|
635
|
+
template <typename... Traits>
|
636
|
+
MetadataMap<Traits...>::MetadataMap(Arena* arena) : elem_storage_(arena) {
|
637
|
+
memset(&list_, 0, sizeof(list_));
|
638
|
+
memset(&idx_, 0, sizeof(idx_));
|
639
|
+
}
|
640
|
+
|
641
|
+
template <typename... Traits>
|
642
|
+
MetadataMap<Traits...>::MetadataMap(MetadataMap&& other) noexcept
|
643
|
+
: table_(std::move(other.table_)) {
|
644
|
+
list_ = other.list_;
|
645
|
+
idx_ = other.idx_;
|
646
|
+
memset(&other.list_, 0, sizeof(list_));
|
647
|
+
memset(&other.idx_, 0, sizeof(idx_));
|
648
|
+
}
|
649
|
+
|
650
|
+
template <typename... Traits>
|
651
|
+
MetadataMap<Traits...>& MetadataMap<Traits...>::operator=(
|
652
|
+
MetadataMap&& other) noexcept {
|
653
|
+
Clear();
|
654
|
+
table_ = std::move(other.table_);
|
655
|
+
list_ = other.list_;
|
656
|
+
idx_ = other.idx_;
|
657
|
+
memset(&other.list_, 0, sizeof(list_));
|
658
|
+
memset(&other.idx_, 0, sizeof(idx_));
|
659
|
+
return *this;
|
660
|
+
}
|
661
|
+
|
662
|
+
template <typename... Traits>
|
663
|
+
MetadataMap<Traits...>::~MetadataMap() {
|
664
|
+
AssertValidCallouts();
|
665
|
+
for (auto* l = list_.head; l; l = l->next) {
|
666
|
+
GRPC_MDELEM_UNREF(l->md);
|
667
|
+
}
|
668
|
+
}
|
669
|
+
|
670
|
+
template <typename... Traits>
|
671
|
+
absl::optional<grpc_slice> MetadataMap<Traits...>::Remove(grpc_slice key) {
|
672
|
+
for (auto* l = list_.head; l; l = l->next) {
|
673
|
+
if (grpc_slice_eq(GRPC_MDKEY(l->md), key)) {
|
674
|
+
auto out = grpc_slice_ref_internal(GRPC_MDVALUE(l->md));
|
675
|
+
Remove(l);
|
676
|
+
return out;
|
677
|
+
}
|
67
678
|
}
|
68
|
-
}
|
679
|
+
return {};
|
680
|
+
}
|
681
|
+
|
682
|
+
template <typename... Traits>
|
683
|
+
grpc_error_handle MetadataMap<Traits...>::LinkCallout(
|
684
|
+
grpc_linked_mdelem* storage, grpc_metadata_batch_callouts_index idx) {
|
685
|
+
AssertValidCallouts();
|
686
|
+
GPR_DEBUG_ASSERT(idx >= 0 && idx < GRPC_BATCH_CALLOUTS_COUNT);
|
687
|
+
if (GPR_LIKELY(idx_.array[idx] == nullptr)) {
|
688
|
+
++list_.default_count;
|
689
|
+
idx_.array[idx] = storage;
|
690
|
+
AssertValidCallouts();
|
691
|
+
return GRPC_ERROR_NONE;
|
692
|
+
}
|
693
|
+
AssertValidCallouts();
|
694
|
+
return error_with_md(storage->md);
|
695
|
+
}
|
69
696
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
697
|
+
template <typename... Traits>
|
698
|
+
grpc_error_handle MetadataMap<Traits...>::MaybeLinkCallout(
|
699
|
+
grpc_linked_mdelem* storage) {
|
700
|
+
grpc_metadata_batch_callouts_index idx =
|
701
|
+
GRPC_BATCH_INDEX_OF(GRPC_MDKEY(storage->md));
|
702
|
+
if (idx == GRPC_BATCH_CALLOUTS_COUNT) {
|
703
|
+
return GRPC_ERROR_NONE;
|
704
|
+
}
|
705
|
+
return LinkCallout(storage, idx);
|
706
|
+
}
|
707
|
+
|
708
|
+
template <typename... Traits>
|
709
|
+
void MetadataMap<Traits...>::MaybeUnlinkCallout(grpc_linked_mdelem* storage) {
|
710
|
+
grpc_metadata_batch_callouts_index idx =
|
711
|
+
GRPC_BATCH_INDEX_OF(GRPC_MDKEY(storage->md));
|
712
|
+
if (idx == GRPC_BATCH_CALLOUTS_COUNT) {
|
713
|
+
return;
|
714
|
+
}
|
715
|
+
--list_.default_count;
|
716
|
+
GPR_DEBUG_ASSERT(idx_.array[idx] != nullptr);
|
717
|
+
idx_.array[idx] = nullptr;
|
718
|
+
}
|
719
|
+
|
720
|
+
template <typename... Traits>
|
721
|
+
grpc_error_handle MetadataMap<Traits...>::AddHead(grpc_linked_mdelem* storage,
|
722
|
+
grpc_mdelem elem_to_add) {
|
723
|
+
GPR_DEBUG_ASSERT(!GRPC_MDISNULL(elem_to_add));
|
724
|
+
storage->md = elem_to_add;
|
725
|
+
return LinkHead(storage);
|
726
|
+
}
|
727
|
+
|
728
|
+
template <typename... Traits>
|
729
|
+
grpc_error_handle MetadataMap<Traits...>::LinkHead(
|
730
|
+
grpc_linked_mdelem* storage) {
|
731
|
+
AssertValidCallouts();
|
732
|
+
grpc_error_handle err = MaybeLinkCallout(storage);
|
733
|
+
if (err != GRPC_ERROR_NONE) {
|
734
|
+
AssertValidCallouts();
|
735
|
+
return err;
|
736
|
+
}
|
737
|
+
link_head(&list_, storage);
|
738
|
+
AssertValidCallouts();
|
739
|
+
return GRPC_ERROR_NONE;
|
740
|
+
}
|
741
|
+
|
742
|
+
// TODO(arjunroy): Need to revisit this and see what guarantees exist between
|
743
|
+
// C-core and the internal-metadata subsystem. E.g. can we ensure a particular
|
744
|
+
// metadata is never added twice, even in the presence of user supplied data?
|
745
|
+
template <typename... Traits>
|
746
|
+
grpc_error_handle MetadataMap<Traits...>::LinkHead(
|
747
|
+
grpc_linked_mdelem* storage, grpc_metadata_batch_callouts_index idx) {
|
748
|
+
GPR_DEBUG_ASSERT(GRPC_BATCH_INDEX_OF(GRPC_MDKEY(storage->md)) == idx);
|
749
|
+
AssertValidCallouts();
|
750
|
+
grpc_error_handle err = LinkCallout(storage, idx);
|
751
|
+
if (GPR_UNLIKELY(err != GRPC_ERROR_NONE)) {
|
752
|
+
AssertValidCallouts();
|
753
|
+
return err;
|
754
|
+
}
|
755
|
+
link_head(&list_, storage);
|
756
|
+
AssertValidCallouts();
|
757
|
+
return GRPC_ERROR_NONE;
|
758
|
+
}
|
759
|
+
|
760
|
+
template <typename... Traits>
|
761
|
+
grpc_error_handle MetadataMap<Traits...>::AddTail(grpc_linked_mdelem* storage,
|
762
|
+
grpc_mdelem elem_to_add) {
|
763
|
+
GPR_DEBUG_ASSERT(!GRPC_MDISNULL(elem_to_add));
|
764
|
+
storage->md = elem_to_add;
|
765
|
+
return LinkTail(storage);
|
766
|
+
}
|
767
|
+
|
768
|
+
template <typename... Traits>
|
769
|
+
grpc_error_handle MetadataMap<Traits...>::LinkTail(
|
770
|
+
grpc_linked_mdelem* storage) {
|
771
|
+
AssertValidCallouts();
|
772
|
+
grpc_error_handle err = MaybeLinkCallout(storage);
|
773
|
+
if (err != GRPC_ERROR_NONE) {
|
774
|
+
AssertValidCallouts();
|
775
|
+
return err;
|
776
|
+
}
|
777
|
+
link_tail(&list_, storage);
|
778
|
+
AssertValidCallouts();
|
779
|
+
return GRPC_ERROR_NONE;
|
780
|
+
}
|
781
|
+
|
782
|
+
template <typename... Traits>
|
783
|
+
grpc_error_handle MetadataMap<Traits...>::LinkTail(
|
784
|
+
grpc_linked_mdelem* storage, grpc_metadata_batch_callouts_index idx) {
|
785
|
+
GPR_DEBUG_ASSERT(GRPC_BATCH_INDEX_OF(GRPC_MDKEY(storage->md)) == idx);
|
786
|
+
AssertValidCallouts();
|
787
|
+
grpc_error_handle err = LinkCallout(storage, idx);
|
788
|
+
if (GPR_UNLIKELY(err != GRPC_ERROR_NONE)) {
|
789
|
+
AssertValidCallouts();
|
790
|
+
return err;
|
791
|
+
}
|
792
|
+
link_tail(&list_, storage);
|
793
|
+
AssertValidCallouts();
|
794
|
+
return GRPC_ERROR_NONE;
|
795
|
+
}
|
796
|
+
|
797
|
+
template <typename... Traits>
|
798
|
+
void MetadataMap<Traits...>::Remove(grpc_linked_mdelem* storage) {
|
799
|
+
AssertValidCallouts();
|
800
|
+
MaybeUnlinkCallout(storage);
|
801
|
+
unlink_storage(&list_, storage);
|
802
|
+
GRPC_MDELEM_UNREF(storage->md);
|
803
|
+
AssertValidCallouts();
|
804
|
+
}
|
805
|
+
|
806
|
+
template <typename... Traits>
|
807
|
+
void MetadataMap<Traits...>::Remove(grpc_metadata_batch_callouts_index idx) {
|
808
|
+
AssertValidCallouts();
|
809
|
+
if (idx_.array[idx] == nullptr) return;
|
810
|
+
--list_.default_count;
|
811
|
+
unlink_storage(&list_, idx_.array[idx]);
|
812
|
+
GRPC_MDELEM_UNREF(idx_.array[idx]->md);
|
813
|
+
idx_.array[idx] = nullptr;
|
814
|
+
AssertValidCallouts();
|
815
|
+
}
|
816
|
+
|
817
|
+
template <typename... Traits>
|
818
|
+
absl::optional<absl::string_view> MetadataMap<Traits...>::GetValue(
|
819
|
+
absl::string_view target_key, std::string* concatenated_value) const {
|
820
|
+
// Find all values for the specified key.
|
821
|
+
absl::InlinedVector<absl::string_view, 1> values;
|
822
|
+
for (grpc_linked_mdelem* md = list_.head; md != nullptr; md = md->next) {
|
823
|
+
absl::string_view key = grpc_core::StringViewFromSlice(GRPC_MDKEY(md->md));
|
824
|
+
absl::string_view value =
|
825
|
+
grpc_core::StringViewFromSlice(GRPC_MDVALUE(md->md));
|
826
|
+
if (target_key == key) values.push_back(value);
|
827
|
+
}
|
828
|
+
// If none found, no match.
|
829
|
+
if (values.empty()) return absl::nullopt;
|
830
|
+
// If exactly one found, return it as-is.
|
831
|
+
if (values.size() == 1) return values.front();
|
832
|
+
// If more than one found, concatenate the values, using
|
833
|
+
// *concatenated_values as a temporary holding place for the
|
834
|
+
// concatenated string.
|
835
|
+
*concatenated_value = absl::StrJoin(values, ",");
|
836
|
+
return *concatenated_value;
|
837
|
+
}
|
838
|
+
|
839
|
+
template <typename... Traits>
|
840
|
+
grpc_error_handle MetadataMap<Traits...>::Substitute(
|
841
|
+
grpc_linked_mdelem* storage, grpc_mdelem new_mdelem) {
|
842
|
+
AssertValidCallouts();
|
843
|
+
grpc_error_handle error = GRPC_ERROR_NONE;
|
844
|
+
grpc_mdelem old_mdelem = storage->md;
|
845
|
+
if (!grpc_slice_eq(GRPC_MDKEY(new_mdelem), GRPC_MDKEY(old_mdelem))) {
|
846
|
+
MaybeUnlinkCallout(storage);
|
847
|
+
storage->md = new_mdelem;
|
848
|
+
error = MaybeLinkCallout(storage);
|
849
|
+
if (error != GRPC_ERROR_NONE) {
|
850
|
+
unlink_storage(&list_, storage);
|
851
|
+
GRPC_MDELEM_UNREF(storage->md);
|
852
|
+
}
|
853
|
+
} else {
|
854
|
+
storage->md = new_mdelem;
|
855
|
+
}
|
856
|
+
GRPC_MDELEM_UNREF(old_mdelem);
|
857
|
+
AssertValidCallouts();
|
858
|
+
return error;
|
859
|
+
}
|
860
|
+
|
861
|
+
template <typename... Traits>
|
862
|
+
void MetadataMap<Traits...>::Clear() {
|
863
|
+
// TODO(ctiller): implement this without deconstructing/reconstructing once
|
864
|
+
// linked_mdelem is no longer a thing.
|
865
|
+
auto* arena = elem_storage_.arena();
|
866
|
+
this->~MetadataMap();
|
867
|
+
new (this) MetadataMap(arena);
|
868
|
+
}
|
869
|
+
|
870
|
+
template <typename... Traits>
|
871
|
+
size_t MetadataMap<Traits...>::TransportSize() const {
|
872
|
+
size_t size = 0;
|
873
|
+
for (grpc_linked_mdelem* elem = list_.head; elem != nullptr;
|
874
|
+
elem = elem->next) {
|
875
|
+
size += GRPC_MDELEM_LENGTH(elem->md);
|
876
|
+
}
|
877
|
+
return size;
|
878
|
+
}
|
879
|
+
|
880
|
+
template <typename... Traits>
|
881
|
+
bool MetadataMap<Traits...>::ReplaceIfExists(grpc_slice key, grpc_slice value) {
|
882
|
+
AssertValidCallouts();
|
883
|
+
for (grpc_linked_mdelem* l = list_.head; l != nullptr; l = l->next) {
|
884
|
+
if (grpc_slice_eq(GRPC_MDKEY(l->md), key)) {
|
885
|
+
auto new_mdelem = grpc_mdelem_from_slices(key, value);
|
886
|
+
GRPC_MDELEM_UNREF(l->md);
|
887
|
+
l->md = new_mdelem;
|
888
|
+
AssertValidCallouts();
|
889
|
+
return true;
|
890
|
+
}
|
891
|
+
}
|
892
|
+
AssertValidCallouts();
|
893
|
+
return false;
|
894
|
+
}
|
895
|
+
|
896
|
+
} // namespace grpc_core
|
897
|
+
|
898
|
+
using grpc_metadata_batch =
|
899
|
+
grpc_core::MetadataMap<grpc_core::GrpcTimeoutMetadata,
|
900
|
+
grpc_core::TeMetadata>;
|
901
|
+
|
902
|
+
inline void grpc_metadata_batch_clear(grpc_metadata_batch* batch) {
|
903
|
+
batch->Clear();
|
904
|
+
}
|
905
|
+
inline bool grpc_metadata_batch_is_empty(grpc_metadata_batch* batch) {
|
906
|
+
return batch->empty();
|
907
|
+
}
|
74
908
|
|
75
909
|
/* Returns the transport size of the batch. */
|
76
|
-
size_t grpc_metadata_batch_size(grpc_metadata_batch* batch)
|
910
|
+
inline size_t grpc_metadata_batch_size(grpc_metadata_batch* batch) {
|
911
|
+
return batch->TransportSize();
|
912
|
+
}
|
77
913
|
|
78
914
|
/** Remove \a storage from the batch, unreffing the mdelem contained */
|
79
|
-
void grpc_metadata_batch_remove(grpc_metadata_batch* batch,
|
80
|
-
|
81
|
-
|
82
|
-
|
915
|
+
inline void grpc_metadata_batch_remove(grpc_metadata_batch* batch,
|
916
|
+
grpc_linked_mdelem* storage) {
|
917
|
+
batch->Remove(storage);
|
918
|
+
}
|
919
|
+
inline void grpc_metadata_batch_remove(grpc_metadata_batch* batch,
|
920
|
+
grpc_metadata_batch_callouts_index idx) {
|
921
|
+
batch->Remove(idx);
|
922
|
+
}
|
83
923
|
|
84
924
|
/** Substitute a new mdelem for an old value */
|
85
|
-
grpc_error_handle grpc_metadata_batch_substitute(
|
86
|
-
|
87
|
-
|
925
|
+
inline grpc_error_handle grpc_metadata_batch_substitute(
|
926
|
+
grpc_metadata_batch* batch, grpc_linked_mdelem* storage,
|
927
|
+
grpc_mdelem new_mdelem) {
|
928
|
+
return batch->Substitute(storage, new_mdelem);
|
929
|
+
}
|
88
930
|
|
89
931
|
void grpc_metadata_batch_set_value(grpc_linked_mdelem* storage,
|
90
932
|
const grpc_slice& value);
|
@@ -96,33 +938,43 @@ void grpc_metadata_batch_set_value(grpc_linked_mdelem* storage,
|
|
96
938
|
If the key is present more than once in the batch, constructs a
|
97
939
|
comma-concatenated string of all values in concatenated_value and returns a
|
98
940
|
string_view of that string. */
|
99
|
-
absl::optional<absl::string_view> grpc_metadata_batch_get_value(
|
941
|
+
inline absl::optional<absl::string_view> grpc_metadata_batch_get_value(
|
100
942
|
grpc_metadata_batch* batch, absl::string_view target_key,
|
101
|
-
std::string* concatenated_value)
|
943
|
+
std::string* concatenated_value) {
|
944
|
+
return batch->GetValue(target_key, concatenated_value);
|
945
|
+
}
|
102
946
|
|
103
947
|
/** Add \a storage to the beginning of \a batch. storage->md is
|
104
948
|
assumed to be valid.
|
105
949
|
\a storage is owned by the caller and must survive for the
|
106
950
|
lifetime of batch. This usually means it should be around
|
107
951
|
for the lifetime of the call. */
|
108
|
-
grpc_error_handle grpc_metadata_batch_link_head(
|
109
|
-
|
110
|
-
|
111
|
-
|
952
|
+
inline GRPC_MUST_USE_RESULT grpc_error_handle grpc_metadata_batch_link_head(
|
953
|
+
grpc_metadata_batch* batch, grpc_linked_mdelem* storage) {
|
954
|
+
return batch->LinkHead(storage);
|
955
|
+
}
|
956
|
+
|
957
|
+
inline GRPC_MUST_USE_RESULT grpc_error_handle grpc_metadata_batch_link_head(
|
112
958
|
grpc_metadata_batch* batch, grpc_linked_mdelem* storage,
|
113
|
-
grpc_metadata_batch_callouts_index idx)
|
959
|
+
grpc_metadata_batch_callouts_index idx) {
|
960
|
+
return batch->LinkHead(storage, idx);
|
961
|
+
}
|
114
962
|
|
115
963
|
/** Add \a storage to the end of \a batch. storage->md is
|
116
964
|
assumed to be valid.
|
117
965
|
\a storage is owned by the caller and must survive for the
|
118
966
|
lifetime of batch. This usually means it should be around
|
119
967
|
for the lifetime of the call. */
|
120
|
-
grpc_error_handle grpc_metadata_batch_link_tail(
|
121
|
-
|
122
|
-
|
123
|
-
|
968
|
+
inline GRPC_MUST_USE_RESULT grpc_error_handle grpc_metadata_batch_link_tail(
|
969
|
+
grpc_metadata_batch* batch, grpc_linked_mdelem* storage) {
|
970
|
+
return batch->LinkTail(storage);
|
971
|
+
}
|
972
|
+
|
973
|
+
inline GRPC_MUST_USE_RESULT grpc_error_handle grpc_metadata_batch_link_tail(
|
124
974
|
grpc_metadata_batch* batch, grpc_linked_mdelem* storage,
|
125
|
-
grpc_metadata_batch_callouts_index idx)
|
975
|
+
grpc_metadata_batch_callouts_index idx) {
|
976
|
+
return batch->LinkTail(storage, idx);
|
977
|
+
}
|
126
978
|
|
127
979
|
/** Add \a elem_to_add as the first element in \a batch, using
|
128
980
|
\a storage as backing storage for the linked list element.
|
@@ -130,9 +982,11 @@ grpc_error_handle grpc_metadata_batch_link_tail(
|
|
130
982
|
lifetime of batch. This usually means it should be around
|
131
983
|
for the lifetime of the call.
|
132
984
|
Takes ownership of \a elem_to_add */
|
133
|
-
grpc_error_handle grpc_metadata_batch_add_head(
|
985
|
+
inline grpc_error_handle grpc_metadata_batch_add_head(
|
134
986
|
grpc_metadata_batch* batch, grpc_linked_mdelem* storage,
|
135
|
-
grpc_mdelem elem_to_add)
|
987
|
+
grpc_mdelem elem_to_add) {
|
988
|
+
return batch->AddHead(storage, elem_to_add);
|
989
|
+
}
|
136
990
|
|
137
991
|
// TODO(arjunroy, roth): Remove redundant methods.
|
138
992
|
// add/link_head/tail are almost identical.
|
@@ -156,9 +1010,11 @@ inline grpc_error_handle GRPC_MUST_USE_RESULT grpc_metadata_batch_add_head(
|
|
156
1010
|
lifetime of batch. This usually means it should be around
|
157
1011
|
for the lifetime of the call.
|
158
1012
|
Takes ownership of \a elem_to_add */
|
159
|
-
grpc_error_handle grpc_metadata_batch_add_tail(
|
1013
|
+
inline GRPC_MUST_USE_RESULT grpc_error_handle grpc_metadata_batch_add_tail(
|
160
1014
|
grpc_metadata_batch* batch, grpc_linked_mdelem* storage,
|
161
|
-
grpc_mdelem elem_to_add)
|
1015
|
+
grpc_mdelem elem_to_add) {
|
1016
|
+
return batch->AddTail(storage, elem_to_add);
|
1017
|
+
}
|
162
1018
|
|
163
1019
|
inline grpc_error_handle GRPC_MUST_USE_RESULT grpc_metadata_batch_add_tail(
|
164
1020
|
grpc_metadata_batch* batch, grpc_linked_mdelem* storage,
|
@@ -174,48 +1030,26 @@ inline grpc_error_handle GRPC_MUST_USE_RESULT grpc_metadata_batch_add_tail(
|
|
174
1030
|
return grpc_metadata_batch_add_tail(batch, storage, idx);
|
175
1031
|
}
|
176
1032
|
|
177
|
-
grpc_error_handle grpc_attach_md_to_error(grpc_error_handle src,
|
178
|
-
grpc_mdelem md);
|
179
|
-
|
180
|
-
struct grpc_filtered_mdelem {
|
181
|
-
grpc_error_handle error;
|
182
|
-
grpc_mdelem md;
|
183
|
-
};
|
184
|
-
#define GRPC_FILTERED_ERROR(error) \
|
185
|
-
{ (error), GRPC_MDNULL }
|
186
|
-
#define GRPC_FILTERED_MDELEM(md) \
|
187
|
-
{ GRPC_ERROR_NONE, (md) }
|
188
|
-
#define GRPC_FILTERED_REMOVE() \
|
189
|
-
{ GRPC_ERROR_NONE, GRPC_MDNULL }
|
190
|
-
|
191
1033
|
typedef grpc_filtered_mdelem (*grpc_metadata_batch_filter_func)(
|
192
1034
|
void* user_data, grpc_mdelem elem);
|
193
|
-
grpc_error_handle grpc_metadata_batch_filter(
|
1035
|
+
inline GRPC_MUST_USE_RESULT grpc_error_handle grpc_metadata_batch_filter(
|
194
1036
|
grpc_metadata_batch* batch, grpc_metadata_batch_filter_func func,
|
195
|
-
void* user_data, const char* composite_error_string)
|
1037
|
+
void* user_data, const char* composite_error_string) {
|
1038
|
+
return batch->Filter([=](grpc_mdelem elem) { return func(user_data, elem); },
|
1039
|
+
composite_error_string);
|
1040
|
+
}
|
196
1041
|
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
#define grpc_metadata_batch_assert_ok(batch) \
|
201
|
-
do { \
|
202
|
-
} while (0)
|
203
|
-
#endif
|
1042
|
+
inline void grpc_metadata_batch_assert_ok(grpc_metadata_batch* batch) {
|
1043
|
+
batch->AssertOk();
|
1044
|
+
}
|
204
1045
|
|
205
|
-
/// Copies \a src to \a dst.
|
206
|
-
/// \a grpc_linked_mdelem structs of at least the same size as \a src.
|
1046
|
+
/// Copies \a src to \a dst.
|
207
1047
|
///
|
208
1048
|
/// For each mdelem in \a src, if the mdelem is of storage types
|
209
1049
|
/// GRPC_MDELEM_STORAGE_INTERNED or GRPC_MDELEM_STORAGE_ALLOCATED,
|
210
1050
|
/// refs the original mdelem for the copy. Otherwise, makes a new
|
211
1051
|
/// mdelem that will hold its own refs to the key and value slices.
|
212
|
-
|
213
|
-
/// Currently used only in the retry code.
|
214
|
-
void grpc_metadata_batch_copy(grpc_metadata_batch* src,
|
215
|
-
grpc_metadata_batch* dst,
|
216
|
-
grpc_linked_mdelem* storage);
|
217
|
-
|
218
|
-
void grpc_metadata_batch_move(grpc_metadata_batch* src,
|
1052
|
+
void grpc_metadata_batch_copy(const grpc_metadata_batch* src,
|
219
1053
|
grpc_metadata_batch* dst);
|
220
1054
|
|
221
1055
|
#endif /* GRPC_CORE_LIB_TRANSPORT_METADATA_BATCH_H */
|