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.
Files changed (368) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +83 -41
  3. data/include/grpc/credentials.h +7 -1
  4. data/src/core/call/client_call.cc +4 -4
  5. data/src/core/call/filter_fusion.h +1230 -0
  6. data/src/core/call/metadata.cc +22 -0
  7. data/src/core/call/metadata.h +24 -2
  8. data/src/core/channelz/channelz.cc +10 -17
  9. data/src/core/channelz/channelz.h +58 -19
  10. data/src/core/channelz/channelz_registry.cc +0 -162
  11. data/src/core/channelz/channelz_registry.h +14 -7
  12. data/src/core/channelz/property_list.cc +19 -23
  13. data/src/core/channelz/property_list.h +3 -1
  14. data/src/core/channelz/v2tov1/convert.cc +683 -0
  15. data/src/core/channelz/v2tov1/convert.h +58 -0
  16. data/src/core/channelz/v2tov1/legacy_api.cc +425 -0
  17. data/src/core/channelz/v2tov1/legacy_api.h +32 -0
  18. data/src/core/channelz/v2tov1/property_list.cc +118 -0
  19. data/src/core/channelz/v2tov1/property_list.h +52 -0
  20. data/src/core/client_channel/client_channel_filter.cc +5 -4
  21. data/src/core/client_channel/client_channel_filter.h +2 -2
  22. data/src/core/client_channel/client_channel_internal.h +2 -1
  23. data/src/core/client_channel/load_balanced_call_destination.cc +6 -5
  24. data/src/core/client_channel/subchannel.cc +14 -6
  25. data/src/core/client_channel/subchannel.h +2 -0
  26. data/src/core/config/core_configuration.cc +3 -1
  27. data/src/core/config/core_configuration.h +12 -0
  28. data/src/core/credentials/transport/alts/alts_credentials.cc +5 -0
  29. data/src/core/credentials/transport/alts/check_gcp_environment_windows.cc +2 -0
  30. data/src/core/credentials/transport/channel_creds_registry_init.cc +3 -1
  31. data/src/core/credentials/transport/ssl/ssl_credentials.cc +1 -1
  32. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +8 -3
  33. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +29 -24
  34. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +19 -8
  35. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +96 -54
  36. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +15 -2
  37. data/src/core/credentials/transport/tls/spiffe_utils.cc +371 -0
  38. data/src/core/credentials/transport/tls/spiffe_utils.h +171 -0
  39. data/src/core/credentials/transport/tls/ssl_utils.cc +11 -10
  40. data/src/core/credentials/transport/tls/ssl_utils.h +4 -2
  41. data/src/core/credentials/transport/tls/tls_credentials.cc +2 -0
  42. data/src/core/credentials/transport/tls/tls_security_connector.cc +11 -26
  43. data/src/core/credentials/transport/tls/tls_security_connector.h +12 -12
  44. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +1 -2
  45. data/src/core/ext/filters/http/client/http_client_filter.cc +3 -6
  46. data/src/core/ext/filters/http/client_authority_filter.cc +1 -2
  47. data/src/core/ext/filters/http/message_compress/compression_filter.cc +8 -8
  48. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -6
  49. data/src/core/ext/filters/message_size/message_size_filter.cc +4 -4
  50. data/src/core/ext/filters/rbac/rbac_filter.cc +1 -1
  51. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +3 -5
  52. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +3 -2
  53. data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -0
  54. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -0
  55. data/src/core/ext/transport/chttp2/transport/frame.cc +89 -6
  56. data/src/core/ext/transport/chttp2/transport/frame.h +38 -0
  57. data/src/core/ext/transport/chttp2/transport/header_assembler.h +5 -14
  58. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +4 -1
  59. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +294 -78
  60. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +128 -9
  61. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +11 -38
  62. data/src/core/ext/transport/chttp2/transport/http2_settings.h +52 -35
  63. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +61 -0
  64. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +142 -0
  65. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +81 -3
  66. data/src/core/ext/transport/chttp2/transport/http2_transport.h +12 -1
  67. data/src/core/ext/transport/chttp2/transport/message_assembler.h +2 -2
  68. data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -1
  69. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +2 -1
  70. data/src/core/ext/transport/chttp2/transport/ping_promise.h +22 -5
  71. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +607 -0
  72. data/src/core/ext/transport/chttp2/transport/writable_streams.h +254 -0
  73. data/src/core/ext/transport/chttp2/transport/writing.cc +6 -4
  74. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb.h +4959 -0
  75. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb_minitable.c +1111 -0
  76. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb_minitable.h +108 -0
  77. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb.h +142 -54
  78. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.c +18 -14
  79. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.h +2 -2
  80. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.c +716 -0
  81. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.h +227 -0
  82. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.c +86 -88
  83. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.h +2 -2
  84. data/src/core/filter/auth/auth_filters.h +2 -2
  85. data/src/core/filter/fused_filters.cc +154 -0
  86. data/src/core/handshaker/security/legacy_secure_endpoint.cc +1 -1
  87. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +965 -0
  88. data/src/core/handshaker/security/secure_endpoint.cc +28 -13
  89. data/src/core/handshaker/security/secure_endpoint.h +8 -0
  90. data/src/core/lib/channel/promise_based_filter.cc +15 -25
  91. data/src/core/lib/channel/promise_based_filter.h +6 -5
  92. data/src/core/lib/event_engine/ares_resolver.h +3 -1
  93. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +9 -5
  94. data/src/core/lib/event_engine/cf_engine/cf_engine.h +2 -1
  95. data/src/core/lib/event_engine/cf_engine/cfsocket_listener.cc +263 -0
  96. data/src/core/lib/event_engine/cf_engine/cfsocket_listener.h +107 -0
  97. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +31 -3
  98. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +12 -0
  99. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +12 -10
  100. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +6 -4
  101. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +15 -14
  102. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +7 -5
  103. data/src/core/lib/event_engine/posix_engine/event_poller.h +0 -8
  104. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +11 -5
  105. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.h +3 -2
  106. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +1 -0
  107. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +4 -4
  108. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +3 -4
  109. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +2 -2
  110. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +188 -199
  111. data/src/core/lib/event_engine/posix_engine/posix_engine.h +30 -45
  112. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +1 -1
  113. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +1 -1
  114. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +2 -1
  115. data/src/core/lib/experiments/experiments.cc +120 -6
  116. data/src/core/lib/experiments/experiments.h +46 -3
  117. data/src/core/lib/iomgr/combiner.cc +1 -1
  118. data/src/core/lib/iomgr/exec_ctx.h +3 -9
  119. data/src/core/lib/iomgr/socket_mutator.cc +1 -1
  120. data/src/core/lib/iomgr/socket_utils_posix.cc +1 -1
  121. data/src/core/lib/iomgr/socket_utils_posix.h +1 -1
  122. data/src/core/lib/iomgr/tcp_client_posix.cc +1 -1
  123. data/src/core/lib/iomgr/tcp_posix.cc +3 -3
  124. data/src/core/lib/promise/activity.h +2 -2
  125. data/src/core/lib/promise/mpsc.cc +8 -8
  126. data/src/core/lib/promise/party.cc +7 -7
  127. data/src/core/lib/promise/party.h +4 -4
  128. data/src/core/lib/promise/poll.h +10 -0
  129. data/src/core/lib/resource_quota/memory_quota.cc +90 -3
  130. data/src/core/lib/resource_quota/memory_quota.h +20 -9
  131. data/src/core/lib/resource_quota/periodic_update.cc +14 -0
  132. data/src/core/lib/resource_quota/periodic_update.h +8 -0
  133. data/src/core/lib/resource_quota/resource_quota.cc +15 -4
  134. data/src/core/lib/resource_quota/resource_quota.h +3 -0
  135. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +1 -2
  136. data/src/core/lib/surface/call.cc +5 -5
  137. data/src/core/lib/surface/call.h +6 -5
  138. data/src/core/lib/surface/completion_queue.cc +2 -4
  139. data/src/core/lib/surface/filter_stack_call.cc +1 -1
  140. data/src/core/lib/surface/version.cc +2 -2
  141. data/src/core/lib/transport/promise_endpoint.cc +2 -2
  142. data/src/core/lib/transport/promise_endpoint.h +3 -3
  143. data/src/core/load_balancing/endpoint_list.cc +29 -2
  144. data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +3 -3
  145. data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +1 -1
  146. data/src/core/load_balancing/pick_first/pick_first.cc +12 -5
  147. data/src/core/load_balancing/xds/xds_cluster_impl.cc +5 -3
  148. data/src/core/net/socket_mutator.cc +19 -0
  149. data/src/core/net/socket_mutator.h +25 -0
  150. data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -0
  151. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +6 -1
  152. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +2 -1
  153. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +8 -5
  154. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +2 -1
  155. data/src/core/resolver/xds/xds_dependency_manager.cc +1 -1
  156. data/src/core/server/server.cc +1 -1
  157. data/src/core/server/server_call_tracer_filter.cc +0 -66
  158. data/src/core/server/server_call_tracer_filter.h +64 -0
  159. data/src/core/server/server_config_selector_filter.cc +1 -1
  160. data/src/core/service_config/service_config_channel_arg_filter.cc +3 -60
  161. data/src/core/service_config/service_config_channel_arg_filter.h +82 -0
  162. data/src/core/telemetry/call_tracer.cc +20 -14
  163. data/src/core/telemetry/call_tracer.h +22 -17
  164. data/src/core/telemetry/metrics.h +8 -8
  165. data/src/core/telemetry/stats_data.cc +151 -151
  166. data/src/core/telemetry/stats_data.h +87 -87
  167. data/src/core/transport/auth_context.cc +20 -0
  168. data/src/core/transport/auth_context.h +4 -0
  169. data/src/core/transport/auth_context_comparator_registry.h +69 -0
  170. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +2 -3
  171. data/src/core/tsi/ssl_transport_security.cc +202 -32
  172. data/src/core/tsi/ssl_transport_security.h +19 -10
  173. data/src/core/tsi/ssl_transport_security_utils.cc +21 -0
  174. data/src/core/tsi/ssl_transport_security_utils.h +4 -0
  175. data/src/core/util/http_client/httpcli_security_connector.cc +3 -1
  176. data/src/core/util/latent_see.cc +178 -146
  177. data/src/core/util/latent_see.h +245 -188
  178. data/src/core/util/single_set_ptr.h +5 -2
  179. data/src/core/util/useful.h +91 -0
  180. data/src/core/util/windows/directory_reader.cc +1 -0
  181. data/src/core/util/windows/thd.cc +1 -3
  182. data/src/core/util/work_serializer.cc +1 -1
  183. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +32 -5
  184. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +5 -0
  185. data/src/core/xds/grpc/xds_certificate_provider.cc +5 -6
  186. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  187. data/src/ruby/lib/grpc/version.rb +1 -1
  188. data/third_party/cares/cares/include/ares.h +925 -460
  189. data/third_party/cares/cares/include/ares_dns.h +86 -71
  190. data/third_party/cares/cares/include/ares_dns_record.h +1118 -0
  191. data/third_party/cares/cares/include/ares_nameser.h +215 -189
  192. data/third_party/cares/cares/include/ares_version.h +37 -14
  193. data/third_party/cares/cares/src/lib/ares_addrinfo2hostent.c +305 -0
  194. data/third_party/cares/cares/src/lib/ares_addrinfo_localhost.c +245 -0
  195. data/third_party/cares/cares/src/lib/ares_android.c +216 -164
  196. data/third_party/cares/cares/src/lib/ares_android.h +25 -14
  197. data/third_party/cares/cares/src/lib/ares_cancel.c +68 -44
  198. data/third_party/cares/cares/src/lib/ares_close_sockets.c +137 -0
  199. data/third_party/cares/cares/src/lib/ares_conn.c +511 -0
  200. data/third_party/cares/cares/src/lib/ares_conn.h +196 -0
  201. data/third_party/cares/cares/src/lib/ares_cookie.c +461 -0
  202. data/third_party/cares/cares/src/lib/ares_data.c +93 -181
  203. data/third_party/cares/cares/src/lib/ares_data.h +50 -39
  204. data/third_party/cares/cares/src/lib/ares_destroy.c +127 -89
  205. data/third_party/cares/cares/src/lib/ares_free_hostent.c +35 -24
  206. data/third_party/cares/cares/src/lib/ares_free_string.c +24 -16
  207. data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +45 -38
  208. data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +549 -663
  209. data/third_party/cares/cares/src/lib/ares_getenv.c +25 -15
  210. data/third_party/cares/cares/src/lib/ares_getenv.h +26 -18
  211. data/third_party/cares/cares/src/lib/ares_gethostbyaddr.c +163 -221
  212. data/third_party/cares/cares/src/lib/ares_gethostbyname.c +222 -223
  213. data/third_party/cares/cares/src/lib/ares_getnameinfo.c +328 -338
  214. data/third_party/cares/cares/src/lib/ares_hosts_file.c +952 -0
  215. data/third_party/cares/cares/src/lib/ares_inet_net_pton.h +25 -19
  216. data/third_party/cares/cares/src/lib/ares_init.c +425 -2091
  217. data/third_party/cares/cares/src/lib/ares_ipv6.h +63 -33
  218. data/third_party/cares/cares/src/lib/ares_library_init.c +110 -54
  219. data/third_party/cares/cares/src/lib/ares_metrics.c +261 -0
  220. data/third_party/cares/cares/src/lib/ares_options.c +418 -332
  221. data/third_party/cares/cares/src/lib/ares_parse_into_addrinfo.c +179 -0
  222. data/third_party/cares/cares/src/lib/ares_private.h +558 -356
  223. data/third_party/cares/cares/src/lib/ares_process.c +1224 -1369
  224. data/third_party/cares/cares/src/lib/ares_qcache.c +430 -0
  225. data/third_party/cares/cares/src/lib/ares_query.c +126 -121
  226. data/third_party/cares/cares/src/lib/ares_search.c +564 -262
  227. data/third_party/cares/cares/src/lib/ares_send.c +264 -93
  228. data/third_party/cares/cares/src/lib/ares_set_socket_functions.c +588 -0
  229. data/third_party/cares/cares/src/lib/ares_setup.h +115 -111
  230. data/third_party/cares/cares/src/lib/ares_socket.c +425 -0
  231. data/third_party/cares/cares/src/lib/ares_socket.h +163 -0
  232. data/third_party/cares/cares/src/lib/ares_sortaddrinfo.c +447 -0
  233. data/third_party/cares/cares/src/lib/ares_strerror.c +83 -48
  234. data/third_party/cares/cares/src/lib/ares_sysconfig.c +639 -0
  235. data/third_party/cares/cares/src/lib/ares_sysconfig_files.c +839 -0
  236. data/third_party/cares/cares/src/lib/ares_sysconfig_mac.c +373 -0
  237. data/third_party/cares/cares/src/lib/ares_sysconfig_win.c +621 -0
  238. data/third_party/cares/cares/src/lib/ares_timeout.c +136 -73
  239. data/third_party/cares/cares/src/lib/ares_update_servers.c +1362 -0
  240. data/third_party/cares/cares/src/lib/ares_version.c +29 -4
  241. data/third_party/cares/cares/src/lib/config-dos.h +88 -89
  242. data/third_party/cares/cares/src/lib/config-win32.h +122 -77
  243. data/third_party/cares/cares/src/lib/dsa/ares_array.c +394 -0
  244. data/third_party/cares/cares/src/lib/dsa/ares_htable.c +447 -0
  245. data/third_party/cares/cares/src/lib/dsa/ares_htable.h +174 -0
  246. data/third_party/cares/cares/src/lib/dsa/ares_htable_asvp.c +224 -0
  247. data/third_party/cares/cares/src/lib/dsa/ares_htable_dict.c +228 -0
  248. data/third_party/cares/cares/src/lib/dsa/ares_htable_strvp.c +210 -0
  249. data/third_party/cares/cares/src/lib/dsa/ares_htable_szvp.c +188 -0
  250. data/third_party/cares/cares/src/lib/dsa/ares_htable_vpstr.c +186 -0
  251. data/third_party/cares/cares/src/lib/dsa/ares_htable_vpvp.c +194 -0
  252. data/third_party/cares/cares/src/lib/dsa/ares_llist.c +382 -0
  253. data/third_party/cares/cares/src/lib/dsa/ares_slist.c +479 -0
  254. data/third_party/cares/cares/src/lib/dsa/ares_slist.h +207 -0
  255. data/third_party/cares/cares/src/lib/event/ares_event.h +191 -0
  256. data/third_party/cares/cares/src/lib/event/ares_event_configchg.c +743 -0
  257. data/third_party/cares/cares/src/lib/event/ares_event_epoll.c +192 -0
  258. data/third_party/cares/cares/src/lib/event/ares_event_kqueue.c +248 -0
  259. data/third_party/cares/cares/src/lib/event/ares_event_poll.c +140 -0
  260. data/third_party/cares/cares/src/lib/event/ares_event_select.c +159 -0
  261. data/third_party/cares/cares/src/lib/event/ares_event_thread.c +567 -0
  262. data/third_party/cares/cares/src/lib/event/ares_event_wake_pipe.c +166 -0
  263. data/third_party/cares/cares/src/lib/event/ares_event_win32.c +978 -0
  264. data/third_party/cares/cares/src/lib/event/ares_event_win32.h +161 -0
  265. data/third_party/cares/cares/src/lib/include/ares_array.h +276 -0
  266. data/third_party/cares/cares/src/lib/include/ares_buf.h +732 -0
  267. data/third_party/cares/cares/src/lib/include/ares_htable_asvp.h +130 -0
  268. data/third_party/cares/cares/src/lib/include/ares_htable_dict.h +123 -0
  269. data/third_party/cares/cares/src/lib/include/ares_htable_strvp.h +130 -0
  270. data/third_party/cares/cares/src/lib/include/ares_htable_szvp.h +118 -0
  271. data/third_party/cares/cares/src/lib/include/ares_htable_vpstr.h +111 -0
  272. data/third_party/cares/cares/src/lib/include/ares_htable_vpvp.h +128 -0
  273. data/third_party/cares/cares/src/lib/include/ares_llist.h +239 -0
  274. data/third_party/cares/cares/src/lib/include/ares_mem.h +38 -0
  275. data/third_party/cares/cares/src/lib/include/ares_str.h +244 -0
  276. data/third_party/cares/cares/src/lib/inet_net_pton.c +202 -157
  277. data/third_party/cares/cares/src/lib/inet_ntop.c +87 -69
  278. data/third_party/cares/cares/src/lib/legacy/ares_create_query.c +78 -0
  279. data/third_party/cares/cares/src/lib/legacy/ares_expand_name.c +99 -0
  280. data/third_party/cares/cares/src/lib/legacy/ares_expand_string.c +107 -0
  281. data/third_party/cares/cares/src/lib/legacy/ares_fds.c +80 -0
  282. data/third_party/cares/cares/src/lib/legacy/ares_getsock.c +85 -0
  283. data/third_party/cares/cares/src/lib/legacy/ares_parse_a_reply.c +107 -0
  284. data/third_party/cares/cares/src/lib/legacy/ares_parse_aaaa_reply.c +109 -0
  285. data/third_party/cares/cares/src/lib/legacy/ares_parse_caa_reply.c +137 -0
  286. data/third_party/cares/cares/src/lib/legacy/ares_parse_mx_reply.c +110 -0
  287. data/third_party/cares/cares/src/lib/legacy/ares_parse_naptr_reply.c +132 -0
  288. data/third_party/cares/cares/src/lib/legacy/ares_parse_ns_reply.c +154 -0
  289. data/third_party/cares/cares/src/lib/legacy/ares_parse_ptr_reply.c +213 -0
  290. data/third_party/cares/cares/src/lib/legacy/ares_parse_soa_reply.c +115 -0
  291. data/third_party/cares/cares/src/lib/legacy/ares_parse_srv_reply.c +114 -0
  292. data/third_party/cares/cares/src/lib/legacy/ares_parse_txt_reply.c +144 -0
  293. data/third_party/cares/cares/src/lib/legacy/ares_parse_uri_reply.c +113 -0
  294. data/third_party/cares/cares/src/lib/record/ares_dns_mapping.c +982 -0
  295. data/third_party/cares/cares/src/lib/record/ares_dns_multistring.c +307 -0
  296. data/third_party/cares/cares/src/lib/record/ares_dns_multistring.h +72 -0
  297. data/third_party/cares/cares/src/lib/record/ares_dns_name.c +673 -0
  298. data/third_party/cares/cares/src/lib/record/ares_dns_parse.c +1329 -0
  299. data/third_party/cares/cares/src/lib/record/ares_dns_private.h +273 -0
  300. data/third_party/cares/cares/src/lib/record/ares_dns_record.c +1661 -0
  301. data/third_party/cares/cares/src/lib/record/ares_dns_write.c +1229 -0
  302. data/third_party/cares/cares/src/lib/str/ares_buf.c +1498 -0
  303. data/third_party/cares/cares/src/lib/str/ares_str.c +508 -0
  304. data/third_party/cares/cares/src/lib/str/ares_strsplit.c +90 -0
  305. data/third_party/cares/cares/src/lib/str/ares_strsplit.h +51 -0
  306. data/third_party/cares/cares/src/lib/thirdparty/apple/dnsinfo.h +122 -0
  307. data/third_party/cares/cares/src/lib/util/ares_iface_ips.c +628 -0
  308. data/third_party/cares/cares/src/lib/util/ares_iface_ips.h +139 -0
  309. data/third_party/cares/cares/src/lib/util/ares_math.c +158 -0
  310. data/third_party/cares/cares/src/lib/util/ares_math.h +45 -0
  311. data/third_party/cares/cares/src/lib/util/ares_rand.c +389 -0
  312. data/third_party/cares/cares/src/lib/util/ares_rand.h +36 -0
  313. data/third_party/cares/cares/src/lib/util/ares_threads.c +614 -0
  314. data/third_party/cares/cares/src/lib/util/ares_threads.h +60 -0
  315. data/third_party/cares/cares/src/lib/util/ares_time.h +48 -0
  316. data/third_party/cares/cares/src/lib/util/ares_timeval.c +95 -0
  317. data/third_party/cares/cares/src/lib/util/ares_uri.c +1626 -0
  318. data/third_party/cares/cares/src/lib/util/ares_uri.h +252 -0
  319. data/third_party/cares/cares/src/lib/windows_port.c +16 -9
  320. metadata +121 -49
  321. data/src/core/util/ring_buffer.h +0 -122
  322. data/third_party/cares/cares/include/ares_rules.h +0 -125
  323. data/third_party/cares/cares/src/lib/ares__addrinfo2hostent.c +0 -266
  324. data/third_party/cares/cares/src/lib/ares__addrinfo_localhost.c +0 -240
  325. data/third_party/cares/cares/src/lib/ares__close_sockets.c +0 -61
  326. data/third_party/cares/cares/src/lib/ares__get_hostent.c +0 -260
  327. data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +0 -229
  328. data/third_party/cares/cares/src/lib/ares__read_line.c +0 -73
  329. data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +0 -258
  330. data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +0 -507
  331. data/third_party/cares/cares/src/lib/ares__timeval.c +0 -111
  332. data/third_party/cares/cares/src/lib/ares_create_query.c +0 -197
  333. data/third_party/cares/cares/src/lib/ares_expand_name.c +0 -311
  334. data/third_party/cares/cares/src/lib/ares_expand_string.c +0 -67
  335. data/third_party/cares/cares/src/lib/ares_fds.c +0 -59
  336. data/third_party/cares/cares/src/lib/ares_getsock.c +0 -66
  337. data/third_party/cares/cares/src/lib/ares_iphlpapi.h +0 -221
  338. data/third_party/cares/cares/src/lib/ares_llist.c +0 -63
  339. data/third_party/cares/cares/src/lib/ares_llist.h +0 -39
  340. data/third_party/cares/cares/src/lib/ares_mkquery.c +0 -24
  341. data/third_party/cares/cares/src/lib/ares_nowarn.c +0 -260
  342. data/third_party/cares/cares/src/lib/ares_nowarn.h +0 -61
  343. data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +0 -90
  344. data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +0 -92
  345. data/third_party/cares/cares/src/lib/ares_parse_caa_reply.c +0 -199
  346. data/third_party/cares/cares/src/lib/ares_parse_mx_reply.c +0 -164
  347. data/third_party/cares/cares/src/lib/ares_parse_naptr_reply.c +0 -183
  348. data/third_party/cares/cares/src/lib/ares_parse_ns_reply.c +0 -177
  349. data/third_party/cares/cares/src/lib/ares_parse_ptr_reply.c +0 -228
  350. data/third_party/cares/cares/src/lib/ares_parse_soa_reply.c +0 -179
  351. data/third_party/cares/cares/src/lib/ares_parse_srv_reply.c +0 -168
  352. data/third_party/cares/cares/src/lib/ares_parse_txt_reply.c +0 -214
  353. data/third_party/cares/cares/src/lib/ares_parse_uri_reply.c +0 -184
  354. data/third_party/cares/cares/src/lib/ares_platform.c +0 -11042
  355. data/third_party/cares/cares/src/lib/ares_platform.h +0 -43
  356. data/third_party/cares/cares/src/lib/ares_rand.c +0 -279
  357. data/third_party/cares/cares/src/lib/ares_strcasecmp.c +0 -66
  358. data/third_party/cares/cares/src/lib/ares_strcasecmp.h +0 -30
  359. data/third_party/cares/cares/src/lib/ares_strdup.c +0 -42
  360. data/third_party/cares/cares/src/lib/ares_strdup.h +0 -24
  361. data/third_party/cares/cares/src/lib/ares_strsplit.c +0 -94
  362. data/third_party/cares/cares/src/lib/ares_strsplit.h +0 -42
  363. data/third_party/cares/cares/src/lib/ares_writev.c +0 -79
  364. data/third_party/cares/cares/src/lib/ares_writev.h +0 -36
  365. data/third_party/cares/cares/src/lib/bitncmp.c +0 -59
  366. data/third_party/cares/cares/src/lib/bitncmp.h +0 -26
  367. data/third_party/cares/cares/src/lib/setup_once.h +0 -554
  368. 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
- // TODO(tjagtap) : [PH2][P2] : Manage limits
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
- GRPC_HTTP2_CLIENT_DLOG << "Http2Transport ProcessHttp2SettingsFrame Factory";
319
- // TODO(tjagtap) : [PH2][P2] : Implement this.
320
- // Load into this.settings_
321
- // Take necessary actions as per settings that have changed.
322
- GRPC_HTTP2_CLIENT_DLOG
323
- << "Http2Transport ProcessHttp2SettingsFrame Promise { ack=" << frame.ack
324
- << ", settings length=" << frame.settings.size() << "}";
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
- if (!self->ping_manager_.AckPing(opaque)) {
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 Factory";
428
- // TODO(tjagtap) : [PH2][P2] : Implement this.
429
- GRPC_HTTP2_CLIENT_DLOG
430
- << "Http2Transport ProcessHttp2SecurityFrame Promise { payload="
431
- << frame.payload.JoinIntoString() << " }";
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
- if (self->incoming_header_in_progress_ &&
501
- (self->current_frame_header_.type != 9 /*Continuation*/ ||
502
- self->current_frame_header_.stream_id !=
503
- self->incoming_header_stream_id_)) {
504
- LOG(ERROR) << "Closing Connection " << header.ToString() << " "
505
- << kAssemblerContiguousSequenceError;
506
- return self->HandleError(Http2Status::Http2ConnectionError(
507
- Http2ErrorCode::kProtocolError,
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] Fix Settings workflow.
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
- // Convert a message to a Http2DataFrame and send the frame out.
919
- auto send_message =
920
- [self = RefAsSubclass<Http2ClientTransport>(),
921
- stream_id](MessageHandle message) mutable {
922
- // TODO(akshitpatel) : [PH2][P2] : Assuming one message per frame.
923
- // This will eventually change as more logic is added.
924
- SliceBuffer frame_payload;
925
- size_t payload_size = message->payload()->Length();
926
- AppendGrpcHeaderToSliceBuffer(frame_payload, message->flags(),
927
- payload_size);
928
- frame_payload.TakeAndAppend(*message->payload());
929
- Http2DataFrame frame{stream_id, /*end_stream*/ false,
930
- std::move(frame_payload)};
931
- GRPC_HTTP2_CLIENT_DLOG
932
- << "Http2ClientTransport CallOutboundLoop send_message";
933
- return self->EnqueueOutgoingFrame(std::move(frame));
934
- };
935
-
936
- SliceBuffer buf;
937
- encoder_.EncodeRawHeaders(*metadata.get(), buf);
938
- Http2Frame frame = Http2HeaderFrame{stream_id, /*end_headers*/ true,
939
- /*end_stream*/ false, std::move(buf)};
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
- Map(EnqueueOutgoingFrame(std::move(frame)),
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>(), stream_id]() mutable {
968
- // TODO(akshitpatel): [PH2][P2] : Figure out a way to send the end
969
- // of stream frame in the same frame as the last message.
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
- // TODO (akshitpatel) : [PH2][P2] :
999
- // Check for max concurrent streams.
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),