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
@@ -31,153 +31,161 @@
|
|
31
31
|
#include "src/core/ext/filters/client_channel/resolver_registry.h"
|
32
32
|
#include "src/core/lib/channel/channel_args.h"
|
33
33
|
#include "src/core/lib/channel/handshaker_registry.h"
|
34
|
-
#include "src/core/lib/gpr/env.h"
|
35
34
|
#include "src/core/lib/gpr/string.h"
|
35
|
+
#include "src/core/lib/gprpp/sync.h"
|
36
36
|
#include "src/core/lib/http/format_request.h"
|
37
37
|
#include "src/core/lib/http/parser.h"
|
38
38
|
#include "src/core/lib/slice/slice_internal.h"
|
39
39
|
#include "src/core/lib/uri/uri_parser.h"
|
40
40
|
|
41
|
-
|
42
|
-
// Base class. Must be first.
|
43
|
-
grpc_handshaker base;
|
41
|
+
namespace grpc_core {
|
44
42
|
|
45
|
-
|
46
|
-
gpr_mu mu;
|
43
|
+
namespace {
|
47
44
|
|
48
|
-
|
45
|
+
class HttpConnectHandshaker : public Handshaker {
|
46
|
+
public:
|
47
|
+
HttpConnectHandshaker();
|
48
|
+
void Shutdown(grpc_error* why) override;
|
49
|
+
void DoHandshake(grpc_tcp_server_acceptor* acceptor,
|
50
|
+
grpc_closure* on_handshake_done,
|
51
|
+
HandshakerArgs* args) override;
|
52
|
+
const char* name() const override { return "http_connect"; }
|
53
|
+
|
54
|
+
private:
|
55
|
+
virtual ~HttpConnectHandshaker();
|
56
|
+
void CleanupArgsForFailureLocked();
|
57
|
+
void HandshakeFailedLocked(grpc_error* error);
|
58
|
+
static void OnWriteDone(void* arg, grpc_error* error);
|
59
|
+
static void OnReadDone(void* arg, grpc_error* error);
|
60
|
+
|
61
|
+
gpr_mu mu_;
|
62
|
+
|
63
|
+
bool is_shutdown_ = false;
|
49
64
|
// Endpoint and read buffer to destroy after a shutdown.
|
50
|
-
grpc_endpoint*
|
51
|
-
grpc_slice_buffer*
|
65
|
+
grpc_endpoint* endpoint_to_destroy_ = nullptr;
|
66
|
+
grpc_slice_buffer* read_buffer_to_destroy_ = nullptr;
|
52
67
|
|
53
68
|
// State saved while performing the handshake.
|
54
|
-
|
55
|
-
grpc_closure*
|
69
|
+
HandshakerArgs* args_ = nullptr;
|
70
|
+
grpc_closure* on_handshake_done_ = nullptr;
|
56
71
|
|
57
72
|
// Objects for processing the HTTP CONNECT request and response.
|
58
|
-
grpc_slice_buffer
|
59
|
-
grpc_closure
|
60
|
-
grpc_closure
|
61
|
-
grpc_http_parser
|
62
|
-
grpc_http_response
|
63
|
-
}
|
73
|
+
grpc_slice_buffer write_buffer_;
|
74
|
+
grpc_closure request_done_closure_;
|
75
|
+
grpc_closure response_read_closure_;
|
76
|
+
grpc_http_parser http_parser_;
|
77
|
+
grpc_http_response http_response_;
|
78
|
+
};
|
64
79
|
|
65
|
-
|
66
|
-
|
67
|
-
if (
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
grpc_slice_buffer_destroy_internal(handshaker->read_buffer_to_destroy);
|
74
|
-
gpr_free(handshaker->read_buffer_to_destroy);
|
75
|
-
}
|
76
|
-
grpc_slice_buffer_destroy_internal(&handshaker->write_buffer);
|
77
|
-
grpc_http_parser_destroy(&handshaker->http_parser);
|
78
|
-
grpc_http_response_destroy(&handshaker->http_response);
|
79
|
-
gpr_free(handshaker);
|
80
|
+
HttpConnectHandshaker::~HttpConnectHandshaker() {
|
81
|
+
gpr_mu_destroy(&mu_);
|
82
|
+
if (endpoint_to_destroy_ != nullptr) {
|
83
|
+
grpc_endpoint_destroy(endpoint_to_destroy_);
|
84
|
+
}
|
85
|
+
if (read_buffer_to_destroy_ != nullptr) {
|
86
|
+
grpc_slice_buffer_destroy_internal(read_buffer_to_destroy_);
|
87
|
+
gpr_free(read_buffer_to_destroy_);
|
80
88
|
}
|
89
|
+
grpc_slice_buffer_destroy_internal(&write_buffer_);
|
90
|
+
grpc_http_parser_destroy(&http_parser_);
|
91
|
+
grpc_http_response_destroy(&http_response_);
|
81
92
|
}
|
82
93
|
|
83
94
|
// Set args fields to nullptr, saving the endpoint and read buffer for
|
84
95
|
// later destruction.
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
handshaker->args->args = nullptr;
|
96
|
+
void HttpConnectHandshaker::CleanupArgsForFailureLocked() {
|
97
|
+
endpoint_to_destroy_ = args_->endpoint;
|
98
|
+
args_->endpoint = nullptr;
|
99
|
+
read_buffer_to_destroy_ = args_->read_buffer;
|
100
|
+
args_->read_buffer = nullptr;
|
101
|
+
grpc_channel_args_destroy(args_->args);
|
102
|
+
args_->args = nullptr;
|
93
103
|
}
|
94
104
|
|
95
105
|
// If the handshake failed or we're shutting down, clean up and invoke the
|
96
106
|
// callback with the error.
|
97
|
-
|
98
|
-
grpc_error* error) {
|
107
|
+
void HttpConnectHandshaker::HandshakeFailedLocked(grpc_error* error) {
|
99
108
|
if (error == GRPC_ERROR_NONE) {
|
100
109
|
// If we were shut down after an endpoint operation succeeded but
|
101
110
|
// before the endpoint callback was invoked, we need to generate our
|
102
111
|
// own error.
|
103
112
|
error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Handshaker shutdown");
|
104
113
|
}
|
105
|
-
if (!
|
114
|
+
if (!is_shutdown_) {
|
106
115
|
// TODO(ctiller): It is currently necessary to shutdown endpoints
|
107
116
|
// before destroying them, even if we know that there are no
|
108
117
|
// pending read/write callbacks. This should be fixed, at which
|
109
118
|
// point this can be removed.
|
110
|
-
grpc_endpoint_shutdown(
|
119
|
+
grpc_endpoint_shutdown(args_->endpoint, GRPC_ERROR_REF(error));
|
111
120
|
// Not shutting down, so the handshake failed. Clean up before
|
112
121
|
// invoking the callback.
|
113
|
-
|
122
|
+
CleanupArgsForFailureLocked();
|
114
123
|
// Set shutdown to true so that subsequent calls to
|
115
124
|
// http_connect_handshaker_shutdown() do nothing.
|
116
|
-
|
125
|
+
is_shutdown_ = true;
|
117
126
|
}
|
118
127
|
// Invoke callback.
|
119
|
-
GRPC_CLOSURE_SCHED(
|
128
|
+
GRPC_CLOSURE_SCHED(on_handshake_done_, error);
|
120
129
|
}
|
121
130
|
|
122
131
|
// Callback invoked when finished writing HTTP CONNECT request.
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
if (error != GRPC_ERROR_NONE || handshaker->shutdown) {
|
132
|
+
void HttpConnectHandshaker::OnWriteDone(void* arg, grpc_error* error) {
|
133
|
+
auto* handshaker = static_cast<HttpConnectHandshaker*>(arg);
|
134
|
+
gpr_mu_lock(&handshaker->mu_);
|
135
|
+
if (error != GRPC_ERROR_NONE || handshaker->is_shutdown_) {
|
128
136
|
// If the write failed or we're shutting down, clean up and invoke the
|
129
137
|
// callback with the error.
|
130
|
-
|
131
|
-
gpr_mu_unlock(&handshaker->
|
132
|
-
|
138
|
+
handshaker->HandshakeFailedLocked(GRPC_ERROR_REF(error));
|
139
|
+
gpr_mu_unlock(&handshaker->mu_);
|
140
|
+
handshaker->Unref();
|
133
141
|
} else {
|
134
142
|
// Otherwise, read the response.
|
135
143
|
// The read callback inherits our ref to the handshaker.
|
136
|
-
grpc_endpoint_read(handshaker->
|
137
|
-
handshaker->
|
138
|
-
&handshaker->
|
139
|
-
gpr_mu_unlock(&handshaker->
|
144
|
+
grpc_endpoint_read(handshaker->args_->endpoint,
|
145
|
+
handshaker->args_->read_buffer,
|
146
|
+
&handshaker->response_read_closure_, /*urgent=*/true);
|
147
|
+
gpr_mu_unlock(&handshaker->mu_);
|
140
148
|
}
|
141
149
|
}
|
142
150
|
|
143
151
|
// Callback invoked for reading HTTP CONNECT response.
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
gpr_mu_lock(&handshaker->
|
148
|
-
if (error != GRPC_ERROR_NONE || handshaker->
|
152
|
+
void HttpConnectHandshaker::OnReadDone(void* arg, grpc_error* error) {
|
153
|
+
auto* handshaker = static_cast<HttpConnectHandshaker*>(arg);
|
154
|
+
|
155
|
+
gpr_mu_lock(&handshaker->mu_);
|
156
|
+
if (error != GRPC_ERROR_NONE || handshaker->is_shutdown_) {
|
149
157
|
// If the read failed or we're shutting down, clean up and invoke the
|
150
158
|
// callback with the error.
|
151
|
-
|
159
|
+
handshaker->HandshakeFailedLocked(GRPC_ERROR_REF(error));
|
152
160
|
goto done;
|
153
161
|
}
|
154
162
|
// Add buffer to parser.
|
155
|
-
for (size_t i = 0; i < handshaker->
|
156
|
-
if (GRPC_SLICE_LENGTH(handshaker->
|
163
|
+
for (size_t i = 0; i < handshaker->args_->read_buffer->count; ++i) {
|
164
|
+
if (GRPC_SLICE_LENGTH(handshaker->args_->read_buffer->slices[i]) > 0) {
|
157
165
|
size_t body_start_offset = 0;
|
158
|
-
error = grpc_http_parser_parse(&handshaker->
|
159
|
-
handshaker->
|
166
|
+
error = grpc_http_parser_parse(&handshaker->http_parser_,
|
167
|
+
handshaker->args_->read_buffer->slices[i],
|
160
168
|
&body_start_offset);
|
161
169
|
if (error != GRPC_ERROR_NONE) {
|
162
|
-
|
170
|
+
handshaker->HandshakeFailedLocked(error);
|
163
171
|
goto done;
|
164
172
|
}
|
165
|
-
if (handshaker->
|
173
|
+
if (handshaker->http_parser_.state == GRPC_HTTP_BODY) {
|
166
174
|
// Remove the data we've already read from the read buffer,
|
167
175
|
// leaving only the leftover bytes (if any).
|
168
176
|
grpc_slice_buffer tmp_buffer;
|
169
177
|
grpc_slice_buffer_init(&tmp_buffer);
|
170
178
|
if (body_start_offset <
|
171
|
-
GRPC_SLICE_LENGTH(handshaker->
|
179
|
+
GRPC_SLICE_LENGTH(handshaker->args_->read_buffer->slices[i])) {
|
172
180
|
grpc_slice_buffer_add(
|
173
181
|
&tmp_buffer,
|
174
|
-
grpc_slice_split_tail(&handshaker->
|
182
|
+
grpc_slice_split_tail(&handshaker->args_->read_buffer->slices[i],
|
175
183
|
body_start_offset));
|
176
184
|
}
|
177
185
|
grpc_slice_buffer_addn(&tmp_buffer,
|
178
|
-
&handshaker->
|
179
|
-
handshaker->
|
180
|
-
grpc_slice_buffer_swap(handshaker->
|
186
|
+
&handshaker->args_->read_buffer->slices[i + 1],
|
187
|
+
handshaker->args_->read_buffer->count - i - 1);
|
188
|
+
grpc_slice_buffer_swap(handshaker->args_->read_buffer, &tmp_buffer);
|
181
189
|
grpc_slice_buffer_destroy_internal(&tmp_buffer);
|
182
190
|
break;
|
183
191
|
}
|
@@ -194,64 +202,53 @@ static void on_read_done(void* arg, grpc_error* error) {
|
|
194
202
|
// need to fix the HTTP parser to understand when the body is
|
195
203
|
// complete (e.g., handling chunked transfer encoding or looking
|
196
204
|
// at the Content-Length: header).
|
197
|
-
if (handshaker->
|
198
|
-
grpc_slice_buffer_reset_and_unref_internal(handshaker->
|
199
|
-
grpc_endpoint_read(handshaker->
|
200
|
-
handshaker->
|
201
|
-
&handshaker->
|
202
|
-
gpr_mu_unlock(&handshaker->
|
205
|
+
if (handshaker->http_parser_.state != GRPC_HTTP_BODY) {
|
206
|
+
grpc_slice_buffer_reset_and_unref_internal(handshaker->args_->read_buffer);
|
207
|
+
grpc_endpoint_read(handshaker->args_->endpoint,
|
208
|
+
handshaker->args_->read_buffer,
|
209
|
+
&handshaker->response_read_closure_, /*urgent=*/true);
|
210
|
+
gpr_mu_unlock(&handshaker->mu_);
|
203
211
|
return;
|
204
212
|
}
|
205
213
|
// Make sure we got a 2xx response.
|
206
|
-
if (handshaker->
|
207
|
-
handshaker->
|
214
|
+
if (handshaker->http_response_.status < 200 ||
|
215
|
+
handshaker->http_response_.status >= 300) {
|
208
216
|
char* msg;
|
209
217
|
gpr_asprintf(&msg, "HTTP proxy returned response code %d",
|
210
|
-
handshaker->
|
218
|
+
handshaker->http_response_.status);
|
211
219
|
error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg);
|
212
220
|
gpr_free(msg);
|
213
|
-
|
221
|
+
handshaker->HandshakeFailedLocked(error);
|
214
222
|
goto done;
|
215
223
|
}
|
216
224
|
// Success. Invoke handshake-done callback.
|
217
|
-
GRPC_CLOSURE_SCHED(handshaker->
|
225
|
+
GRPC_CLOSURE_SCHED(handshaker->on_handshake_done_, error);
|
218
226
|
done:
|
219
227
|
// Set shutdown to true so that subsequent calls to
|
220
228
|
// http_connect_handshaker_shutdown() do nothing.
|
221
|
-
handshaker->
|
222
|
-
gpr_mu_unlock(&handshaker->
|
223
|
-
|
229
|
+
handshaker->is_shutdown_ = true;
|
230
|
+
gpr_mu_unlock(&handshaker->mu_);
|
231
|
+
handshaker->Unref();
|
224
232
|
}
|
225
233
|
|
226
234
|
//
|
227
235
|
// Public handshaker methods
|
228
236
|
//
|
229
237
|
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
static void http_connect_handshaker_shutdown(grpc_handshaker* handshaker_in,
|
237
|
-
grpc_error* why) {
|
238
|
-
http_connect_handshaker* handshaker =
|
239
|
-
reinterpret_cast<http_connect_handshaker*>(handshaker_in);
|
240
|
-
gpr_mu_lock(&handshaker->mu);
|
241
|
-
if (!handshaker->shutdown) {
|
242
|
-
handshaker->shutdown = true;
|
243
|
-
grpc_endpoint_shutdown(handshaker->args->endpoint, GRPC_ERROR_REF(why));
|
244
|
-
cleanup_args_for_failure_locked(handshaker);
|
238
|
+
void HttpConnectHandshaker::Shutdown(grpc_error* why) {
|
239
|
+
gpr_mu_lock(&mu_);
|
240
|
+
if (!is_shutdown_) {
|
241
|
+
is_shutdown_ = true;
|
242
|
+
grpc_endpoint_shutdown(args_->endpoint, GRPC_ERROR_REF(why));
|
243
|
+
CleanupArgsForFailureLocked();
|
245
244
|
}
|
246
|
-
gpr_mu_unlock(&
|
245
|
+
gpr_mu_unlock(&mu_);
|
247
246
|
GRPC_ERROR_UNREF(why);
|
248
247
|
}
|
249
248
|
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
http_connect_handshaker* handshaker =
|
254
|
-
reinterpret_cast<http_connect_handshaker*>(handshaker_in);
|
249
|
+
void HttpConnectHandshaker::DoHandshake(grpc_tcp_server_acceptor* acceptor,
|
250
|
+
grpc_closure* on_handshake_done,
|
251
|
+
HandshakerArgs* args) {
|
255
252
|
// Check for HTTP CONNECT channel arg.
|
256
253
|
// If not found, invoke on_handshake_done without doing anything.
|
257
254
|
const grpc_arg* arg =
|
@@ -260,9 +257,9 @@ static void http_connect_handshaker_do_handshake(
|
|
260
257
|
if (server_name == nullptr) {
|
261
258
|
// Set shutdown to true so that subsequent calls to
|
262
259
|
// http_connect_handshaker_shutdown() do nothing.
|
263
|
-
gpr_mu_lock(&
|
264
|
-
|
265
|
-
gpr_mu_unlock(&
|
260
|
+
gpr_mu_lock(&mu_);
|
261
|
+
is_shutdown_ = true;
|
262
|
+
gpr_mu_unlock(&mu_);
|
266
263
|
GRPC_CLOSURE_SCHED(on_handshake_done, GRPC_ERROR_NONE);
|
267
264
|
return;
|
268
265
|
}
|
@@ -280,6 +277,7 @@ static void http_connect_handshaker_do_handshake(
|
|
280
277
|
gpr_malloc(sizeof(grpc_http_header) * num_header_strings));
|
281
278
|
for (size_t i = 0; i < num_header_strings; ++i) {
|
282
279
|
char* sep = strchr(header_strings[i], ':');
|
280
|
+
|
283
281
|
if (sep == nullptr) {
|
284
282
|
gpr_log(GPR_ERROR, "skipping unparseable HTTP CONNECT header: %s",
|
285
283
|
header_strings[i]);
|
@@ -292,9 +290,9 @@ static void http_connect_handshaker_do_handshake(
|
|
292
290
|
}
|
293
291
|
}
|
294
292
|
// Save state in the handshaker object.
|
295
|
-
|
296
|
-
|
297
|
-
|
293
|
+
MutexLock lock(&mu_);
|
294
|
+
args_ = args;
|
295
|
+
on_handshake_done_ = on_handshake_done;
|
298
296
|
// Log connection via proxy.
|
299
297
|
char* proxy_name = grpc_endpoint_get_peer(args->endpoint);
|
300
298
|
gpr_log(GPR_INFO, "Connecting to server %s via HTTP proxy %s", server_name,
|
@@ -302,15 +300,18 @@ static void http_connect_handshaker_do_handshake(
|
|
302
300
|
gpr_free(proxy_name);
|
303
301
|
// Construct HTTP CONNECT request.
|
304
302
|
grpc_httpcli_request request;
|
305
|
-
memset(&request, 0, sizeof(request));
|
306
303
|
request.host = server_name;
|
304
|
+
request.ssl_host_override = nullptr;
|
307
305
|
request.http.method = (char*)"CONNECT";
|
308
306
|
request.http.path = server_name;
|
307
|
+
request.http.version = GRPC_HTTP_HTTP10; // Set by OnReadDone
|
309
308
|
request.http.hdrs = headers;
|
310
309
|
request.http.hdr_count = num_headers;
|
310
|
+
request.http.body_length = 0;
|
311
|
+
request.http.body = nullptr;
|
311
312
|
request.handshaker = &grpc_httpcli_plaintext;
|
312
313
|
grpc_slice request_slice = grpc_httpcli_format_connect_request(&request);
|
313
|
-
grpc_slice_buffer_add(&
|
314
|
+
grpc_slice_buffer_add(&write_buffer_, request_slice);
|
314
315
|
// Clean up.
|
315
316
|
gpr_free(headers);
|
316
317
|
for (size_t i = 0; i < num_header_strings; ++i) {
|
@@ -318,54 +319,42 @@ static void http_connect_handshaker_do_handshake(
|
|
318
319
|
}
|
319
320
|
gpr_free(header_strings);
|
320
321
|
// Take a new ref to be held by the write callback.
|
321
|
-
|
322
|
-
grpc_endpoint_write(args->endpoint, &
|
323
|
-
|
324
|
-
gpr_mu_unlock(&handshaker->mu);
|
322
|
+
Ref().release();
|
323
|
+
grpc_endpoint_write(args->endpoint, &write_buffer_, &request_done_closure_,
|
324
|
+
nullptr);
|
325
325
|
}
|
326
326
|
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
grpc_handshaker_init(&http_connect_handshaker_vtable, &handshaker->base);
|
336
|
-
gpr_mu_init(&handshaker->mu);
|
337
|
-
gpr_ref_init(&handshaker->refcount, 1);
|
338
|
-
grpc_slice_buffer_init(&handshaker->write_buffer);
|
339
|
-
GRPC_CLOSURE_INIT(&handshaker->request_done_closure, on_write_done,
|
340
|
-
handshaker, grpc_schedule_on_exec_ctx);
|
341
|
-
GRPC_CLOSURE_INIT(&handshaker->response_read_closure, on_read_done,
|
342
|
-
handshaker, grpc_schedule_on_exec_ctx);
|
343
|
-
grpc_http_parser_init(&handshaker->http_parser, GRPC_HTTP_RESPONSE,
|
344
|
-
&handshaker->http_response);
|
345
|
-
return &handshaker->base;
|
327
|
+
HttpConnectHandshaker::HttpConnectHandshaker() {
|
328
|
+
gpr_mu_init(&mu_);
|
329
|
+
grpc_slice_buffer_init(&write_buffer_);
|
330
|
+
GRPC_CLOSURE_INIT(&request_done_closure_, &HttpConnectHandshaker::OnWriteDone,
|
331
|
+
this, grpc_schedule_on_exec_ctx);
|
332
|
+
GRPC_CLOSURE_INIT(&response_read_closure_, &HttpConnectHandshaker::OnReadDone,
|
333
|
+
this, grpc_schedule_on_exec_ctx);
|
334
|
+
grpc_http_parser_init(&http_parser_, GRPC_HTTP_RESPONSE, &http_response_);
|
346
335
|
}
|
347
336
|
|
348
337
|
//
|
349
338
|
// handshaker factory
|
350
339
|
//
|
351
340
|
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
}
|
359
|
-
|
360
|
-
|
341
|
+
class HttpConnectHandshakerFactory : public HandshakerFactory {
|
342
|
+
public:
|
343
|
+
void AddHandshakers(const grpc_channel_args* args,
|
344
|
+
grpc_pollset_set* interested_parties,
|
345
|
+
HandshakeManager* handshake_mgr) override {
|
346
|
+
handshake_mgr->Add(MakeRefCounted<HttpConnectHandshaker>());
|
347
|
+
}
|
348
|
+
~HttpConnectHandshakerFactory() override = default;
|
349
|
+
};
|
361
350
|
|
362
|
-
|
363
|
-
handshaker_factory_add_handshakers, handshaker_factory_destroy};
|
351
|
+
} // namespace
|
364
352
|
|
365
|
-
|
366
|
-
&handshaker_factory_vtable};
|
353
|
+
} // namespace grpc_core
|
367
354
|
|
368
355
|
void grpc_http_connect_register_handshaker_factory() {
|
369
|
-
|
370
|
-
|
356
|
+
using namespace grpc_core;
|
357
|
+
HandshakerRegistry::RegisterHandshakerFactory(
|
358
|
+
true /* at_start */, HANDSHAKER_CLIENT,
|
359
|
+
UniquePtr<HandshakerFactory>(New<HttpConnectHandshakerFactory>()));
|
371
360
|
}
|
@@ -25,7 +25,7 @@
|
|
25
25
|
|
26
26
|
/// Channel arg indicating HTTP CONNECT headers (string).
|
27
27
|
/// Multiple headers are separated by newlines. Key/value pairs are
|
28
|
-
///
|
28
|
+
/// separated by colons.
|
29
29
|
#define GRPC_ARG_HTTP_CONNECT_HEADERS "grpc.http_connect_headers"
|
30
30
|
|
31
31
|
/// Registers handshaker factory.
|
@@ -37,17 +37,6 @@ static void destroy_channel_elem(grpc_channel_element* elem) {}
|
|
37
37
|
namespace {
|
38
38
|
|
39
39
|
struct call_data {
|
40
|
-
call_data(const grpc_call_element_args& args) {
|
41
|
-
if (args.context[GRPC_GRPCLB_CLIENT_STATS].value != nullptr) {
|
42
|
-
// Get stats object from context and take a ref.
|
43
|
-
client_stats = static_cast<grpc_core::GrpcLbClientStats*>(
|
44
|
-
args.context[GRPC_GRPCLB_CLIENT_STATS].value)
|
45
|
-
->Ref();
|
46
|
-
// Record call started.
|
47
|
-
client_stats->AddCallStarted();
|
48
|
-
}
|
49
|
-
}
|
50
|
-
|
51
40
|
// Stats object to update.
|
52
41
|
grpc_core::RefCountedPtr<grpc_core::GrpcLbClientStats> client_stats;
|
53
42
|
// State for intercepting send_initial_metadata.
|
@@ -82,7 +71,7 @@ static void recv_initial_metadata_ready(void* arg, grpc_error* error) {
|
|
82
71
|
static grpc_error* init_call_elem(grpc_call_element* elem,
|
83
72
|
const grpc_call_element_args* args) {
|
84
73
|
GPR_ASSERT(args->context != nullptr);
|
85
|
-
new (elem->call_data) call_data(
|
74
|
+
new (elem->call_data) call_data();
|
86
75
|
return GRPC_ERROR_NONE;
|
87
76
|
}
|
88
77
|
|
@@ -96,9 +85,6 @@ static void destroy_call_elem(grpc_call_element* elem,
|
|
96
85
|
calld->client_stats->AddCallFinished(
|
97
86
|
!calld->send_initial_metadata_succeeded /* client_failed_to_send */,
|
98
87
|
calld->recv_initial_metadata_succeeded /* known_received */);
|
99
|
-
// All done, so unref the stats object.
|
100
|
-
// TODO(roth): Eliminate this once filter stack is converted to C++.
|
101
|
-
calld->client_stats.reset();
|
102
88
|
}
|
103
89
|
calld->~call_data();
|
104
90
|
}
|
@@ -107,25 +93,36 @@ static void start_transport_stream_op_batch(
|
|
107
93
|
grpc_call_element* elem, grpc_transport_stream_op_batch* batch) {
|
108
94
|
call_data* calld = static_cast<call_data*>(elem->call_data);
|
109
95
|
GPR_TIMER_SCOPE("clr_start_transport_stream_op_batch", 0);
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
96
|
+
// Handle send_initial_metadata.
|
97
|
+
if (batch->send_initial_metadata) {
|
98
|
+
// Grab client stats object from user_data for LB token metadata.
|
99
|
+
grpc_linked_mdelem* lb_token =
|
100
|
+
batch->payload->send_initial_metadata.send_initial_metadata->idx.named
|
101
|
+
.lb_token;
|
102
|
+
if (lb_token != nullptr) {
|
103
|
+
grpc_core::GrpcLbClientStats* client_stats =
|
104
|
+
static_cast<grpc_core::GrpcLbClientStats*>(grpc_mdelem_get_user_data(
|
105
|
+
lb_token->md, grpc_core::GrpcLbClientStats::Destroy));
|
106
|
+
if (client_stats != nullptr) {
|
107
|
+
calld->client_stats = client_stats->Ref();
|
108
|
+
// Intercept completion.
|
109
|
+
calld->original_on_complete_for_send = batch->on_complete;
|
110
|
+
GRPC_CLOSURE_INIT(&calld->on_complete_for_send, on_complete_for_send,
|
111
|
+
calld, grpc_schedule_on_exec_ctx);
|
112
|
+
batch->on_complete = &calld->on_complete_for_send;
|
113
|
+
}
|
127
114
|
}
|
128
115
|
}
|
116
|
+
// Intercept completion of recv_initial_metadata.
|
117
|
+
if (batch->recv_initial_metadata) {
|
118
|
+
calld->original_recv_initial_metadata_ready =
|
119
|
+
batch->payload->recv_initial_metadata.recv_initial_metadata_ready;
|
120
|
+
GRPC_CLOSURE_INIT(&calld->recv_initial_metadata_ready,
|
121
|
+
recv_initial_metadata_ready, calld,
|
122
|
+
grpc_schedule_on_exec_ctx);
|
123
|
+
batch->payload->recv_initial_metadata.recv_initial_metadata_ready =
|
124
|
+
&calld->recv_initial_metadata_ready;
|
125
|
+
}
|
129
126
|
// Chain to next filter.
|
130
127
|
grpc_call_next_op(elem, batch);
|
131
128
|
}
|