grpc 1.40.0 → 1.43.1
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 +137 -82
- data/etc/roots.pem +335 -326
- data/include/grpc/byte_buffer.h +1 -1
- data/include/grpc/byte_buffer_reader.h +1 -1
- data/include/grpc/event_engine/endpoint_config.h +6 -11
- data/include/grpc/event_engine/event_engine.h +164 -95
- data/include/grpc/event_engine/internal/memory_allocator_impl.h +68 -0
- data/include/grpc/event_engine/memory_allocator.h +226 -0
- data/include/grpc/event_engine/memory_request.h +57 -0
- data/include/grpc/event_engine/port.h +1 -3
- data/include/grpc/fork.h +1 -1
- data/include/grpc/grpc.h +14 -4
- data/include/grpc/grpc_posix.h +5 -2
- data/include/grpc/grpc_security.h +294 -145
- data/include/grpc/grpc_security_constants.h +2 -14
- data/include/grpc/impl/codegen/atm.h +5 -3
- data/include/grpc/impl/codegen/atm_gcc_atomic.h +2 -0
- data/include/grpc/impl/codegen/atm_gcc_sync.h +2 -0
- data/include/grpc/impl/codegen/atm_windows.h +2 -0
- data/include/grpc/impl/codegen/byte_buffer.h +2 -0
- data/include/grpc/impl/codegen/byte_buffer_reader.h +2 -0
- data/include/grpc/impl/codegen/compression_types.h +2 -0
- data/include/grpc/impl/codegen/connectivity_state.h +2 -0
- data/include/grpc/impl/codegen/fork.h +2 -0
- data/include/grpc/impl/codegen/gpr_slice.h +2 -0
- data/include/grpc/impl/codegen/gpr_types.h +2 -0
- data/include/grpc/impl/codegen/grpc_types.h +4 -5
- data/include/grpc/impl/codegen/log.h +2 -0
- data/include/grpc/impl/codegen/port_platform.h +37 -22
- data/include/grpc/impl/codegen/propagation_bits.h +2 -0
- data/include/grpc/impl/codegen/slice.h +2 -0
- data/include/grpc/impl/codegen/status.h +2 -0
- data/include/grpc/impl/codegen/sync.h +8 -5
- data/include/grpc/impl/codegen/sync_abseil.h +2 -0
- data/include/grpc/impl/codegen/sync_custom.h +2 -0
- data/include/grpc/impl/codegen/sync_generic.h +3 -0
- data/include/grpc/impl/codegen/sync_posix.h +4 -2
- data/include/grpc/impl/codegen/sync_windows.h +2 -0
- data/include/grpc/slice.h +1 -1
- data/include/grpc/status.h +1 -1
- data/include/grpc/support/atm.h +1 -1
- data/include/grpc/support/atm_gcc_atomic.h +1 -1
- data/include/grpc/support/atm_gcc_sync.h +1 -1
- data/include/grpc/support/atm_windows.h +1 -1
- data/include/grpc/support/log.h +1 -1
- data/include/grpc/support/port_platform.h +1 -1
- data/include/grpc/support/sync.h +1 -1
- data/include/grpc/support/sync_abseil.h +1 -1
- data/include/grpc/support/sync_custom.h +1 -1
- data/include/grpc/support/sync_generic.h +1 -1
- data/include/grpc/support/sync_posix.h +1 -1
- data/include/grpc/support/sync_windows.h +1 -1
- data/include/grpc/support/time.h +2 -2
- data/src/core/ext/filters/census/grpc_context.cc +1 -0
- data/src/core/ext/filters/client_channel/backend_metric.cc +21 -24
- data/src/core/ext/filters/client_channel/backend_metric.h +3 -2
- data/src/core/ext/filters/client_channel/backup_poller.cc +2 -1
- data/src/core/ext/filters/client_channel/backup_poller.h +1 -0
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +72 -91
- data/src/core/ext/filters/client_channel/client_channel.cc +256 -308
- data/src/core/ext/filters/client_channel/client_channel.h +80 -32
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +6 -5
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -1
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +2 -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 +15 -15
- data/src/core/ext/filters/client_channel/config_selector.cc +2 -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 +5 -5
- 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 +19 -17
- data/src/core/ext/filters/client_channel/health/health_check_client.h +5 -4
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +20 -21
- data/src/core/ext/filters/client_channel/http_connect_handshaker.h +10 -2
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +6 -2
- 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 +169 -92
- 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/grpclb_channel_secure.cc +1 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +3 -4
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +4 -4
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -3
- 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 +29 -33
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +5 -6
- 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/subchannel_list.h +2 -2
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +9 -9
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +47 -99
- 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 +97 -41
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +10 -9
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +55 -109
- data/src/core/ext/filters/client_channel/lb_policy.h +96 -103
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -0
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -7
- 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 +16 -18
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +3 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +17 -20
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +26 -58
- 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 +10 -5
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +5 -3
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +11 -17
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +283 -349
- 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 +12 -15
- data/src/core/ext/filters/client_channel/resolver_registry.h +1 -2
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +3 -4
- 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 +89 -147
- 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 +29 -206
- 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 +28 -26
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +6 -14
- data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
- data/src/core/ext/filters/http/client/http_client_filter.cc +50 -68
- data/src/core/ext/filters/http/client_authority_filter.cc +16 -16
- data/src/core/ext/filters/http/http_filters_plugin.cc +51 -71
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +19 -13
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +8 -9
- data/src/core/ext/filters/http/server/http_server_filter.cc +72 -84
- data/src/core/ext/filters/max_age/max_age_filter.cc +24 -26
- data/src/core/ext/filters/message_size/message_size_filter.cc +28 -29
- data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
- data/src/core/ext/filters/server_config_selector/server_config_selector.cc +67 -0
- data/src/core/ext/filters/server_config_selector/server_config_selector.h +70 -0
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +265 -0
- data/src/core/ext/filters/{workarounds/workaround_cronet_compression_filter.h → server_config_selector/server_config_selector_filter.h} +11 -6
- 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/alpn/alpn.cc +2 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +10 -12
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +26 -29
- data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +9 -8
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +33 -54
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +66 -70
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +2 -4
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +7 -5
- data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +11 -15
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +3 -1
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +2 -1
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +1 -0
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +120 -134
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +4 -2
- data/src/core/ext/transport/chttp2/transport/context_list.cc +2 -3
- data/src/core/ext/transport/chttp2/transport/context_list.h +3 -5
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +62 -43
- data/src/core/ext/transport/chttp2/transport/flow_control.h +15 -9
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +11 -11
- data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -0
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +6 -4
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +1 -0
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +6 -5
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +1 -0
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +5 -8
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +1 -0
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +38 -7
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +1 -0
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +12 -7
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +1 -0
- data/src/core/ext/transport/chttp2/transport/hpack_constants.h +41 -0
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +378 -668
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +272 -70
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +107 -0
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +86 -0
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +69 -0
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +792 -1041
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +75 -177
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +146 -0
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +137 -0
- data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +46 -0
- data/src/core/ext/transport/chttp2/transport/hpack_utils.h +30 -0
- data/src/core/ext/transport/chttp2/transport/internal.h +14 -9
- data/src/core/ext/transport/chttp2/transport/parsing.cc +50 -203
- data/src/core/ext/transport/chttp2/transport/popularity_count.h +60 -0
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/varint.cc +7 -3
- data/src/core/ext/transport/chttp2/transport/varint.h +39 -28
- data/src/core/ext/transport/chttp2/transport/writing.cc +61 -50
- data/src/core/ext/transport/inproc/inproc_transport.cc +126 -119
- data/src/core/ext/transport/inproc/inproc_transport.h +1 -1
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +198 -166
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +223 -89
- data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +42 -1
- data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +19 -1
- data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +27 -3
- data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +18 -5
- data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +108 -83
- data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +153 -61
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +189 -161
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +173 -69
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +36 -23
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +33 -13
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +279 -211
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +370 -102
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +17 -6
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +13 -5
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +37 -26
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +13 -5
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +57 -40
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +73 -29
- data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +17 -6
- data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +13 -5
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +172 -126
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +256 -85
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +52 -37
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +53 -21
- data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +16 -5
- data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +13 -5
- data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +26 -14
- data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +23 -9
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +115 -91
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +133 -53
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +91 -72
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +98 -33
- data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +18 -7
- data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +13 -5
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +122 -93
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +166 -57
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +14 -3
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +13 -5
- data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +22 -10
- data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +23 -9
- data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +19 -8
- data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +13 -5
- data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +23 -12
- data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +13 -5
- data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +18 -7
- data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +13 -5
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +42 -28
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +33 -13
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +82 -32
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +176 -17
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +59 -44
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +53 -21
- data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +16 -5
- data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +13 -5
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +74 -58
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +63 -25
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +82 -65
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +73 -29
- data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +26 -15
- data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +13 -5
- data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +20 -8
- data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +23 -9
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +64 -46
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +83 -33
- data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +76 -45
- data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +143 -43
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +101 -77
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +107 -29
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +42 -29
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +33 -13
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +516 -446
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +620 -267
- data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +27 -14
- data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +33 -13
- data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +22 -10
- data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +23 -9
- data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +14 -3
- data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +13 -5
- data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +36 -21
- data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +53 -21
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +45 -32
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +33 -13
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +23 -12
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +13 -5
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +211 -183
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +193 -77
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +8 -1
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +6 -4
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +75 -45
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +120 -34
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +34 -21
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +33 -13
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +88 -70
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +110 -55
- data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +13 -2
- data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +13 -5
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +13 -2
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +13 -5
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +76 -59
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +63 -25
- data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +13 -2
- data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +13 -5
- data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +13 -2
- data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +13 -5
- data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +26 -14
- data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +23 -9
- data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +13 -2
- data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +13 -5
- data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +13 -2
- data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +13 -5
- data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +62 -47
- data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +53 -21
- data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +27 -13
- data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +43 -17
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +24 -11
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +27 -9
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +18 -7
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +13 -5
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +17 -6
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +13 -5
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +16 -5
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +13 -5
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +28 -15
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +33 -13
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +26 -14
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +23 -9
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +21 -9
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +23 -9
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +31 -18
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +33 -13
- data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +39 -22
- data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +73 -29
- data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +42 -27
- data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +53 -21
- data/src/core/ext/upb-generated/envoy/type/v3/http.upb.c +8 -1
- data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +3 -1
- data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +18 -6
- data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +23 -9
- data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +23 -10
- data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +33 -13
- data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +16 -5
- data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +13 -5
- data/src/core/ext/upb-generated/google/api/annotations.upb.c +21 -1
- data/src/core/ext/upb-generated/google/api/annotations.upb.h +8 -1
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +117 -94
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +113 -45
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.c +102 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.h +306 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.c +56 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.h +135 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +123 -99
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +123 -49
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.c +115 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.h +371 -0
- data/src/core/ext/upb-generated/google/api/http.upb.c +36 -23
- data/src/core/ext/upb-generated/google/api/http.upb.h +33 -13
- data/src/core/ext/upb-generated/google/protobuf/any.upb.c +15 -4
- data/src/core/ext/upb-generated/google/protobuf/any.upb.h +13 -5
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +248 -211
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +273 -109
- data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +15 -4
- data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +13 -5
- data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +13 -2
- data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +13 -5
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +38 -24
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +33 -13
- data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +15 -4
- data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +13 -5
- data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +38 -19
- data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +93 -37
- data/src/core/ext/upb-generated/google/rpc/status.upb.c +18 -7
- data/src/core/ext/upb-generated/google/rpc/status.upb.h +13 -5
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +27 -15
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +13 -5
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +106 -84
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +103 -41
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +21 -9
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +23 -9
- data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +17 -5
- data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +23 -9
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +66 -48
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +115 -63
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +68 -0
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +156 -0
- data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +68 -8
- data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +58 -13
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +28 -6
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +18 -5
- data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +20 -1
- data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +8 -1
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +28 -4
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +18 -5
- data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +27 -3
- data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +18 -5
- data/src/core/ext/upb-generated/validate/validate.upb.c +321 -252
- data/src/core/ext/upb-generated/validate/validate.upb.h +251 -93
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +103 -0
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +199 -0
- data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +15 -4
- data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +13 -5
- data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +26 -14
- data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +23 -9
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +21 -9
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +13 -5
- data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +20 -9
- data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +13 -5
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +29 -17
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +23 -9
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +20 -9
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +13 -5
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +71 -0
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +132 -0
- data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +44 -0
- data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +85 -0
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +2 -49
- data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +2 -2
- data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +2 -35
- data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +2 -41
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +407 -434
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +10 -0
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +2 -19
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +100 -138
- 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/config_source.upbdefs.c +2 -15
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +2 -33
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +61 -77
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +61 -79
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +2 -13
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +87 -75
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +10 -0
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +2 -15
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +2 -17
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +2 -19
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +2 -21
- data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +29 -39
- data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +803 -894
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +2 -15
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +98 -143
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +2 -2
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +132 -129
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +180 -190
- data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +2 -19
- data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +2 -15
- data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c +2 -13
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +16 -22
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +2 -19
- data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +2 -15
- data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +2 -2
- data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +2 -2
- data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +105 -162
- data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +2 -13
- data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +2 -23
- data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +7 -15
- data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +21 -30
- data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +6 -5
- data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +7 -10
- data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +7 -11
- data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +2 -51
- data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +64 -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 +15 -19
- data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +27 -33
- data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +18 -24
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +19 -23
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +35 -41
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +21 -25
- data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +40 -0
- data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +35 -0
- data/src/core/ext/xds/certificate_provider_registry.cc +3 -3
- data/src/core/ext/xds/certificate_provider_store.h +1 -1
- data/src/core/ext/xds/xds_api.cc +1386 -1440
- data/src/core/ext/xds/xds_api.h +152 -115
- data/src/core/ext/xds/xds_bootstrap.cc +33 -55
- 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_certificate_provider.h +1 -2
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +112 -0
- data/src/core/ext/xds/xds_channel_stack_modifier.h +52 -0
- data/src/core/ext/xds/xds_client.cc +793 -437
- data/src/core/ext/xds/xds_client.h +83 -69
- data/src/core/ext/xds/xds_client_stats.cc +16 -15
- data/src/core/ext/xds/xds_client_stats.h +7 -7
- data/src/core/ext/xds/xds_http_fault_filter.cc +4 -3
- data/src/core/ext/xds/xds_http_fault_filter.h +3 -2
- data/src/core/ext/xds/xds_http_filters.cc +1 -0
- data/src/core/ext/xds/xds_routing.cc +247 -0
- data/src/core/ext/xds/xds_routing.h +98 -0
- data/src/core/ext/xds/xds_server_config_fetcher.cc +976 -264
- data/src/core/lib/address_utils/parse_address.cc +6 -8
- data/src/core/lib/address_utils/sockaddr_utils.cc +2 -2
- data/src/core/lib/avl/avl.h +389 -88
- data/src/core/lib/backoff/backoff.cc +3 -3
- data/src/core/lib/channel/channel_args.cc +27 -8
- data/src/core/lib/channel/channel_args.h +11 -1
- data/src/core/lib/channel/channel_args_preconditioning.cc +47 -0
- data/src/core/lib/channel/channel_args_preconditioning.h +62 -0
- data/src/core/lib/channel/channel_stack.cc +5 -3
- data/src/core/lib/channel/channel_stack_builder.cc +3 -15
- data/src/core/lib/channel/channel_stack_builder.h +0 -8
- data/src/core/lib/channel/channel_trace.cc +11 -10
- data/src/core/lib/channel/channel_trace.h +2 -1
- data/src/core/lib/channel/channelz.cc +43 -39
- data/src/core/lib/channel/channelz.h +29 -29
- data/src/core/lib/channel/channelz_registry.cc +8 -7
- data/src/core/lib/channel/channelz_registry.h +1 -1
- data/src/core/lib/channel/connected_channel.cc +2 -3
- data/src/core/lib/channel/connected_channel.h +1 -2
- data/src/core/lib/channel/handshaker.cc +2 -1
- data/src/core/lib/channel/handshaker.h +1 -2
- data/src/core/lib/channel/handshaker_factory.h +10 -2
- data/src/core/lib/channel/handshaker_registry.cc +15 -70
- data/src/core/lib/channel/handshaker_registry.h +29 -12
- data/src/core/lib/channel/status_util.h +2 -2
- data/src/core/lib/compression/algorithm_metadata.h +1 -0
- data/src/core/lib/compression/compression.cc +2 -2
- data/src/core/lib/compression/compression_args.cc +15 -10
- data/src/core/lib/compression/compression_args.h +6 -4
- data/src/core/lib/compression/compression_internal.cc +4 -6
- data/src/core/lib/compression/compression_internal.h +1 -1
- data/src/core/lib/compression/message_compress.cc +2 -2
- data/src/core/lib/compression/stream_compression.cc +2 -1
- data/src/core/lib/compression/stream_compression.h +2 -1
- data/src/core/lib/compression/stream_compression_gzip.cc +2 -1
- data/src/core/lib/compression/stream_compression_identity.cc +2 -1
- data/src/core/lib/config/core_configuration.cc +98 -0
- data/src/core/lib/config/core_configuration.h +157 -0
- data/src/core/lib/debug/stats.cc +1 -1
- data/src/core/lib/debug/stats.h +1 -0
- data/src/core/lib/debug/stats_data.cc +15 -14
- data/src/core/lib/debug/stats_data.h +1 -0
- data/src/core/lib/debug/trace.cc +1 -0
- data/src/core/lib/debug/trace.h +4 -3
- data/src/core/lib/event_engine/{endpoint_config.cc → channel_args_endpoint_config.cc} +2 -2
- data/src/core/lib/event_engine/{endpoint_config_internal.h → channel_args_endpoint_config.h} +3 -3
- data/src/core/lib/event_engine/event_engine.cc +0 -13
- data/src/core/lib/event_engine/event_engine_factory.cc +49 -0
- data/src/core/lib/event_engine/event_engine_factory.h +33 -0
- data/src/core/lib/event_engine/memory_allocator.cc +70 -0
- data/src/core/lib/event_engine/sockaddr.cc +3 -3
- data/src/core/lib/gpr/alloc.cc +4 -3
- data/src/core/lib/gpr/atm.cc +1 -1
- data/src/core/lib/gpr/cpu_posix.cc +1 -1
- data/src/core/lib/gpr/env_linux.cc +1 -2
- data/src/core/lib/gpr/env_posix.cc +2 -3
- data/src/core/lib/gpr/log.cc +3 -3
- data/src/core/lib/gpr/log_android.cc +3 -2
- data/src/core/lib/gpr/log_linux.cc +7 -4
- data/src/core/lib/gpr/log_posix.cc +6 -3
- data/src/core/lib/gpr/string.cc +2 -2
- data/src/core/lib/gpr/string.h +2 -2
- data/src/core/lib/gpr/sync.cc +2 -2
- data/src/core/lib/gpr/sync_abseil.cc +7 -6
- data/src/core/lib/gpr/sync_posix.cc +3 -3
- data/src/core/lib/gpr/time.cc +3 -2
- data/src/core/lib/gpr/time_windows.cc +3 -2
- data/src/core/lib/gpr/tls.h +125 -40
- data/src/core/lib/gpr/tmpfile_posix.cc +1 -2
- data/src/core/lib/gpr/useful.h +79 -32
- data/src/core/lib/gprpp/arena.cc +2 -1
- data/src/core/lib/gprpp/arena.h +15 -5
- data/src/core/lib/gprpp/atomic_utils.h +47 -0
- data/src/core/lib/gprpp/bitset.h +188 -0
- data/src/core/lib/gprpp/chunked_vector.h +211 -0
- data/src/core/lib/{transport/authority_override.cc → gprpp/construct_destruct.h} +16 -17
- data/src/core/lib/gprpp/cpp_impl_of.h +45 -0
- data/src/core/lib/gprpp/dual_ref_counted.h +25 -26
- data/src/core/lib/gprpp/fork.cc +14 -12
- data/src/core/lib/gprpp/fork.h +4 -4
- data/src/core/lib/gprpp/global_config.h +1 -2
- data/src/core/lib/gprpp/global_config_env.cc +14 -14
- data/src/core/lib/gprpp/global_config_env.h +2 -2
- data/src/core/lib/gprpp/global_config_generic.h +2 -2
- data/src/core/lib/gprpp/manual_constructor.h +10 -8
- data/src/core/lib/gprpp/memory.h +9 -3
- data/src/core/lib/gprpp/mpscq.cc +7 -7
- data/src/core/lib/gprpp/mpscq.h +6 -5
- data/src/core/lib/gprpp/orphanable.h +4 -4
- data/src/core/lib/gprpp/ref_counted.h +19 -19
- data/src/core/lib/gprpp/ref_counted_ptr.h +2 -4
- data/src/core/lib/gprpp/status_helper.cc +27 -7
- data/src/core/lib/gprpp/status_helper.h +13 -2
- data/src/core/lib/gprpp/sync.h +3 -1
- data/src/core/lib/gprpp/table.h +423 -0
- data/src/core/lib/gprpp/thd_posix.cc +5 -5
- data/src/core/lib/gprpp/thd_windows.cc +4 -11
- data/src/core/lib/gprpp/time_util.cc +2 -2
- data/src/core/lib/gprpp/time_util.h +2 -2
- data/src/core/lib/http/format_request.cc +1 -0
- data/src/core/lib/http/format_request.h +1 -0
- data/src/core/lib/http/httpcli.cc +219 -197
- data/src/core/lib/http/httpcli.h +14 -9
- data/src/core/lib/http/httpcli_security_connector.cc +5 -8
- data/src/core/lib/http/parser.cc +2 -2
- data/src/core/lib/http/parser.h +1 -0
- data/src/core/lib/iomgr/buffer_list.cc +11 -10
- data/src/core/lib/iomgr/buffer_list.h +14 -15
- data/src/core/lib/iomgr/call_combiner.cc +30 -12
- data/src/core/lib/iomgr/cfstream_handle.cc +1 -1
- data/src/core/lib/iomgr/combiner.cc +9 -23
- data/src/core/lib/iomgr/combiner.h +1 -0
- data/src/core/lib/iomgr/dualstack_socket_posix.cc +1 -0
- data/src/core/lib/iomgr/endpoint.cc +0 -4
- data/src/core/lib/iomgr/endpoint.h +1 -4
- data/src/core/lib/iomgr/endpoint_cfstream.cc +15 -42
- data/src/core/lib/iomgr/endpoint_cfstream.h +4 -4
- data/src/core/lib/iomgr/endpoint_pair.h +1 -0
- data/src/core/lib/iomgr/endpoint_pair_event_engine.cc +1 -2
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +11 -9
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +5 -6
- data/src/core/lib/iomgr/error.cc +113 -52
- data/src/core/lib/iomgr/error.h +73 -18
- data/src/core/lib/iomgr/error_cfstream.cc +7 -2
- data/src/core/lib/iomgr/error_internal.h +1 -0
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +17 -24
- data/src/core/lib/iomgr/ev_epollex_linux.cc +22 -29
- data/src/core/lib/iomgr/ev_poll_posix.cc +42 -45
- data/src/core/lib/iomgr/ev_posix.cc +1 -2
- 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 +7 -27
- data/src/core/lib/iomgr/event_engine/endpoint.h +1 -2
- data/src/core/lib/iomgr/event_engine/iomgr.cc +7 -28
- data/src/core/lib/iomgr/event_engine/pollset.cc +5 -4
- data/src/core/lib/iomgr/event_engine/resolver.cc +14 -9
- data/src/core/lib/iomgr/event_engine/tcp.cc +66 -34
- data/src/core/lib/iomgr/event_engine/timer.cc +10 -4
- data/src/core/lib/iomgr/exec_ctx.cc +4 -13
- data/src/core/lib/iomgr/exec_ctx.h +22 -30
- data/src/core/lib/iomgr/executor/mpmcqueue.cc +15 -16
- data/src/core/lib/iomgr/executor/mpmcqueue.h +7 -11
- data/src/core/lib/iomgr/executor/threadpool.cc +2 -2
- data/src/core/lib/iomgr/executor/threadpool.h +2 -1
- data/src/core/lib/iomgr/executor.cc +20 -38
- data/src/core/lib/iomgr/executor.h +1 -1
- data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +2 -2
- data/src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc +2 -2
- data/src/core/lib/iomgr/internal_errqueue.cc +3 -2
- data/src/core/lib/iomgr/iocp_windows.cc +1 -0
- data/src/core/lib/iomgr/iomgr.cc +3 -1
- data/src/core/lib/iomgr/iomgr.h +2 -2
- data/src/core/lib/iomgr/iomgr_custom.cc +2 -2
- data/src/core/lib/iomgr/iomgr_custom.h +2 -2
- data/src/core/lib/iomgr/iomgr_internal.cc +6 -10
- data/src/core/lib/iomgr/iomgr_internal.h +3 -2
- data/src/core/lib/iomgr/iomgr_windows.cc +1 -2
- data/src/core/lib/iomgr/is_epollexclusive_available.cc +4 -4
- 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/polling_entity.cc +2 -2
- data/src/core/lib/iomgr/pollset_custom.cc +4 -5
- data/src/core/lib/iomgr/pollset_custom.h +3 -3
- data/src/core/lib/iomgr/pollset_set_custom.cc +1 -2
- data/src/core/lib/iomgr/pollset_set_windows.cc +1 -0
- data/src/core/lib/iomgr/port.h +0 -5
- data/src/core/lib/iomgr/python_util.h +1 -0
- data/src/core/lib/iomgr/resolve_address.cc +2 -1
- data/src/core/lib/iomgr/resolve_address.h +0 -4
- data/src/core/lib/iomgr/resolve_address_custom.cc +4 -4
- data/src/core/lib/iomgr/resolve_address_custom.h +0 -1
- data/src/core/lib/iomgr/resolve_address_posix.cc +7 -11
- data/src/core/lib/iomgr/resolve_address_windows.cc +6 -8
- data/src/core/lib/iomgr/sockaddr.h +1 -1
- data/src/core/lib/iomgr/socket_factory_posix.cc +5 -5
- data/src/core/lib/iomgr/socket_factory_posix.h +1 -0
- data/src/core/lib/iomgr/socket_mutator.cc +2 -2
- data/src/core/lib/iomgr/socket_mutator.h +2 -2
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +4 -5
- data/src/core/lib/iomgr/socket_utils_linux.cc +4 -4
- data/src/core/lib/iomgr/socket_utils_posix.cc +2 -2
- data/src/core/lib/iomgr/socket_utils_posix.h +2 -2
- data/src/core/lib/iomgr/socket_utils_windows.cc +2 -2
- data/src/core/lib/iomgr/tcp_client.h +2 -0
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +7 -23
- data/src/core/lib/iomgr/tcp_client_custom.cc +6 -20
- data/src/core/lib/iomgr/tcp_client_posix.cc +14 -24
- data/src/core/lib/iomgr/tcp_client_posix.h +3 -1
- data/src/core/lib/iomgr/tcp_client_windows.cc +7 -9
- data/src/core/lib/iomgr/tcp_custom.cc +12 -51
- data/src/core/lib/iomgr/tcp_custom.h +1 -1
- data/src/core/lib/iomgr/tcp_posix.cc +51 -87
- data/src/core/lib/iomgr/tcp_posix.h +9 -12
- data/src/core/lib/iomgr/tcp_server.h +4 -3
- data/src/core/lib/iomgr/tcp_server_custom.cc +7 -34
- data/src/core/lib/iomgr/tcp_server_posix.cc +15 -13
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +21 -17
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -2
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +3 -4
- data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +4 -4
- data/src/core/lib/iomgr/tcp_server_windows.cc +6 -10
- data/src/core/lib/iomgr/tcp_windows.cc +5 -29
- data/src/core/lib/iomgr/tcp_windows.h +1 -1
- data/src/core/lib/iomgr/timer.cc +1 -0
- data/src/core/lib/iomgr/timer.h +1 -2
- data/src/core/lib/iomgr/timer_custom.cc +2 -2
- data/src/core/lib/iomgr/timer_generic.cc +21 -51
- data/src/core/lib/iomgr/timer_generic.h +1 -0
- data/src/core/lib/iomgr/timer_heap.cc +2 -3
- data/src/core/lib/iomgr/unix_sockets_posix.cc +4 -6
- data/src/core/lib/iomgr/unix_sockets_posix.h +3 -4
- data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +1 -1
- data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +1 -0
- data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -3
- data/src/core/lib/iomgr/wakeup_fd_posix.cc +1 -0
- data/src/core/lib/iomgr/work_serializer.cc +115 -44
- data/src/core/lib/iomgr/work_serializer.h +17 -5
- data/src/core/lib/json/json_reader.cc +92 -52
- data/src/core/lib/json/json_util.cc +69 -1
- data/src/core/lib/json/json_util.h +65 -115
- data/src/core/lib/json/json_writer.cc +0 -3
- data/src/core/lib/matchers/matchers.h +0 -1
- data/src/core/lib/profiling/basic_timers.cc +8 -6
- data/src/core/lib/profiling/stap_timers.cc +2 -2
- data/src/core/lib/promise/activity.cc +115 -0
- data/src/core/lib/promise/activity.h +499 -0
- data/src/core/lib/promise/context.h +86 -0
- data/src/core/lib/promise/detail/basic_seq.h +407 -0
- data/src/core/lib/promise/detail/promise_factory.h +189 -0
- data/src/core/lib/promise/detail/promise_like.h +85 -0
- data/src/core/lib/promise/detail/status.h +44 -0
- data/src/core/lib/promise/detail/switch.h +1455 -0
- data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +48 -0
- data/src/core/lib/promise/loop.h +108 -0
- data/src/core/lib/promise/map.h +88 -0
- data/src/core/lib/promise/poll.h +60 -0
- data/src/core/lib/promise/race.h +84 -0
- data/src/core/lib/promise/seq.h +71 -0
- data/src/core/lib/resource_quota/api.cc +108 -0
- data/src/core/lib/resource_quota/api.h +41 -0
- data/src/core/lib/resource_quota/memory_quota.cc +454 -0
- data/src/core/lib/resource_quota/memory_quota.h +421 -0
- data/src/core/lib/resource_quota/resource_quota.cc +33 -0
- data/src/core/lib/resource_quota/resource_quota.h +58 -0
- data/src/core/lib/{transport/authority_override.h → resource_quota/thread_quota.cc} +22 -16
- data/src/core/lib/resource_quota/thread_quota.h +57 -0
- data/src/core/lib/{iomgr/event_engine/iomgr.h → resource_quota/trace.cc} +4 -9
- data/src/core/lib/resource_quota/trace.h +24 -0
- data/src/core/lib/security/authorization/authorization_policy_provider.h +5 -4
- data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
- data/src/core/lib/security/authorization/evaluate_args.cc +22 -24
- data/src/core/lib/security/authorization/evaluate_args.h +2 -1
- data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +173 -0
- data/src/core/lib/security/authorization/sdk_server_authz_filter.h +67 -0
- data/src/core/lib/security/context/security_context.cc +11 -8
- data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +2 -2
- data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -2
- data/src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc +2 -2
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +5 -4
- data/src/core/lib/security/credentials/credentials.cc +10 -8
- data/src/core/lib/security/credentials/credentials.h +7 -2
- data/src/core/lib/security/credentials/credentials_metadata.cc +2 -3
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +24 -38
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +1 -2
- data/src/core/lib/security/credentials/external/aws_request_signer.cc +3 -3
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +69 -43
- data/src/core/lib/security/credentials/external/external_account_credentials.h +1 -0
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +5 -8
- data/src/core/lib/security/credentials/google_default/credentials_generic.cc +1 -2
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +60 -10
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +2 -1
- data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
- data/src/core/lib/security/credentials/jwt/json_token.h +2 -1
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +31 -14
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +11 -3
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +9 -17
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +3 -3
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +21 -29
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -0
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +4 -6
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +4 -4
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +0 -1
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +3 -2
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +10 -6
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +13 -13
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +13 -12
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +201 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +106 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +11 -90
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +21 -84
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +21 -10
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +28 -33
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +3 -3
- data/src/core/lib/security/security_connector/alts/alts_security_connector.h +2 -2
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +9 -12
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +7 -7
- data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +1 -0
- data/src/core/lib/security/security_connector/load_system_roots_linux.cc +4 -5
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +4 -1
- 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/ssl_security_connector.cc +4 -7
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +1 -2
- data/src/core/lib/security/security_connector/ssl_utils.cc +13 -6
- data/src/core/lib/security/security_connector/ssl_utils.h +1 -1
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +345 -200
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +64 -43
- data/src/core/lib/security/transport/auth_filters.h +1 -0
- data/src/core/lib/security/transport/client_auth_filter.cc +9 -11
- data/src/core/lib/security/transport/secure_endpoint.cc +4 -14
- data/src/core/lib/security/transport/secure_endpoint.h +1 -0
- data/src/core/lib/security/transport/security_handshaker.cc +80 -49
- data/src/core/lib/security/transport/security_handshaker.h +2 -1
- 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/security/util/json_util.cc +6 -8
- data/src/core/lib/slice/percent_encoding.cc +84 -97
- data/src/core/lib/slice/percent_encoding.h +23 -28
- data/src/core/lib/slice/slice.cc +9 -26
- data/src/core/lib/slice/slice.h +341 -0
- data/src/core/lib/{gpr/tls_pthread.cc → slice/slice_api.cc} +15 -6
- data/src/core/lib/slice/slice_buffer.cc +10 -7
- data/src/core/lib/slice/slice_intern.cc +11 -17
- data/src/core/lib/slice/slice_internal.h +3 -246
- data/src/core/lib/slice/slice_refcount.cc +17 -0
- data/src/core/lib/slice/slice_refcount.h +125 -0
- data/src/core/lib/slice/slice_refcount_base.h +181 -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 +377 -0
- data/src/core/lib/slice/static_slice.h +300 -0
- data/src/core/lib/surface/api_trace.cc +2 -1
- data/src/core/lib/surface/api_trace.h +1 -0
- data/src/core/lib/surface/builtins.cc +49 -0
- data/src/core/lib/surface/builtins.h +26 -0
- data/src/core/lib/surface/byte_buffer_reader.cc +1 -1
- data/src/core/lib/surface/call.cc +180 -170
- data/src/core/lib/surface/call.h +3 -9
- data/src/core/lib/surface/call_details.cc +2 -2
- data/src/core/lib/surface/call_log_batch.cc +2 -2
- data/src/core/lib/surface/channel.cc +20 -45
- data/src/core/lib/surface/channel.h +6 -13
- 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/channel_ping.cc +1 -2
- data/src/core/lib/surface/channel_stack_type.cc +2 -1
- data/src/core/lib/surface/completion_queue.cc +60 -69
- data/src/core/lib/surface/completion_queue_factory.cc +2 -1
- data/src/core/lib/surface/completion_queue_factory.h +1 -0
- data/src/core/lib/surface/event_string.cc +1 -0
- data/src/core/lib/surface/init.cc +4 -49
- data/src/core/lib/surface/init.h +0 -1
- data/src/core/lib/surface/init_secure.cc +36 -14
- data/src/core/lib/surface/lame_client.cc +46 -31
- data/src/core/lib/surface/lame_client.h +1 -1
- data/src/core/lib/surface/metadata_array.cc +2 -2
- data/src/core/lib/surface/server.cc +57 -65
- data/src/core/lib/surface/server.h +34 -30
- data/src/core/lib/surface/validate_metadata.cc +49 -18
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/bdp_estimator.cc +2 -2
- data/src/core/lib/transport/byte_stream.cc +4 -0
- data/src/core/lib/transport/byte_stream.h +1 -0
- data/src/core/lib/transport/connectivity_state.cc +8 -5
- data/src/core/lib/transport/connectivity_state.h +2 -2
- data/src/core/lib/transport/error_utils.cc +43 -17
- data/src/core/lib/transport/error_utils.h +1 -1
- data/src/core/lib/transport/metadata.cc +41 -20
- data/src/core/lib/transport/metadata.h +19 -16
- data/src/core/lib/transport/metadata_batch.cc +40 -371
- data/src/core/lib/transport/metadata_batch.h +986 -69
- data/src/core/lib/transport/parsed_metadata.cc +35 -0
- data/src/core/lib/transport/parsed_metadata.h +382 -0
- data/src/core/lib/transport/pid_controller.cc +4 -4
- data/src/core/lib/transport/static_metadata.cc +632 -849
- data/src/core/lib/transport/static_metadata.h +115 -397
- data/src/core/lib/transport/status_metadata.cc +1 -0
- data/src/core/lib/transport/transport.cc +8 -31
- data/src/core/lib/transport/transport.h +0 -1
- data/src/core/lib/transport/transport_op_string.cc +40 -20
- data/src/core/lib/uri/uri_parser.cc +19 -19
- data/src/core/lib/uri/uri_parser.h +2 -0
- data/src/core/plugin_registry/grpc_plugin_registry.cc +78 -41
- data/src/core/tsi/alts/crypt/aes_gcm.cc +6 -3
- data/src/core/tsi/alts/crypt/gsec.h +2 -3
- 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 +4 -5
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +2 -3
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +12 -2
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +2 -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 +43 -80
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +20 -53
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -3
- data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +2 -2
- data/src/core/tsi/ssl_transport_security.cc +51 -12
- data/src/core/tsi/ssl_transport_security.h +4 -1
- data/src/core/tsi/transport_security.cc +15 -3
- data/src/core/tsi/transport_security.h +16 -1
- data/src/core/tsi/transport_security_grpc.h +1 -0
- 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_byte_buffer.c +2 -1
- data/src/ruby/ext/grpc/rb_call.c +5 -5
- data/src/ruby/ext/grpc/rb_call_credentials.c +5 -5
- data/src/ruby/ext/grpc/rb_channel.c +10 -8
- data/src/ruby/ext/grpc/rb_channel_args.c +2 -2
- data/src/ruby/ext/grpc/rb_channel_credentials.c +4 -4
- data/src/ruby/ext/grpc/rb_channel_credentials.h +1 -0
- data/src/ruby/ext/grpc/rb_completion_queue.c +3 -2
- data/src/ruby/ext/grpc/rb_compression_options.c +5 -4
- data/src/ruby/ext/grpc/rb_event_thread.c +4 -4
- data/src/ruby/ext/grpc/rb_grpc.c +5 -4
- data/src/ruby/ext/grpc/rb_grpc.h +1 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +10 -10
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +15 -15
- data/src/ruby/ext/grpc/rb_server.c +6 -5
- data/src/ruby/ext/grpc/rb_server_credentials.c +3 -3
- data/src/ruby/ext/grpc/rb_server_credentials.h +1 -0
- data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +8 -5
- data/src/ruby/ext/grpc/rb_xds_channel_credentials.h +3 -1
- data/src/ruby/ext/grpc/rb_xds_server_credentials.c +6 -5
- data/src/ruby/ext/grpc/rb_xds_server_credentials.h +3 -1
- 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/algorithm/container.h +101 -91
- data/third_party/abseil-cpp/absl/base/attributes.h +64 -31
- data/third_party/abseil-cpp/absl/base/config.h +67 -37
- data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +1 -26
- data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -1
- data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +2 -0
- data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +69 -0
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +4 -4
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +15 -10
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +16 -0
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +4 -4
- data/third_party/abseil-cpp/absl/base/options.h +1 -1
- data/third_party/abseil-cpp/absl/container/fixed_array.h +0 -5
- data/third_party/abseil-cpp/absl/container/inlined_vector.h +105 -97
- data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +17 -15
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +18 -102
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +37 -78
- data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +388 -423
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +3 -2
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -8
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +251 -120
- data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +11 -1
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +12 -11
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +6 -2
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +12 -5
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +110 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +234 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +25 -7
- data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +8 -2
- data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +21 -3
- data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +2 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize.cc +2 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +14 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +72 -0
- data/third_party/abseil-cpp/absl/functional/function_ref.h +4 -1
- data/third_party/abseil-cpp/absl/hash/hash.h +22 -0
- data/third_party/abseil-cpp/absl/hash/internal/hash.cc +15 -16
- data/third_party/abseil-cpp/absl/hash/internal/hash.h +88 -37
- data/third_party/abseil-cpp/absl/hash/internal/{wyhash.cc → low_level_hash.cc} +23 -11
- data/third_party/abseil-cpp/absl/hash/internal/{wyhash.h → low_level_hash.h} +14 -12
- data/third_party/abseil-cpp/absl/memory/memory.h +1 -1
- data/third_party/abseil-cpp/absl/meta/type_traits.h +32 -2
- data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -10
- data/third_party/abseil-cpp/absl/numeric/int128.h +146 -73
- data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +19 -25
- data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +73 -70
- data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.cc +4 -4
- data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.h +6 -6
- data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +230 -0
- data/third_party/abseil-cpp/absl/status/internal/status_internal.h +5 -5
- data/third_party/abseil-cpp/absl/status/status.cc +9 -17
- data/third_party/abseil-cpp/absl/status/status.h +19 -15
- data/third_party/abseil-cpp/absl/status/statusor.cc +34 -2
- data/third_party/abseil-cpp/absl/status/statusor.h +31 -21
- data/third_party/abseil-cpp/absl/strings/charconv.cc +3 -3
- data/third_party/abseil-cpp/absl/strings/charconv.h +3 -2
- data/third_party/abseil-cpp/absl/strings/cord.cc +453 -359
- data/third_party/abseil-cpp/absl/strings/cord.h +197 -70
- data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +6 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +140 -63
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +1128 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +939 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +185 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +265 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +68 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +211 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +129 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.h +50 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +7 -7
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +55 -181
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +42 -24
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +4 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc +96 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +85 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +139 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +131 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +445 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +298 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +87 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_update_scope.h +71 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +121 -0
- data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +48 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +8 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +3 -4
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +6 -6
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +36 -18
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +62 -73
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +24 -16
- data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +35 -35
- data/third_party/abseil-cpp/absl/strings/numbers.cc +1 -1
- data/third_party/abseil-cpp/absl/strings/numbers.h +34 -0
- data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
- data/third_party/abseil-cpp/absl/strings/str_format.h +1 -2
- data/third_party/abseil-cpp/absl/strings/string_view.cc +16 -21
- data/third_party/abseil-cpp/absl/strings/string_view.h +120 -39
- data/third_party/abseil-cpp/absl/strings/substitute.cc +2 -1
- data/third_party/abseil-cpp/absl/strings/substitute.h +99 -74
- data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +25 -15
- data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +5 -3
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -1
- data/third_party/abseil-cpp/absl/synchronization/mutex.h +3 -3
- data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -3
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +93 -20
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +1 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +2 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +83 -21
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +49 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +1 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -3
- data/third_party/abseil-cpp/absl/time/time.h +67 -36
- data/third_party/abseil-cpp/absl/types/bad_optional_access.h +1 -1
- data/third_party/abseil-cpp/absl/types/bad_variant_access.h +2 -2
- data/third_party/abseil-cpp/absl/types/span.h +3 -3
- data/third_party/address_sorting/address_sorting_posix.c +1 -0
- data/third_party/boringssl-with-bazel/err_data.c +685 -673
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +67 -54
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +21 -22
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +6 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +16 -23
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +55 -37
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c +19 -29
- data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/a_strex.c +269 -272
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +106 -153
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +4 -4
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +1 -40
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utf8.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +59 -47
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +24 -28
- data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/charmap.h +0 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/{asn1_locl.h → internal.h} +86 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +57 -281
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +290 -199
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +9 -9
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +10 -14
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +8 -6
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +2 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/time_support.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +11 -8
- data/third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c +1 -7
- data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +1 -5
- data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +0 -4
- data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +1 -7
- data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +1 -6
- data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +3 -17
- data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +4 -6
- data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +3 -1
- data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c +9 -0
- data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +8 -0
- data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +38 -47
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c +45 -65
- data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +14 -3
- data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +6 -3
- data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +32 -34
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +26 -9
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c +3 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +5 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +5 -9
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +10 -0
- 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/digest/digest.c +2 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +4 -7
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +4 -7
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +5 -9
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +4 -6
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +24 -9
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +4 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +7 -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/hpke/hpke.c +34 -0
- data/third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c +219 -121
- data/third_party/boringssl-with-bazel/src/crypto/hrss/internal.h +9 -2
- data/third_party/boringssl-with-bazel/src/crypto/internal.h +62 -2
- data/third_party/boringssl-with-bazel/src/crypto/lhash/internal.h +253 -0
- data/third_party/boringssl-with-bazel/src/crypto/lhash/lhash.c +28 -23
- data/third_party/boringssl-with-bazel/src/crypto/mem.c +32 -9
- data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +7 -3
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c +0 -9
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +0 -8
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c +0 -2
- data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c +0 -4
- data/third_party/boringssl-with-bazel/src/crypto/pkcs7/internal.h +16 -7
- data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +9 -4
- data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +151 -12
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +5 -1
- data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +59 -22
- data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +6 -6
- data/third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c +15 -11
- data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +2 -18
- data/third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +2 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +233 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +246 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +15 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +10 -5
- data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +0 -179
- data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c +4 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +6 -23
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +1 -5
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +25 -22
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +11 -54
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +2 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +1 -3
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +0 -16
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +9 -11
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_exten.c +2 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +23 -21
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +12 -11
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +232 -11
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +2 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +2 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +5 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +24 -5
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +18 -8
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +6 -7
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c +4 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +23 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c +112 -55
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c +2 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +14 -13
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +76 -31
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +1504 -561
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +5 -12
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +10 -6
- data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +3 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +3 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +9 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +8 -2
- data/third_party/boringssl-with-bazel/src/include/openssl/conf.h +8 -5
- data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +4 -12
- data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +3 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +17 -41
- data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +12 -27
- data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +8 -10
- data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +35 -55
- data/third_party/boringssl-with-bazel/src/include/openssl/hkdf.h +4 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +25 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/hrss.h +14 -12
- data/third_party/boringssl-with-bazel/src/include/openssl/lhash.h +4 -205
- data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +12 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +5 -4
- data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +0 -20
- data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +15 -14
- data/third_party/boringssl-with-bazel/src/include/openssl/pool.h +7 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +29 -28
- data/third_party/boringssl-with-bazel/src/include/openssl/span.h +37 -15
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +87 -24
- data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +31 -32
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +725 -189
- data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +16 -695
- data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +52 -16
- data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +9 -16
- data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +310 -359
- data/third_party/boringssl-with-bazel/src/ssl/{t1_lib.cc → extensions.cc} +110 -159
- data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +24 -13
- data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +145 -142
- data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +106 -99
- data/third_party/boringssl-with-bazel/src/ssl/internal.h +90 -51
- data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +1 -2
- data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +2 -2
- data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +11 -5
- data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +2 -51
- data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +121 -65
- data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +6 -12
- data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +4 -0
- data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +28 -23
- data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +14 -27
- data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +210 -212
- data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +30 -41
- data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +48 -34
- 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
- data/third_party/upb/upb/decode.c +383 -183
- data/third_party/upb/upb/decode.h +32 -4
- data/third_party/upb/upb/decode_fast.c +513 -500
- data/third_party/upb/upb/decode_fast.h +27 -0
- data/third_party/upb/upb/{decode.int.h → decode_internal.h} +39 -8
- data/third_party/upb/upb/def.c +489 -254
- data/third_party/upb/upb/def.h +86 -33
- data/third_party/upb/upb/def.hpp +46 -4
- data/third_party/upb/upb/encode.c +137 -44
- data/third_party/upb/upb/encode.h +29 -2
- data/third_party/upb/upb/msg.c +182 -28
- data/third_party/upb/upb/msg.h +75 -580
- data/third_party/upb/upb/msg_internal.h +769 -0
- data/third_party/upb/upb/port_def.inc +85 -24
- data/third_party/upb/upb/port_undef.inc +38 -1
- data/third_party/upb/upb/reflection.c +126 -94
- data/third_party/upb/upb/reflection.h +42 -10
- data/third_party/upb/upb/reflection.hpp +37 -0
- data/third_party/upb/upb/table.c +211 -86
- data/third_party/upb/upb/{table.int.h → table_internal.h} +56 -180
- data/third_party/upb/upb/text_encode.c +35 -7
- data/third_party/upb/upb/text_encode.h +26 -0
- data/third_party/upb/upb/upb.c +67 -8
- data/third_party/upb/upb/upb.h +36 -6
- data/third_party/upb/upb/upb.hpp +24 -0
- data/third_party/upb/upb/upb_internal.h +58 -0
- metadata +182 -107
- data/include/grpc/event_engine/slice_allocator.h +0 -66
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +0 -179
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +0 -38
- 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 -66
- data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +0 -74
- data/src/core/ext/transport/chttp2/transport/hpack_table.cc +0 -243
- data/src/core/ext/transport/chttp2/transport/hpack_table.h +0 -148
- 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 -124
- data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.c +0 -33
- data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +0 -77
- 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/avl/avl.cc +0 -306
- data/src/core/lib/gpr/tls_gcc.h +0 -52
- data/src/core/lib/gpr/tls_msvc.h +0 -54
- data/src/core/lib/gpr/tls_pthread.h +0 -56
- data/src/core/lib/gpr/tls_stdcpp.h +0 -48
- data/src/core/lib/gprpp/atomic.h +0 -104
- data/src/core/lib/iomgr/endpoint_pair_uv.cc +0 -40
- data/src/core/lib/iomgr/iomgr_uv.cc +0 -43
- data/src/core/lib/iomgr/pollset_uv.cc +0 -95
- data/src/core/lib/iomgr/pollset_uv.h +0 -36
- data/src/core/lib/iomgr/resource_quota.cc +0 -1019
- data/src/core/lib/iomgr/resource_quota.h +0 -177
- data/src/core/lib/iomgr/sockaddr_custom.h +0 -54
- data/src/core/lib/iomgr/socket_utils_uv.cc +0 -49
- data/src/core/lib/iomgr/tcp_uv.cc +0 -421
- data/src/core/lib/iomgr/timer_uv.cc +0 -66
- data/src/core/lib/iomgr/udp_server.cc +0 -748
- data/src/core/lib/iomgr/udp_server.h +0 -103
- data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +0 -93
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +0 -217
- data/third_party/upb/third_party/wyhash/wyhash.h +0 -145
- data/third_party/upb/upb/upb.int.h +0 -29
@@ -19,7 +19,6 @@
|
|
19
19
|
#include <grpc/support/port_platform.h>
|
20
20
|
|
21
21
|
#include "src/core/ext/transport/chttp2/transport/hpack_parser.h"
|
22
|
-
#include "src/core/ext/transport/chttp2/transport/internal.h"
|
23
22
|
|
24
23
|
#include <assert.h>
|
25
24
|
#include <stddef.h>
|
@@ -32,6 +31,7 @@
|
|
32
31
|
#include <grpc/support/log.h>
|
33
32
|
|
34
33
|
#include "src/core/ext/transport/chttp2/transport/bin_encoder.h"
|
34
|
+
#include "src/core/ext/transport/chttp2/transport/internal.h"
|
35
35
|
#include "src/core/lib/debug/stats.h"
|
36
36
|
#include "src/core/lib/gpr/string.h"
|
37
37
|
#include "src/core/lib/profiling/timers.h"
|
@@ -50,21 +50,7 @@
|
|
50
50
|
|
51
51
|
namespace grpc_core {
|
52
52
|
|
53
|
-
|
54
|
-
|
55
|
-
/* How parsing works:
|
56
|
-
|
57
|
-
The parser object keeps track of a function pointer which represents the
|
58
|
-
current parse state.
|
59
|
-
|
60
|
-
Each time new bytes are presented, we call into the current state, which
|
61
|
-
recursively parses until all bytes in the given chunk are exhausted.
|
62
|
-
|
63
|
-
The parse state that terminates then saves its function pointer to be the
|
64
|
-
current state so that it can resume when more bytes are available.
|
65
|
-
|
66
|
-
It's expected that most optimizing compilers will turn this code into
|
67
|
-
a set of indirect jumps, and so not waste stack space. */
|
53
|
+
TraceFlag grpc_trace_chttp2_hpack_parser(false, "chttp2_hpack_parser");
|
68
54
|
|
69
55
|
/* state table for huffman decoding: given a state, gives an index/16 into
|
70
56
|
next_sub_tbl. Taking that index and adding the value of the nibble being
|
@@ -441,7 +427,7 @@ static const int16_t emit_sub_tbl[249 * 16] = {
|
|
441
427
|
|
442
428
|
namespace {
|
443
429
|
// The alphabet used for base64 encoding binary metadata.
|
444
|
-
|
430
|
+
constexpr char kBase64Alphabet[] =
|
445
431
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
|
446
432
|
|
447
433
|
// An inverted table: for each value in kBase64Alphabet, table contains the
|
@@ -461,1124 +447,892 @@ struct Base64InverseTable {
|
|
461
447
|
}
|
462
448
|
};
|
463
449
|
|
464
|
-
|
450
|
+
GRPC_HPACK_CONSTEXPR_VALUE Base64InverseTable kBase64InverseTable;
|
465
451
|
} // namespace
|
466
452
|
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
453
|
+
// Input tracks the current byte through the input data and provides it
|
454
|
+
// via a simple stream interface.
|
455
|
+
class HPackParser::Input {
|
456
|
+
public:
|
457
|
+
Input(grpc_slice_refcount* current_slice_refcount, const uint8_t* begin,
|
458
|
+
const uint8_t* end)
|
459
|
+
: current_slice_refcount_(current_slice_refcount),
|
460
|
+
begin_(begin),
|
461
|
+
end_(end),
|
462
|
+
frontier_(begin) {}
|
463
|
+
|
464
|
+
// If input is backed by a slice, retrieve its refcount. If not, return
|
465
|
+
// nullptr.
|
466
|
+
grpc_slice_refcount* slice_refcount() { return current_slice_refcount_; }
|
467
|
+
|
468
|
+
// Have we reached the end of input?
|
469
|
+
bool end_of_stream() const { return begin_ == end_; }
|
470
|
+
// How many bytes until end of input
|
471
|
+
size_t remaining() const { return end_ - begin_; }
|
472
|
+
// Current position, as a pointer
|
473
|
+
const uint8_t* cur_ptr() const { return begin_; }
|
474
|
+
// End position, as a pointer
|
475
|
+
const uint8_t* end_ptr() const { return end_; }
|
476
|
+
// Move read position forward by n, unchecked
|
477
|
+
void Advance(size_t n) { begin_ += n; }
|
478
|
+
|
479
|
+
// Retrieve the current character, or nullopt if end of stream
|
480
|
+
// Do not advance
|
481
|
+
absl::optional<uint8_t> peek() const {
|
482
|
+
if (end_of_stream()) {
|
483
|
+
return {};
|
484
|
+
}
|
485
|
+
return *begin_;
|
479
486
|
}
|
480
|
-
gpr_log(
|
481
|
-
GPR_INFO,
|
482
|
-
"Decode: '%s: %s', elem_interned=%d [%d], k_interned=%d, v_interned=%d",
|
483
|
-
k, v, GRPC_MDELEM_IS_INTERNED(md), GRPC_MDELEM_STORAGE(md),
|
484
|
-
grpc_slice_is_interned(GRPC_MDKEY(md)),
|
485
|
-
grpc_slice_is_interned(GRPC_MDVALUE(md)));
|
486
|
-
gpr_free(k);
|
487
|
-
gpr_free(v);
|
488
|
-
}
|
489
487
|
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
GPR_DEBUG_ASSERT(GRPC_MDELEM_STORAGE(md) == GRPC_MDELEM_STORAGE_INTERNED ||
|
498
|
-
GRPC_MDELEM_STORAGE(md) == GRPC_MDELEM_STORAGE_STATIC);
|
499
|
-
grpc_error_handle err = grpc_chttp2_hptbl_add(&table_, md);
|
500
|
-
if (GPR_UNLIKELY(err != GRPC_ERROR_NONE)) return err;
|
488
|
+
// Retrieve and advance past the current character, or return nullopt if end
|
489
|
+
// of stream
|
490
|
+
absl::optional<uint8_t> Next() {
|
491
|
+
if (end_of_stream()) {
|
492
|
+
return UnexpectedEOF(absl::optional<uint8_t>());
|
493
|
+
}
|
494
|
+
return *begin_++;
|
501
495
|
}
|
502
|
-
return sink_(md);
|
503
|
-
}
|
504
496
|
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
497
|
+
// Helper to parse a varint delta on top of value, return nullopt on failure
|
498
|
+
// (setting error)
|
499
|
+
absl::optional<uint32_t> ParseVarint(uint32_t value) {
|
500
|
+
// TODO(ctiller): break out a variant of this when we know there are at
|
501
|
+
// least 5 bytes in input_
|
502
|
+
auto cur = Next();
|
503
|
+
if (!cur) return {};
|
504
|
+
value += *cur & 0x7f;
|
505
|
+
if ((*cur & 0x80) == 0) return value;
|
506
|
+
|
507
|
+
cur = Next();
|
508
|
+
if (!cur) return {};
|
509
|
+
value += (*cur & 0x7f) << 7;
|
510
|
+
if ((*cur & 0x80) == 0) return value;
|
511
|
+
|
512
|
+
cur = Next();
|
513
|
+
if (!cur) return {};
|
514
|
+
value += (*cur & 0x7f) << 14;
|
515
|
+
if ((*cur & 0x80) == 0) return value;
|
516
|
+
|
517
|
+
cur = Next();
|
518
|
+
if (!cur) return {};
|
519
|
+
value += (*cur & 0x7f) << 21;
|
520
|
+
if ((*cur & 0x80) == 0) return value;
|
521
|
+
|
522
|
+
cur = Next();
|
523
|
+
if (!cur) return {};
|
524
|
+
uint32_t c = (*cur) & 0x7f;
|
525
|
+
// We might overflow here, so we need to be a little careful about the
|
526
|
+
// addition
|
527
|
+
if (c > 0xf) return ParseVarintOutOfRange(value, *cur);
|
528
|
+
const uint32_t add = c << 28;
|
529
|
+
if (add > 0xffffffffu - value) {
|
530
|
+
return ParseVarintOutOfRange(value, *cur);
|
531
|
+
}
|
532
|
+
value += add;
|
533
|
+
if ((*cur & 0x80) == 0) return value;
|
534
|
+
|
535
|
+
// Spec weirdness: we can add an infinite stream of 0x80 at the end of a
|
536
|
+
// varint and still end up with a correctly encoded varint.
|
537
|
+
do {
|
538
|
+
cur = Next();
|
539
|
+
if (!cur.has_value()) return {};
|
540
|
+
} while (*cur == 0x80);
|
541
|
+
|
542
|
+
// BUT... the last byte needs to be 0x00 or we'll overflow dramatically!
|
543
|
+
if (*cur == 0) return value;
|
544
|
+
return ParseVarintOutOfRange(value, *cur);
|
514
545
|
}
|
515
|
-
data_.copied.length = 0;
|
516
|
-
return s;
|
517
|
-
}
|
518
546
|
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
547
|
+
// Prefix for a string
|
548
|
+
struct StringPrefix {
|
549
|
+
// Number of bytes in input for string
|
550
|
+
uint32_t length;
|
551
|
+
// Is it huffman compressed
|
552
|
+
bool huff;
|
553
|
+
};
|
554
|
+
|
555
|
+
// Parse a string prefix
|
556
|
+
absl::optional<StringPrefix> ParseStringPrefix() {
|
557
|
+
auto cur = Next();
|
558
|
+
if (!cur.has_value()) return {};
|
559
|
+
// Huffman if the top bit is 1
|
560
|
+
const bool huff = (*cur & 0x80) != 0;
|
561
|
+
// String length
|
562
|
+
uint32_t strlen = (*cur & 0x7f);
|
563
|
+
if (strlen == 0x7f) {
|
564
|
+
// all ones ==> varint string length
|
565
|
+
auto v = ParseVarint(0x7f);
|
566
|
+
if (!v.has_value()) return {};
|
567
|
+
strlen = *v;
|
568
|
+
}
|
569
|
+
return StringPrefix{strlen, huff};
|
528
570
|
}
|
529
|
-
data_.copied.length = 0;
|
530
|
-
return s;
|
531
|
-
}
|
532
571
|
|
533
|
-
|
534
|
-
|
535
|
-
state_ = *next_state_++;
|
536
|
-
return (this->*state_)(cur, end);
|
537
|
-
}
|
572
|
+
// Check if we saw an EOF.. must be verified before looking at TakeError
|
573
|
+
bool eof_error() const { return eof_error_; }
|
538
574
|
|
539
|
-
|
540
|
-
|
541
|
-
grpc_error_handle
|
542
|
-
|
543
|
-
|
544
|
-
state_ = &HPackParser::parse_begin;
|
545
|
-
return GRPC_ERROR_NONE;
|
575
|
+
// Extract the parse error, leaving the current error as NONE.
|
576
|
+
grpc_error_handle TakeError() {
|
577
|
+
grpc_error_handle out = error_;
|
578
|
+
error_ = GRPC_ERROR_NONE;
|
579
|
+
return out;
|
546
580
|
}
|
547
581
|
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
case 0: // literal key
|
558
|
-
return parse_lithdr_notidx_v(cur, end);
|
559
|
-
case 0xf: // varint encoded key index
|
560
|
-
return parse_lithdr_notidx_x(cur, end);
|
561
|
-
default: // inline encoded key index
|
562
|
-
return parse_lithdr_notidx(cur, end);
|
563
|
-
}
|
564
|
-
// Literal header never indexed.
|
565
|
-
// First byte format: 0001xxxx
|
566
|
-
// Where xxxx:
|
567
|
-
// 0000 - literal key
|
568
|
-
// 1111 - indexed key, varint encoded index
|
569
|
-
// other - indexed key, inline encoded index
|
570
|
-
case 1:
|
571
|
-
switch (*cur & 0xf) {
|
572
|
-
case 0: // literal key
|
573
|
-
return parse_lithdr_nvridx_v(cur, end);
|
574
|
-
case 0xf: // varint encoded key index
|
575
|
-
return parse_lithdr_nvridx_x(cur, end);
|
576
|
-
default: // inline encoded key index
|
577
|
-
return parse_lithdr_nvridx(cur, end);
|
578
|
-
}
|
579
|
-
// Update max table size.
|
580
|
-
// First byte format: 001xxxxx
|
581
|
-
// Where xxxxx:
|
582
|
-
// 11111 - max size is varint encoded
|
583
|
-
// other - max size is stored inline
|
584
|
-
case 2:
|
585
|
-
// inline encoded max table size
|
586
|
-
return parse_max_tbl_size(cur, end);
|
587
|
-
case 3:
|
588
|
-
if (*cur == 0x3f) {
|
589
|
-
// varint encoded max table size
|
590
|
-
return parse_max_tbl_size_x(cur, end);
|
591
|
-
} else {
|
592
|
-
// inline encoded max table size
|
593
|
-
return parse_max_tbl_size(cur, end);
|
594
|
-
}
|
595
|
-
// Literal header with incremental indexing.
|
596
|
-
// First byte format: 01xxxxxx
|
597
|
-
// Where xxxxxx:
|
598
|
-
// 000000 - literal key
|
599
|
-
// 111111 - indexed key, varint encoded index
|
600
|
-
// other - indexed key, inline encoded index
|
601
|
-
case 4:
|
602
|
-
if (*cur == 0x40) {
|
603
|
-
// literal key
|
604
|
-
return parse_lithdr_incidx_v(cur, end);
|
605
|
-
}
|
606
|
-
ABSL_FALLTHROUGH_INTENDED;
|
607
|
-
case 5:
|
608
|
-
case 6:
|
609
|
-
// inline encoded key index
|
610
|
-
return parse_lithdr_incidx(cur, end);
|
611
|
-
case 7:
|
612
|
-
if (*cur == 0x7f) {
|
613
|
-
// varint encoded key index
|
614
|
-
return parse_lithdr_incidx_x(cur, end);
|
615
|
-
} else {
|
616
|
-
// inline encoded key index
|
617
|
-
return parse_lithdr_incidx(cur, end);
|
618
|
-
}
|
619
|
-
// Indexed Header Field Representation
|
620
|
-
// First byte format: 1xxxxxxx
|
621
|
-
// Where xxxxxxx:
|
622
|
-
// 0000000 - illegal
|
623
|
-
// 1111111 - varint encoded field index
|
624
|
-
// other - inline encoded field index
|
625
|
-
case 8:
|
626
|
-
if (*cur == 0x80) {
|
627
|
-
// illegal value.
|
628
|
-
return parse_illegal_op(cur, end);
|
629
|
-
}
|
630
|
-
ABSL_FALLTHROUGH_INTENDED;
|
631
|
-
case 9:
|
632
|
-
case 10:
|
633
|
-
case 11:
|
634
|
-
case 12:
|
635
|
-
case 13:
|
636
|
-
case 14:
|
637
|
-
// inline encoded field index
|
638
|
-
return parse_indexed_field(cur, end);
|
639
|
-
case 15:
|
640
|
-
if (*cur == 0xff) {
|
641
|
-
// varint encoded field index
|
642
|
-
return parse_indexed_field_x(cur, end);
|
643
|
-
} else {
|
644
|
-
// inline encoded field index
|
645
|
-
return parse_indexed_field(cur, end);
|
646
|
-
}
|
582
|
+
// Set the current error - allows the rest of the code not to need to pass
|
583
|
+
// around StatusOr<> which would be prohibitive here.
|
584
|
+
GPR_ATTRIBUTE_NOINLINE void SetError(grpc_error_handle error) {
|
585
|
+
if (error_ != GRPC_ERROR_NONE || eof_error_) {
|
586
|
+
GRPC_ERROR_UNREF(error);
|
587
|
+
return;
|
588
|
+
}
|
589
|
+
error_ = error;
|
590
|
+
begin_ = end_;
|
647
591
|
}
|
648
|
-
GPR_UNREACHABLE_CODE(abort());
|
649
|
-
}
|
650
592
|
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
return
|
593
|
+
// If no error is set, set it to the value produced by error_factory.
|
594
|
+
// Return return_value unchanged.
|
595
|
+
template <typename F, typename T>
|
596
|
+
GPR_ATTRIBUTE_NOINLINE T MaybeSetErrorAndReturn(F error_factory,
|
597
|
+
T return_value) {
|
598
|
+
if (error_ != GRPC_ERROR_NONE || eof_error_) return return_value;
|
599
|
+
error_ = error_factory();
|
600
|
+
begin_ = end_;
|
601
|
+
return return_value;
|
657
602
|
}
|
658
603
|
|
659
|
-
return (
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
return GRPC_ERROR_NONE;
|
604
|
+
// Set the error to an unexpected eof, and return result (code golfed as this
|
605
|
+
// is a common case)
|
606
|
+
template <typename T>
|
607
|
+
T UnexpectedEOF(T return_value) {
|
608
|
+
if (error_ != GRPC_ERROR_NONE) return return_value;
|
609
|
+
eof_error_ = true;
|
610
|
+
return return_value;
|
667
611
|
}
|
668
612
|
|
669
|
-
|
670
|
-
}
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
613
|
+
// Update the frontier - signifies we've successfully parsed another element
|
614
|
+
void UpdateFrontier() { frontier_ = begin_; }
|
615
|
+
|
616
|
+
// Get the frontier - for buffering should we fail due to eof
|
617
|
+
const uint8_t* frontier() const { return frontier_; }
|
618
|
+
|
619
|
+
private:
|
620
|
+
// Helper to set the error to out of range for ParseVarint
|
621
|
+
absl::optional<uint32_t> ParseVarintOutOfRange(uint32_t value,
|
622
|
+
uint8_t last_byte) {
|
623
|
+
return MaybeSetErrorAndReturn(
|
624
|
+
[value, last_byte] {
|
625
|
+
return GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrFormat(
|
626
|
+
"integer overflow in hpack integer decoding: have 0x%08x, "
|
627
|
+
"got byte 0x%02x on byte 5",
|
628
|
+
value, last_byte));
|
629
|
+
},
|
630
|
+
absl::optional<uint32_t>());
|
677
631
|
}
|
678
632
|
|
679
|
-
|
680
|
-
|
633
|
+
// Refcount if we are backed by a slice
|
634
|
+
grpc_slice_refcount* current_slice_refcount_;
|
635
|
+
// Current input point
|
636
|
+
const uint8_t* begin_;
|
637
|
+
// End of stream point
|
638
|
+
const uint8_t* const end_;
|
639
|
+
// Frontier denotes the first byte past successfully processed input
|
640
|
+
const uint8_t* frontier_;
|
641
|
+
// Current error
|
642
|
+
grpc_error_handle error_ = GRPC_ERROR_NONE;
|
643
|
+
// If the error was EOF, we flag it here..
|
644
|
+
bool eof_error_ = false;
|
645
|
+
};
|
681
646
|
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
647
|
+
// Helper to parse a string and turn it into a slice with appropriate memory
|
648
|
+
// management characteristics
|
649
|
+
class HPackParser::String {
|
650
|
+
public:
|
651
|
+
// Helper to specify a string should be internalized
|
652
|
+
struct Intern {};
|
653
|
+
// Helper to specify a string should be externalized
|
654
|
+
struct Extern {};
|
655
|
+
|
656
|
+
private:
|
657
|
+
// Forward declare take functions... we'll need them in the public interface
|
658
|
+
Slice Take(Extern);
|
659
|
+
Slice Take(Intern);
|
660
|
+
|
661
|
+
public:
|
662
|
+
String(const String&) = delete;
|
663
|
+
String& operator=(const String&) = delete;
|
664
|
+
String(String&& other) noexcept : value_(std::move(other.value_)) {
|
665
|
+
other.value_ = absl::Span<const uint8_t>();
|
687
666
|
}
|
688
|
-
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
-
grpc_error_handle HPackParser::parse_stream_dep0(const uint8_t* cur,
|
693
|
-
const uint8_t* end) {
|
694
|
-
if (cur == end) {
|
695
|
-
state_ = &HPackParser::parse_stream_dep0;
|
696
|
-
return GRPC_ERROR_NONE;
|
667
|
+
String& operator=(String&& other) noexcept {
|
668
|
+
value_ = std::move(other.value_);
|
669
|
+
other.value_ = absl::Span<const uint8_t>();
|
670
|
+
return *this;
|
697
671
|
}
|
698
672
|
|
699
|
-
|
700
|
-
|
701
|
-
|
702
|
-
|
703
|
-
|
704
|
-
grpc_error_set_int(
|
705
|
-
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Invalid HPACK index received"),
|
706
|
-
GRPC_ERROR_INT_INDEX, static_cast<intptr_t>(index_)),
|
707
|
-
GRPC_ERROR_INT_SIZE, static_cast<intptr_t>(table_.num_ents));
|
708
|
-
}
|
709
|
-
|
710
|
-
/* emit an indexed field; jumps to begin the next field on completion */
|
711
|
-
grpc_error_handle HPackParser::finish_indexed_field(const uint8_t* cur,
|
712
|
-
const uint8_t* end) {
|
713
|
-
grpc_mdelem md = grpc_chttp2_hptbl_lookup<true>(&table_, index_);
|
714
|
-
if (GPR_UNLIKELY(GRPC_MDISNULL(md))) {
|
715
|
-
return InvalidHPackIndexError();
|
673
|
+
// Take the value and leave this empty
|
674
|
+
// Use Intern/Extern to choose memory management
|
675
|
+
template <typename T>
|
676
|
+
auto Take() -> decltype(this->Take(T())) {
|
677
|
+
return Take(T());
|
716
678
|
}
|
717
|
-
GRPC_STATS_INC_HPACK_RECV_INDEXED();
|
718
|
-
grpc_error_handle err = FinishHeader<TableAction::kOmitFromTable>(md);
|
719
|
-
if (GPR_UNLIKELY(err != GRPC_ERROR_NONE)) return err;
|
720
|
-
return parse_begin(cur, end);
|
721
|
-
}
|
722
|
-
|
723
|
-
/* parse an indexed field with index < 127 */
|
724
|
-
grpc_error_handle HPackParser::parse_indexed_field(const uint8_t* cur,
|
725
|
-
const uint8_t* end) {
|
726
|
-
dynamic_table_updates_allowed_ = 0;
|
727
|
-
index_ = (*cur) & 0x7f;
|
728
|
-
md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
|
729
|
-
return finish_indexed_field(cur + 1, end);
|
730
|
-
}
|
731
|
-
|
732
|
-
/* parse an indexed field with index >= 127 */
|
733
|
-
grpc_error_handle HPackParser::parse_indexed_field_x(const uint8_t* cur,
|
734
|
-
const uint8_t* end) {
|
735
|
-
static const State and_then[] = {&HPackParser::finish_indexed_field};
|
736
|
-
dynamic_table_updates_allowed_ = 0;
|
737
|
-
next_state_ = and_then;
|
738
|
-
index_ = 0x7f;
|
739
|
-
md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
|
740
|
-
parsing_.value = &index_;
|
741
|
-
return parse_value0(cur + 1, end);
|
742
|
-
}
|
743
|
-
|
744
|
-
/* When finishing with a header, get the cached md element for this index.
|
745
|
-
This is set in parse_value_string(). We ensure (in debug mode) that the
|
746
|
-
cached metadata corresponds with the index we are examining. */
|
747
|
-
grpc_mdelem HPackParser::GetPrecomputedMDForIndex() {
|
748
|
-
GPR_DEBUG_ASSERT(md_for_index_.payload != 0);
|
749
|
-
GPR_DEBUG_ASSERT(static_cast<int64_t>(index_) == precomputed_md_index_);
|
750
|
-
grpc_mdelem md = md_for_index_;
|
751
|
-
GPR_DEBUG_ASSERT(!GRPC_MDISNULL(md)); /* handled in string parsing */
|
752
|
-
md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
|
753
|
-
#ifndef NDEBUG
|
754
|
-
precomputed_md_index_ = -1;
|
755
|
-
#endif
|
756
|
-
return md;
|
757
|
-
}
|
758
|
-
|
759
|
-
static const grpc_core::ManagedMemorySlice& get_indexed_key(grpc_mdelem md) {
|
760
|
-
GPR_DEBUG_ASSERT(GRPC_MDELEM_IS_INTERNED(md));
|
761
|
-
return static_cast<const grpc_core::ManagedMemorySlice&>(
|
762
|
-
grpc_slice_ref_internal(GRPC_MDKEY(md)));
|
763
|
-
}
|
764
|
-
|
765
|
-
/* finish a literal header with incremental indexing */
|
766
|
-
grpc_error_handle HPackParser::finish_lithdr_incidx(const uint8_t* cur,
|
767
|
-
const uint8_t* end) {
|
768
|
-
GRPC_STATS_INC_HPACK_RECV_LITHDR_INCIDX();
|
769
|
-
grpc_mdelem md = GetPrecomputedMDForIndex();
|
770
|
-
grpc_error_handle err = FinishHeader<TableAction::kAddToTable>(
|
771
|
-
grpc_mdelem_from_slices(get_indexed_key(md), value_.TakeIntern()));
|
772
|
-
if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
|
773
|
-
return parse_begin(cur, end);
|
774
|
-
}
|
775
|
-
|
776
|
-
/* finish a literal header with incremental indexing with no index */
|
777
|
-
grpc_error_handle HPackParser::finish_lithdr_incidx_v(const uint8_t* cur,
|
778
|
-
const uint8_t* end) {
|
779
|
-
GRPC_STATS_INC_HPACK_RECV_LITHDR_INCIDX_V();
|
780
|
-
grpc_error_handle err = FinishHeader<TableAction::kAddToTable>(
|
781
|
-
grpc_mdelem_from_slices(key_.TakeIntern(), value_.TakeIntern()));
|
782
|
-
if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
|
783
|
-
return parse_begin(cur, end);
|
784
|
-
}
|
785
|
-
|
786
|
-
/* parse a literal header with incremental indexing; index < 63 */
|
787
|
-
grpc_error_handle HPackParser::parse_lithdr_incidx(const uint8_t* cur,
|
788
|
-
const uint8_t* end) {
|
789
|
-
static const State and_then[] = {
|
790
|
-
&HPackParser::parse_value_string_with_indexed_key,
|
791
|
-
&HPackParser::finish_lithdr_incidx};
|
792
|
-
dynamic_table_updates_allowed_ = 0;
|
793
|
-
next_state_ = and_then;
|
794
|
-
index_ = (*cur) & 0x3f;
|
795
|
-
md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
|
796
|
-
return parse_string_prefix(cur + 1, end);
|
797
|
-
}
|
798
|
-
|
799
|
-
/* parse a literal header with incremental indexing; index >= 63 */
|
800
|
-
grpc_error_handle HPackParser::parse_lithdr_incidx_x(const uint8_t* cur,
|
801
|
-
const uint8_t* end) {
|
802
|
-
static const State and_then[] = {
|
803
|
-
&HPackParser::parse_string_prefix,
|
804
|
-
&HPackParser::parse_value_string_with_indexed_key,
|
805
|
-
&HPackParser::finish_lithdr_incidx};
|
806
|
-
dynamic_table_updates_allowed_ = 0;
|
807
|
-
next_state_ = and_then;
|
808
|
-
index_ = 0x3f;
|
809
|
-
md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
|
810
|
-
parsing_.value = &index_;
|
811
|
-
return parse_value0(cur + 1, end);
|
812
|
-
}
|
813
|
-
|
814
|
-
/* parse a literal header with incremental indexing; index = 0 */
|
815
|
-
grpc_error_handle HPackParser::parse_lithdr_incidx_v(const uint8_t* cur,
|
816
|
-
const uint8_t* end) {
|
817
|
-
static const State and_then[] = {
|
818
|
-
&HPackParser::parse_key_string, &HPackParser::parse_string_prefix,
|
819
|
-
&HPackParser::parse_value_string_with_literal_key,
|
820
|
-
&HPackParser::finish_lithdr_incidx_v};
|
821
|
-
dynamic_table_updates_allowed_ = 0;
|
822
|
-
next_state_ = and_then;
|
823
|
-
return parse_string_prefix(cur + 1, end);
|
824
|
-
}
|
825
|
-
|
826
|
-
/* finish a literal header without incremental indexing */
|
827
|
-
grpc_error_handle HPackParser::finish_lithdr_notidx(const uint8_t* cur,
|
828
|
-
const uint8_t* end) {
|
829
|
-
GRPC_STATS_INC_HPACK_RECV_LITHDR_NOTIDX();
|
830
|
-
grpc_mdelem md = GetPrecomputedMDForIndex();
|
831
|
-
grpc_error_handle err = FinishHeader<TableAction::kOmitFromTable>(
|
832
|
-
grpc_mdelem_from_slices(get_indexed_key(md), value_.TakeExtern()));
|
833
|
-
if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
|
834
|
-
return parse_begin(cur, end);
|
835
|
-
}
|
836
|
-
|
837
|
-
/* finish a literal header without incremental indexing with index = 0 */
|
838
|
-
grpc_error_handle HPackParser::finish_lithdr_notidx_v(const uint8_t* cur,
|
839
|
-
const uint8_t* end) {
|
840
|
-
GRPC_STATS_INC_HPACK_RECV_LITHDR_NOTIDX_V();
|
841
|
-
grpc_error_handle err = FinishHeader<TableAction::kOmitFromTable>(
|
842
|
-
grpc_mdelem_from_slices(key_.TakeIntern(), value_.TakeExtern()));
|
843
|
-
if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
|
844
|
-
return parse_begin(cur, end);
|
845
|
-
}
|
846
|
-
|
847
|
-
/* parse a literal header without incremental indexing; index < 15 */
|
848
|
-
grpc_error_handle HPackParser::parse_lithdr_notidx(const uint8_t* cur,
|
849
|
-
const uint8_t* end) {
|
850
|
-
static const State and_then[] = {
|
851
|
-
&HPackParser::parse_value_string_with_indexed_key,
|
852
|
-
&HPackParser::finish_lithdr_notidx};
|
853
|
-
dynamic_table_updates_allowed_ = 0;
|
854
|
-
next_state_ = and_then;
|
855
|
-
index_ = (*cur) & 0xf;
|
856
|
-
md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
|
857
|
-
return parse_string_prefix(cur + 1, end);
|
858
|
-
}
|
859
|
-
|
860
|
-
/* parse a literal header without incremental indexing; index >= 15 */
|
861
|
-
grpc_error_handle HPackParser::parse_lithdr_notidx_x(const uint8_t* cur,
|
862
|
-
const uint8_t* end) {
|
863
|
-
static const State and_then[] = {
|
864
|
-
&HPackParser::parse_string_prefix,
|
865
|
-
&HPackParser::parse_value_string_with_indexed_key,
|
866
|
-
&HPackParser::finish_lithdr_notidx};
|
867
|
-
dynamic_table_updates_allowed_ = 0;
|
868
|
-
next_state_ = and_then;
|
869
|
-
index_ = 0xf;
|
870
|
-
md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
|
871
|
-
parsing_.value = &index_;
|
872
|
-
return parse_value0(cur + 1, end);
|
873
|
-
}
|
874
|
-
|
875
|
-
/* parse a literal header without incremental indexing; index == 0 */
|
876
|
-
grpc_error_handle HPackParser::parse_lithdr_notidx_v(const uint8_t* cur,
|
877
|
-
const uint8_t* end) {
|
878
|
-
static const State and_then[] = {
|
879
|
-
&HPackParser::parse_key_string, &HPackParser::parse_string_prefix,
|
880
|
-
&HPackParser::parse_value_string_with_literal_key,
|
881
|
-
&HPackParser::finish_lithdr_notidx_v};
|
882
|
-
dynamic_table_updates_allowed_ = 0;
|
883
|
-
next_state_ = and_then;
|
884
|
-
return parse_string_prefix(cur + 1, end);
|
885
|
-
}
|
886
|
-
|
887
|
-
/* finish a literal header that is never indexed */
|
888
|
-
grpc_error_handle HPackParser::finish_lithdr_nvridx(const uint8_t* cur,
|
889
|
-
const uint8_t* end) {
|
890
|
-
GRPC_STATS_INC_HPACK_RECV_LITHDR_NVRIDX();
|
891
|
-
grpc_mdelem md = GetPrecomputedMDForIndex();
|
892
|
-
grpc_error_handle err = FinishHeader<TableAction::kOmitFromTable>(
|
893
|
-
grpc_mdelem_from_slices(get_indexed_key(md), value_.TakeExtern()));
|
894
|
-
if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
|
895
|
-
return parse_begin(cur, end);
|
896
|
-
}
|
897
|
-
|
898
|
-
/* finish a literal header that is never indexed with an extra value */
|
899
|
-
grpc_error_handle HPackParser::finish_lithdr_nvridx_v(const uint8_t* cur,
|
900
|
-
const uint8_t* end) {
|
901
|
-
GRPC_STATS_INC_HPACK_RECV_LITHDR_NVRIDX_V();
|
902
|
-
grpc_error_handle err = FinishHeader<TableAction::kOmitFromTable>(
|
903
|
-
grpc_mdelem_from_slices(key_.TakeIntern(), value_.TakeExtern()));
|
904
|
-
if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
|
905
|
-
return parse_begin(cur, end);
|
906
|
-
}
|
907
|
-
|
908
|
-
/* parse a literal header that is never indexed; index < 15 */
|
909
|
-
grpc_error_handle HPackParser::parse_lithdr_nvridx(const uint8_t* cur,
|
910
|
-
const uint8_t* end) {
|
911
|
-
static const State and_then[] = {
|
912
|
-
&HPackParser::parse_value_string_with_indexed_key,
|
913
|
-
&HPackParser::finish_lithdr_nvridx};
|
914
|
-
dynamic_table_updates_allowed_ = 0;
|
915
|
-
next_state_ = and_then;
|
916
|
-
index_ = (*cur) & 0xf;
|
917
|
-
md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
|
918
|
-
return parse_string_prefix(cur + 1, end);
|
919
|
-
}
|
920
|
-
|
921
|
-
/* parse a literal header that is never indexed; index >= 15 */
|
922
|
-
grpc_error_handle HPackParser::parse_lithdr_nvridx_x(const uint8_t* cur,
|
923
|
-
const uint8_t* end) {
|
924
|
-
static const State and_then[] = {
|
925
|
-
&HPackParser::parse_string_prefix,
|
926
|
-
&HPackParser::parse_value_string_with_indexed_key,
|
927
|
-
&HPackParser::finish_lithdr_nvridx};
|
928
|
-
dynamic_table_updates_allowed_ = 0;
|
929
|
-
next_state_ = and_then;
|
930
|
-
index_ = 0xf;
|
931
|
-
md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
|
932
|
-
parsing_.value = &index_;
|
933
|
-
return parse_value0(cur + 1, end);
|
934
|
-
}
|
935
679
|
|
936
|
-
|
937
|
-
|
938
|
-
|
939
|
-
|
940
|
-
|
941
|
-
|
942
|
-
|
943
|
-
|
944
|
-
|
945
|
-
|
946
|
-
}
|
680
|
+
// Return a reference to the value as a string view
|
681
|
+
absl::string_view string_view() const {
|
682
|
+
if (auto* p = absl::get_if<Slice>(&value_)) {
|
683
|
+
return p->as_string_view();
|
684
|
+
} else if (auto* p = absl::get_if<absl::Span<const uint8_t>>(&value_)) {
|
685
|
+
return absl::string_view(reinterpret_cast<const char*>(p->data()),
|
686
|
+
p->size());
|
687
|
+
} else if (auto* p = absl::get_if<std::vector<uint8_t>>(&value_)) {
|
688
|
+
return absl::string_view(reinterpret_cast<const char*>(p->data()),
|
689
|
+
p->size());
|
690
|
+
}
|
691
|
+
GPR_UNREACHABLE_CODE(return absl::string_view());
|
692
|
+
}
|
947
693
|
|
948
|
-
|
949
|
-
|
950
|
-
|
951
|
-
|
952
|
-
|
694
|
+
// Parse a non-binary string
|
695
|
+
static absl::optional<String> Parse(Input* input) {
|
696
|
+
auto pfx = input->ParseStringPrefix();
|
697
|
+
if (!pfx.has_value()) return {};
|
698
|
+
if (pfx->huff) {
|
699
|
+
// Huffman coded
|
700
|
+
std::vector<uint8_t> output;
|
701
|
+
auto v = ParseHuff(input, pfx->length,
|
702
|
+
[&output](uint8_t c) { output.push_back(c); });
|
703
|
+
if (!v) return {};
|
704
|
+
return String(std::move(output));
|
705
|
+
}
|
706
|
+
return ParseUncompressed(input, pfx->length);
|
953
707
|
}
|
954
|
-
grpc_error_handle err =
|
955
|
-
grpc_chttp2_hptbl_set_current_table_size(&table_, index_);
|
956
|
-
if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
|
957
|
-
return parse_begin(cur, end);
|
958
|
-
}
|
959
708
|
|
960
|
-
|
961
|
-
|
962
|
-
|
963
|
-
|
964
|
-
|
965
|
-
|
966
|
-
|
967
|
-
|
709
|
+
// Parse a binary string
|
710
|
+
static absl::optional<String> ParseBinary(Input* input) {
|
711
|
+
auto pfx = input->ParseStringPrefix();
|
712
|
+
if (!pfx.has_value()) return {};
|
713
|
+
if (!pfx->huff) {
|
714
|
+
if (pfx->length > 0 && input->peek() == 0) {
|
715
|
+
// 'true-binary'
|
716
|
+
input->Advance(1);
|
717
|
+
return ParseUncompressed(input, pfx->length - 1);
|
718
|
+
}
|
719
|
+
// Base64 encoded... pull out the string, then unbase64 it
|
720
|
+
auto base64 = ParseUncompressed(input, pfx->length);
|
721
|
+
if (!base64.has_value()) return {};
|
722
|
+
return Unbase64(input, std::move(*base64));
|
723
|
+
} else {
|
724
|
+
// Huffman encoded...
|
725
|
+
std::vector<uint8_t> decompressed;
|
726
|
+
// State here says either we don't know if it's base64 or binary, or we do
|
727
|
+
// and what is it.
|
728
|
+
enum class State { kUnsure, kBinary, kBase64 };
|
729
|
+
State state = State::kUnsure;
|
730
|
+
auto decompressed_ok =
|
731
|
+
ParseHuff(input, pfx->length, [&state, &decompressed](uint8_t c) {
|
732
|
+
if (state == State::kUnsure) {
|
733
|
+
// First byte... if it's zero it's binary
|
734
|
+
if (c == 0) {
|
735
|
+
// Save the type, and skip the zero
|
736
|
+
state = State::kBinary;
|
737
|
+
return;
|
738
|
+
} else {
|
739
|
+
// Flag base64, store this value
|
740
|
+
state = State::kBase64;
|
741
|
+
}
|
742
|
+
}
|
743
|
+
// Non-first byte, or base64 first byte
|
744
|
+
decompressed.push_back(c);
|
745
|
+
});
|
746
|
+
if (!decompressed_ok) return {};
|
747
|
+
switch (state) {
|
748
|
+
case State::kUnsure:
|
749
|
+
// No bytes, empty span
|
750
|
+
return String(absl::Span<const uint8_t>());
|
751
|
+
case State::kBinary:
|
752
|
+
// Binary, we're done
|
753
|
+
return String(std::move(decompressed));
|
754
|
+
case State::kBase64:
|
755
|
+
// Base64 - unpack it
|
756
|
+
return Unbase64(input, String(std::move(decompressed)));
|
757
|
+
}
|
758
|
+
GPR_UNREACHABLE_CODE(abort(););
|
759
|
+
}
|
968
760
|
}
|
969
|
-
dynamic_table_updates_allowed_--;
|
970
|
-
index_ = (*cur) & 0x1f;
|
971
|
-
md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
|
972
|
-
return finish_max_tbl_size(cur + 1, end);
|
973
|
-
}
|
974
761
|
|
975
|
-
|
976
|
-
|
977
|
-
|
978
|
-
|
979
|
-
|
980
|
-
|
981
|
-
|
982
|
-
|
983
|
-
|
762
|
+
private:
|
763
|
+
void AppendBytes(const uint8_t* data, size_t length);
|
764
|
+
explicit String(std::vector<uint8_t> v) : value_(std::move(v)) {}
|
765
|
+
explicit String(absl::Span<const uint8_t> v) : value_(v) {}
|
766
|
+
String(grpc_slice_refcount* r, const uint8_t* begin, const uint8_t* end)
|
767
|
+
: value_(Slice::FromRefcountAndBytes(r, begin, end)) {}
|
768
|
+
|
769
|
+
// Parse some huffman encoded bytes, using output(uint8_t b) to emit each
|
770
|
+
// decoded byte.
|
771
|
+
template <typename Out>
|
772
|
+
static bool ParseHuff(Input* input, uint32_t length, Out output) {
|
773
|
+
GRPC_STATS_INC_HPACK_RECV_HUFFMAN();
|
774
|
+
int16_t state = 0;
|
775
|
+
// Parse one half byte... we leverage some lookup tables to keep the logic
|
776
|
+
// here really simple.
|
777
|
+
auto nibble = [&output, &state](uint8_t nibble) {
|
778
|
+
int16_t emit = emit_sub_tbl[16 * emit_tbl[state] + nibble];
|
779
|
+
int16_t next = next_sub_tbl[16 * next_tbl[state] + nibble];
|
780
|
+
if (emit != -1) {
|
781
|
+
if (emit >= 0 && emit < 256) {
|
782
|
+
output(static_cast<uint8_t>(emit));
|
783
|
+
} else {
|
784
|
+
assert(emit == 256);
|
785
|
+
}
|
786
|
+
}
|
787
|
+
state = next;
|
788
|
+
};
|
789
|
+
// If there's insufficient bytes remaining, return now.
|
790
|
+
if (input->remaining() < length) {
|
791
|
+
return input->UnexpectedEOF(false);
|
792
|
+
}
|
793
|
+
// Grab the byte range, and iterate through it.
|
794
|
+
const uint8_t* p = input->cur_ptr();
|
795
|
+
input->Advance(length);
|
796
|
+
for (uint32_t i = 0; i < length; i++) {
|
797
|
+
nibble(p[i] >> 4);
|
798
|
+
nibble(p[i] & 0xf);
|
799
|
+
}
|
800
|
+
return true;
|
984
801
|
}
|
985
|
-
dynamic_table_updates_allowed_--;
|
986
|
-
next_state_ = and_then;
|
987
|
-
index_ = 0x1f;
|
988
|
-
md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
|
989
|
-
parsing_.value = &index_;
|
990
|
-
return parse_value0(cur + 1, end);
|
991
|
-
}
|
992
802
|
|
993
|
-
|
994
|
-
|
995
|
-
|
996
|
-
|
997
|
-
|
998
|
-
|
999
|
-
|
803
|
+
// Parse some uncompressed string bytes.
|
804
|
+
static absl::optional<String> ParseUncompressed(Input* input,
|
805
|
+
uint32_t length) {
|
806
|
+
GRPC_STATS_INC_HPACK_RECV_UNCOMPRESSED();
|
807
|
+
// Check there's enough bytes
|
808
|
+
if (input->remaining() < length) {
|
809
|
+
return input->UnexpectedEOF(absl::optional<String>());
|
810
|
+
}
|
811
|
+
auto* refcount = input->slice_refcount();
|
812
|
+
auto* p = input->cur_ptr();
|
813
|
+
input->Advance(length);
|
814
|
+
if (refcount != nullptr) {
|
815
|
+
return String(refcount, p, p + length);
|
816
|
+
} else {
|
817
|
+
return String(absl::Span<const uint8_t>(p, length));
|
818
|
+
}
|
1000
819
|
}
|
1001
|
-
state_ = &HPackParser::still_parse_error;
|
1002
|
-
return err;
|
1003
|
-
}
|
1004
820
|
|
1005
|
-
|
1006
|
-
|
1007
|
-
|
1008
|
-
|
821
|
+
// Turn base64 encoded bytes into not base64 encoded bytes.
|
822
|
+
// Only takes input to set an error on failure.
|
823
|
+
static absl::optional<String> Unbase64(Input* input, String s) {
|
824
|
+
absl::optional<std::vector<uint8_t>> result;
|
825
|
+
if (auto* p = absl::get_if<Slice>(&s.value_)) {
|
826
|
+
result = Unbase64Loop(p->begin(), p->end());
|
827
|
+
}
|
828
|
+
if (auto* p = absl::get_if<absl::Span<const uint8_t>>(&s.value_)) {
|
829
|
+
result = Unbase64Loop(p->begin(), p->end());
|
830
|
+
}
|
831
|
+
if (auto* p = absl::get_if<std::vector<uint8_t>>(&s.value_)) {
|
832
|
+
result = Unbase64Loop(p->data(), p->data() + p->size());
|
833
|
+
}
|
834
|
+
if (!result.has_value()) {
|
835
|
+
return input->MaybeSetErrorAndReturn(
|
836
|
+
[] {
|
837
|
+
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
838
|
+
"illegal base64 encoding");
|
839
|
+
},
|
840
|
+
absl::optional<String>());
|
841
|
+
}
|
842
|
+
return String(std::move(*result));
|
843
|
+
}
|
1009
844
|
|
1010
|
-
|
1011
|
-
|
1012
|
-
|
1013
|
-
|
1014
|
-
|
1015
|
-
|
1016
|
-
}
|
845
|
+
// Main loop for Unbase64
|
846
|
+
static absl::optional<std::vector<uint8_t>> Unbase64Loop(const uint8_t* cur,
|
847
|
+
const uint8_t* end) {
|
848
|
+
while (cur != end && end[-1] == '=') {
|
849
|
+
--end;
|
850
|
+
}
|
1017
851
|
|
1018
|
-
|
1019
|
-
|
1020
|
-
grpc_error_handle HPackParser::parse_value0(const uint8_t* cur,
|
1021
|
-
const uint8_t* end) {
|
1022
|
-
if (cur == end) {
|
1023
|
-
state_ = &HPackParser::parse_value0;
|
1024
|
-
return GRPC_ERROR_NONE;
|
1025
|
-
}
|
852
|
+
std::vector<uint8_t> out;
|
853
|
+
out.reserve(3 * (end - cur) / 4 + 3);
|
1026
854
|
|
1027
|
-
|
855
|
+
// Decode 4 bytes at a time while we can
|
856
|
+
while (end - cur >= 4) {
|
857
|
+
uint32_t bits = kBase64InverseTable.table[*cur];
|
858
|
+
if (bits > 63) return {};
|
859
|
+
uint32_t buffer = bits << 18;
|
860
|
+
++cur;
|
1028
861
|
|
1029
|
-
|
1030
|
-
|
1031
|
-
|
1032
|
-
|
1033
|
-
}
|
1034
|
-
}
|
862
|
+
bits = kBase64InverseTable.table[*cur];
|
863
|
+
if (bits > 63) return {};
|
864
|
+
buffer |= bits << 12;
|
865
|
+
++cur;
|
1035
866
|
|
1036
|
-
|
1037
|
-
|
1038
|
-
|
1039
|
-
|
1040
|
-
if (cur == end) {
|
1041
|
-
state_ = &HPackParser::parse_value1;
|
1042
|
-
return GRPC_ERROR_NONE;
|
1043
|
-
}
|
867
|
+
bits = kBase64InverseTable.table[*cur];
|
868
|
+
if (bits > 63) return {};
|
869
|
+
buffer |= bits << 6;
|
870
|
+
++cur;
|
1044
871
|
|
1045
|
-
|
872
|
+
bits = kBase64InverseTable.table[*cur];
|
873
|
+
if (bits > 63) return {};
|
874
|
+
buffer |= bits;
|
875
|
+
++cur;
|
1046
876
|
|
1047
|
-
|
1048
|
-
|
1049
|
-
|
1050
|
-
|
1051
|
-
|
1052
|
-
|
877
|
+
out.insert(out.end(), {static_cast<uint8_t>(buffer >> 16),
|
878
|
+
static_cast<uint8_t>(buffer >> 8),
|
879
|
+
static_cast<uint8_t>(buffer)});
|
880
|
+
}
|
881
|
+
// Deal with the last 0, 1, 2, or 3 bytes.
|
882
|
+
switch (end - cur) {
|
883
|
+
case 0:
|
884
|
+
return out;
|
885
|
+
case 1:
|
886
|
+
return {};
|
887
|
+
case 2: {
|
888
|
+
uint32_t bits = kBase64InverseTable.table[*cur];
|
889
|
+
if (bits > 63) return {};
|
890
|
+
uint32_t buffer = bits << 18;
|
1053
891
|
|
1054
|
-
|
1055
|
-
|
1056
|
-
|
1057
|
-
|
1058
|
-
if (cur == end) {
|
1059
|
-
state_ = &HPackParser::parse_value2;
|
1060
|
-
return GRPC_ERROR_NONE;
|
1061
|
-
}
|
892
|
+
++cur;
|
893
|
+
bits = kBase64InverseTable.table[*cur];
|
894
|
+
if (bits > 63) return {};
|
895
|
+
buffer |= bits << 12;
|
1062
896
|
|
1063
|
-
|
897
|
+
if (buffer & 0xffff) return {};
|
898
|
+
out.push_back(static_cast<uint8_t>(buffer >> 16));
|
899
|
+
return out;
|
900
|
+
}
|
901
|
+
case 3: {
|
902
|
+
uint32_t bits = kBase64InverseTable.table[*cur];
|
903
|
+
if (bits > 63) return {};
|
904
|
+
uint32_t buffer = bits << 18;
|
1064
905
|
|
1065
|
-
|
1066
|
-
|
1067
|
-
|
1068
|
-
|
1069
|
-
}
|
1070
|
-
}
|
906
|
+
++cur;
|
907
|
+
bits = kBase64InverseTable.table[*cur];
|
908
|
+
if (bits > 63) return {};
|
909
|
+
buffer |= bits << 12;
|
1071
910
|
|
1072
|
-
|
1073
|
-
|
1074
|
-
|
1075
|
-
|
1076
|
-
if (cur == end) {
|
1077
|
-
state_ = &HPackParser::parse_value3;
|
1078
|
-
return GRPC_ERROR_NONE;
|
1079
|
-
}
|
911
|
+
++cur;
|
912
|
+
bits = kBase64InverseTable.table[*cur];
|
913
|
+
if (bits > 63) return {};
|
914
|
+
buffer |= bits << 6;
|
1080
915
|
|
1081
|
-
|
916
|
+
++cur;
|
917
|
+
if (buffer & 0xff) return {};
|
918
|
+
out.push_back(static_cast<uint8_t>(buffer >> 16));
|
919
|
+
out.push_back(static_cast<uint8_t>(buffer >> 8));
|
920
|
+
return out;
|
921
|
+
}
|
922
|
+
}
|
1082
923
|
|
1083
|
-
|
1084
|
-
return parse_value4(cur + 1, end);
|
1085
|
-
} else {
|
1086
|
-
return parse_next(cur + 1, end);
|
924
|
+
GPR_UNREACHABLE_CODE(return out;);
|
1087
925
|
}
|
1088
|
-
}
|
1089
926
|
|
1090
|
-
|
1091
|
-
|
1092
|
-
grpc_error_handle HPackParser::parse_value4(const uint8_t* cur,
|
1093
|
-
const uint8_t* end) {
|
1094
|
-
uint8_t c;
|
1095
|
-
uint32_t cur_value;
|
1096
|
-
uint32_t add_value;
|
927
|
+
absl::variant<Slice, absl::Span<const uint8_t>, std::vector<uint8_t>> value_;
|
928
|
+
};
|
1097
929
|
|
1098
|
-
|
1099
|
-
|
1100
|
-
|
930
|
+
// Parser parses one key/value pair from a byte stream.
|
931
|
+
class HPackParser::Parser {
|
932
|
+
public:
|
933
|
+
Parser(Input* input, grpc_metadata_batch* metadata_buffer,
|
934
|
+
uint32_t metadata_size_limit, HPackTable* table,
|
935
|
+
uint8_t* dynamic_table_updates_allowed, uint32_t* frame_length,
|
936
|
+
LogInfo log_info)
|
937
|
+
: input_(input),
|
938
|
+
metadata_buffer_(metadata_buffer),
|
939
|
+
table_(table),
|
940
|
+
dynamic_table_updates_allowed_(dynamic_table_updates_allowed),
|
941
|
+
frame_length_(frame_length),
|
942
|
+
metadata_size_limit_(metadata_size_limit),
|
943
|
+
log_info_(log_info) {}
|
944
|
+
|
945
|
+
// Skip any priority bits, or return false on failure
|
946
|
+
bool SkipPriority() {
|
947
|
+
if (input_->remaining() < 5) return input_->UnexpectedEOF(false);
|
948
|
+
input_->Advance(5);
|
949
|
+
return true;
|
1101
950
|
}
|
1102
951
|
|
1103
|
-
|
1104
|
-
|
1105
|
-
|
952
|
+
bool Parse() {
|
953
|
+
auto cur = *input_->Next();
|
954
|
+
switch (cur >> 4) {
|
955
|
+
// Literal header not indexed - First byte format: 0000xxxx
|
956
|
+
// Literal header never indexed - First byte format: 0001xxxx
|
957
|
+
// Where xxxx:
|
958
|
+
// 0000 - literal key
|
959
|
+
// 1111 - indexed key, varint encoded index
|
960
|
+
// other - indexed key, inline encoded index
|
961
|
+
case 0:
|
962
|
+
case 1:
|
963
|
+
switch (cur & 0xf) {
|
964
|
+
case 0: // literal key
|
965
|
+
return FinishHeaderOmitFromTable(ParseLiteralKey<String::Extern>());
|
966
|
+
case 0xf: // varint encoded key index
|
967
|
+
return FinishHeaderOmitFromTable(
|
968
|
+
ParseVarIdxKey<String::Extern>(0xf));
|
969
|
+
default: // inline encoded key index
|
970
|
+
return FinishHeaderOmitFromTable(
|
971
|
+
ParseIdxKey<String::Extern>(cur & 0xf));
|
972
|
+
}
|
973
|
+
// Update max table size.
|
974
|
+
// First byte format: 001xxxxx
|
975
|
+
// Where xxxxx:
|
976
|
+
// 11111 - max size is varint encoded
|
977
|
+
// other - max size is stored inline
|
978
|
+
case 2:
|
979
|
+
// inline encoded max table size
|
980
|
+
return FinishMaxTableSize(cur & 0x1f);
|
981
|
+
case 3:
|
982
|
+
if (cur == 0x3f) {
|
983
|
+
// varint encoded max table size
|
984
|
+
return FinishMaxTableSize(input_->ParseVarint(0x1f));
|
985
|
+
} else {
|
986
|
+
// inline encoded max table size
|
987
|
+
return FinishMaxTableSize(cur & 0x1f);
|
988
|
+
}
|
989
|
+
// Literal header with incremental indexing.
|
990
|
+
// First byte format: 01xxxxxx
|
991
|
+
// Where xxxxxx:
|
992
|
+
// 000000 - literal key
|
993
|
+
// 111111 - indexed key, varint encoded index
|
994
|
+
// other - indexed key, inline encoded index
|
995
|
+
case 4:
|
996
|
+
if (cur == 0x40) {
|
997
|
+
// literal key
|
998
|
+
return FinishHeaderAndAddToTable(ParseLiteralKey<String::Intern>());
|
999
|
+
}
|
1000
|
+
ABSL_FALLTHROUGH_INTENDED;
|
1001
|
+
case 5:
|
1002
|
+
case 6:
|
1003
|
+
// inline encoded key index
|
1004
|
+
return FinishHeaderAndAddToTable(
|
1005
|
+
ParseIdxKey<String::Intern>(cur & 0x3f));
|
1006
|
+
case 7:
|
1007
|
+
if (cur == 0x7f) {
|
1008
|
+
// varint encoded key index
|
1009
|
+
return FinishHeaderAndAddToTable(
|
1010
|
+
ParseVarIdxKey<String::Intern>(0x3f));
|
1011
|
+
} else {
|
1012
|
+
// inline encoded key index
|
1013
|
+
return FinishHeaderAndAddToTable(
|
1014
|
+
ParseIdxKey<String::Intern>(cur & 0x3f));
|
1015
|
+
}
|
1016
|
+
// Indexed Header Field Representation
|
1017
|
+
// First byte format: 1xxxxxxx
|
1018
|
+
// Where xxxxxxx:
|
1019
|
+
// 0000000 - illegal
|
1020
|
+
// 1111111 - varint encoded field index
|
1021
|
+
// other - inline encoded field index
|
1022
|
+
case 8:
|
1023
|
+
if (cur == 0x80) {
|
1024
|
+
// illegal value.
|
1025
|
+
return input_->MaybeSetErrorAndReturn(
|
1026
|
+
[] {
|
1027
|
+
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1028
|
+
"Illegal hpack op code");
|
1029
|
+
},
|
1030
|
+
false);
|
1031
|
+
}
|
1032
|
+
ABSL_FALLTHROUGH_INTENDED;
|
1033
|
+
case 9:
|
1034
|
+
case 10:
|
1035
|
+
case 11:
|
1036
|
+
case 12:
|
1037
|
+
case 13:
|
1038
|
+
case 14:
|
1039
|
+
// inline encoded field index
|
1040
|
+
return FinishIndexed(cur & 0x7f);
|
1041
|
+
case 15:
|
1042
|
+
if (cur == 0xff) {
|
1043
|
+
// varint encoded field index
|
1044
|
+
return FinishIndexed(input_->ParseVarint(0x7f));
|
1045
|
+
} else {
|
1046
|
+
// inline encoded field index
|
1047
|
+
return FinishIndexed(cur & 0x7f);
|
1048
|
+
}
|
1049
|
+
}
|
1050
|
+
GPR_UNREACHABLE_CODE(abort());
|
1106
1051
|
}
|
1107
1052
|
|
1108
|
-
|
1109
|
-
|
1110
|
-
|
1111
|
-
|
1053
|
+
private:
|
1054
|
+
void GPR_ATTRIBUTE_NOINLINE LogHeader(const HPackTable::Memento& memento) {
|
1055
|
+
const char* type;
|
1056
|
+
switch (log_info_.type) {
|
1057
|
+
case LogInfo::kHeaders:
|
1058
|
+
type = "HDR";
|
1059
|
+
break;
|
1060
|
+
case LogInfo::kTrailers:
|
1061
|
+
type = "TRL";
|
1062
|
+
break;
|
1063
|
+
case LogInfo::kDontKnow:
|
1064
|
+
type = "???";
|
1065
|
+
break;
|
1066
|
+
}
|
1067
|
+
gpr_log(GPR_DEBUG, "HTTP:%d:%s:%s: %s", log_info_.stream_id, type,
|
1068
|
+
log_info_.is_client ? "CLI" : "SVR", memento.DebugString().c_str());
|
1112
1069
|
}
|
1113
1070
|
|
1114
|
-
|
1071
|
+
bool EmitHeader(const HPackTable::Memento& md) {
|
1072
|
+
// Pass up to the transport
|
1073
|
+
if (GPR_UNLIKELY(metadata_buffer_ == nullptr)) return true;
|
1074
|
+
*frame_length_ += md.transport_size();
|
1075
|
+
if (GPR_UNLIKELY(*frame_length_ > metadata_size_limit_)) {
|
1076
|
+
return HandleMetadataSizeLimitExceeded(md);
|
1077
|
+
}
|
1115
1078
|
|
1116
|
-
|
1117
|
-
|
1118
|
-
|
1119
|
-
|
1079
|
+
grpc_error_handle err = metadata_buffer_->Set(md);
|
1080
|
+
if (GPR_UNLIKELY(err != GRPC_ERROR_NONE)) {
|
1081
|
+
input_->SetError(err);
|
1082
|
+
return false;
|
1083
|
+
}
|
1084
|
+
return true;
|
1120
1085
|
}
|
1121
1086
|
|
1122
|
-
|
1123
|
-
|
1124
|
-
|
1125
|
-
|
1126
|
-
|
1127
|
-
|
1128
|
-
|
1129
|
-
|
1130
|
-
|
1131
|
-
|
1132
|
-
|
1133
|
-
|
1134
|
-
|
1135
|
-
|
1136
|
-
|
1137
|
-
|
1138
|
-
++cur;
|
1087
|
+
bool FinishHeaderAndAddToTable(absl::optional<HPackTable::Memento> md) {
|
1088
|
+
// Allow higher code to just pass in failures ... simplifies things a bit.
|
1089
|
+
if (!md.has_value()) return false;
|
1090
|
+
// Log if desired
|
1091
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_chttp2_hpack_parser)) {
|
1092
|
+
LogHeader(*md);
|
1093
|
+
}
|
1094
|
+
// Emit whilst we own the metadata.
|
1095
|
+
auto r = EmitHeader(*md);
|
1096
|
+
// Add to the hpack table
|
1097
|
+
grpc_error_handle err = table_->Add(std::move(*md));
|
1098
|
+
if (GPR_UNLIKELY(err != GRPC_ERROR_NONE)) {
|
1099
|
+
input_->SetError(err);
|
1100
|
+
return false;
|
1101
|
+
};
|
1102
|
+
return r;
|
1139
1103
|
}
|
1140
1104
|
|
1141
|
-
|
1142
|
-
|
1143
|
-
return
|
1105
|
+
bool FinishHeaderOmitFromTable(absl::optional<HPackTable::Memento> md) {
|
1106
|
+
// Allow higher code to just pass in failures ... simplifies things a bit.
|
1107
|
+
if (!md.has_value()) return false;
|
1108
|
+
return FinishHeaderOmitFromTable(*md);
|
1144
1109
|
}
|
1145
1110
|
|
1146
|
-
|
1147
|
-
|
1111
|
+
bool FinishHeaderOmitFromTable(const HPackTable::Memento& md) {
|
1112
|
+
// Log if desired
|
1113
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_chttp2_hpack_parser)) {
|
1114
|
+
LogHeader(md);
|
1115
|
+
}
|
1116
|
+
return EmitHeader(md);
|
1148
1117
|
}
|
1149
1118
|
|
1150
|
-
|
1151
|
-
|
1152
|
-
|
1153
|
-
|
1154
|
-
|
1155
|
-
|
1156
|
-
|
1157
|
-
}
|
1158
|
-
|
1159
|
-
|
1160
|
-
|
1161
|
-
|
1162
|
-
|
1163
|
-
|
1164
|
-
|
1119
|
+
// Parse a string encoded key and a string encoded value
|
1120
|
+
template <typename TakeValueType>
|
1121
|
+
absl::optional<HPackTable::Memento> ParseLiteralKey() {
|
1122
|
+
auto key = String::Parse(input_);
|
1123
|
+
if (!key.has_value()) return {};
|
1124
|
+
auto value = ParseValueString(absl::EndsWith(key->string_view(), "-bin"));
|
1125
|
+
if (GPR_UNLIKELY(!value.has_value())) {
|
1126
|
+
return {};
|
1127
|
+
}
|
1128
|
+
auto key_string = key->string_view();
|
1129
|
+
auto value_slice = value->Take<TakeValueType>();
|
1130
|
+
const auto transport_size = key_string.size() + value_slice.size() +
|
1131
|
+
hpack_constants::kEntryOverhead;
|
1132
|
+
return grpc_metadata_batch::Parse(key->string_view(),
|
1133
|
+
std::move(value_slice), transport_size);
|
1165
1134
|
}
|
1166
1135
|
|
1167
|
-
|
1168
|
-
|
1169
|
-
|
1170
|
-
|
1171
|
-
|
1172
|
-
|
1173
|
-
|
1136
|
+
// Parse an index encoded key and a string encoded value
|
1137
|
+
template <typename TakeValueType>
|
1138
|
+
absl::optional<HPackTable::Memento> ParseIdxKey(uint32_t index) {
|
1139
|
+
const auto* elem = table_->Lookup(index);
|
1140
|
+
if (GPR_UNLIKELY(elem == nullptr)) {
|
1141
|
+
return InvalidHPackIndexError(index,
|
1142
|
+
absl::optional<HPackTable::Memento>());
|
1143
|
+
}
|
1144
|
+
auto value = ParseValueString(elem->is_binary_header());
|
1145
|
+
if (GPR_UNLIKELY(!value.has_value())) return {};
|
1146
|
+
return elem->WithNewValue(value->Take<TakeValueType>());
|
1174
1147
|
}
|
1175
|
-
}
|
1176
1148
|
|
1177
|
-
|
1178
|
-
|
1179
|
-
|
1180
|
-
|
1181
|
-
|
1182
|
-
|
1183
|
-
data_.copied.str = static_cast<char*>(
|
1184
|
-
gpr_realloc(data_.copied.str, data_.copied.capacity));
|
1149
|
+
// Parse a varint index encoded key and a string encoded value
|
1150
|
+
template <typename TakeValueType>
|
1151
|
+
absl::optional<HPackTable::Memento> ParseVarIdxKey(uint32_t offset) {
|
1152
|
+
auto index = input_->ParseVarint(offset);
|
1153
|
+
if (GPR_UNLIKELY(!index.has_value())) return {};
|
1154
|
+
return ParseIdxKey<TakeValueType>(*index);
|
1185
1155
|
}
|
1186
|
-
memcpy(data_.copied.str + data_.copied.length, data, length);
|
1187
|
-
GPR_ASSERT(length <= UINT32_MAX - data_.copied.length);
|
1188
|
-
data_.copied.length += static_cast<uint32_t>(length);
|
1189
|
-
}
|
1190
1156
|
|
1191
|
-
|
1192
|
-
|
1193
|
-
|
1194
|
-
|
1195
|
-
|
1196
|
-
|
1197
|
-
|
1198
|
-
str->AppendBytes(cur, static_cast<size_t>(end - cur));
|
1199
|
-
return GRPC_ERROR_NONE;
|
1200
|
-
case BinaryState::kBinaryBegin:
|
1201
|
-
if (cur == end) {
|
1202
|
-
binary_ = BinaryState::kBinaryBegin;
|
1203
|
-
return GRPC_ERROR_NONE;
|
1204
|
-
}
|
1205
|
-
if (*cur == 0) {
|
1206
|
-
/* 'true-binary' case */
|
1207
|
-
++cur;
|
1208
|
-
binary_ = BinaryState::kNotBinary;
|
1209
|
-
GRPC_STATS_INC_HPACK_RECV_BINARY();
|
1210
|
-
str->AppendBytes(cur, static_cast<size_t>(end - cur));
|
1211
|
-
return GRPC_ERROR_NONE;
|
1212
|
-
}
|
1213
|
-
GRPC_STATS_INC_HPACK_RECV_BINARY_BASE64();
|
1214
|
-
b64_byte0:
|
1215
|
-
ABSL_FALLTHROUGH_INTENDED;
|
1216
|
-
case BinaryState::kBase64Byte0:
|
1217
|
-
if (cur == end) {
|
1218
|
-
binary_ = BinaryState::kBase64Byte0;
|
1219
|
-
return GRPC_ERROR_NONE;
|
1220
|
-
}
|
1221
|
-
bits = kBase64InverseTable.table[*cur];
|
1222
|
-
++cur;
|
1223
|
-
if (bits == 255) {
|
1224
|
-
return parse_error(
|
1225
|
-
cur, end,
|
1226
|
-
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Illegal base64 character"));
|
1227
|
-
} else if (bits == 64) {
|
1228
|
-
goto b64_byte0;
|
1229
|
-
}
|
1230
|
-
base64_buffer_ = bits << 18;
|
1231
|
-
b64_byte1:
|
1232
|
-
ABSL_FALLTHROUGH_INTENDED;
|
1233
|
-
case BinaryState::kBase64Byte1:
|
1234
|
-
if (cur == end) {
|
1235
|
-
binary_ = BinaryState::kBase64Byte1;
|
1236
|
-
return GRPC_ERROR_NONE;
|
1237
|
-
}
|
1238
|
-
bits = kBase64InverseTable.table[*cur];
|
1239
|
-
++cur;
|
1240
|
-
if (bits == 255) {
|
1241
|
-
return parse_error(
|
1242
|
-
cur, end,
|
1243
|
-
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Illegal base64 character"));
|
1244
|
-
} else if (bits == 64) {
|
1245
|
-
goto b64_byte1;
|
1246
|
-
}
|
1247
|
-
base64_buffer_ |= bits << 12;
|
1248
|
-
b64_byte2:
|
1249
|
-
ABSL_FALLTHROUGH_INTENDED;
|
1250
|
-
case BinaryState::kBase64Byte2:
|
1251
|
-
if (cur == end) {
|
1252
|
-
binary_ = BinaryState::kBase64Byte2;
|
1253
|
-
return GRPC_ERROR_NONE;
|
1254
|
-
}
|
1255
|
-
bits = kBase64InverseTable.table[*cur];
|
1256
|
-
++cur;
|
1257
|
-
if (bits == 255) {
|
1258
|
-
return parse_error(
|
1259
|
-
cur, end,
|
1260
|
-
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Illegal base64 character"));
|
1261
|
-
} else if (bits == 64) {
|
1262
|
-
goto b64_byte2;
|
1263
|
-
}
|
1264
|
-
base64_buffer_ |= bits << 6;
|
1265
|
-
b64_byte3:
|
1266
|
-
ABSL_FALLTHROUGH_INTENDED;
|
1267
|
-
case BinaryState::kBase64Byte3:
|
1268
|
-
if (cur == end) {
|
1269
|
-
binary_ = BinaryState::kBase64Byte3;
|
1270
|
-
return GRPC_ERROR_NONE;
|
1271
|
-
}
|
1272
|
-
bits = kBase64InverseTable.table[*cur];
|
1273
|
-
++cur;
|
1274
|
-
if (bits == 255) {
|
1275
|
-
return parse_error(
|
1276
|
-
cur, end,
|
1277
|
-
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Illegal base64 character"));
|
1278
|
-
} else if (bits == 64) {
|
1279
|
-
goto b64_byte3;
|
1280
|
-
}
|
1281
|
-
base64_buffer_ |= bits;
|
1282
|
-
bits = base64_buffer_;
|
1283
|
-
decoded[0] = static_cast<uint8_t>(bits >> 16);
|
1284
|
-
decoded[1] = static_cast<uint8_t>(bits >> 8);
|
1285
|
-
decoded[2] = static_cast<uint8_t>(bits);
|
1286
|
-
str->AppendBytes(decoded, 3);
|
1287
|
-
goto b64_byte0;
|
1157
|
+
// Parse a string, figuring out if it's binary or not by the key name.
|
1158
|
+
absl::optional<String> ParseValueString(bool is_binary) {
|
1159
|
+
if (is_binary) {
|
1160
|
+
return String::ParseBinary(input_);
|
1161
|
+
} else {
|
1162
|
+
return String::Parse(input_);
|
1163
|
+
}
|
1288
1164
|
}
|
1289
|
-
GPR_UNREACHABLE_CODE(return parse_error(
|
1290
|
-
cur, end,
|
1291
|
-
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Should never reach here")));
|
1292
|
-
}
|
1293
1165
|
|
1294
|
-
|
1295
|
-
|
1296
|
-
|
1297
|
-
|
1298
|
-
|
1299
|
-
|
1300
|
-
|
1301
|
-
|
1302
|
-
|
1303
|
-
|
1304
|
-
case BinaryState::kBase64Byte0:
|
1305
|
-
break;
|
1306
|
-
case BinaryState::kBase64Byte1:
|
1307
|
-
return parse_error(cur, end,
|
1308
|
-
GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1309
|
-
"illegal base64 encoding")); /* illegal encoding */
|
1310
|
-
case BinaryState::kBase64Byte2:
|
1311
|
-
bits = base64_buffer_;
|
1312
|
-
if (bits & 0xffff) {
|
1313
|
-
grpc_error_handle err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1314
|
-
absl::StrFormat("trailing bits in base64 encoding: 0x%04x",
|
1315
|
-
bits & 0xffff)
|
1316
|
-
.c_str());
|
1317
|
-
return parse_error(cur, end, err);
|
1318
|
-
}
|
1319
|
-
decoded[0] = static_cast<uint8_t>(bits >> 16);
|
1320
|
-
str->AppendBytes(decoded, 1);
|
1321
|
-
break;
|
1322
|
-
case BinaryState::kBase64Byte3:
|
1323
|
-
bits = base64_buffer_;
|
1324
|
-
if (bits & 0xff) {
|
1325
|
-
grpc_error_handle err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
|
1326
|
-
absl::StrFormat("trailing bits in base64 encoding: 0x%02x",
|
1327
|
-
bits & 0xff)
|
1328
|
-
.c_str());
|
1329
|
-
return parse_error(cur, end, err);
|
1330
|
-
}
|
1331
|
-
decoded[0] = static_cast<uint8_t>(bits >> 16);
|
1332
|
-
decoded[1] = static_cast<uint8_t>(bits >> 8);
|
1333
|
-
str->AppendBytes(decoded, 2);
|
1334
|
-
break;
|
1166
|
+
// Emit an indexed field
|
1167
|
+
bool FinishIndexed(absl::optional<uint32_t> index) {
|
1168
|
+
*dynamic_table_updates_allowed_ = 0;
|
1169
|
+
if (!index.has_value()) return false;
|
1170
|
+
const auto* elem = table_->Lookup(*index);
|
1171
|
+
if (GPR_UNLIKELY(elem == nullptr)) {
|
1172
|
+
return InvalidHPackIndexError(*index, false);
|
1173
|
+
}
|
1174
|
+
GRPC_STATS_INC_HPACK_RECV_INDEXED();
|
1175
|
+
return FinishHeaderOmitFromTable(*elem);
|
1335
1176
|
}
|
1336
|
-
return GRPC_ERROR_NONE;
|
1337
|
-
}
|
1338
1177
|
|
1339
|
-
|
1340
|
-
|
1341
|
-
|
1342
|
-
|
1343
|
-
|
1344
|
-
|
1345
|
-
|
1346
|
-
|
1347
|
-
|
1348
|
-
|
1349
|
-
|
1178
|
+
// finish parsing a max table size change
|
1179
|
+
bool FinishMaxTableSize(absl::optional<uint32_t> size) {
|
1180
|
+
if (!size.has_value()) return false;
|
1181
|
+
if (*dynamic_table_updates_allowed_ == 0) {
|
1182
|
+
return input_->MaybeSetErrorAndReturn(
|
1183
|
+
[] {
|
1184
|
+
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1185
|
+
"More than two max table size changes in a single frame");
|
1186
|
+
},
|
1187
|
+
false);
|
1188
|
+
}
|
1189
|
+
(*dynamic_table_updates_allowed_)--;
|
1190
|
+
grpc_error_handle err = table_->SetCurrentTableSize(*size);
|
1191
|
+
if (err != GRPC_ERROR_NONE) {
|
1192
|
+
input_->SetError(err);
|
1193
|
+
return false;
|
1350
1194
|
}
|
1195
|
+
return true;
|
1351
1196
|
}
|
1352
|
-
huff_state_ = next;
|
1353
|
-
return GRPC_ERROR_NONE;
|
1354
|
-
}
|
1355
1197
|
|
1356
|
-
|
1357
|
-
|
1358
|
-
|
1359
|
-
|
1360
|
-
|
1361
|
-
|
1362
|
-
|
1363
|
-
|
1198
|
+
// Set an invalid hpack index error if no error has been set. Returns result
|
1199
|
+
// unmodified.
|
1200
|
+
template <typename R>
|
1201
|
+
R InvalidHPackIndexError(uint32_t index, R result) {
|
1202
|
+
return input_->MaybeSetErrorAndReturn(
|
1203
|
+
[this, index] {
|
1204
|
+
return grpc_error_set_int(
|
1205
|
+
grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1206
|
+
"Invalid HPACK index received"),
|
1207
|
+
GRPC_ERROR_INT_INDEX,
|
1208
|
+
static_cast<intptr_t>(index)),
|
1209
|
+
GRPC_ERROR_INT_SIZE,
|
1210
|
+
static_cast<intptr_t>(this->table_->num_entries()));
|
1211
|
+
},
|
1212
|
+
std::move(result));
|
1364
1213
|
}
|
1365
|
-
return GRPC_ERROR_NONE;
|
1366
|
-
}
|
1367
1214
|
|
1368
|
-
|
1369
|
-
|
1370
|
-
|
1371
|
-
|
1372
|
-
|
1373
|
-
|
1374
|
-
|
1375
|
-
|
1215
|
+
GPR_ATTRIBUTE_NOINLINE
|
1216
|
+
bool HandleMetadataSizeLimitExceeded(const HPackTable::Memento&) {
|
1217
|
+
gpr_log(GPR_DEBUG,
|
1218
|
+
"received initial metadata size exceeds limit (%" PRIu32
|
1219
|
+
" vs. %" PRIu32
|
1220
|
+
"). GRPC_ARG_MAX_METADATA_SIZE can be set to increase this limit.",
|
1221
|
+
*frame_length_, metadata_size_limit_);
|
1222
|
+
if (metadata_buffer_ != nullptr) metadata_buffer_->Clear();
|
1223
|
+
return input_->MaybeSetErrorAndReturn(
|
1224
|
+
[] {
|
1225
|
+
return grpc_error_set_int(
|
1226
|
+
GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1227
|
+
"received initial metadata size exceeds limit"),
|
1228
|
+
GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_RESOURCE_EXHAUSTED);
|
1229
|
+
},
|
1230
|
+
false);
|
1376
1231
|
}
|
1377
|
-
}
|
1378
1232
|
|
1379
|
-
|
1380
|
-
|
1381
|
-
|
1382
|
-
|
1383
|
-
|
1384
|
-
|
1385
|
-
|
1386
|
-
|
1387
|
-
|
1388
|
-
|
1389
|
-
|
1390
|
-
|
1391
|
-
|
1392
|
-
|
1393
|
-
|
1394
|
-
|
1395
|
-
state_ = &HPackParser::parse_string;
|
1396
|
-
return GRPC_ERROR_NONE;
|
1233
|
+
Input* const input_;
|
1234
|
+
grpc_metadata_batch* const metadata_buffer_;
|
1235
|
+
HPackTable* const table_;
|
1236
|
+
uint8_t* const dynamic_table_updates_allowed_;
|
1237
|
+
uint32_t* const frame_length_;
|
1238
|
+
const uint32_t metadata_size_limit_;
|
1239
|
+
const LogInfo log_info_;
|
1240
|
+
};
|
1241
|
+
|
1242
|
+
Slice HPackParser::String::Take(Extern) {
|
1243
|
+
if (auto* p = absl::get_if<Slice>(&value_)) {
|
1244
|
+
return p->Copy();
|
1245
|
+
} else if (auto* p = absl::get_if<absl::Span<const uint8_t>>(&value_)) {
|
1246
|
+
return Slice::FromCopiedBuffer(*p);
|
1247
|
+
} else if (auto* p = absl::get_if<std::vector<uint8_t>>(&value_)) {
|
1248
|
+
return Slice::FromCopiedBuffer(*p);
|
1397
1249
|
}
|
1250
|
+
GPR_UNREACHABLE_CODE(return Slice());
|
1398
1251
|
}
|
1399
1252
|
|
1400
|
-
|
1401
|
-
|
1402
|
-
|
1403
|
-
|
1404
|
-
|
1405
|
-
|
1406
|
-
|
1407
|
-
|
1408
|
-
GRPC_STATS_INC_HPACK_RECV_UNCOMPRESSED();
|
1409
|
-
str->copied_ = false;
|
1410
|
-
str->data_.referenced.refcount = current_slice_refcount_;
|
1411
|
-
str->data_.referenced.data.refcounted.bytes = const_cast<uint8_t*>(cur);
|
1412
|
-
str->data_.referenced.data.refcounted.length = strlen_;
|
1413
|
-
grpc_slice_ref_internal(str->data_.referenced);
|
1414
|
-
return parse_next(cur + strlen_, end);
|
1415
|
-
}
|
1416
|
-
strgot_ = 0;
|
1417
|
-
str->copied_ = true;
|
1418
|
-
str->data_.copied.length = 0;
|
1419
|
-
parsing_.str = str;
|
1420
|
-
huff_state_ = 0;
|
1421
|
-
binary_ = binary;
|
1422
|
-
switch (binary_) {
|
1423
|
-
case BinaryState::kNotBinary:
|
1424
|
-
if (huff_) {
|
1425
|
-
GRPC_STATS_INC_HPACK_RECV_HUFFMAN();
|
1426
|
-
} else {
|
1427
|
-
GRPC_STATS_INC_HPACK_RECV_UNCOMPRESSED();
|
1428
|
-
}
|
1429
|
-
break;
|
1430
|
-
case BinaryState::kBinaryBegin:
|
1431
|
-
/* stats incremented later: don't know true binary or not */
|
1432
|
-
break;
|
1433
|
-
default:
|
1434
|
-
abort();
|
1253
|
+
Slice HPackParser::String::Take(Intern) {
|
1254
|
+
ManagedMemorySlice m;
|
1255
|
+
if (auto* p = absl::get_if<Slice>(&value_)) {
|
1256
|
+
m = ManagedMemorySlice(&p->c_slice());
|
1257
|
+
} else if (auto* p = absl::get_if<absl::Span<const uint8_t>>(&value_)) {
|
1258
|
+
m = ManagedMemorySlice(reinterpret_cast<const char*>(p->data()), p->size());
|
1259
|
+
} else if (auto* p = absl::get_if<std::vector<uint8_t>>(&value_)) {
|
1260
|
+
m = ManagedMemorySlice(reinterpret_cast<const char*>(p->data()), p->size());
|
1435
1261
|
}
|
1436
|
-
return
|
1262
|
+
return Slice(m);
|
1437
1263
|
}
|
1438
1264
|
|
1439
|
-
/*
|
1440
|
-
grpc_error_handle HPackParser::parse_key_string(const uint8_t* cur,
|
1441
|
-
const uint8_t* end) {
|
1442
|
-
return begin_parse_string(cur, end, BinaryState::kNotBinary, &key_);
|
1443
|
-
}
|
1265
|
+
/* PUBLIC INTERFACE */
|
1444
1266
|
|
1445
|
-
|
1446
|
-
|
1447
|
-
bool HPackParser::IsBinaryLiteralHeader() {
|
1448
|
-
/* We know that either argument here is a reference counter slice.
|
1449
|
-
* 1. If it is a grpc_core::StaticSlice, the refcount is set to kNoopRefcount.
|
1450
|
-
* 2. If it's key_.data.referenced, then key_.copied was set to false,
|
1451
|
-
* which occurs in begin_parse_string() - where the refcount is set to
|
1452
|
-
* current_slice_refcount_, which is not null. */
|
1453
|
-
return grpc_is_refcounted_slice_binary_header(
|
1454
|
-
key_.copied_ ? grpc_core::ExternallyManagedSlice(key_.data_.copied.str,
|
1455
|
-
key_.data_.copied.length)
|
1456
|
-
: key_.data_.referenced);
|
1457
|
-
}
|
1267
|
+
HPackParser::HPackParser() = default;
|
1458
1268
|
|
1459
|
-
|
1460
|
-
pointless recomputation of the metadata when finishing a header. We read the
|
1461
|
-
cached value in get_precomputed_md_for_idx(). */
|
1462
|
-
void HPackParser::SetPrecomputedMDIndex(grpc_mdelem md) {
|
1463
|
-
GPR_DEBUG_ASSERT(md_for_index_.payload == 0);
|
1464
|
-
GPR_DEBUG_ASSERT(precomputed_md_index_ == -1);
|
1465
|
-
md_for_index_ = md;
|
1466
|
-
#ifndef NDEBUG
|
1467
|
-
precomputed_md_index_ = index_;
|
1468
|
-
#endif
|
1469
|
-
}
|
1269
|
+
HPackParser::~HPackParser() = default;
|
1470
1270
|
|
1471
|
-
|
1472
|
-
|
1473
|
-
|
1474
|
-
|
1475
|
-
|
1476
|
-
|
1477
|
-
|
1478
|
-
|
1271
|
+
void HPackParser::BeginFrame(grpc_metadata_batch* metadata_buffer,
|
1272
|
+
uint32_t metadata_size_limit, Boundary boundary,
|
1273
|
+
Priority priority, LogInfo log_info) {
|
1274
|
+
metadata_buffer_ = metadata_buffer;
|
1275
|
+
boundary_ = boundary;
|
1276
|
+
priority_ = priority;
|
1277
|
+
dynamic_table_updates_allowed_ = 2;
|
1278
|
+
frame_length_ = 0;
|
1279
|
+
metadata_size_limit_ = metadata_size_limit;
|
1280
|
+
log_info_ = log_info;
|
1281
|
+
}
|
1282
|
+
|
1283
|
+
grpc_error_handle HPackParser::Parse(const grpc_slice& slice, bool is_last) {
|
1284
|
+
if (GPR_UNLIKELY(!unparsed_bytes_.empty())) {
|
1285
|
+
std::vector<uint8_t> buffer = std::move(unparsed_bytes_);
|
1286
|
+
buffer.insert(buffer.end(), GRPC_SLICE_START_PTR(slice),
|
1287
|
+
GRPC_SLICE_END_PTR(slice));
|
1288
|
+
return ParseInput(
|
1289
|
+
Input(nullptr, buffer.data(), buffer.data() + buffer.size()), is_last);
|
1479
1290
|
}
|
1480
|
-
|
1481
|
-
|
1482
|
-
|
1483
|
-
* index < GRPC_CHTTP2_LAST_STATIC_ENTRY or added via
|
1484
|
-
* grpc_chttp2_hptbl_add).
|
1485
|
-
* 3. If added via grpc_chttp2_hptbl_add, the entry is either static or
|
1486
|
-
* interned.
|
1487
|
-
* 4. Both static and interned element slices have non-null refcounts. */
|
1488
|
-
*is = grpc_is_refcounted_slice_binary_header(GRPC_MDKEY(elem));
|
1489
|
-
SetPrecomputedMDIndex(elem);
|
1490
|
-
return GRPC_ERROR_NONE;
|
1491
|
-
}
|
1492
|
-
|
1493
|
-
/* parse the value string */
|
1494
|
-
grpc_error_handle HPackParser::parse_value_string(const uint8_t* cur,
|
1495
|
-
const uint8_t* end,
|
1496
|
-
bool is_binary) {
|
1497
|
-
return begin_parse_string(
|
1498
|
-
cur, end, is_binary ? BinaryState::kBinaryBegin : BinaryState::kNotBinary,
|
1499
|
-
&value_);
|
1500
|
-
}
|
1501
|
-
|
1502
|
-
grpc_error_handle HPackParser::parse_value_string_with_indexed_key(
|
1503
|
-
const uint8_t* cur, const uint8_t* end) {
|
1504
|
-
bool is_binary = false;
|
1505
|
-
grpc_error_handle err = IsBinaryIndexedHeader(&is_binary);
|
1506
|
-
if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
|
1507
|
-
return parse_value_string(cur, end, is_binary);
|
1508
|
-
}
|
1509
|
-
|
1510
|
-
grpc_error_handle HPackParser::parse_value_string_with_literal_key(
|
1511
|
-
const uint8_t* cur, const uint8_t* end) {
|
1512
|
-
return parse_value_string(cur, end, IsBinaryLiteralHeader());
|
1291
|
+
return ParseInput(Input(slice.refcount, GRPC_SLICE_START_PTR(slice),
|
1292
|
+
GRPC_SLICE_END_PTR(slice)),
|
1293
|
+
is_last);
|
1513
1294
|
}
|
1514
1295
|
|
1515
|
-
|
1516
|
-
|
1517
|
-
|
1518
|
-
|
1519
|
-
|
1520
|
-
|
1521
|
-
|
1522
|
-
|
1523
|
-
|
1524
|
-
|
1525
|
-
|
1526
|
-
|
1527
|
-
|
1528
|
-
to 0 initially, invalidated when the index changes, and invalidated when it
|
1529
|
-
is read (by get_precomputed_md_for_idx()). It is set during string parsing,
|
1530
|
-
by set_precomputed_md_idx() - which is called by parse_value_string().
|
1531
|
-
The goal here is to avoid recomputing the metadata for the index when
|
1532
|
-
finishing with a header as well as the initial parse. */
|
1533
|
-
md_for_index_.payload = 0;
|
1534
|
-
#ifndef NDEBUG
|
1535
|
-
/* In debug mode, this ensures that the cached metadata we're reading is in
|
1536
|
-
* fact correct for the index we are examining. */
|
1537
|
-
precomputed_md_index_ = -1;
|
1538
|
-
#endif
|
1539
|
-
dynamic_table_updates_allowed_ = 2;
|
1540
|
-
last_error_ = GRPC_ERROR_NONE;
|
1296
|
+
grpc_error_handle HPackParser::ParseInput(Input input, bool is_last) {
|
1297
|
+
if (ParseInputInner(&input)) {
|
1298
|
+
return GRPC_ERROR_NONE;
|
1299
|
+
}
|
1300
|
+
if (input.eof_error()) {
|
1301
|
+
if (GPR_UNLIKELY(is_last && is_boundary())) {
|
1302
|
+
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1303
|
+
"Incomplete header at the end of a header/continuation sequence");
|
1304
|
+
}
|
1305
|
+
unparsed_bytes_ = std::vector<uint8_t>(input.frontier(), input.end_ptr());
|
1306
|
+
return GRPC_ERROR_NONE;
|
1307
|
+
}
|
1308
|
+
return input.TakeError();
|
1541
1309
|
}
|
1542
1310
|
|
1543
|
-
|
1544
|
-
|
1545
|
-
boundary_ = boundary;
|
1546
|
-
switch (priority) {
|
1547
|
-
case Priority::Included:
|
1548
|
-
after_prioritization_ = state_;
|
1549
|
-
state_ = &HPackParser::parse_stream_dep0;
|
1550
|
-
break;
|
1311
|
+
bool HPackParser::ParseInputInner(Input* input) {
|
1312
|
+
switch (priority_) {
|
1551
1313
|
case Priority::None:
|
1552
1314
|
break;
|
1315
|
+
case Priority::Included: {
|
1316
|
+
if (input->remaining() < 5) return input->UnexpectedEOF(false);
|
1317
|
+
input->Advance(5);
|
1318
|
+
input->UpdateFrontier();
|
1319
|
+
priority_ = Priority::None;
|
1320
|
+
}
|
1553
1321
|
}
|
1554
|
-
|
1555
|
-
|
1556
|
-
|
1557
|
-
|
1558
|
-
|
1559
|
-
|
1560
|
-
|
1561
|
-
|
1562
|
-
gpr_free(value_.data_.copied.str);
|
1563
|
-
}
|
1564
|
-
|
1565
|
-
grpc_error_handle HPackParser::Parse(const grpc_slice& slice) {
|
1566
|
-
/* max number of bytes to parse at a time... limits call stack depth on
|
1567
|
-
* compilers without TCO */
|
1568
|
-
#define MAX_PARSE_LENGTH 1024
|
1569
|
-
current_slice_refcount_ = slice.refcount;
|
1570
|
-
const uint8_t* start = GRPC_SLICE_START_PTR(slice);
|
1571
|
-
const uint8_t* end = GRPC_SLICE_END_PTR(slice);
|
1572
|
-
grpc_error_handle error = GRPC_ERROR_NONE;
|
1573
|
-
while (start != end && error == GRPC_ERROR_NONE) {
|
1574
|
-
const uint8_t* target = start + GPR_MIN(MAX_PARSE_LENGTH, end - start);
|
1575
|
-
error = (this->*state_)(start, target);
|
1576
|
-
start = target;
|
1322
|
+
while (!input->end_of_stream()) {
|
1323
|
+
if (GPR_UNLIKELY(!Parser(input, metadata_buffer_, metadata_size_limit_,
|
1324
|
+
&table_, &dynamic_table_updates_allowed_,
|
1325
|
+
&frame_length_, log_info_)
|
1326
|
+
.Parse())) {
|
1327
|
+
return false;
|
1328
|
+
}
|
1329
|
+
input->UpdateFrontier();
|
1577
1330
|
}
|
1578
|
-
|
1579
|
-
return error;
|
1331
|
+
return true;
|
1580
1332
|
}
|
1581
1333
|
|
1334
|
+
void HPackParser::FinishFrame() { metadata_buffer_ = nullptr; }
|
1335
|
+
|
1582
1336
|
} // namespace grpc_core
|
1583
1337
|
|
1584
1338
|
// TODO(ctiller): this serves as an eviction notice for the remainder of this
|
@@ -1605,10 +1359,11 @@ static void force_client_rst_stream(void* sp, grpc_error_handle /*error*/) {
|
|
1605
1359
|
static void parse_stream_compression_md(grpc_chttp2_transport* /*t*/,
|
1606
1360
|
grpc_chttp2_stream* s,
|
1607
1361
|
grpc_metadata_batch* initial_metadata) {
|
1608
|
-
if (initial_metadata->
|
1362
|
+
if (initial_metadata->legacy_index()->named.content_encoding == nullptr ||
|
1609
1363
|
grpc_stream_compression_method_parse(
|
1610
|
-
GRPC_MDVALUE(
|
1611
|
-
|
1364
|
+
GRPC_MDVALUE(
|
1365
|
+
initial_metadata->legacy_index()->named.content_encoding->md),
|
1366
|
+
false, &s->stream_decompression_method) == 0) {
|
1612
1367
|
s->stream_decompression_method =
|
1613
1368
|
GRPC_STREAM_COMPRESSION_IDENTITY_DECOMPRESS;
|
1614
1369
|
}
|
@@ -1630,27 +1385,23 @@ grpc_error_handle grpc_chttp2_header_parser_parse(void* hpack_parser,
|
|
1630
1385
|
if (s != nullptr) {
|
1631
1386
|
s->stats.incoming.header_bytes += GRPC_SLICE_LENGTH(slice);
|
1632
1387
|
}
|
1633
|
-
grpc_error_handle error = parser->Parse(slice);
|
1388
|
+
grpc_error_handle error = parser->Parse(slice, is_last != 0);
|
1634
1389
|
if (error != GRPC_ERROR_NONE) {
|
1635
1390
|
return error;
|
1636
1391
|
}
|
1637
1392
|
if (is_last) {
|
1638
|
-
if (parser->is_boundary() && !parser->is_in_begin_state()) {
|
1639
|
-
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1640
|
-
"end of header frame not aligned with a hpack record boundary");
|
1641
|
-
}
|
1642
1393
|
/* need to check for null stream: this can occur if we receive an invalid
|
1643
1394
|
stream id on a header */
|
1644
1395
|
if (s != nullptr) {
|
1645
1396
|
if (parser->is_boundary()) {
|
1646
|
-
if (s->header_frames_received ==
|
1397
|
+
if (s->header_frames_received == 2) {
|
1647
1398
|
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
|
1648
1399
|
"Too many trailer frames");
|
1649
1400
|
}
|
1650
1401
|
/* Process stream compression md element if it exists */
|
1651
1402
|
if (s->header_frames_received ==
|
1652
1403
|
0) { /* Only acts on initial metadata */
|
1653
|
-
parse_stream_compression_md(t, s, &s->
|
1404
|
+
parse_stream_compression_md(t, s, &s->initial_metadata_buffer);
|
1654
1405
|
}
|
1655
1406
|
s->published_metadata[s->header_frames_received] =
|
1656
1407
|
GRPC_METADATA_PUBLISHED_FROM_WIRE;
|