grpc 1.74.1 → 1.75.0.pre1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Makefile +83 -41
- data/include/grpc/credentials.h +7 -1
- data/src/core/call/client_call.cc +4 -4
- data/src/core/call/filter_fusion.h +1230 -0
- data/src/core/call/metadata.cc +22 -0
- data/src/core/call/metadata.h +24 -2
- data/src/core/channelz/channelz.cc +10 -17
- data/src/core/channelz/channelz.h +58 -19
- data/src/core/channelz/channelz_registry.cc +0 -162
- data/src/core/channelz/channelz_registry.h +14 -7
- data/src/core/channelz/property_list.cc +19 -23
- data/src/core/channelz/property_list.h +3 -1
- data/src/core/channelz/v2tov1/convert.cc +683 -0
- data/src/core/channelz/v2tov1/convert.h +58 -0
- data/src/core/channelz/v2tov1/legacy_api.cc +425 -0
- data/src/core/channelz/v2tov1/legacy_api.h +32 -0
- data/src/core/channelz/v2tov1/property_list.cc +118 -0
- data/src/core/channelz/v2tov1/property_list.h +52 -0
- data/src/core/client_channel/client_channel_filter.cc +5 -4
- data/src/core/client_channel/client_channel_filter.h +2 -2
- data/src/core/client_channel/client_channel_internal.h +2 -1
- data/src/core/client_channel/load_balanced_call_destination.cc +6 -5
- data/src/core/client_channel/subchannel.cc +14 -6
- data/src/core/client_channel/subchannel.h +2 -0
- data/src/core/config/core_configuration.cc +3 -1
- data/src/core/config/core_configuration.h +12 -0
- data/src/core/credentials/transport/alts/alts_credentials.cc +5 -0
- data/src/core/credentials/transport/alts/check_gcp_environment_windows.cc +2 -0
- data/src/core/credentials/transport/channel_creds_registry_init.cc +3 -1
- data/src/core/credentials/transport/ssl/ssl_credentials.cc +1 -1
- data/src/core/credentials/transport/ssl/ssl_security_connector.cc +8 -3
- data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +29 -24
- data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +19 -8
- data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +96 -54
- data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +15 -2
- data/src/core/credentials/transport/tls/spiffe_utils.cc +371 -0
- data/src/core/credentials/transport/tls/spiffe_utils.h +171 -0
- data/src/core/credentials/transport/tls/ssl_utils.cc +11 -10
- data/src/core/credentials/transport/tls/ssl_utils.h +4 -2
- data/src/core/credentials/transport/tls/tls_credentials.cc +2 -0
- data/src/core/credentials/transport/tls/tls_security_connector.cc +11 -26
- data/src/core/credentials/transport/tls/tls_security_connector.h +12 -12
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +1 -2
- data/src/core/ext/filters/http/client/http_client_filter.cc +3 -6
- data/src/core/ext/filters/http/client_authority_filter.cc +1 -2
- data/src/core/ext/filters/http/message_compress/compression_filter.cc +8 -8
- data/src/core/ext/filters/http/server/http_server_filter.cc +3 -6
- data/src/core/ext/filters/message_size/message_size_filter.cc +4 -4
- data/src/core/ext/filters/rbac/rbac_filter.cc +1 -1
- data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +3 -5
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +3 -2
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -0
- data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -0
- data/src/core/ext/transport/chttp2/transport/frame.cc +89 -6
- data/src/core/ext/transport/chttp2/transport/frame.h +38 -0
- data/src/core/ext/transport/chttp2/transport/header_assembler.h +5 -14
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +4 -1
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +294 -78
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +128 -9
- data/src/core/ext/transport/chttp2/transport/http2_settings.cc +11 -38
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +52 -35
- data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +61 -0
- data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +142 -0
- data/src/core/ext/transport/chttp2/transport/http2_transport.cc +81 -3
- data/src/core/ext/transport/chttp2/transport/http2_transport.h +12 -1
- data/src/core/ext/transport/chttp2/transport/message_assembler.h +2 -2
- data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/ping_promise.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/ping_promise.h +22 -5
- data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +607 -0
- data/src/core/ext/transport/chttp2/transport/writable_streams.h +254 -0
- data/src/core/ext/transport/chttp2/transport/writing.cc +6 -4
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb.h +4959 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb_minitable.c +1111 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb_minitable.h +108 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb.h +142 -54
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.c +18 -14
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.h +2 -2
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.c +716 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.h +227 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.c +86 -88
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.h +2 -2
- data/src/core/filter/auth/auth_filters.h +2 -2
- data/src/core/filter/fused_filters.cc +154 -0
- data/src/core/handshaker/security/legacy_secure_endpoint.cc +1 -1
- data/src/core/handshaker/security/pipelined_secure_endpoint.cc +965 -0
- data/src/core/handshaker/security/secure_endpoint.cc +28 -13
- data/src/core/handshaker/security/secure_endpoint.h +8 -0
- data/src/core/lib/channel/promise_based_filter.cc +15 -25
- data/src/core/lib/channel/promise_based_filter.h +6 -5
- data/src/core/lib/event_engine/ares_resolver.h +3 -1
- data/src/core/lib/event_engine/cf_engine/cf_engine.cc +9 -5
- data/src/core/lib/event_engine/cf_engine/cf_engine.h +2 -1
- data/src/core/lib/event_engine/cf_engine/cfsocket_listener.cc +263 -0
- data/src/core/lib/event_engine/cf_engine/cfsocket_listener.h +107 -0
- data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +31 -3
- data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +12 -0
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +12 -10
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +6 -4
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +15 -14
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +7 -5
- data/src/core/lib/event_engine/posix_engine/event_poller.h +0 -8
- data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +11 -5
- data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.h +3 -2
- data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +1 -0
- data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +4 -4
- data/src/core/lib/event_engine/posix_engine/lockfree_event.h +3 -4
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +2 -2
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +188 -199
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +30 -45
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +1 -1
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +1 -1
- data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +2 -1
- data/src/core/lib/experiments/experiments.cc +120 -6
- data/src/core/lib/experiments/experiments.h +46 -3
- data/src/core/lib/iomgr/combiner.cc +1 -1
- data/src/core/lib/iomgr/exec_ctx.h +3 -9
- data/src/core/lib/iomgr/socket_mutator.cc +1 -1
- data/src/core/lib/iomgr/socket_utils_posix.cc +1 -1
- data/src/core/lib/iomgr/socket_utils_posix.h +1 -1
- data/src/core/lib/iomgr/tcp_client_posix.cc +1 -1
- data/src/core/lib/iomgr/tcp_posix.cc +3 -3
- data/src/core/lib/promise/activity.h +2 -2
- data/src/core/lib/promise/mpsc.cc +8 -8
- data/src/core/lib/promise/party.cc +7 -7
- data/src/core/lib/promise/party.h +4 -4
- data/src/core/lib/promise/poll.h +10 -0
- data/src/core/lib/resource_quota/memory_quota.cc +90 -3
- data/src/core/lib/resource_quota/memory_quota.h +20 -9
- data/src/core/lib/resource_quota/periodic_update.cc +14 -0
- data/src/core/lib/resource_quota/periodic_update.h +8 -0
- data/src/core/lib/resource_quota/resource_quota.cc +15 -4
- data/src/core/lib/resource_quota/resource_quota.h +3 -0
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +1 -2
- data/src/core/lib/surface/call.cc +5 -5
- data/src/core/lib/surface/call.h +6 -5
- data/src/core/lib/surface/completion_queue.cc +2 -4
- data/src/core/lib/surface/filter_stack_call.cc +1 -1
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/promise_endpoint.cc +2 -2
- data/src/core/lib/transport/promise_endpoint.h +3 -3
- data/src/core/load_balancing/endpoint_list.cc +29 -2
- data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +3 -3
- data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +1 -1
- data/src/core/load_balancing/pick_first/pick_first.cc +12 -5
- data/src/core/load_balancing/xds/xds_cluster_impl.cc +5 -3
- data/src/core/net/socket_mutator.cc +19 -0
- data/src/core/net/socket_mutator.h +25 -0
- data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -0
- data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +6 -1
- data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +2 -1
- data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +8 -5
- data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +2 -1
- data/src/core/resolver/xds/xds_dependency_manager.cc +1 -1
- data/src/core/server/server.cc +1 -1
- data/src/core/server/server_call_tracer_filter.cc +0 -66
- data/src/core/server/server_call_tracer_filter.h +64 -0
- data/src/core/server/server_config_selector_filter.cc +1 -1
- data/src/core/service_config/service_config_channel_arg_filter.cc +3 -60
- data/src/core/service_config/service_config_channel_arg_filter.h +82 -0
- data/src/core/telemetry/call_tracer.cc +20 -14
- data/src/core/telemetry/call_tracer.h +22 -17
- data/src/core/telemetry/metrics.h +8 -8
- data/src/core/telemetry/stats_data.cc +151 -151
- data/src/core/telemetry/stats_data.h +87 -87
- data/src/core/transport/auth_context.cc +20 -0
- data/src/core/transport/auth_context.h +4 -0
- data/src/core/transport/auth_context_comparator_registry.h +69 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +2 -3
- data/src/core/tsi/ssl_transport_security.cc +202 -32
- data/src/core/tsi/ssl_transport_security.h +19 -10
- data/src/core/tsi/ssl_transport_security_utils.cc +21 -0
- data/src/core/tsi/ssl_transport_security_utils.h +4 -0
- data/src/core/util/http_client/httpcli_security_connector.cc +3 -1
- data/src/core/util/latent_see.cc +178 -146
- data/src/core/util/latent_see.h +245 -188
- data/src/core/util/single_set_ptr.h +5 -2
- data/src/core/util/useful.h +91 -0
- data/src/core/util/windows/directory_reader.cc +1 -0
- data/src/core/util/windows/thd.cc +1 -3
- data/src/core/util/work_serializer.cc +1 -1
- data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +32 -5
- data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +5 -0
- data/src/core/xds/grpc/xds_certificate_provider.cc +5 -6
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/third_party/cares/cares/include/ares.h +925 -460
- data/third_party/cares/cares/include/ares_dns.h +86 -71
- data/third_party/cares/cares/include/ares_dns_record.h +1118 -0
- data/third_party/cares/cares/include/ares_nameser.h +215 -189
- data/third_party/cares/cares/include/ares_version.h +37 -14
- data/third_party/cares/cares/src/lib/ares_addrinfo2hostent.c +305 -0
- data/third_party/cares/cares/src/lib/ares_addrinfo_localhost.c +245 -0
- data/third_party/cares/cares/src/lib/ares_android.c +216 -164
- data/third_party/cares/cares/src/lib/ares_android.h +25 -14
- data/third_party/cares/cares/src/lib/ares_cancel.c +68 -44
- data/third_party/cares/cares/src/lib/ares_close_sockets.c +137 -0
- data/third_party/cares/cares/src/lib/ares_conn.c +511 -0
- data/third_party/cares/cares/src/lib/ares_conn.h +196 -0
- data/third_party/cares/cares/src/lib/ares_cookie.c +461 -0
- data/third_party/cares/cares/src/lib/ares_data.c +93 -181
- data/third_party/cares/cares/src/lib/ares_data.h +50 -39
- data/third_party/cares/cares/src/lib/ares_destroy.c +127 -89
- data/third_party/cares/cares/src/lib/ares_free_hostent.c +35 -24
- data/third_party/cares/cares/src/lib/ares_free_string.c +24 -16
- data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +45 -38
- data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +549 -663
- data/third_party/cares/cares/src/lib/ares_getenv.c +25 -15
- data/third_party/cares/cares/src/lib/ares_getenv.h +26 -18
- data/third_party/cares/cares/src/lib/ares_gethostbyaddr.c +163 -221
- data/third_party/cares/cares/src/lib/ares_gethostbyname.c +222 -223
- data/third_party/cares/cares/src/lib/ares_getnameinfo.c +328 -338
- data/third_party/cares/cares/src/lib/ares_hosts_file.c +952 -0
- data/third_party/cares/cares/src/lib/ares_inet_net_pton.h +25 -19
- data/third_party/cares/cares/src/lib/ares_init.c +425 -2091
- data/third_party/cares/cares/src/lib/ares_ipv6.h +63 -33
- data/third_party/cares/cares/src/lib/ares_library_init.c +110 -54
- data/third_party/cares/cares/src/lib/ares_metrics.c +261 -0
- data/third_party/cares/cares/src/lib/ares_options.c +418 -332
- data/third_party/cares/cares/src/lib/ares_parse_into_addrinfo.c +179 -0
- data/third_party/cares/cares/src/lib/ares_private.h +558 -356
- data/third_party/cares/cares/src/lib/ares_process.c +1224 -1369
- data/third_party/cares/cares/src/lib/ares_qcache.c +430 -0
- data/third_party/cares/cares/src/lib/ares_query.c +126 -121
- data/third_party/cares/cares/src/lib/ares_search.c +564 -262
- data/third_party/cares/cares/src/lib/ares_send.c +264 -93
- data/third_party/cares/cares/src/lib/ares_set_socket_functions.c +588 -0
- data/third_party/cares/cares/src/lib/ares_setup.h +115 -111
- data/third_party/cares/cares/src/lib/ares_socket.c +425 -0
- data/third_party/cares/cares/src/lib/ares_socket.h +163 -0
- data/third_party/cares/cares/src/lib/ares_sortaddrinfo.c +447 -0
- data/third_party/cares/cares/src/lib/ares_strerror.c +83 -48
- data/third_party/cares/cares/src/lib/ares_sysconfig.c +639 -0
- data/third_party/cares/cares/src/lib/ares_sysconfig_files.c +839 -0
- data/third_party/cares/cares/src/lib/ares_sysconfig_mac.c +373 -0
- data/third_party/cares/cares/src/lib/ares_sysconfig_win.c +621 -0
- data/third_party/cares/cares/src/lib/ares_timeout.c +136 -73
- data/third_party/cares/cares/src/lib/ares_update_servers.c +1362 -0
- data/third_party/cares/cares/src/lib/ares_version.c +29 -4
- data/third_party/cares/cares/src/lib/config-dos.h +88 -89
- data/third_party/cares/cares/src/lib/config-win32.h +122 -77
- data/third_party/cares/cares/src/lib/dsa/ares_array.c +394 -0
- data/third_party/cares/cares/src/lib/dsa/ares_htable.c +447 -0
- data/third_party/cares/cares/src/lib/dsa/ares_htable.h +174 -0
- data/third_party/cares/cares/src/lib/dsa/ares_htable_asvp.c +224 -0
- data/third_party/cares/cares/src/lib/dsa/ares_htable_dict.c +228 -0
- data/third_party/cares/cares/src/lib/dsa/ares_htable_strvp.c +210 -0
- data/third_party/cares/cares/src/lib/dsa/ares_htable_szvp.c +188 -0
- data/third_party/cares/cares/src/lib/dsa/ares_htable_vpstr.c +186 -0
- data/third_party/cares/cares/src/lib/dsa/ares_htable_vpvp.c +194 -0
- data/third_party/cares/cares/src/lib/dsa/ares_llist.c +382 -0
- data/third_party/cares/cares/src/lib/dsa/ares_slist.c +479 -0
- data/third_party/cares/cares/src/lib/dsa/ares_slist.h +207 -0
- data/third_party/cares/cares/src/lib/event/ares_event.h +191 -0
- data/third_party/cares/cares/src/lib/event/ares_event_configchg.c +743 -0
- data/third_party/cares/cares/src/lib/event/ares_event_epoll.c +192 -0
- data/third_party/cares/cares/src/lib/event/ares_event_kqueue.c +248 -0
- data/third_party/cares/cares/src/lib/event/ares_event_poll.c +140 -0
- data/third_party/cares/cares/src/lib/event/ares_event_select.c +159 -0
- data/third_party/cares/cares/src/lib/event/ares_event_thread.c +567 -0
- data/third_party/cares/cares/src/lib/event/ares_event_wake_pipe.c +166 -0
- data/third_party/cares/cares/src/lib/event/ares_event_win32.c +978 -0
- data/third_party/cares/cares/src/lib/event/ares_event_win32.h +161 -0
- data/third_party/cares/cares/src/lib/include/ares_array.h +276 -0
- data/third_party/cares/cares/src/lib/include/ares_buf.h +732 -0
- data/third_party/cares/cares/src/lib/include/ares_htable_asvp.h +130 -0
- data/third_party/cares/cares/src/lib/include/ares_htable_dict.h +123 -0
- data/third_party/cares/cares/src/lib/include/ares_htable_strvp.h +130 -0
- data/third_party/cares/cares/src/lib/include/ares_htable_szvp.h +118 -0
- data/third_party/cares/cares/src/lib/include/ares_htable_vpstr.h +111 -0
- data/third_party/cares/cares/src/lib/include/ares_htable_vpvp.h +128 -0
- data/third_party/cares/cares/src/lib/include/ares_llist.h +239 -0
- data/third_party/cares/cares/src/lib/include/ares_mem.h +38 -0
- data/third_party/cares/cares/src/lib/include/ares_str.h +244 -0
- data/third_party/cares/cares/src/lib/inet_net_pton.c +202 -157
- data/third_party/cares/cares/src/lib/inet_ntop.c +87 -69
- data/third_party/cares/cares/src/lib/legacy/ares_create_query.c +78 -0
- data/third_party/cares/cares/src/lib/legacy/ares_expand_name.c +99 -0
- data/third_party/cares/cares/src/lib/legacy/ares_expand_string.c +107 -0
- data/third_party/cares/cares/src/lib/legacy/ares_fds.c +80 -0
- data/third_party/cares/cares/src/lib/legacy/ares_getsock.c +85 -0
- data/third_party/cares/cares/src/lib/legacy/ares_parse_a_reply.c +107 -0
- data/third_party/cares/cares/src/lib/legacy/ares_parse_aaaa_reply.c +109 -0
- data/third_party/cares/cares/src/lib/legacy/ares_parse_caa_reply.c +137 -0
- data/third_party/cares/cares/src/lib/legacy/ares_parse_mx_reply.c +110 -0
- data/third_party/cares/cares/src/lib/legacy/ares_parse_naptr_reply.c +132 -0
- data/third_party/cares/cares/src/lib/legacy/ares_parse_ns_reply.c +154 -0
- data/third_party/cares/cares/src/lib/legacy/ares_parse_ptr_reply.c +213 -0
- data/third_party/cares/cares/src/lib/legacy/ares_parse_soa_reply.c +115 -0
- data/third_party/cares/cares/src/lib/legacy/ares_parse_srv_reply.c +114 -0
- data/third_party/cares/cares/src/lib/legacy/ares_parse_txt_reply.c +144 -0
- data/third_party/cares/cares/src/lib/legacy/ares_parse_uri_reply.c +113 -0
- data/third_party/cares/cares/src/lib/record/ares_dns_mapping.c +982 -0
- data/third_party/cares/cares/src/lib/record/ares_dns_multistring.c +307 -0
- data/third_party/cares/cares/src/lib/record/ares_dns_multistring.h +72 -0
- data/third_party/cares/cares/src/lib/record/ares_dns_name.c +673 -0
- data/third_party/cares/cares/src/lib/record/ares_dns_parse.c +1329 -0
- data/third_party/cares/cares/src/lib/record/ares_dns_private.h +273 -0
- data/third_party/cares/cares/src/lib/record/ares_dns_record.c +1661 -0
- data/third_party/cares/cares/src/lib/record/ares_dns_write.c +1229 -0
- data/third_party/cares/cares/src/lib/str/ares_buf.c +1498 -0
- data/third_party/cares/cares/src/lib/str/ares_str.c +508 -0
- data/third_party/cares/cares/src/lib/str/ares_strsplit.c +90 -0
- data/third_party/cares/cares/src/lib/str/ares_strsplit.h +51 -0
- data/third_party/cares/cares/src/lib/thirdparty/apple/dnsinfo.h +122 -0
- data/third_party/cares/cares/src/lib/util/ares_iface_ips.c +628 -0
- data/third_party/cares/cares/src/lib/util/ares_iface_ips.h +139 -0
- data/third_party/cares/cares/src/lib/util/ares_math.c +158 -0
- data/third_party/cares/cares/src/lib/util/ares_math.h +45 -0
- data/third_party/cares/cares/src/lib/util/ares_rand.c +389 -0
- data/third_party/cares/cares/src/lib/util/ares_rand.h +36 -0
- data/third_party/cares/cares/src/lib/util/ares_threads.c +614 -0
- data/third_party/cares/cares/src/lib/util/ares_threads.h +60 -0
- data/third_party/cares/cares/src/lib/util/ares_time.h +48 -0
- data/third_party/cares/cares/src/lib/util/ares_timeval.c +95 -0
- data/third_party/cares/cares/src/lib/util/ares_uri.c +1626 -0
- data/third_party/cares/cares/src/lib/util/ares_uri.h +252 -0
- data/third_party/cares/cares/src/lib/windows_port.c +16 -9
- metadata +121 -49
- data/src/core/util/ring_buffer.h +0 -122
- data/third_party/cares/cares/include/ares_rules.h +0 -125
- data/third_party/cares/cares/src/lib/ares__addrinfo2hostent.c +0 -266
- data/third_party/cares/cares/src/lib/ares__addrinfo_localhost.c +0 -240
- data/third_party/cares/cares/src/lib/ares__close_sockets.c +0 -61
- data/third_party/cares/cares/src/lib/ares__get_hostent.c +0 -260
- data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +0 -229
- data/third_party/cares/cares/src/lib/ares__read_line.c +0 -73
- data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +0 -258
- data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +0 -507
- data/third_party/cares/cares/src/lib/ares__timeval.c +0 -111
- data/third_party/cares/cares/src/lib/ares_create_query.c +0 -197
- data/third_party/cares/cares/src/lib/ares_expand_name.c +0 -311
- data/third_party/cares/cares/src/lib/ares_expand_string.c +0 -67
- data/third_party/cares/cares/src/lib/ares_fds.c +0 -59
- data/third_party/cares/cares/src/lib/ares_getsock.c +0 -66
- data/third_party/cares/cares/src/lib/ares_iphlpapi.h +0 -221
- data/third_party/cares/cares/src/lib/ares_llist.c +0 -63
- data/third_party/cares/cares/src/lib/ares_llist.h +0 -39
- data/third_party/cares/cares/src/lib/ares_mkquery.c +0 -24
- data/third_party/cares/cares/src/lib/ares_nowarn.c +0 -260
- data/third_party/cares/cares/src/lib/ares_nowarn.h +0 -61
- data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +0 -90
- data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +0 -92
- data/third_party/cares/cares/src/lib/ares_parse_caa_reply.c +0 -199
- data/third_party/cares/cares/src/lib/ares_parse_mx_reply.c +0 -164
- data/third_party/cares/cares/src/lib/ares_parse_naptr_reply.c +0 -183
- data/third_party/cares/cares/src/lib/ares_parse_ns_reply.c +0 -177
- data/third_party/cares/cares/src/lib/ares_parse_ptr_reply.c +0 -228
- data/third_party/cares/cares/src/lib/ares_parse_soa_reply.c +0 -179
- data/third_party/cares/cares/src/lib/ares_parse_srv_reply.c +0 -168
- data/third_party/cares/cares/src/lib/ares_parse_txt_reply.c +0 -214
- data/third_party/cares/cares/src/lib/ares_parse_uri_reply.c +0 -184
- data/third_party/cares/cares/src/lib/ares_platform.c +0 -11042
- data/third_party/cares/cares/src/lib/ares_platform.h +0 -43
- data/third_party/cares/cares/src/lib/ares_rand.c +0 -279
- data/third_party/cares/cares/src/lib/ares_strcasecmp.c +0 -66
- data/third_party/cares/cares/src/lib/ares_strcasecmp.h +0 -30
- data/third_party/cares/cares/src/lib/ares_strdup.c +0 -42
- data/third_party/cares/cares/src/lib/ares_strdup.h +0 -24
- data/third_party/cares/cares/src/lib/ares_strsplit.c +0 -94
- data/third_party/cares/cares/src/lib/ares_strsplit.h +0 -42
- data/third_party/cares/cares/src/lib/ares_writev.c +0 -79
- data/third_party/cares/cares/src/lib/ares_writev.h +0 -36
- data/third_party/cares/cares/src/lib/bitncmp.c +0 -59
- data/third_party/cares/cares/src/lib/bitncmp.h +0 -26
- data/third_party/cares/cares/src/lib/setup_once.h +0 -554
- data/third_party/cares/cares/src/tools/ares_getopt.h +0 -53
@@ -25,6 +25,7 @@
|
|
25
25
|
#include "absl/status/statusor.h"
|
26
26
|
#include "absl/strings/string_view.h"
|
27
27
|
#include "absl/types/span.h"
|
28
|
+
#include "src/core/ext/transport/chttp2/transport/http2_settings.h"
|
28
29
|
#include "src/core/ext/transport/chttp2/transport/http2_status.h"
|
29
30
|
#include "src/core/lib/slice/slice.h"
|
30
31
|
#include "src/core/lib/slice/slice_buffer.h"
|
@@ -257,6 +258,20 @@ GrpcMessageHeader ExtractGrpcHeader(SliceBuffer& payload);
|
|
257
258
|
void AppendGrpcHeaderToSliceBuffer(SliceBuffer& payload, const uint8_t flags,
|
258
259
|
const uint32_t length);
|
259
260
|
|
261
|
+
///////////////////////////////////////////////////////////////////////////////
|
262
|
+
// Validations
|
263
|
+
|
264
|
+
http2::Http2Status ValidateSettingsValues(
|
265
|
+
std::vector<Http2SettingsFrame::Setting>& list);
|
266
|
+
|
267
|
+
http2::Http2Status ValidateFrameHeader(uint32_t max_frame_size_setting,
|
268
|
+
bool incoming_header_in_progress,
|
269
|
+
uint32_t incoming_header_stream_id,
|
270
|
+
Http2FrameHeader& current_frame_header);
|
271
|
+
|
272
|
+
///////////////////////////////////////////////////////////////////////////////
|
273
|
+
// RFC9113 Related Strings and Consts
|
274
|
+
|
260
275
|
namespace RFC9113 {
|
261
276
|
// RFC9113: 5.1.1.
|
262
277
|
inline constexpr absl::string_view kStreamIdMustBeOdd =
|
@@ -316,6 +331,18 @@ inline constexpr absl::string_view kNoPushPromise =
|
|
316
331
|
"setting of the "
|
317
332
|
"peer endpoint is set to 0";
|
318
333
|
|
334
|
+
inline constexpr absl::string_view kAssemblerContiguousSequenceError =
|
335
|
+
"RFC9113 : Field blocks MUST be transmitted as a contiguous sequence "
|
336
|
+
"of frames, with no interleaved frames of any other type or from any "
|
337
|
+
"other stream.";
|
338
|
+
inline constexpr absl::string_view kHalfClosedRemoteState =
|
339
|
+
"RFC9113: half-closed (remote): If an endpoint receives additional frames, "
|
340
|
+
"other than WINDOW_UPDATE, PRIORITY, or RST_STREAM, for a stream that is "
|
341
|
+
"in this state, it MUST respond with a stream error of type STREAM_CLOSED.";
|
342
|
+
inline constexpr absl::string_view kFrameSizeLargerThanMaxFrameSizeSetting =
|
343
|
+
"RFC9113: An endpoint MUST send an error code of FRAME_SIZE_ERROR if a "
|
344
|
+
"frame exceeds the size defined in SETTINGS_MAX_FRAME_SIZE";
|
345
|
+
|
319
346
|
inline constexpr absl::string_view kFrameParserIncorrectPadding =
|
320
347
|
"Incorrect length of padding in frame";
|
321
348
|
inline constexpr absl::string_view kIncorrectFrame = "Incorrect Frame";
|
@@ -323,7 +350,18 @@ inline constexpr absl::string_view kGoAwayLength8 =
|
|
323
350
|
"GOAWAY frame should have a Last-Stream-ID and Error Code making the "
|
324
351
|
"minimum length 8 octets";
|
325
352
|
|
353
|
+
inline constexpr absl::string_view kIncorrectWindowSizeSetting =
|
354
|
+
"RFC9113: Values above the maximum flow-control window size of (2^31)-1 "
|
355
|
+
"MUST be treated as a connection error of type FLOW_CONTROL_ERROR.";
|
356
|
+
inline constexpr absl::string_view kIncorrectFrameSizeSetting =
|
357
|
+
"RFC9113: The initial value is 2^14 (16,384) octets. The value advertised"
|
358
|
+
" by an endpoint MUST be between this initial value and the maximum allowed"
|
359
|
+
" frame size (2^24)-1 or 16,777,215 octets), inclusive. ";
|
360
|
+
|
326
361
|
inline constexpr uint32_t kMaxStreamId31Bit = 0x7fffffffu;
|
362
|
+
inline constexpr uint32_t kMaxSize31Bit = 0x7fffffffu;
|
363
|
+
inline constexpr uint32_t kMinimumFrameSize = 16384;
|
364
|
+
inline constexpr uint32_t kMaximumFrameSize = 16777215;
|
327
365
|
|
328
366
|
} // namespace RFC9113
|
329
367
|
} // namespace grpc_core
|
@@ -47,15 +47,6 @@ namespace http2 {
|
|
47
47
|
|
48
48
|
#define ASSEMBLER_LOG DVLOG(3)
|
49
49
|
|
50
|
-
constexpr absl::string_view kAssemblerContiguousSequenceError =
|
51
|
-
"RFC9113 : Field blocks MUST be transmitted as a contiguous sequence "
|
52
|
-
"of frames, with no interleaved frames of any other type or from any "
|
53
|
-
"other stream.";
|
54
|
-
|
55
|
-
constexpr absl::string_view kAssemblerMismatchedStreamId =
|
56
|
-
"CONTINUATION frame has a different Stream Identifier than the preceeding "
|
57
|
-
"HEADERS frame.";
|
58
|
-
|
59
50
|
constexpr absl::string_view kAssemblerHpackError =
|
60
51
|
"RFC9113 : A decoding error in a field block MUST be treated as a "
|
61
52
|
"connection error of type COMPRESSION_ERROR.";
|
@@ -148,7 +139,9 @@ class HeaderAssembler {
|
|
148
139
|
|
149
140
|
// The caller MUST check using IsReady() before calling this function
|
150
141
|
ValueOrHttp2Status<Arena::PoolPtr<grpc_metadata_batch>> ReadMetadata(
|
151
|
-
HPackParser& parser, bool is_initial_metadata, bool is_client
|
142
|
+
HPackParser& parser, bool is_initial_metadata, bool is_client,
|
143
|
+
const uint32_t max_header_list_size_soft_limit,
|
144
|
+
const uint32_t max_header_list_size_hard_limit) {
|
152
145
|
ASSEMBLER_LOG << "ReadMetadata " << buffer_.Length() << " Bytes.";
|
153
146
|
|
154
147
|
// Validate
|
@@ -162,10 +155,8 @@ class HeaderAssembler {
|
|
162
155
|
Arena::PoolPtr<grpc_metadata_batch> metadata =
|
163
156
|
Arena::MakePooledForOverwrite<grpc_metadata_batch>();
|
164
157
|
parser.BeginFrame(
|
165
|
-
/*grpc_metadata_batch*/ metadata.get(),
|
166
|
-
|
167
|
-
/*metadata_size_soft_limit*/ std::numeric_limits<uint32_t>::max(),
|
168
|
-
/*metadata_size_hard_limit*/ std::numeric_limits<uint32_t>::max(),
|
158
|
+
/*grpc_metadata_batch*/ metadata.get(), max_header_list_size_soft_limit,
|
159
|
+
max_header_list_size_hard_limit,
|
169
160
|
is_initial_metadata ? HPackParser::Boundary::EndOfHeaders
|
170
161
|
: HPackParser::Boundary::EndOfStream,
|
171
162
|
HPackParser::Priority::None,
|
@@ -92,7 +92,10 @@ class HPackParser {
|
|
92
92
|
HPackParser& operator=(HPackParser&&) = default;
|
93
93
|
|
94
94
|
// Begin parsing a new frame
|
95
|
-
// Sink receives each parsed header
|
95
|
+
// Sink receives each parsed header.
|
96
|
+
// You can pass metadata_buffer as a nullptr if you need to discard this frame
|
97
|
+
// after processing it. This would be needed if the stream is already closed,
|
98
|
+
// or multiple other cases.
|
96
99
|
void BeginFrame(grpc_metadata_batch* metadata_buffer,
|
97
100
|
uint32_t metadata_size_soft_limit,
|
98
101
|
uint32_t metadata_size_hard_limit, Boundary boundary,
|
@@ -35,6 +35,7 @@
|
|
35
35
|
#include "src/core/ext/transport/chttp2/transport/frame.h"
|
36
36
|
#include "src/core/ext/transport/chttp2/transport/header_assembler.h"
|
37
37
|
#include "src/core/ext/transport/chttp2/transport/http2_settings.h"
|
38
|
+
#include "src/core/ext/transport/chttp2/transport/http2_settings_manager.h"
|
38
39
|
#include "src/core/ext/transport/chttp2/transport/http2_status.h"
|
39
40
|
#include "src/core/ext/transport/chttp2/transport/internal_channel_arg_names.h"
|
40
41
|
#include "src/core/ext/transport/chttp2/transport/message_assembler.h"
|
@@ -155,6 +156,12 @@ Http2Status Http2ClientTransport::ProcessHttp2DataFrame(Http2DataFrame frame) {
|
|
155
156
|
return Http2Status::Ok();
|
156
157
|
}
|
157
158
|
|
159
|
+
if (stream->GetStreamState() == HttpStreamState::kHalfClosedRemote) {
|
160
|
+
return Http2Status::Http2StreamError(
|
161
|
+
Http2ErrorCode::kStreamClosed,
|
162
|
+
std::string(RFC9113::kHalfClosedRemoteState));
|
163
|
+
}
|
164
|
+
|
158
165
|
// Add frame to assembler
|
159
166
|
GRPC_HTTP2_CLIENT_DLOG
|
160
167
|
<< "Http2Transport ProcessHttp2DataFrame AppendNewDataFrame";
|
@@ -227,6 +234,11 @@ Http2Status Http2ClientTransport::ProcessHttp2HeaderFrame(
|
|
227
234
|
<< frame.stream_id << "} Lookup Failed";
|
228
235
|
return Http2Status::Ok();
|
229
236
|
}
|
237
|
+
if (stream->GetStreamState() == HttpStreamState::kHalfClosedRemote) {
|
238
|
+
return Http2Status::Http2StreamError(
|
239
|
+
Http2ErrorCode::kStreamClosed,
|
240
|
+
std::string(RFC9113::kHalfClosedRemoteState));
|
241
|
+
}
|
230
242
|
|
231
243
|
incoming_header_in_progress_ = !frame.end_headers;
|
232
244
|
incoming_header_stream_id_ = frame.stream_id;
|
@@ -256,7 +268,11 @@ Http2Status Http2ClientTransport::ProcessMetadata(
|
|
256
268
|
if (assembler.IsReady()) {
|
257
269
|
ValueOrHttp2Status<Arena::PoolPtr<grpc_metadata_batch>> read_result =
|
258
270
|
assembler.ReadMetadata(parser_, !incoming_header_end_stream_,
|
259
|
-
/*is_client=*/true
|
271
|
+
/*is_client=*/true,
|
272
|
+
/*max_header_list_size_soft_limit=*/
|
273
|
+
max_header_list_size_soft_limit_,
|
274
|
+
/*max_header_list_size_hard_limit=*/
|
275
|
+
settings_.acked().max_header_list_size());
|
260
276
|
if (read_result.IsOk()) {
|
261
277
|
Arena::PoolPtr<grpc_metadata_batch> metadata =
|
262
278
|
TakeValue(std::move(read_result));
|
@@ -315,17 +331,33 @@ Http2Status Http2ClientTransport::ProcessHttp2RstStreamFrame(
|
|
315
331
|
Http2Status Http2ClientTransport::ProcessHttp2SettingsFrame(
|
316
332
|
Http2SettingsFrame frame) {
|
317
333
|
// https://www.rfc-editor.org/rfc/rfc9113.html#name-settings
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
334
|
+
|
335
|
+
GRPC_HTTP2_CLIENT_DLOG << "Http2Transport ProcessHttp2SettingsFrame { ack="
|
336
|
+
<< frame.ack
|
337
|
+
<< ", settings length=" << frame.settings.size()
|
338
|
+
<< "}";
|
339
|
+
|
340
|
+
// The connector code needs us to run this
|
325
341
|
if (on_receive_settings_ != nullptr) {
|
326
342
|
ExecCtx::Run(DEBUG_LOCATION, on_receive_settings_, absl::OkStatus());
|
327
343
|
on_receive_settings_ = nullptr;
|
328
344
|
}
|
345
|
+
|
346
|
+
if (!frame.ack) {
|
347
|
+
// Check if the received settings have legal values
|
348
|
+
Http2Status status = ValidateSettingsValues(frame.settings);
|
349
|
+
if (!status.IsOk()) {
|
350
|
+
return status;
|
351
|
+
}
|
352
|
+
// TODO(tjagtap) : [PH2][P1]
|
353
|
+
// Apply the new settings
|
354
|
+
// Quickly send the ACK to the peer once the settings are applied
|
355
|
+
} else {
|
356
|
+
// TODO(tjagtap) : [PH2][P1]
|
357
|
+
// Stop the setting timeout promise
|
358
|
+
// Update the ACKed setting data structure
|
359
|
+
}
|
360
|
+
|
329
361
|
return Http2Status::Ok();
|
330
362
|
}
|
331
363
|
|
@@ -337,11 +369,7 @@ auto Http2ClientTransport::ProcessHttp2PingFrame(Http2PingFrame frame) {
|
|
337
369
|
frame.ack,
|
338
370
|
[self = RefAsSubclass<Http2ClientTransport>(), opaque = frame.opaque]() {
|
339
371
|
// Received a ping ack.
|
340
|
-
|
341
|
-
GRPC_HTTP2_CLIENT_DLOG
|
342
|
-
<< "Unknown ping response received for ping id=" << opaque;
|
343
|
-
}
|
344
|
-
return Immediate(Http2Status::Ok());
|
372
|
+
return self->AckPing(opaque);
|
345
373
|
},
|
346
374
|
[self = RefAsSubclass<Http2ClientTransport>(), opaque = frame.opaque]() {
|
347
375
|
// TODO(akshitpatel) : [PH2][P2] : Have a counter to track number of
|
@@ -411,6 +439,11 @@ Http2Status Http2ClientTransport::ProcessHttp2ContinuationFrame(
|
|
411
439
|
// error (Section 5.4.1) of type PROTOCOL_ERROR.
|
412
440
|
return Http2Status::Ok();
|
413
441
|
}
|
442
|
+
if (stream->GetStreamState() == HttpStreamState::kHalfClosedRemote) {
|
443
|
+
return Http2Status::Http2StreamError(
|
444
|
+
Http2ErrorCode::kStreamClosed,
|
445
|
+
std::string(RFC9113::kHalfClosedRemoteState));
|
446
|
+
}
|
414
447
|
|
415
448
|
HeaderAssembler& assember = stream->header_assembler;
|
416
449
|
Http2Status result = assember.AppendContinuationFrame(std::move(frame));
|
@@ -424,11 +457,19 @@ Http2Status Http2ClientTransport::ProcessHttp2ContinuationFrame(
|
|
424
457
|
|
425
458
|
Http2Status Http2ClientTransport::ProcessHttp2SecurityFrame(
|
426
459
|
Http2SecurityFrame frame) {
|
427
|
-
GRPC_HTTP2_CLIENT_DLOG << "Http2Transport ProcessHttp2SecurityFrame
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
460
|
+
GRPC_HTTP2_CLIENT_DLOG << "Http2Transport ProcessHttp2SecurityFrame "
|
461
|
+
"ProcessHttp2SecurityFrame { payload="
|
462
|
+
<< frame.payload.JoinIntoString() << " }";
|
463
|
+
if ((settings_.acked().allow_security_frame() ||
|
464
|
+
settings_.local().allow_security_frame()) &&
|
465
|
+
settings_.peer().allow_security_frame()) {
|
466
|
+
// TODO(tjagtap) : [PH2][P4] : Evaluate when to accept the frame and when to
|
467
|
+
// reject it. Compare it with the requirement and with CHTTP2.
|
468
|
+
// TODO(tjagtap) : [PH2][P3] : Add handling of Security frame
|
469
|
+
// Just the frame.payload needs to be passed to the endpoint_ object.
|
470
|
+
// Refer usage of TransportFramingEndpointExtension.
|
471
|
+
}
|
472
|
+
// Ignore the Security frame if it is not expected.
|
432
473
|
return Http2Status::Ok();
|
433
474
|
}
|
434
475
|
|
@@ -497,15 +538,14 @@ auto Http2ClientTransport::ReadAndProcessOneFrame() {
|
|
497
538
|
},
|
498
539
|
// Validate the incoming frame as per the current state of the transport
|
499
540
|
[self = RefAsSubclass<Http2ClientTransport>()](Http2FrameHeader header) {
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
std::string(kAssemblerContiguousSequenceError)));
|
541
|
+
Http2Status status = ValidateFrameHeader(
|
542
|
+
/*max_frame_size_setting*/ self->settings_.acked().max_frame_size(),
|
543
|
+
/*incoming_header_in_progress*/ self->incoming_header_in_progress_,
|
544
|
+
/*incoming_header_stream_id*/ self->incoming_header_stream_id_,
|
545
|
+
/*current_frame_header*/ header);
|
546
|
+
|
547
|
+
if (!status.IsOk()) {
|
548
|
+
return self->HandleError(std::move(status));
|
509
549
|
}
|
510
550
|
GRPC_HTTP2_CLIENT_DLOG << "Http2ClientTransport ReadAndProcessOneFrame "
|
511
551
|
"Validated Frame Header:"
|
@@ -649,6 +689,110 @@ auto Http2ClientTransport::OnWriteLoopEnded() {
|
|
649
689
|
};
|
650
690
|
}
|
651
691
|
|
692
|
+
auto Http2ClientTransport::StreamMultiplexerLoop() {
|
693
|
+
GRPC_HTTP2_CLIENT_DLOG
|
694
|
+
<< "Http2ClientTransport StreamMultiplexerLoop Factory";
|
695
|
+
// This loop iterates over all the writable streams and drains them. If
|
696
|
+
// there are no writable streams, StreamMultiplexerLoop blocks until there
|
697
|
+
// is a writable stream.
|
698
|
+
return Loop([self = RefAsSubclass<Http2ClientTransport>()]() mutable {
|
699
|
+
// Overview:
|
700
|
+
// 1. Get the next writable stream.
|
701
|
+
// 2. Dequeue frames from the stream queue based on available transport
|
702
|
+
// tokens.
|
703
|
+
// 3. If the stream is still writable, enqueue the stream back to the
|
704
|
+
// writable stream list.
|
705
|
+
// 4. Enqueue the dequeued frames to the MPSC queue.
|
706
|
+
return TrySeq(
|
707
|
+
self->writable_stream_list_.Next(/*transport_tokens_available*/ true),
|
708
|
+
[self](const uint32_t stream_id) mutable
|
709
|
+
-> absl::StatusOr<std::vector<Http2Frame>> {
|
710
|
+
RefCountedPtr<Stream> stream = self->LookupStream(stream_id);
|
711
|
+
if (GPR_UNLIKELY(stream == nullptr)) {
|
712
|
+
// Stream was closed before we could dequeue.
|
713
|
+
// TODO(akshitpatel) : [PH2][P2] : Race condition. Determine should
|
714
|
+
// we have a DCHECK here based on how ResetStream/Aborts are
|
715
|
+
// handled.
|
716
|
+
return std::vector<Http2Frame>();
|
717
|
+
}
|
718
|
+
|
719
|
+
// TODO(akshitpatel) : [PH2][P3] : Plug transport_tokens when
|
720
|
+
// transport flow control is implemented.
|
721
|
+
absl::StatusOr<StreamDataQueue<ClientMetadataHandle>::DequeueResult>
|
722
|
+
result = stream->DequeueFrames(
|
723
|
+
/*transport_tokens*/ std::numeric_limits<uint32_t>::max(),
|
724
|
+
self->settings_.peer().max_frame_size(), self->encoder_);
|
725
|
+
if (result.ok() && result->is_writable) {
|
726
|
+
// Stream is still writable. Enqueue it back to the writable stream
|
727
|
+
// list.
|
728
|
+
// TODO(akshitpatel) : [PH2][P3] : Plug transport_tokens when
|
729
|
+
// transport flow control is implemented.
|
730
|
+
absl::Status status = self->writable_stream_list_.Enqueue(
|
731
|
+
stream_id, WritableStreams::StreamPriority::kDefault);
|
732
|
+
|
733
|
+
if (GPR_UNLIKELY(!status.ok())) {
|
734
|
+
LOG(ERROR) << "Failed to enqueue stream " << stream_id
|
735
|
+
<< " with status: " << status;
|
736
|
+
// Close transport if we fail to enqueue stream.
|
737
|
+
return absl::InternalError("Failed to enqueue stream");
|
738
|
+
}
|
739
|
+
} else if (GPR_UNLIKELY(!result.ok())) {
|
740
|
+
// Close the corresponding stream if we fail to dequeue frames from
|
741
|
+
// the stream queue.
|
742
|
+
LOG(ERROR) << "Failed to dequeue frames for stream " << stream_id
|
743
|
+
<< " with status: " << result.status();
|
744
|
+
absl::Status status =
|
745
|
+
self->HandleError(Http2Status::AbslStreamError(
|
746
|
+
absl::StatusCode::kInternal, "Failed to dequeue frames"));
|
747
|
+
return std::vector<Http2Frame>();
|
748
|
+
}
|
749
|
+
GRPC_HTTP2_CLIENT_DLOG
|
750
|
+
<< "Http2ClientTransport StreamMultiplexerLoop. Dequeued "
|
751
|
+
<< result->frames.size()
|
752
|
+
<< " frames for "
|
753
|
+
"stream: "
|
754
|
+
<< stream_id;
|
755
|
+
return std::move(result->frames);
|
756
|
+
},
|
757
|
+
[self](std::vector<Http2Frame> frames) {
|
758
|
+
// Enqueue the frames to the MPSC queue.
|
759
|
+
return Loop([self, frames = std::move(frames), idx = 0u]() mutable {
|
760
|
+
return If(
|
761
|
+
idx < frames.size(),
|
762
|
+
[self, &frames, &idx]() {
|
763
|
+
return Map(
|
764
|
+
// Enqueue to the MPSC queue could return pending. This
|
765
|
+
// induces backpressure for the sender. Only after writing
|
766
|
+
// to the MPSC queue we will loop back to read more
|
767
|
+
// streams.
|
768
|
+
self->EnqueueOutgoingFrame(std::move(frames[idx++])),
|
769
|
+
[](absl::Status status) -> LoopCtl<absl::Status> {
|
770
|
+
if (GPR_UNLIKELY(!status.ok())) {
|
771
|
+
return status;
|
772
|
+
}
|
773
|
+
return Continue{};
|
774
|
+
});
|
775
|
+
},
|
776
|
+
[]() -> LoopCtl<absl::Status> { return absl::OkStatus(); });
|
777
|
+
});
|
778
|
+
},
|
779
|
+
[]() -> LoopCtl<absl::Status> { return Continue{}; });
|
780
|
+
});
|
781
|
+
}
|
782
|
+
|
783
|
+
auto Http2ClientTransport::OnStreamMultiplexerLoopEnded() {
|
784
|
+
GRPC_HTTP2_CLIENT_DLOG
|
785
|
+
<< "Http2ClientTransport OnStreamMultiplexerLoopEnded Factory";
|
786
|
+
return [self = RefAsSubclass<Http2ClientTransport>()](absl::Status status) {
|
787
|
+
GRPC_HTTP2_CLIENT_DLOG
|
788
|
+
<< "Http2ClientTransport OnStreamMultiplexerLoopEnded Promise Status="
|
789
|
+
<< status;
|
790
|
+
GRPC_UNUSED absl::Status error =
|
791
|
+
self->HandleError(Http2Status::AbslConnectionError(
|
792
|
+
status.code(), std::string(status.message())));
|
793
|
+
};
|
794
|
+
}
|
795
|
+
|
652
796
|
///////////////////////////////////////////////////////////////////////////////
|
653
797
|
// Constructor Destructor
|
654
798
|
|
@@ -665,6 +809,8 @@ Http2ClientTransport::Http2ClientTransport(
|
|
665
809
|
is_first_write_(true),
|
666
810
|
incoming_header_stream_id_(0),
|
667
811
|
on_receive_settings_(on_receive_settings),
|
812
|
+
max_header_list_size_soft_limit_(
|
813
|
+
GetSoftLimitFromChannelArgs(channel_args)),
|
668
814
|
keepalive_time_(std::max(
|
669
815
|
Duration::Seconds(10),
|
670
816
|
channel_args.GetDurationFromIntMillis(GRPC_ARG_KEEPALIVE_TIME_MS)
|
@@ -693,11 +839,12 @@ Http2ClientTransport::Http2ClientTransport(
|
|
693
839
|
: Duration::Infinity()),
|
694
840
|
keepalive_time_),
|
695
841
|
keepalive_permit_without_calls_(false) {
|
696
|
-
// TODO(tjagtap) : [PH2][P2] : Save and apply channel_args.
|
697
|
-
// TODO(tjagtap) : [PH2][P2] : Initialize settings_ to appropriate values.
|
698
|
-
|
699
842
|
GRPC_HTTP2_CLIENT_DLOG << "Http2ClientTransport Constructor Begin";
|
700
843
|
|
844
|
+
InitLocalSettings(settings_.mutable_local(), /*is_client=*/true);
|
845
|
+
ReadSettingsFromChannelArgs(channel_args, settings_.mutable_local(),
|
846
|
+
/*is_client=*/true);
|
847
|
+
|
701
848
|
// Initialize the general party and write party.
|
702
849
|
auto general_party_arena = SimpleArenaAllocator(0)->MakeArena();
|
703
850
|
general_party_arena->SetContext<EventEngine>(event_engine.get());
|
@@ -706,18 +853,38 @@ Http2ClientTransport::Http2ClientTransport(
|
|
706
853
|
general_party_->Spawn("ReadLoop", ReadLoop(), OnReadLoopEnded());
|
707
854
|
// TODO(tjagtap) : [PH2][P2] Fix when needed.
|
708
855
|
general_party_->Spawn("WriteLoop", WriteLoop(), OnWriteLoopEnded());
|
856
|
+
general_party_->Spawn("StreamMultiplexerLoop", StreamMultiplexerLoop(),
|
857
|
+
OnStreamMultiplexerLoopEnded());
|
709
858
|
|
710
859
|
// The keepalive loop is only spawned if the keepalive time is not infinity.
|
711
860
|
keepalive_manager_.Spawn(general_party_.get());
|
712
861
|
|
713
|
-
// TODO(tjagtap) : [PH2][P2]
|
862
|
+
// TODO(tjagtap) : [PH2][P2] Delete this hack once flow control is done.
|
863
|
+
// We are increasing the flow control window so that we can avoid sending
|
864
|
+
// WINDOW_UPDATE frames while flow control is under development. Once it is
|
865
|
+
// ready we should remove these lines.
|
866
|
+
// <DeleteAfterFlowControl>
|
714
867
|
Http2ErrorCode code = settings_.mutable_local().Apply(
|
715
868
|
Http2Settings::kInitialWindowSizeWireId,
|
716
869
|
(Http2Settings::max_initial_window_size() - 1));
|
717
870
|
DCHECK(code == Http2ErrorCode::kNoError);
|
871
|
+
// </DeleteAfterFlowControl>
|
872
|
+
|
873
|
+
const int max_hpack_table_size =
|
874
|
+
channel_args.GetInt(GRPC_ARG_HTTP2_HPACK_TABLE_SIZE_ENCODER).value_or(-1);
|
875
|
+
if (max_hpack_table_size >= 0) {
|
876
|
+
encoder_.SetMaxUsableSize(max_hpack_table_size);
|
877
|
+
}
|
878
|
+
|
879
|
+
settings_timeout_ =
|
880
|
+
channel_args.GetDurationFromIntMillis(GRPC_ARG_SETTINGS_TIMEOUT)
|
881
|
+
.value_or(std::max(keepalive_timeout_ * 2, Duration::Minutes(1)));
|
882
|
+
|
718
883
|
std::optional<Http2SettingsFrame> settings_frame =
|
719
884
|
settings_.MaybeSendUpdate();
|
720
885
|
if (settings_frame.has_value()) {
|
886
|
+
GRPC_HTTP2_CLIENT_DLOG
|
887
|
+
<< "Http2ClientTransport Constructor Spawn SendFirstSettingsFrame";
|
721
888
|
general_party_->Spawn(
|
722
889
|
"SendFirstSettingsFrame",
|
723
890
|
[self = RefAsSubclass<Http2ClientTransport>(),
|
@@ -726,6 +893,12 @@ Http2ClientTransport::Http2ClientTransport(
|
|
726
893
|
},
|
727
894
|
[](GRPC_UNUSED absl::Status status) {});
|
728
895
|
}
|
896
|
+
if (settings_.local().allow_security_frame()) {
|
897
|
+
// TODO(tjagtap) : [PH2][P3] : Setup the plumbing to pass the security frame
|
898
|
+
// to the endpoing via TransportFramingEndpointExtension.
|
899
|
+
// Also decide if this plumbing is done here, or when the peer sends
|
900
|
+
// allow_security_frame too.
|
901
|
+
}
|
729
902
|
GRPC_HTTP2_CLIENT_DLOG << "Http2ClientTransport Constructor End";
|
730
903
|
}
|
731
904
|
|
@@ -915,60 +1088,91 @@ auto Http2ClientTransport::CallOutboundLoop(
|
|
915
1088
|
ClientMetadataHandle metadata) {
|
916
1089
|
GRPC_HTTP2_CLIENT_DLOG << "Http2ClientTransport CallOutboundLoop";
|
917
1090
|
|
918
|
-
|
919
|
-
|
920
|
-
|
921
|
-
|
922
|
-
|
923
|
-
|
924
|
-
|
925
|
-
|
926
|
-
|
927
|
-
|
928
|
-
|
929
|
-
|
930
|
-
|
931
|
-
|
932
|
-
|
933
|
-
|
934
|
-
|
935
|
-
|
936
|
-
|
937
|
-
|
938
|
-
|
939
|
-
|
1091
|
+
auto send_message = [self = RefAsSubclass<Http2ClientTransport>(),
|
1092
|
+
stream_id](MessageHandle&& message) mutable {
|
1093
|
+
RefCountedPtr<Stream> stream = self->LookupStream(stream_id);
|
1094
|
+
return If(
|
1095
|
+
stream != nullptr,
|
1096
|
+
[self, stream, message = std::move(message), stream_id]() mutable {
|
1097
|
+
return TrySeq(stream->EnqueueMessage(std::move(message)),
|
1098
|
+
[self, stream_id](bool became_writable) {
|
1099
|
+
GRPC_HTTP2_CLIENT_DLOG
|
1100
|
+
<< "Http2ClientTransport CallOutboundLoop "
|
1101
|
+
"Enqueued Message";
|
1102
|
+
return self->MaybeAddStreamToWritableStreamList(
|
1103
|
+
stream_id, became_writable);
|
1104
|
+
});
|
1105
|
+
},
|
1106
|
+
[]() {
|
1107
|
+
// This will trigger Call stack cleanup.
|
1108
|
+
return absl::InternalError("Stream not found while sending message");
|
1109
|
+
});
|
1110
|
+
};
|
1111
|
+
|
1112
|
+
auto send_initial_metadata = [self = RefAsSubclass<Http2ClientTransport>(),
|
1113
|
+
stream_id,
|
1114
|
+
metadata = std::move(metadata)]() mutable {
|
1115
|
+
RefCountedPtr<Stream> stream = self->LookupStream(stream_id);
|
1116
|
+
return If(
|
1117
|
+
stream != nullptr,
|
1118
|
+
[self, stream, metadata = std::move(metadata), stream_id]() mutable {
|
1119
|
+
return TrySeq(
|
1120
|
+
stream->EnqueueInitialMetadata(std::move(metadata)),
|
1121
|
+
[self, stream_id](bool became_writable) {
|
1122
|
+
GRPC_HTTP2_CLIENT_DLOG
|
1123
|
+
<< "Http2ClientTransport CallOutboundLoop "
|
1124
|
+
"Enqueued Initial Metadata";
|
1125
|
+
return self->MaybeAddStreamToWritableStreamList(
|
1126
|
+
stream_id, became_writable);
|
1127
|
+
},
|
1128
|
+
[stream] {
|
1129
|
+
// TODO(akshitpatel) : [PH2][P2] : Think how to handle stream
|
1130
|
+
// states.
|
1131
|
+
stream->SentInitialMetadata();
|
1132
|
+
return absl::OkStatus();
|
1133
|
+
});
|
1134
|
+
},
|
1135
|
+
[]() {
|
1136
|
+
// This will trigger Call stack cleanup.
|
1137
|
+
return absl::InternalError(
|
1138
|
+
"Stream not found while sending initial metadata");
|
1139
|
+
});
|
1140
|
+
};
|
1141
|
+
|
1142
|
+
auto send_half_closed = [self = RefAsSubclass<Http2ClientTransport>(),
|
1143
|
+
stream_id]() mutable {
|
1144
|
+
RefCountedPtr<Stream> stream = self->LookupStream(stream_id);
|
1145
|
+
return If(
|
1146
|
+
stream != nullptr,
|
1147
|
+
[self, stream, stream_id]() mutable {
|
1148
|
+
return TrySeq(stream->EnqueueHalfClosed(),
|
1149
|
+
[self, stream_id](bool became_writable) {
|
1150
|
+
GRPC_HTTP2_CLIENT_DLOG
|
1151
|
+
<< "Http2ClientTransport CallOutboundLoop "
|
1152
|
+
"Enqueued Half Closed";
|
1153
|
+
return self->MaybeAddStreamToWritableStreamList(
|
1154
|
+
stream_id, became_writable);
|
1155
|
+
});
|
1156
|
+
},
|
1157
|
+
[]() {
|
1158
|
+
// This will trigger Call stack cleanup.
|
1159
|
+
return absl::InternalError(
|
1160
|
+
"Stream not found while sending half closed");
|
1161
|
+
});
|
1162
|
+
};
|
940
1163
|
return GRPC_LATENT_SEE_PROMISE(
|
941
1164
|
"Ph2CallOutboundLoop",
|
942
1165
|
TrySeq(
|
943
|
-
|
944
|
-
[self = RefAsSubclass<Http2ClientTransport>(),
|
945
|
-
stream_id](absl::Status status) {
|
946
|
-
if (status.ok()) {
|
947
|
-
// TODO(akshitpatel) : [PH2][P3] : Investigate if stream
|
948
|
-
// lookup can be done once outside the promise and all the
|
949
|
-
// promises can hold a reference to the stream.
|
950
|
-
auto stream = self->LookupStream(stream_id);
|
951
|
-
if (GPR_UNLIKELY(stream == nullptr)) {
|
952
|
-
LOG(ERROR)
|
953
|
-
<< "Stream not found while sending initial metadata";
|
954
|
-
return absl::InternalError(
|
955
|
-
"Stream not found while sending initial metadata");
|
956
|
-
}
|
957
|
-
stream->SentInitialMetadata();
|
958
|
-
}
|
959
|
-
return status;
|
960
|
-
}),
|
1166
|
+
send_initial_metadata(),
|
961
1167
|
[call_handler, send_message, lock = std::move(lock)]() {
|
962
1168
|
// The lock will be released once the promise is constructed from
|
963
1169
|
// this factory. ForEach will be polled after the lock is
|
964
1170
|
// released.
|
965
1171
|
return ForEach(MessagesFrom(call_handler), send_message);
|
966
1172
|
},
|
967
|
-
[self = RefAsSubclass<Http2ClientTransport>(),
|
968
|
-
|
969
|
-
|
970
|
-
Http2DataFrame frame{stream_id, /*end_stream*/ true, SliceBuffer()};
|
971
|
-
return self->EnqueueOutgoingFrame(std::move(frame));
|
1173
|
+
[self = RefAsSubclass<Http2ClientTransport>(),
|
1174
|
+
send_half_closed = std::move(send_half_closed)]() mutable {
|
1175
|
+
return send_half_closed();
|
972
1176
|
},
|
973
1177
|
[call_handler]() mutable {
|
974
1178
|
return Map(call_handler.WasCancelled(), [](bool cancelled) {
|
@@ -995,8 +1199,20 @@ void Http2ClientTransport::StartCall(CallHandler call_handler) {
|
|
995
1199
|
},
|
996
1200
|
[self = RefAsSubclass<Http2ClientTransport>(),
|
997
1201
|
call_handler](auto args /* Locked stream_id_mutex */) mutable {
|
998
|
-
//
|
999
|
-
//
|
1202
|
+
// For a gRPC Client, we only need to check the
|
1203
|
+
// MAX_CONCURRENT_STREAMS setting compliance at the time of
|
1204
|
+
// sending (that is write path). A gRPC Client will never
|
1205
|
+
// receive a stream initiated by a server, so we dont have to
|
1206
|
+
// check MAX_CONCURRENT_STREAMS compliance on the Read-Path.
|
1207
|
+
//
|
1208
|
+
// TODO(tjagtap) : [PH2][P1] Check for MAX_CONCURRENT_STREAMS
|
1209
|
+
// sent by peer before making a stream. Decide behaviour if we are
|
1210
|
+
// crossing this threshold.
|
1211
|
+
//
|
1212
|
+
// TODO(tjagtap) : [PH2][P1] : For a server we will have to do
|
1213
|
+
// this for incoming streams only. If a server receives more streams
|
1214
|
+
// from a client than is allowed by the clients settings, whether or
|
1215
|
+
// not we should fail is debatable.
|
1000
1216
|
const uint32_t stream_id = self->NextStreamId(std::get<0>(args));
|
1001
1217
|
return If(
|
1002
1218
|
self->MakeStream(call_handler, stream_id),
|