grpc 1.18.0 → 1.22.0
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 +4731 -7404
- data/etc/roots.pem +146 -0
- data/include/grpc/grpc.h +11 -6
- data/include/grpc/grpc_security.h +297 -4
- data/include/grpc/grpc_security_constants.h +1 -1
- data/include/grpc/impl/codegen/byte_buffer.h +13 -0
- data/include/grpc/impl/codegen/gpr_types.h +1 -1
- data/include/grpc/impl/codegen/grpc_types.h +30 -7
- data/include/grpc/impl/codegen/port_platform.h +88 -7
- data/include/grpc/impl/codegen/slice.h +2 -22
- data/include/grpc/impl/codegen/status.h +2 -1
- data/include/grpc/impl/codegen/sync_posix.h +18 -0
- data/include/grpc/slice.h +3 -3
- data/src/core/ext/filters/client_channel/backup_poller.cc +21 -16
- data/src/core/ext/filters/client_channel/backup_poller.h +8 -2
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +3 -1
- data/src/core/ext/filters/client_channel/client_channel.cc +2435 -1557
- data/src/core/ext/filters/client_channel/client_channel.h +2 -10
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +6 -89
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +8 -33
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +22 -34
- data/src/core/ext/filters/client_channel/client_channel_factory.h +19 -38
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +9 -11
- data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +179 -0
- data/src/core/ext/filters/client_channel/global_subchannel_pool.h +68 -0
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +59 -55
- data/src/core/ext/filters/client_channel/health/health_check_client.h +20 -9
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +146 -157
- data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +29 -32
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +844 -859
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +3 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +2 -6
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +6 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +14 -12
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +16 -12
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +3 -3
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +185 -312
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +143 -375
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +192 -245
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +1554 -955
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc +0 -43
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.cc +14 -10
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +2 -2
- data/src/core/ext/filters/client_channel/lb_policy.cc +115 -22
- data/src/core/ext/filters/client_channel/lb_policy.h +260 -129
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +5 -2
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +107 -4
- data/src/core/ext/filters/client_channel/lb_policy_registry.h +10 -3
- data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +96 -0
- data/src/core/ext/filters/client_channel/local_subchannel_pool.h +56 -0
- data/src/core/ext/filters/client_channel/parse_address.cc +24 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +121 -122
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +84 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +3 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +179 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +24 -10
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +111 -47
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +7 -13
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +39 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +0 -6
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -64
- data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +28 -0
- data/src/core/{lib/iomgr/network_status_tracker.cc → ext/filters/client_channel/resolver/dns/dns_resolver_selection.h} +8 -15
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +36 -82
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +111 -72
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +13 -8
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +28 -63
- data/src/core/ext/filters/client_channel/resolver.cc +54 -1
- data/src/core/ext/filters/client_channel/resolver.h +52 -23
- data/src/core/ext/filters/client_channel/resolver_factory.h +3 -1
- data/src/core/ext/filters/client_channel/resolver_registry.cc +5 -2
- data/src/core/ext/filters/client_channel/resolver_registry.h +5 -4
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +368 -241
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +58 -76
- data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +543 -0
- data/src/core/ext/filters/client_channel/resolving_lb_policy.h +139 -0
- data/src/core/ext/filters/client_channel/server_address.cc +4 -54
- data/src/core/ext/filters/client_channel/server_address.h +1 -13
- data/src/core/ext/filters/client_channel/service_config.cc +329 -0
- data/src/core/ext/filters/client_channel/service_config.h +205 -0
- data/src/core/ext/filters/client_channel/subchannel.cc +803 -838
- data/src/core/ext/filters/client_channel/subchannel.h +295 -128
- data/src/core/ext/filters/client_channel/subchannel_interface.h +113 -0
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +97 -0
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +94 -0
- data/src/core/ext/filters/deadline/deadline_filter.cc +3 -4
- data/src/core/ext/filters/deadline/deadline_filter.h +3 -2
- data/src/core/ext/filters/http/client/http_client_filter.cc +7 -5
- data/src/core/ext/filters/http/client/http_client_filter.h +1 -1
- data/src/core/ext/filters/http/client_authority_filter.cc +6 -3
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +4 -3
- data/src/core/ext/filters/http/server/http_server_filter.cc +18 -12
- data/src/core/ext/filters/max_age/max_age_filter.cc +5 -2
- data/src/core/ext/filters/message_size/message_size_filter.cc +119 -77
- data/src/core/ext/filters/message_size/message_size_filter.h +33 -0
- data/src/core/ext/transport/chttp2/alpn/alpn.h +1 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +13 -12
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +45 -47
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +134 -143
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +68 -21
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +4 -4
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +4 -4
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +7 -6
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +4 -3
- data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +9 -7
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +156 -94
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +33 -37
- data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +6 -5
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -2
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -4
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +8 -6
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -4
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -6
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +74 -55
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +33 -11
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +3 -2
- data/src/core/ext/transport/chttp2/transport/hpack_table.cc +7 -14
- data/src/core/ext/transport/chttp2/transport/hpack_table.h +10 -1
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +9 -5
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +9 -3
- data/src/core/ext/transport/chttp2/transport/internal.h +43 -30
- data/src/core/ext/transport/chttp2/transport/parsing.cc +52 -70
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/writing.cc +70 -33
- data/src/core/ext/transport/inproc/inproc_transport.cc +26 -18
- data/src/core/lib/channel/channel_args.cc +2 -101
- data/src/core/lib/channel/channel_args.h +3 -37
- data/src/core/lib/channel/channel_stack.h +10 -6
- data/src/core/lib/channel/channel_trace.cc +4 -4
- data/src/core/lib/channel/channel_trace.h +4 -4
- data/src/core/lib/channel/channelz.cc +168 -38
- data/src/core/lib/channel/channelz.h +40 -44
- data/src/core/lib/channel/channelz_registry.cc +75 -107
- data/src/core/lib/channel/channelz_registry.h +10 -28
- data/src/core/lib/channel/connected_channel.cc +2 -2
- data/src/core/lib/channel/context.h +2 -2
- data/src/core/lib/channel/handshaker.cc +151 -218
- data/src/core/lib/channel/handshaker.h +110 -101
- data/src/core/lib/channel/handshaker_factory.h +11 -19
- data/src/core/lib/channel/handshaker_registry.cc +67 -51
- data/src/core/lib/channel/handshaker_registry.h +21 -16
- data/src/core/lib/compression/algorithm_metadata.h +3 -3
- data/src/core/lib/compression/compression.cc +14 -9
- data/src/core/lib/compression/compression_args.cc +127 -0
- data/src/core/lib/compression/compression_args.h +55 -0
- data/src/core/lib/compression/compression_internal.cc +16 -12
- data/src/core/lib/compression/compression_internal.h +1 -1
- data/src/core/lib/compression/stream_compression.cc +3 -2
- data/src/core/lib/compression/stream_compression.h +2 -2
- data/src/core/lib/compression/stream_compression_gzip.cc +9 -9
- data/src/core/lib/debug/trace.cc +13 -7
- data/src/core/lib/debug/trace.h +14 -1
- data/src/core/lib/gpr/arena.h +13 -9
- data/src/core/lib/gpr/cpu_posix.cc +5 -3
- data/src/core/lib/gpr/env.h +3 -6
- data/src/core/lib/gpr/env_linux.cc +6 -1
- data/src/core/lib/gpr/env_posix.cc +5 -0
- data/src/core/lib/gpr/env_windows.cc +7 -5
- data/src/core/lib/gpr/log.cc +9 -13
- data/src/core/lib/gpr/log_posix.cc +2 -1
- data/src/core/lib/gpr/string.cc +20 -7
- data/src/core/lib/gpr/string.h +10 -3
- data/src/core/lib/gpr/sync_posix.cc +65 -4
- data/src/core/lib/gpr/time.cc +8 -0
- data/src/core/lib/gpr/time_posix.cc +21 -2
- data/src/core/lib/gprpp/arena.cc +103 -0
- data/src/core/lib/gprpp/arena.h +121 -0
- data/src/core/lib/gprpp/atomic.h +75 -5
- data/src/core/lib/gprpp/fork.cc +13 -32
- data/src/core/lib/gprpp/fork.h +5 -1
- data/src/core/lib/gprpp/global_config.h +96 -0
- data/src/core/lib/gprpp/global_config_custom.h +29 -0
- data/src/core/lib/gprpp/global_config_env.cc +135 -0
- data/src/core/lib/gprpp/global_config_env.h +131 -0
- data/src/core/lib/gprpp/global_config_generic.h +44 -0
- data/src/core/lib/gprpp/inlined_vector.h +8 -0
- data/src/core/lib/gprpp/map.h +436 -0
- data/src/core/lib/gprpp/memory.h +2 -2
- data/src/core/lib/gprpp/optional.h +48 -0
- data/src/core/lib/gprpp/orphanable.h +6 -5
- data/src/core/lib/gprpp/{mutex_lock.h → pair.h} +15 -19
- data/src/core/lib/gprpp/ref_counted.h +36 -17
- data/src/core/lib/gprpp/sync.h +126 -0
- data/src/core/lib/gprpp/thd.h +42 -7
- data/src/core/lib/gprpp/thd_posix.cc +31 -13
- data/src/core/lib/gprpp/thd_windows.cc +47 -34
- data/src/core/lib/http/httpcli.cc +6 -5
- data/src/core/lib/http/httpcli_security_connector.cc +13 -15
- data/src/core/lib/http/parser.cc +3 -2
- data/src/core/lib/http/parser.h +2 -1
- data/src/core/lib/iomgr/buffer_list.cc +182 -24
- data/src/core/lib/iomgr/buffer_list.h +72 -10
- data/src/core/lib/iomgr/call_combiner.cc +84 -90
- data/src/core/lib/iomgr/call_combiner.h +75 -82
- data/src/core/lib/iomgr/cfstream_handle.cc +203 -0
- data/src/core/lib/iomgr/cfstream_handle.h +86 -0
- data/src/core/lib/iomgr/combiner.cc +11 -3
- data/src/core/lib/iomgr/combiner.h +1 -1
- data/src/core/lib/iomgr/endpoint.cc +2 -2
- data/src/core/lib/iomgr/endpoint.h +3 -2
- data/src/core/lib/iomgr/endpoint_cfstream.cc +375 -0
- data/src/core/lib/iomgr/endpoint_cfstream.h +49 -0
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +2 -2
- data/src/core/lib/iomgr/error.cc +21 -17
- data/src/core/lib/iomgr/error.h +36 -6
- data/src/core/lib/iomgr/error_cfstream.cc +52 -0
- data/src/core/lib/iomgr/error_cfstream.h +31 -0
- data/src/core/lib/iomgr/error_internal.h +1 -1
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +44 -28
- data/src/core/lib/iomgr/ev_epollex_linux.cc +173 -194
- data/src/core/lib/iomgr/ev_poll_posix.cc +16 -487
- data/src/core/lib/iomgr/ev_posix.cc +29 -19
- data/src/core/lib/iomgr/ev_posix.h +19 -3
- data/src/core/lib/iomgr/ev_windows.cc +2 -2
- data/src/core/lib/iomgr/exec_ctx.cc +1 -0
- data/src/core/lib/iomgr/exec_ctx.h +137 -8
- data/src/core/lib/iomgr/executor.cc +147 -95
- data/src/core/lib/iomgr/executor.h +55 -49
- data/src/core/lib/iomgr/fork_posix.cc +6 -5
- data/src/core/lib/{gprpp/atomic_with_std.h → iomgr/grpc_if_nametoindex.h} +8 -13
- data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +42 -0
- data/src/core/lib/iomgr/{network_status_tracker.h → grpc_if_nametoindex_unsupported.cc} +15 -9
- data/src/core/lib/iomgr/internal_errqueue.cc +3 -5
- data/src/core/lib/iomgr/internal_errqueue.h +105 -3
- data/src/core/lib/iomgr/iomgr.cc +20 -13
- data/src/core/lib/iomgr/iomgr.h +15 -0
- data/src/core/lib/iomgr/iomgr_custom.cc +17 -3
- data/src/core/lib/iomgr/iomgr_custom.h +2 -0
- data/src/core/lib/iomgr/iomgr_internal.cc +10 -0
- data/src/core/lib/iomgr/iomgr_internal.h +12 -0
- data/src/core/lib/iomgr/iomgr_posix.cc +19 -2
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +93 -0
- data/src/core/lib/iomgr/iomgr_windows.cc +18 -2
- data/src/core/lib/iomgr/lockfree_event.cc +4 -4
- data/src/core/lib/iomgr/port.h +35 -0
- data/src/core/lib/iomgr/resolve_address_posix.cc +4 -3
- data/src/core/lib/iomgr/resolve_address_windows.cc +2 -1
- data/src/core/lib/iomgr/resource_quota.cc +40 -37
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +6 -2
- data/src/core/lib/iomgr/socket_windows.cc +19 -0
- data/src/core/lib/iomgr/socket_windows.h +8 -0
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +216 -0
- data/src/core/lib/iomgr/tcp_client_custom.cc +2 -2
- data/src/core/lib/iomgr/tcp_client_posix.cc +3 -3
- data/src/core/lib/iomgr/tcp_client_windows.cc +7 -5
- data/src/core/lib/iomgr/tcp_custom.cc +10 -14
- data/src/core/lib/iomgr/tcp_posix.cc +256 -140
- data/src/core/lib/iomgr/tcp_server.cc +5 -0
- data/src/core/lib/iomgr/tcp_server.h +24 -0
- data/src/core/lib/iomgr/tcp_server_custom.cc +14 -12
- data/src/core/lib/iomgr/tcp_server_posix.cc +86 -12
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
- data/src/core/lib/iomgr/tcp_server_windows.cc +13 -11
- data/src/core/lib/iomgr/tcp_uv.cc +5 -7
- data/src/core/lib/iomgr/tcp_windows.cc +8 -14
- data/src/core/lib/iomgr/timer.h +2 -1
- data/src/core/lib/iomgr/timer_generic.cc +16 -16
- data/src/core/lib/iomgr/timer_manager.cc +20 -11
- data/src/core/lib/iomgr/udp_server.cc +8 -6
- data/src/core/lib/iomgr/wakeup_fd_posix.cc +1 -19
- data/src/core/lib/json/json.cc +1 -4
- data/src/core/lib/profiling/basic_timers.cc +10 -4
- data/src/core/lib/security/context/security_context.cc +6 -7
- data/src/core/lib/security/context/security_context.h +3 -4
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +1 -1
- data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -2
- data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -0
- data/src/core/lib/security/credentials/credentials.h +9 -1
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +15 -3
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +2 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +2 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +10 -6
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -1
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +3 -3
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +9 -8
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -2
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +2 -2
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +192 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +210 -0
- data/src/core/lib/security/credentials/tls/spiffe_credentials.cc +129 -0
- data/src/core/lib/security/credentials/tls/spiffe_credentials.h +62 -0
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +10 -8
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -12
- data/src/core/lib/security/security_connector/load_system_roots_linux.cc +7 -5
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +10 -8
- data/src/core/lib/security/security_connector/security_connector.cc +0 -1
- data/src/core/lib/security/security_connector/security_connector.h +3 -3
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +39 -38
- data/src/core/lib/security/security_connector/ssl_utils.cc +164 -26
- data/src/core/lib/security/security_connector/ssl_utils.h +70 -1
- data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +426 -0
- data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +122 -0
- data/src/core/lib/security/transport/auth_filters.h +5 -2
- data/src/core/lib/security/transport/client_auth_filter.cc +55 -50
- data/src/core/lib/security/transport/secure_endpoint.cc +6 -6
- data/src/core/lib/security/transport/security_handshaker.cc +271 -303
- data/src/core/lib/security/transport/security_handshaker.h +11 -2
- data/src/core/lib/security/transport/server_auth_filter.cc +3 -3
- data/src/core/lib/slice/b64.h +2 -2
- data/src/core/lib/slice/percent_encoding.cc +3 -3
- data/src/core/lib/slice/percent_encoding.h +3 -3
- data/src/core/lib/slice/slice.cc +174 -122
- data/src/core/lib/slice/slice_buffer.cc +54 -21
- data/src/core/lib/slice/slice_hash_table.h +4 -4
- data/src/core/lib/slice/slice_intern.cc +49 -107
- data/src/core/lib/slice/slice_internal.h +264 -3
- data/src/core/lib/slice/slice_string_helpers.cc +10 -1
- data/src/core/lib/slice/slice_string_helpers.h +3 -1
- data/src/core/lib/slice/slice_utils.h +50 -0
- data/src/core/lib/slice/slice_weak_hash_table.h +6 -6
- data/src/core/lib/surface/api_trace.h +1 -1
- data/src/core/lib/surface/byte_buffer_reader.cc +17 -0
- data/src/core/lib/surface/call.cc +67 -46
- data/src/core/lib/surface/call.h +7 -2
- data/src/core/lib/surface/call_details.cc +0 -1
- data/src/core/lib/surface/channel.cc +89 -97
- data/src/core/lib/surface/channel.h +60 -6
- data/src/core/lib/surface/channel_init.h +5 -0
- data/src/core/lib/surface/completion_queue.cc +221 -216
- data/src/core/lib/surface/completion_queue.h +2 -1
- data/src/core/lib/surface/init.cc +82 -33
- data/src/core/lib/surface/init.h +1 -0
- data/src/core/lib/surface/init_secure.cc +1 -1
- data/src/core/lib/surface/lame_client.cc +5 -7
- data/src/core/lib/surface/server.cc +42 -47
- data/src/core/lib/surface/validate_metadata.cc +14 -8
- data/src/core/lib/surface/validate_metadata.h +13 -2
- data/src/core/lib/surface/version.cc +1 -1
- data/src/core/lib/transport/bdp_estimator.cc +3 -3
- data/src/core/lib/transport/bdp_estimator.h +2 -2
- data/src/core/lib/transport/connectivity_state.cc +10 -40
- data/src/core/lib/transport/connectivity_state.h +0 -8
- data/src/core/lib/transport/error_utils.cc +12 -0
- data/src/core/lib/transport/metadata.cc +258 -267
- data/src/core/lib/transport/metadata.h +227 -16
- data/src/core/lib/transport/metadata_batch.cc +1 -1
- data/src/core/lib/transport/metadata_batch.h +1 -1
- data/src/core/lib/transport/static_metadata.cc +477 -399
- data/src/core/lib/transport/static_metadata.h +273 -182
- data/src/core/lib/transport/status_metadata.cc +3 -3
- data/src/core/lib/transport/timeout_encoding.cc +1 -1
- data/src/core/lib/transport/timeout_encoding.h +1 -1
- data/src/core/lib/transport/transport.cc +39 -72
- data/src/core/lib/transport/transport.h +59 -24
- data/src/core/lib/transport/transport_impl.h +1 -1
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +3 -3
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
- data/src/core/tsi/alts/handshaker/alts_shared_resource.h +1 -1
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +4 -3
- data/src/core/tsi/alts/handshaker/transport_security_common_api.h +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +1 -1
- data/src/core/tsi/fake_transport_security.cc +4 -4
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +1 -1
- data/src/core/tsi/ssl_transport_security.cc +12 -10
- data/src/core/tsi/ssl_transport_security.h +24 -4
- data/src/ruby/bin/math_pb.rb +18 -16
- data/src/ruby/ext/grpc/extconf.rb +12 -4
- data/src/ruby/ext/grpc/rb_call_credentials.c +8 -5
- data/src/ruby/ext/grpc/rb_channel.c +14 -10
- data/src/ruby/ext/grpc/rb_channel_credentials.c +8 -4
- data/src/ruby/ext/grpc/rb_compression_options.c +9 -7
- data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
- data/src/ruby/ext/grpc/rb_grpc.c +23 -24
- data/src/ruby/ext/grpc/rb_grpc.h +4 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +24 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +36 -0
- data/src/ruby/ext/grpc/rb_server.c +8 -4
- data/src/ruby/lib/grpc/errors.rb +22 -3
- data/src/ruby/lib/grpc/generic/bidi_call.rb +1 -1
- data/src/ruby/lib/grpc/generic/rpc_server.rb +2 -2
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/README.md +1 -1
- data/src/ruby/pb/grpc/health/v1/health_pb.rb +13 -10
- data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +18 -0
- data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +3 -1
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +58 -56
- data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -0
- data/src/ruby/spec/errors_spec.rb +141 -0
- data/third_party/cares/cares/ares.h +12 -0
- data/third_party/cares/cares/ares_create_query.c +5 -1
- data/third_party/cares/cares/ares_data.c +74 -73
- data/third_party/cares/cares/ares_destroy.c +6 -1
- data/third_party/cares/cares/ares_gethostbyaddr.c +5 -5
- data/third_party/cares/cares/ares_gethostbyname.c +15 -4
- data/third_party/cares/cares/ares_getnameinfo.c +11 -0
- data/third_party/cares/cares/ares_init.c +274 -173
- data/third_party/cares/cares/ares_library_init.c +21 -3
- data/third_party/cares/cares/ares_options.c +6 -2
- data/third_party/cares/cares/ares_parse_naptr_reply.c +7 -6
- data/third_party/cares/cares/ares_parse_ptr_reply.c +4 -2
- data/third_party/cares/cares/ares_platform.c +7 -0
- data/third_party/cares/cares/ares_private.h +19 -11
- data/third_party/cares/cares/ares_process.c +27 -2
- data/third_party/cares/cares/ares_rules.h +1 -1
- data/third_party/cares/cares/ares_search.c +7 -0
- data/third_party/cares/cares/ares_send.c +6 -0
- data/third_party/cares/cares/ares_strsplit.c +174 -0
- data/third_party/cares/cares/ares_strsplit.h +43 -0
- data/third_party/cares/cares/ares_version.h +4 -4
- data/third_party/cares/cares/config-win32.h +1 -1
- data/third_party/cares/cares/inet_ntop.c +2 -3
- data/third_party/cares/config_darwin/ares_config.h +3 -0
- data/third_party/cares/config_freebsd/ares_config.h +3 -0
- data/third_party/cares/config_linux/ares_config.h +3 -0
- data/third_party/cares/config_openbsd/ares_config.h +3 -0
- metadata +83 -48
- data/src/core/ext/filters/client_channel/request_routing.cc +0 -936
- data/src/core/ext/filters/client_channel/request_routing.h +0 -177
- data/src/core/ext/filters/client_channel/subchannel_index.cc +0 -248
- data/src/core/ext/filters/client_channel/subchannel_index.h +0 -76
- data/src/core/lib/channel/handshaker_factory.cc +0 -42
- data/src/core/lib/gpr/arena.cc +0 -192
- data/src/core/lib/gprpp/atomic_with_atm.h +0 -57
- data/src/core/lib/iomgr/wakeup_fd_cv.cc +0 -107
- data/src/core/lib/iomgr/wakeup_fd_cv.h +0 -69
- data/src/core/lib/transport/service_config.cc +0 -106
- data/src/core/lib/transport/service_config.h +0 -249
@@ -37,6 +37,7 @@
|
|
37
37
|
#include "src/core/lib/debug/stats.h"
|
38
38
|
#include "src/core/lib/slice/slice_internal.h"
|
39
39
|
#include "src/core/lib/slice/slice_string_helpers.h"
|
40
|
+
#include "src/core/lib/surface/validate_metadata.h"
|
40
41
|
#include "src/core/lib/transport/metadata.h"
|
41
42
|
#include "src/core/lib/transport/static_metadata.h"
|
42
43
|
#include "src/core/lib/transport/timeout_encoding.h"
|
@@ -56,10 +57,13 @@
|
|
56
57
|
/* don't consider adding anything bigger than this to the hpack table */
|
57
58
|
#define MAX_DECODER_SPACE_USAGE 512
|
58
59
|
|
59
|
-
|
60
|
+
#define DATA_FRAME_HEADER_SIZE 9
|
61
|
+
|
62
|
+
static grpc_slice_refcount terminal_slice_refcount(
|
63
|
+
grpc_slice_refcount::Type::STATIC);
|
60
64
|
static const grpc_slice terminal_slice = {
|
61
65
|
&terminal_slice_refcount, /* refcount */
|
62
|
-
{{
|
66
|
+
{{0, nullptr}} /* data.refcounted */
|
63
67
|
};
|
64
68
|
|
65
69
|
typedef struct {
|
@@ -80,7 +84,8 @@ typedef struct {
|
|
80
84
|
bool use_true_binary_metadata;
|
81
85
|
} framer_state;
|
82
86
|
|
83
|
-
/* fills p (which is expected to be
|
87
|
+
/* fills p (which is expected to be DATA_FRAME_HEADER_SIZE bytes long)
|
88
|
+
* with a data frame header */
|
84
89
|
static void fill_header(uint8_t* p, uint8_t type, uint32_t id, size_t len,
|
85
90
|
uint8_t flags) {
|
86
91
|
GPR_ASSERT(len < 16777316);
|
@@ -107,15 +112,17 @@ static void finish_frame(framer_state* st, int is_header_boundary,
|
|
107
112
|
static_cast<uint8_t>(
|
108
113
|
(is_last_in_stream ? GRPC_CHTTP2_DATA_FLAG_END_STREAM : 0) |
|
109
114
|
(is_header_boundary ? GRPC_CHTTP2_DATA_FLAG_END_HEADERS : 0)));
|
110
|
-
st->stats->framing_bytes +=
|
115
|
+
st->stats->framing_bytes += DATA_FRAME_HEADER_SIZE;
|
111
116
|
st->is_first_frame = 0;
|
112
117
|
}
|
113
118
|
|
114
119
|
/* begin a new frame: reserve off header space, remember how many bytes we'd
|
115
120
|
output before beginning */
|
116
121
|
static void begin_frame(framer_state* st) {
|
117
|
-
|
118
|
-
|
122
|
+
grpc_slice reserved;
|
123
|
+
reserved.refcount = nullptr;
|
124
|
+
reserved.data.inlined.length = DATA_FRAME_HEADER_SIZE;
|
125
|
+
st->header_idx = grpc_slice_buffer_add_indexed(st->output, reserved);
|
119
126
|
st->output_length_at_start_of_frame = st->output->length;
|
120
127
|
}
|
121
128
|
|
@@ -188,8 +195,9 @@ static void evict_entry(grpc_chttp2_hpack_compressor* c) {
|
|
188
195
|
static uint32_t prepare_space_for_new_elem(grpc_chttp2_hpack_compressor* c,
|
189
196
|
size_t elem_size) {
|
190
197
|
uint32_t new_index = c->tail_remote_index + c->table_elems + 1;
|
191
|
-
|
198
|
+
GPR_DEBUG_ASSERT(elem_size < 65536);
|
192
199
|
|
200
|
+
// TODO(arjunroy): Re-examine semantics
|
193
201
|
if (elem_size > c->max_table_size) {
|
194
202
|
while (c->table_size > 0) {
|
195
203
|
evict_entry(c);
|
@@ -203,6 +211,7 @@ static uint32_t prepare_space_for_new_elem(grpc_chttp2_hpack_compressor* c,
|
|
203
211
|
while (c->table_size + elem_size > c->max_table_size) {
|
204
212
|
evict_entry(c);
|
205
213
|
}
|
214
|
+
// TODO(arjunroy): Are we conflating size in bytes vs. membership?
|
206
215
|
GPR_ASSERT(c->table_elems < c->max_table_size);
|
207
216
|
c->table_elem_size[new_index % c->cap_table_elems] =
|
208
217
|
static_cast<uint16_t>(elem_size);
|
@@ -215,19 +224,19 @@ static uint32_t prepare_space_for_new_elem(grpc_chttp2_hpack_compressor* c,
|
|
215
224
|
// Add a key to the dynamic table. Both key and value will be added to table at
|
216
225
|
// the decoder.
|
217
226
|
static void add_key_with_index(grpc_chttp2_hpack_compressor* c,
|
218
|
-
grpc_mdelem elem, uint32_t new_index
|
227
|
+
grpc_mdelem elem, uint32_t new_index,
|
228
|
+
uint32_t key_hash) {
|
219
229
|
if (new_index == 0) {
|
220
230
|
return;
|
221
231
|
}
|
222
232
|
|
223
|
-
uint32_t key_hash = grpc_slice_hash(GRPC_MDKEY(elem));
|
224
|
-
|
225
233
|
/* Store the key into {entries,indices}_keys */
|
226
|
-
if (
|
227
|
-
|
234
|
+
if (grpc_slice_static_interned_equal(
|
235
|
+
c->entries_keys[HASH_FRAGMENT_2(key_hash)], GRPC_MDKEY(elem))) {
|
228
236
|
c->indices_keys[HASH_FRAGMENT_2(key_hash)] = new_index;
|
229
|
-
} else if (
|
230
|
-
|
237
|
+
} else if (grpc_slice_static_interned_equal(
|
238
|
+
c->entries_keys[HASH_FRAGMENT_3(key_hash)],
|
239
|
+
GRPC_MDKEY(elem))) {
|
231
240
|
c->indices_keys[HASH_FRAGMENT_3(key_hash)] = new_index;
|
232
241
|
} else if (c->entries_keys[HASH_FRAGMENT_2(key_hash)].refcount ==
|
233
242
|
&terminal_slice_refcount) {
|
@@ -255,22 +264,20 @@ static void add_key_with_index(grpc_chttp2_hpack_compressor* c,
|
|
255
264
|
|
256
265
|
/* add an element to the decoder table */
|
257
266
|
static void add_elem_with_index(grpc_chttp2_hpack_compressor* c,
|
258
|
-
grpc_mdelem elem, uint32_t new_index
|
267
|
+
grpc_mdelem elem, uint32_t new_index,
|
268
|
+
uint32_t elem_hash, uint32_t key_hash) {
|
259
269
|
if (new_index == 0) {
|
260
270
|
return;
|
261
271
|
}
|
262
|
-
|
263
|
-
|
264
|
-
uint32_t key_hash = grpc_slice_hash(GRPC_MDKEY(elem));
|
265
|
-
uint32_t value_hash = grpc_slice_hash(GRPC_MDVALUE(elem));
|
266
|
-
uint32_t elem_hash = GRPC_MDSTR_KV_HASH(key_hash, value_hash);
|
272
|
+
GPR_DEBUG_ASSERT(GRPC_MDELEM_IS_INTERNED(elem));
|
267
273
|
|
268
274
|
/* Store this element into {entries,indices}_elem */
|
269
|
-
if (
|
275
|
+
if (grpc_mdelem_both_interned_eq(c->entries_elems[HASH_FRAGMENT_2(elem_hash)],
|
276
|
+
elem)) {
|
270
277
|
/* already there: update with new index */
|
271
278
|
c->indices_elems[HASH_FRAGMENT_2(elem_hash)] = new_index;
|
272
|
-
} else if (
|
273
|
-
|
279
|
+
} else if (grpc_mdelem_both_interned_eq(
|
280
|
+
c->entries_elems[HASH_FRAGMENT_3(elem_hash)], elem)) {
|
274
281
|
/* already there (cuckoo): update with new index */
|
275
282
|
c->indices_elems[HASH_FRAGMENT_3(elem_hash)] = new_index;
|
276
283
|
} else if (GRPC_MDISNULL(c->entries_elems[HASH_FRAGMENT_2(elem_hash)])) {
|
@@ -294,19 +301,19 @@ static void add_elem_with_index(grpc_chttp2_hpack_compressor* c,
|
|
294
301
|
c->indices_elems[HASH_FRAGMENT_3(elem_hash)] = new_index;
|
295
302
|
}
|
296
303
|
|
297
|
-
add_key_with_index(c, elem, new_index);
|
304
|
+
add_key_with_index(c, elem, new_index, key_hash);
|
298
305
|
}
|
299
306
|
|
300
307
|
static void add_elem(grpc_chttp2_hpack_compressor* c, grpc_mdelem elem,
|
301
|
-
size_t elem_size) {
|
308
|
+
size_t elem_size, uint32_t elem_hash, uint32_t key_hash) {
|
302
309
|
uint32_t new_index = prepare_space_for_new_elem(c, elem_size);
|
303
|
-
add_elem_with_index(c, elem, new_index);
|
310
|
+
add_elem_with_index(c, elem, new_index, elem_hash, key_hash);
|
304
311
|
}
|
305
312
|
|
306
313
|
static void add_key(grpc_chttp2_hpack_compressor* c, grpc_mdelem elem,
|
307
|
-
size_t elem_size) {
|
314
|
+
size_t elem_size, uint32_t key_hash) {
|
308
315
|
uint32_t new_index = prepare_space_for_new_elem(c, elem_size);
|
309
|
-
add_key_with_index(c, elem, new_index);
|
316
|
+
add_key_with_index(c, elem, new_index, key_hash);
|
310
317
|
}
|
311
318
|
|
312
319
|
static void emit_indexed(grpc_chttp2_hpack_compressor* c, uint32_t elem_index,
|
@@ -323,9 +330,14 @@ typedef struct {
|
|
323
330
|
bool insert_null_before_wire_value;
|
324
331
|
} wire_value;
|
325
332
|
|
333
|
+
template <bool mdkey_definitely_interned>
|
326
334
|
static wire_value get_wire_value(grpc_mdelem elem, bool true_binary_enabled) {
|
327
335
|
wire_value wire_val;
|
328
|
-
|
336
|
+
bool is_bin_hdr =
|
337
|
+
mdkey_definitely_interned
|
338
|
+
? grpc_is_refcounted_slice_binary_header(GRPC_MDKEY(elem))
|
339
|
+
: grpc_is_binary_header_internal(GRPC_MDKEY(elem));
|
340
|
+
if (is_bin_hdr) {
|
329
341
|
if (true_binary_enabled) {
|
330
342
|
GRPC_STATS_INC_HPACK_SEND_BINARY();
|
331
343
|
wire_val.huffman_prefix = 0x00;
|
@@ -363,7 +375,7 @@ static void emit_lithdr_incidx(grpc_chttp2_hpack_compressor* c,
|
|
363
375
|
framer_state* st) {
|
364
376
|
GRPC_STATS_INC_HPACK_SEND_LITHDR_INCIDX();
|
365
377
|
uint32_t len_pfx = GRPC_CHTTP2_VARINT_LENGTH(key_index, 2);
|
366
|
-
wire_value value = get_wire_value(elem, st->use_true_binary_metadata);
|
378
|
+
wire_value value = get_wire_value<true>(elem, st->use_true_binary_metadata);
|
367
379
|
size_t len_val = wire_value_length(value);
|
368
380
|
uint32_t len_val_len;
|
369
381
|
GPR_ASSERT(len_val <= UINT32_MAX);
|
@@ -380,7 +392,7 @@ static void emit_lithdr_noidx(grpc_chttp2_hpack_compressor* c,
|
|
380
392
|
framer_state* st) {
|
381
393
|
GRPC_STATS_INC_HPACK_SEND_LITHDR_NOTIDX();
|
382
394
|
uint32_t len_pfx = GRPC_CHTTP2_VARINT_LENGTH(key_index, 4);
|
383
|
-
wire_value value = get_wire_value(elem, st->use_true_binary_metadata);
|
395
|
+
wire_value value = get_wire_value<false>(elem, st->use_true_binary_metadata);
|
384
396
|
size_t len_val = wire_value_length(value);
|
385
397
|
uint32_t len_val_len;
|
386
398
|
GPR_ASSERT(len_val <= UINT32_MAX);
|
@@ -399,7 +411,7 @@ static void emit_lithdr_incidx_v(grpc_chttp2_hpack_compressor* c,
|
|
399
411
|
GRPC_STATS_INC_HPACK_SEND_LITHDR_INCIDX_V();
|
400
412
|
GRPC_STATS_INC_HPACK_SEND_UNCOMPRESSED();
|
401
413
|
uint32_t len_key = static_cast<uint32_t> GRPC_SLICE_LENGTH(GRPC_MDKEY(elem));
|
402
|
-
wire_value value = get_wire_value(elem, st->use_true_binary_metadata);
|
414
|
+
wire_value value = get_wire_value<true>(elem, st->use_true_binary_metadata);
|
403
415
|
uint32_t len_val = static_cast<uint32_t>(wire_value_length(value));
|
404
416
|
uint32_t len_key_len = GRPC_CHTTP2_VARINT_LENGTH(len_key, 1);
|
405
417
|
uint32_t len_val_len = GRPC_CHTTP2_VARINT_LENGTH(len_val, 1);
|
@@ -421,7 +433,7 @@ static void emit_lithdr_noidx_v(grpc_chttp2_hpack_compressor* c,
|
|
421
433
|
GRPC_STATS_INC_HPACK_SEND_LITHDR_NOTIDX_V();
|
422
434
|
GRPC_STATS_INC_HPACK_SEND_UNCOMPRESSED();
|
423
435
|
uint32_t len_key = static_cast<uint32_t> GRPC_SLICE_LENGTH(GRPC_MDKEY(elem));
|
424
|
-
wire_value value = get_wire_value(elem, st->use_true_binary_metadata);
|
436
|
+
wire_value value = get_wire_value<false>(elem, st->use_true_binary_metadata);
|
425
437
|
uint32_t len_val = static_cast<uint32_t>(wire_value_length(value));
|
426
438
|
uint32_t len_key_len = GRPC_CHTTP2_VARINT_LENGTH(len_key, 1);
|
427
439
|
uint32_t len_val_len = GRPC_CHTTP2_VARINT_LENGTH(len_val, 1);
|
@@ -461,10 +473,10 @@ static void hpack_enc(grpc_chttp2_hpack_compressor* c, grpc_mdelem elem,
|
|
461
473
|
"Reserved header (colon-prefixed) happening after regular ones.");
|
462
474
|
}
|
463
475
|
|
464
|
-
if (grpc_http_trace
|
476
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
|
465
477
|
char* k = grpc_slice_to_c_string(GRPC_MDKEY(elem));
|
466
478
|
char* v = nullptr;
|
467
|
-
if (
|
479
|
+
if (grpc_is_binary_header_internal(GRPC_MDKEY(elem))) {
|
468
480
|
v = grpc_dump_slice(GRPC_MDVALUE(elem), GPR_DUMP_HEX);
|
469
481
|
} else {
|
470
482
|
v = grpc_slice_to_c_string(GRPC_MDVALUE(elem));
|
@@ -488,27 +500,33 @@ static void hpack_enc(grpc_chttp2_hpack_compressor* c, grpc_mdelem elem,
|
|
488
500
|
return;
|
489
501
|
}
|
490
502
|
|
491
|
-
uint32_t key_hash = grpc_slice_hash(GRPC_MDKEY(elem));
|
492
503
|
uint32_t elem_hash = 0;
|
493
504
|
|
494
505
|
if (elem_interned) {
|
495
|
-
|
496
|
-
|
506
|
+
if (GRPC_MDELEM_STORAGE(elem) == GRPC_MDELEM_STORAGE_INTERNED) {
|
507
|
+
elem_hash =
|
508
|
+
reinterpret_cast<grpc_core::InternedMetadata*>(GRPC_MDELEM_DATA(elem))
|
509
|
+
->hash();
|
510
|
+
} else {
|
511
|
+
elem_hash =
|
512
|
+
reinterpret_cast<grpc_core::StaticMetadata*>(GRPC_MDELEM_DATA(elem))
|
513
|
+
->hash();
|
514
|
+
}
|
497
515
|
|
498
516
|
inc_filter(HASH_FRAGMENT_1(elem_hash), &c->filter_elems_sum,
|
499
517
|
c->filter_elems);
|
500
518
|
|
501
519
|
/* is this elem currently in the decoders table? */
|
502
|
-
|
503
|
-
|
520
|
+
if (grpc_mdelem_both_interned_eq(
|
521
|
+
c->entries_elems[HASH_FRAGMENT_2(elem_hash)], elem) &&
|
504
522
|
c->indices_elems[HASH_FRAGMENT_2(elem_hash)] > c->tail_remote_index) {
|
505
523
|
/* HIT: complete element (first cuckoo hash) */
|
506
524
|
emit_indexed(c, dynidx(c, c->indices_elems[HASH_FRAGMENT_2(elem_hash)]),
|
507
525
|
st);
|
508
526
|
return;
|
509
527
|
}
|
510
|
-
|
511
|
-
|
528
|
+
if (grpc_mdelem_both_interned_eq(
|
529
|
+
c->entries_elems[HASH_FRAGMENT_3(elem_hash)], elem) &&
|
512
530
|
c->indices_elems[HASH_FRAGMENT_3(elem_hash)] > c->tail_remote_index) {
|
513
531
|
/* HIT: complete element (second cuckoo hash) */
|
514
532
|
emit_indexed(c, dynidx(c, c->indices_elems[HASH_FRAGMENT_3(elem_hash)]),
|
@@ -527,11 +545,12 @@ static void hpack_enc(grpc_chttp2_hpack_compressor* c, grpc_mdelem elem,
|
|
527
545
|
c->filter_elems[HASH_FRAGMENT_1(elem_hash)] >=
|
528
546
|
c->filter_elems_sum / ONE_ON_ADD_PROBABILITY;
|
529
547
|
|
548
|
+
uint32_t key_hash = GRPC_MDKEY(elem).refcount->Hash(GRPC_MDKEY(elem));
|
530
549
|
auto emit_maybe_add = [&should_add_elem, &elem, &st, &c, &indices_key,
|
531
|
-
&decoder_space_usage] {
|
550
|
+
&decoder_space_usage, &elem_hash, &key_hash] {
|
532
551
|
if (should_add_elem) {
|
533
552
|
emit_lithdr_incidx(c, dynidx(c, indices_key), elem, st);
|
534
|
-
add_elem(c, elem, decoder_space_usage);
|
553
|
+
add_elem(c, elem, decoder_space_usage, elem_hash, key_hash);
|
535
554
|
} else {
|
536
555
|
emit_lithdr_noidx(c, dynidx(c, indices_key), elem, st);
|
537
556
|
}
|
@@ -539,8 +558,8 @@ static void hpack_enc(grpc_chttp2_hpack_compressor* c, grpc_mdelem elem,
|
|
539
558
|
|
540
559
|
/* no hits for the elem... maybe there's a key? */
|
541
560
|
indices_key = c->indices_keys[HASH_FRAGMENT_2(key_hash)];
|
542
|
-
if (
|
543
|
-
|
561
|
+
if (grpc_slice_static_interned_equal(
|
562
|
+
c->entries_keys[HASH_FRAGMENT_2(key_hash)], GRPC_MDKEY(elem)) &&
|
544
563
|
indices_key > c->tail_remote_index) {
|
545
564
|
/* HIT: key (first cuckoo hash) */
|
546
565
|
emit_maybe_add();
|
@@ -548,8 +567,8 @@ static void hpack_enc(grpc_chttp2_hpack_compressor* c, grpc_mdelem elem,
|
|
548
567
|
}
|
549
568
|
|
550
569
|
indices_key = c->indices_keys[HASH_FRAGMENT_3(key_hash)];
|
551
|
-
if (
|
552
|
-
|
570
|
+
if (grpc_slice_static_interned_equal(
|
571
|
+
c->entries_keys[HASH_FRAGMENT_3(key_hash)], GRPC_MDKEY(elem)) &&
|
553
572
|
indices_key > c->tail_remote_index) {
|
554
573
|
/* HIT: key (first cuckoo hash) */
|
555
574
|
emit_maybe_add();
|
@@ -565,9 +584,9 @@ static void hpack_enc(grpc_chttp2_hpack_compressor* c, grpc_mdelem elem,
|
|
565
584
|
emit_lithdr_noidx_v(c, 0, elem, st);
|
566
585
|
}
|
567
586
|
if (should_add_elem) {
|
568
|
-
add_elem(c, elem, decoder_space_usage);
|
587
|
+
add_elem(c, elem, decoder_space_usage, elem_hash, key_hash);
|
569
588
|
} else if (should_add_key) {
|
570
|
-
add_key(c, elem, decoder_space_usage);
|
589
|
+
add_key(c, elem, decoder_space_usage, key_hash);
|
571
590
|
}
|
572
591
|
}
|
573
592
|
|
@@ -660,7 +679,7 @@ void grpc_chttp2_hpack_compressor_set_max_table_size(
|
|
660
679
|
}
|
661
680
|
}
|
662
681
|
c->advertise_table_size_change = 1;
|
663
|
-
if (grpc_http_trace
|
682
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
|
664
683
|
gpr_log(GPR_INFO, "set max table size from encoder to %d", max_table_size);
|
665
684
|
}
|
666
685
|
}
|
@@ -692,18 +711,18 @@ void grpc_chttp2_encode_header(grpc_chttp2_hpack_compressor* c,
|
|
692
711
|
}
|
693
712
|
for (size_t i = 0; i < extra_headers_size; ++i) {
|
694
713
|
grpc_mdelem md = *extra_headers[i];
|
695
|
-
|
714
|
+
uintptr_t static_index = grpc_chttp2_get_static_hpack_table_index(md);
|
696
715
|
if (static_index) {
|
697
|
-
emit_indexed(c, static_index, &st);
|
716
|
+
emit_indexed(c, static_cast<uint32_t>(static_index), &st);
|
698
717
|
} else {
|
699
718
|
hpack_enc(c, md, &st);
|
700
719
|
}
|
701
720
|
}
|
702
721
|
grpc_metadata_batch_assert_ok(metadata);
|
703
722
|
for (grpc_linked_mdelem* l = metadata->list.head; l; l = l->next) {
|
704
|
-
|
723
|
+
uintptr_t static_index = grpc_chttp2_get_static_hpack_table_index(l->md);
|
705
724
|
if (static_index) {
|
706
|
-
emit_indexed(c, static_index, &st);
|
725
|
+
emit_indexed(c, static_cast<uint32_t>(static_index), &st);
|
707
726
|
} else {
|
708
727
|
hpack_enc(c, l->md, &st);
|
709
728
|
}
|
@@ -35,6 +35,7 @@
|
|
35
35
|
#include "src/core/lib/profiling/timers.h"
|
36
36
|
#include "src/core/lib/slice/slice_internal.h"
|
37
37
|
#include "src/core/lib/slice/slice_string_helpers.h"
|
38
|
+
#include "src/core/lib/surface/validate_metadata.h"
|
38
39
|
#include "src/core/lib/transport/http2_errors.h"
|
39
40
|
|
40
41
|
typedef enum {
|
@@ -624,10 +625,10 @@ static const uint8_t inverse_base64[256] = {
|
|
624
625
|
/* emission helpers */
|
625
626
|
static grpc_error* on_hdr(grpc_chttp2_hpack_parser* p, grpc_mdelem md,
|
626
627
|
int add_to_table) {
|
627
|
-
if (grpc_http_trace
|
628
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
|
628
629
|
char* k = grpc_slice_to_c_string(GRPC_MDKEY(md));
|
629
630
|
char* v = nullptr;
|
630
|
-
if (
|
631
|
+
if (grpc_is_binary_header_internal(GRPC_MDKEY(md))) {
|
631
632
|
v = grpc_dump_slice(GRPC_MDVALUE(md), GPR_DUMP_HEX);
|
632
633
|
} else {
|
633
634
|
v = grpc_slice_to_c_string(GRPC_MDVALUE(md));
|
@@ -994,7 +995,7 @@ static grpc_error* parse_lithdr_nvridx_v(grpc_chttp2_hpack_parser* p,
|
|
994
995
|
/* finish parsing a max table size change */
|
995
996
|
static grpc_error* finish_max_tbl_size(grpc_chttp2_hpack_parser* p,
|
996
997
|
const uint8_t* cur, const uint8_t* end) {
|
997
|
-
if (grpc_http_trace
|
998
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
|
998
999
|
gpr_log(GPR_INFO, "MAX TABLE SIZE: %d", p->index);
|
999
1000
|
}
|
1000
1001
|
grpc_error* err =
|
@@ -1452,7 +1453,7 @@ static grpc_error* begin_parse_string(grpc_chttp2_hpack_parser* p,
|
|
1452
1453
|
uint8_t binary,
|
1453
1454
|
grpc_chttp2_hpack_parser_string* str) {
|
1454
1455
|
if (!p->huff && binary == NOT_BINARY &&
|
1455
|
-
(end - cur) >=
|
1456
|
+
static_cast<uint32_t>(end - cur) >= p->strlen &&
|
1456
1457
|
p->current_slice_refcount != nullptr) {
|
1457
1458
|
GRPC_STATS_INC_HPACK_RECV_UNCOMPRESSED();
|
1458
1459
|
str->copied = false;
|
@@ -1494,7 +1495,13 @@ static grpc_error* parse_key_string(grpc_chttp2_hpack_parser* p,
|
|
1494
1495
|
/* check if a key represents a binary header or not */
|
1495
1496
|
|
1496
1497
|
static bool is_binary_literal_header(grpc_chttp2_hpack_parser* p) {
|
1497
|
-
|
1498
|
+
/* We know that either argument here is a reference counter slice.
|
1499
|
+
* 1. If a result of grpc_slice_from_static_buffer, the refcount is set to
|
1500
|
+
* NoopRefcount.
|
1501
|
+
* 2. If it's p->key.data.referenced, then p->key.copied was set to false,
|
1502
|
+
* which occurs in begin_parse_string() - where the refcount is set to
|
1503
|
+
* p->current_slice_refcount, which is not null. */
|
1504
|
+
return grpc_is_refcounted_slice_binary_header(
|
1498
1505
|
p->key.copied ? grpc_slice_from_static_buffer(p->key.data.copied.str,
|
1499
1506
|
p->key.data.copied.length)
|
1500
1507
|
: p->key.data.referenced);
|
@@ -1511,7 +1518,15 @@ static grpc_error* is_binary_indexed_header(grpc_chttp2_hpack_parser* p,
|
|
1511
1518
|
static_cast<intptr_t>(p->index)),
|
1512
1519
|
GRPC_ERROR_INT_SIZE, static_cast<intptr_t>(p->table.num_ents));
|
1513
1520
|
}
|
1514
|
-
|
1521
|
+
/* We know that GRPC_MDKEY(elem) points to a reference counted slice since:
|
1522
|
+
* 1. elem was a result of grpc_chttp2_hptbl_lookup
|
1523
|
+
* 2. An item in this table is either static (see entries with
|
1524
|
+
* index < GRPC_CHTTP2_LAST_STATIC_ENTRY or added via
|
1525
|
+
* grpc_chttp2_hptbl_add).
|
1526
|
+
* 3. If added via grpc_chttp2_hptbl_add, the entry is either static or
|
1527
|
+
* interned.
|
1528
|
+
* 4. Both static and interned element slices have non-null refcounts. */
|
1529
|
+
*is = grpc_is_refcounted_slice_binary_header(GRPC_MDKEY(elem));
|
1515
1530
|
return GRPC_ERROR_NONE;
|
1516
1531
|
}
|
1517
1532
|
|
@@ -1570,16 +1585,16 @@ void grpc_chttp2_hpack_parser_destroy(grpc_chttp2_hpack_parser* p) {
|
|
1570
1585
|
}
|
1571
1586
|
|
1572
1587
|
grpc_error* grpc_chttp2_hpack_parser_parse(grpc_chttp2_hpack_parser* p,
|
1573
|
-
grpc_slice slice) {
|
1588
|
+
const grpc_slice& slice) {
|
1574
1589
|
/* max number of bytes to parse at a time... limits call stack depth on
|
1575
1590
|
* compilers without TCO */
|
1576
1591
|
#define MAX_PARSE_LENGTH 1024
|
1577
1592
|
p->current_slice_refcount = slice.refcount;
|
1578
|
-
uint8_t* start = GRPC_SLICE_START_PTR(slice);
|
1579
|
-
uint8_t* end = GRPC_SLICE_END_PTR(slice);
|
1593
|
+
const uint8_t* start = GRPC_SLICE_START_PTR(slice);
|
1594
|
+
const uint8_t* end = GRPC_SLICE_END_PTR(slice);
|
1580
1595
|
grpc_error* error = GRPC_ERROR_NONE;
|
1581
1596
|
while (start != end && error == GRPC_ERROR_NONE) {
|
1582
|
-
uint8_t* target = start + GPR_MIN(MAX_PARSE_LENGTH, end - start);
|
1597
|
+
const uint8_t* target = start + GPR_MIN(MAX_PARSE_LENGTH, end - start);
|
1583
1598
|
error = p->state(p, start, target);
|
1584
1599
|
start = target;
|
1585
1600
|
}
|
@@ -1616,12 +1631,19 @@ static void parse_stream_compression_md(grpc_chttp2_transport* t,
|
|
1616
1631
|
s->stream_decompression_method =
|
1617
1632
|
GRPC_STREAM_COMPRESSION_IDENTITY_DECOMPRESS;
|
1618
1633
|
}
|
1634
|
+
|
1635
|
+
if (s->stream_decompression_method !=
|
1636
|
+
GRPC_STREAM_COMPRESSION_IDENTITY_DECOMPRESS) {
|
1637
|
+
s->stream_decompression_ctx = nullptr;
|
1638
|
+
grpc_slice_buffer_init(&s->decompressed_data_buffer);
|
1639
|
+
}
|
1619
1640
|
}
|
1620
1641
|
|
1621
1642
|
grpc_error* grpc_chttp2_header_parser_parse(void* hpack_parser,
|
1622
1643
|
grpc_chttp2_transport* t,
|
1623
1644
|
grpc_chttp2_stream* s,
|
1624
|
-
grpc_slice slice,
|
1645
|
+
const grpc_slice& slice,
|
1646
|
+
int is_last) {
|
1625
1647
|
GPR_TIMER_SCOPE("grpc_chttp2_header_parser_parse", 0);
|
1626
1648
|
grpc_chttp2_hpack_parser* parser =
|
1627
1649
|
static_cast<grpc_chttp2_hpack_parser*>(hpack_parser);
|
@@ -97,13 +97,14 @@ void grpc_chttp2_hpack_parser_destroy(grpc_chttp2_hpack_parser* p);
|
|
97
97
|
void grpc_chttp2_hpack_parser_set_has_priority(grpc_chttp2_hpack_parser* p);
|
98
98
|
|
99
99
|
grpc_error* grpc_chttp2_hpack_parser_parse(grpc_chttp2_hpack_parser* p,
|
100
|
-
grpc_slice slice);
|
100
|
+
const grpc_slice& slice);
|
101
101
|
|
102
102
|
/* wraps grpc_chttp2_hpack_parser_parse to provide a frame level parser for
|
103
103
|
the transport */
|
104
104
|
grpc_error* grpc_chttp2_header_parser_parse(void* hpack_parser,
|
105
105
|
grpc_chttp2_transport* t,
|
106
106
|
grpc_chttp2_stream* s,
|
107
|
-
grpc_slice slice,
|
107
|
+
const grpc_slice& slice,
|
108
|
+
int is_last);
|
108
109
|
|
109
110
|
#endif /* GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_PARSER_H */
|
@@ -29,6 +29,7 @@
|
|
29
29
|
|
30
30
|
#include "src/core/lib/debug/trace.h"
|
31
31
|
#include "src/core/lib/gpr/murmur_hash.h"
|
32
|
+
#include "src/core/lib/surface/validate_metadata.h"
|
32
33
|
#include "src/core/lib/transport/static_metadata.h"
|
33
34
|
|
34
35
|
extern grpc_core::TraceFlag grpc_http_trace;
|
@@ -247,7 +248,7 @@ void grpc_chttp2_hptbl_set_max_bytes(grpc_chttp2_hptbl* tbl,
|
|
247
248
|
if (tbl->max_bytes == max_bytes) {
|
248
249
|
return;
|
249
250
|
}
|
250
|
-
if (grpc_http_trace
|
251
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
|
251
252
|
gpr_log(GPR_INFO, "Update hpack parser max size to %d", max_bytes);
|
252
253
|
}
|
253
254
|
while (tbl->mem_used > max_bytes) {
|
@@ -270,7 +271,7 @@ grpc_error* grpc_chttp2_hptbl_set_current_table_size(grpc_chttp2_hptbl* tbl,
|
|
270
271
|
gpr_free(msg);
|
271
272
|
return err;
|
272
273
|
}
|
273
|
-
if (grpc_http_trace
|
274
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
|
274
275
|
gpr_log(GPR_INFO, "Update hpack parser table size to %d", bytes);
|
275
276
|
}
|
276
277
|
while (tbl->mem_used > bytes) {
|
@@ -375,9 +376,11 @@ static size_t get_base64_encoded_size(size_t raw_length) {
|
|
375
376
|
|
376
377
|
size_t grpc_chttp2_get_size_in_hpack_table(grpc_mdelem elem,
|
377
378
|
bool use_true_binary_metadata) {
|
378
|
-
|
379
|
+
const uint8_t* key_buf = GRPC_SLICE_START_PTR(GRPC_MDKEY(elem));
|
380
|
+
size_t key_len = GRPC_SLICE_LENGTH(GRPC_MDKEY(elem));
|
381
|
+
size_t overhead_and_key = 32 + key_len;
|
379
382
|
size_t value_len = GRPC_SLICE_LENGTH(GRPC_MDVALUE(elem));
|
380
|
-
if (
|
383
|
+
if (grpc_key_is_binary_header(key_buf, key_len)) {
|
381
384
|
return overhead_and_key + (use_true_binary_metadata
|
382
385
|
? value_len + 1
|
383
386
|
: get_base64_encoded_size(value_len));
|
@@ -385,13 +388,3 @@ size_t grpc_chttp2_get_size_in_hpack_table(grpc_mdelem elem,
|
|
385
388
|
return overhead_and_key + value_len;
|
386
389
|
}
|
387
390
|
}
|
388
|
-
|
389
|
-
uint8_t grpc_chttp2_get_static_hpack_table_index(grpc_mdelem md) {
|
390
|
-
if (GRPC_MDELEM_STORAGE(md) == GRPC_MDELEM_STORAGE_STATIC) {
|
391
|
-
uint8_t index = GRPC_MDELEM_DATA(md) - grpc_static_mdelem_table;
|
392
|
-
if (index < GRPC_CHTTP2_LAST_STATIC_ENTRY) {
|
393
|
-
return index + 1; // Hpack static metadata element indices start at 1
|
394
|
-
}
|
395
|
-
}
|
396
|
-
return 0;
|
397
|
-
}
|
@@ -24,6 +24,7 @@
|
|
24
24
|
#include <grpc/slice.h>
|
25
25
|
#include "src/core/lib/iomgr/error.h"
|
26
26
|
#include "src/core/lib/transport/metadata.h"
|
27
|
+
#include "src/core/lib/transport/static_metadata.h"
|
27
28
|
|
28
29
|
/* HPACK header table */
|
29
30
|
|
@@ -90,7 +91,15 @@ size_t grpc_chttp2_get_size_in_hpack_table(grpc_mdelem elem,
|
|
90
91
|
/* Returns the static hpack table index that corresponds to /a elem. Returns 0
|
91
92
|
if /a elem is not statically stored or if it is not in the static hpack
|
92
93
|
table */
|
93
|
-
|
94
|
+
inline uintptr_t grpc_chttp2_get_static_hpack_table_index(grpc_mdelem md) {
|
95
|
+
uintptr_t index =
|
96
|
+
reinterpret_cast<grpc_core::StaticMetadata*>(GRPC_MDELEM_DATA(md)) -
|
97
|
+
grpc_static_mdelem_table;
|
98
|
+
if (index < GRPC_CHTTP2_LAST_STATIC_ENTRY) {
|
99
|
+
return index + 1; // Hpack static metadata element indices start at 1
|
100
|
+
}
|
101
|
+
return 0;
|
102
|
+
}
|
94
103
|
|
95
104
|
/* Find a key/value pair in the table... returns the index in the table of the
|
96
105
|
most similar entry, or 0 if the value was not found */
|
@@ -30,11 +30,15 @@
|
|
30
30
|
grpc_error* grpc_chttp2_incoming_metadata_buffer_add(
|
31
31
|
grpc_chttp2_incoming_metadata_buffer* buffer, grpc_mdelem elem) {
|
32
32
|
buffer->size += GRPC_MDELEM_LENGTH(elem);
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
33
|
+
grpc_linked_mdelem* storage;
|
34
|
+
if (buffer->count < buffer->kPreallocatedMDElem) {
|
35
|
+
storage = &buffer->preallocated_mdelems[buffer->count];
|
36
|
+
buffer->count++;
|
37
|
+
} else {
|
38
|
+
storage = static_cast<grpc_linked_mdelem*>(
|
39
|
+
buffer->arena->Alloc(sizeof(grpc_linked_mdelem)));
|
40
|
+
}
|
41
|
+
return grpc_metadata_batch_add_tail(&buffer->batch, storage, elem);
|
38
42
|
}
|
39
43
|
|
40
44
|
grpc_error* grpc_chttp2_incoming_metadata_buffer_replace_or_add(
|
@@ -24,7 +24,8 @@
|
|
24
24
|
#include "src/core/lib/transport/transport.h"
|
25
25
|
|
26
26
|
struct grpc_chttp2_incoming_metadata_buffer {
|
27
|
-
grpc_chttp2_incoming_metadata_buffer(
|
27
|
+
explicit grpc_chttp2_incoming_metadata_buffer(grpc_core::Arena* arena)
|
28
|
+
: arena(arena) {
|
28
29
|
grpc_metadata_batch_init(&batch);
|
29
30
|
batch.deadline = GRPC_MILLIS_INF_FUTURE;
|
30
31
|
}
|
@@ -32,9 +33,14 @@ struct grpc_chttp2_incoming_metadata_buffer {
|
|
32
33
|
grpc_metadata_batch_destroy(&batch);
|
33
34
|
}
|
34
35
|
|
35
|
-
|
36
|
+
static constexpr size_t kPreallocatedMDElem = 10;
|
37
|
+
|
38
|
+
grpc_core::Arena* arena;
|
39
|
+
size_t size = 0; // total size of metadata.
|
40
|
+
size_t count = 0; // minimum of count of metadata and kPreallocatedMDElem.
|
41
|
+
// These preallocated mdelems are used while count < kPreallocatedMDElem.
|
42
|
+
grpc_linked_mdelem preallocated_mdelems[kPreallocatedMDElem];
|
36
43
|
grpc_metadata_batch batch;
|
37
|
-
size_t size = 0; // total size of metadata
|
38
44
|
};
|
39
45
|
|
40
46
|
void grpc_chttp2_incoming_metadata_buffer_publish(
|