grpc 1.78.1 → 1.80.0

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 (426) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +22 -8
  3. data/include/grpc/credentials.h +47 -37
  4. data/include/grpc/credentials_cpp.h +39 -0
  5. data/include/grpc/event_engine/event_engine.h +8 -3
  6. data/include/grpc/grpc.h +4 -0
  7. data/include/grpc/impl/call.h +9 -0
  8. data/include/grpc/impl/channel_arg_names.h +7 -0
  9. data/include/grpc/module.modulemap +2 -0
  10. data/include/grpc/private_key_signer.h +104 -0
  11. data/include/grpc/support/port_platform.h +6 -0
  12. data/src/core/call/call_filters.h +101 -78
  13. data/src/core/call/call_spine.h +91 -68
  14. data/src/core/call/call_state.h +60 -4
  15. data/src/core/call/client_call.cc +9 -9
  16. data/src/core/call/client_call.h +1 -1
  17. data/src/core/call/metadata_batch.cc +2 -0
  18. data/src/core/call/metadata_batch.h +48 -1
  19. data/src/core/call/metadata_info.cc +35 -0
  20. data/src/core/call/metadata_info.h +2 -0
  21. data/src/core/call/simple_slice_based_metadata.h +2 -1
  22. data/src/core/channelz/channelz.cc +9 -6
  23. data/src/core/channelz/channelz.h +7 -4
  24. data/src/core/channelz/property_list.h +5 -0
  25. data/src/core/channelz/v2tov1/convert.cc +1 -1
  26. data/src/core/channelz/v2tov1/legacy_api.cc +164 -307
  27. data/src/core/client_channel/buffered_call.cc +7 -3
  28. data/src/core/client_channel/buffered_call.h +11 -5
  29. data/src/core/client_channel/client_channel.cc +106 -44
  30. data/src/core/client_channel/client_channel.h +3 -6
  31. data/src/core/client_channel/client_channel_filter.cc +90 -64
  32. data/src/core/client_channel/client_channel_filter.h +3 -6
  33. data/src/core/client_channel/client_channel_internal.h +5 -0
  34. data/src/core/client_channel/config_selector.h +17 -12
  35. data/src/core/client_channel/dynamic_filters.cc +8 -7
  36. data/src/core/client_channel/dynamic_filters.h +7 -5
  37. data/src/core/client_channel/retry_filter.cc +1 -1
  38. data/src/core/client_channel/retry_filter.h +2 -2
  39. data/src/core/client_channel/subchannel.cc +1682 -266
  40. data/src/core/client_channel/subchannel.h +411 -134
  41. data/src/core/client_channel/subchannel_stream_client.cc +22 -18
  42. data/src/core/client_channel/subchannel_stream_client.h +8 -9
  43. data/src/core/client_channel/subchannel_stream_limiter.cc +76 -0
  44. data/src/core/client_channel/subchannel_stream_limiter.h +51 -0
  45. data/src/core/config/config_vars.cc +9 -1
  46. data/src/core/config/config_vars.h +6 -0
  47. data/src/core/credentials/call/call_creds_registry.h +51 -22
  48. data/src/core/credentials/call/call_creds_registry_init.cc +86 -2
  49. data/src/core/credentials/call/external/aws_external_account_credentials.cc +2 -2
  50. data/src/core/credentials/call/external/external_account_credentials.cc +11 -4
  51. data/src/core/credentials/call/external/file_external_account_credentials.cc +2 -2
  52. data/src/core/credentials/transport/channel_creds_registry.h +71 -20
  53. data/src/core/credentials/transport/channel_creds_registry_init.cc +338 -29
  54. data/src/core/credentials/transport/ssl/ssl_credentials.cc +43 -24
  55. data/src/core/credentials/transport/ssl/ssl_credentials.h +7 -1
  56. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +2 -8
  57. data/src/core/credentials/transport/ssl/ssl_security_connector.h +4 -3
  58. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +25 -5
  59. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +7 -5
  60. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +181 -109
  61. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +55 -42
  62. data/src/core/credentials/transport/tls/grpc_tls_credentials_options.cc +28 -23
  63. data/src/core/credentials/transport/tls/grpc_tls_credentials_options.h +26 -23
  64. data/src/core/credentials/transport/tls/spiffe_utils.cc +2 -2
  65. data/src/core/credentials/transport/tls/ssl_utils.cc +18 -18
  66. data/src/core/credentials/transport/tls/ssl_utils.h +12 -10
  67. data/src/core/credentials/transport/tls/tls_security_connector.cc +106 -74
  68. data/src/core/credentials/transport/tls/tls_security_connector.h +12 -8
  69. data/src/core/credentials/transport/xds/xds_credentials.cc +76 -32
  70. data/src/core/credentials/transport/xds/xds_credentials.h +4 -2
  71. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +117 -35
  72. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +42 -4
  73. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +58 -29
  74. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +19 -11
  75. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +82 -25
  76. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +28 -3
  77. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.cc +9 -7
  78. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +1 -1
  79. data/src/core/ext/transport/chttp2/transport/call_tracer_wrapper.h +7 -1
  80. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +117 -67
  81. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +2 -0
  82. data/src/core/ext/transport/chttp2/transport/flow_control.h +11 -1
  83. data/src/core/ext/transport/chttp2/transport/frame.cc +2 -15
  84. data/src/core/ext/transport/chttp2/transport/frame.h +0 -4
  85. data/src/core/ext/transport/chttp2/transport/goaway.cc +17 -2
  86. data/src/core/ext/transport/chttp2/transport/goaway.h +27 -6
  87. data/src/core/ext/transport/chttp2/transport/header_assembler.h +8 -21
  88. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +101 -40
  89. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +95 -0
  90. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +923 -772
  91. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +406 -423
  92. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +1 -0
  93. data/src/core/ext/transport/chttp2/transport/http2_settings.h +8 -1
  94. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +25 -13
  95. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +71 -24
  96. data/src/core/ext/transport/chttp2/transport/http2_transport.h +25 -49
  97. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +2 -2
  98. data/src/core/ext/transport/chttp2/transport/incoming_metadata_tracker.h +29 -9
  99. data/src/core/ext/transport/chttp2/transport/internal.h +6 -2
  100. data/src/core/ext/transport/chttp2/transport/keepalive.cc +14 -20
  101. data/src/core/ext/transport/chttp2/transport/keepalive.h +9 -6
  102. data/src/core/ext/transport/chttp2/transport/parsing.cc +11 -0
  103. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +34 -74
  104. data/src/core/ext/transport/chttp2/transport/ping_promise.h +123 -79
  105. data/src/core/ext/transport/chttp2/transport/security_frame.h +233 -3
  106. data/src/core/ext/transport/chttp2/transport/stream.h +152 -73
  107. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +155 -85
  108. data/src/core/ext/transport/chttp2/transport/transport_common.h +0 -5
  109. data/src/core/ext/transport/chttp2/transport/writable_streams.h +8 -7
  110. data/src/core/ext/transport/chttp2/transport/write_cycle.cc +86 -0
  111. data/src/core/ext/transport/chttp2/transport/write_cycle.h +355 -0
  112. data/src/core/ext/transport/chttp2/transport/writing.cc +31 -29
  113. data/src/core/ext/upb-gen/cel/expr/checked.upb.h +1875 -0
  114. data/src/core/ext/upb-gen/cel/expr/checked.upb_minitable.c +409 -0
  115. data/src/core/ext/upb-gen/cel/expr/checked.upb_minitable.h +56 -0
  116. data/src/core/ext/upb-gen/cel/expr/syntax.upb.h +2223 -0
  117. data/src/core/ext/upb-gen/cel/expr/syntax.upb_minitable.c +489 -0
  118. data/src/core/ext/upb-gen/cel/expr/syntax.upb_minitable.h +60 -0
  119. data/src/core/ext/upb-gen/envoy/config/accesslog/v3/accesslog.upb.h +2 -1
  120. data/src/core/ext/upb-gen/envoy/config/bootstrap/v3/bootstrap.upb.h +130 -18
  121. data/src/core/ext/upb-gen/envoy/config/bootstrap/v3/bootstrap.upb_minitable.c +18 -13
  122. data/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb.h +70 -38
  123. data/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb_minitable.c +20 -17
  124. data/src/core/ext/upb-gen/envoy/config/common/matcher/v3/matcher.upb.h +26 -10
  125. data/src/core/ext/upb-gen/envoy/config/common/matcher/v3/matcher.upb_minitable.c +8 -7
  126. data/src/core/ext/upb-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upb.h +495 -0
  127. data/src/core/ext/upb-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upb_minitable.c +114 -0
  128. data/src/core/ext/upb-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upb_minitable.h +36 -0
  129. data/src/core/ext/upb-gen/envoy/config/core/v3/address.upb.h +26 -10
  130. data/src/core/ext/upb-gen/envoy/config/core/v3/address.upb_minitable.c +8 -7
  131. data/src/core/ext/upb-gen/envoy/config/core/v3/cel.upb.h +121 -0
  132. data/src/core/ext/upb-gen/envoy/config/core/v3/cel.upb_minitable.c +54 -0
  133. data/src/core/ext/upb-gen/envoy/config/core/v3/cel.upb_minitable.h +32 -0
  134. data/src/core/ext/upb-gen/envoy/config/core/v3/grpc_service.upb.h +143 -9
  135. data/src/core/ext/upb-gen/envoy/config/core/v3/grpc_service.upb_minitable.c +18 -6
  136. data/src/core/ext/upb-gen/envoy/config/core/v3/protocol.upb.h +112 -11
  137. data/src/core/ext/upb-gen/envoy/config/core/v3/protocol.upb_minitable.c +22 -9
  138. data/src/core/ext/upb-gen/envoy/config/core/v3/proxy_protocol.upb.h +276 -0
  139. data/src/core/ext/upb-gen/envoy/config/core/v3/proxy_protocol.upb_minitable.c +60 -5
  140. data/src/core/ext/upb-gen/envoy/config/core/v3/proxy_protocol.upb_minitable.h +4 -0
  141. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint_components.upb.h +72 -0
  142. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint_components.upb_minitable.c +23 -2
  143. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint_components.upb_minitable.h +2 -0
  144. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener.upb.h +129 -13
  145. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener.upb_minitable.c +36 -10
  146. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener.upb_minitable.h +2 -0
  147. data/src/core/ext/upb-gen/envoy/config/listener/v3/quic_config.upb.h +30 -0
  148. data/src/core/ext/upb-gen/envoy/config/listener/v3/quic_config.upb_minitable.c +5 -3
  149. data/src/core/ext/upb-gen/envoy/config/metrics/v3/metrics_service.upb.h +16 -0
  150. data/src/core/ext/upb-gen/envoy/config/metrics/v3/metrics_service.upb_minitable.c +4 -3
  151. data/src/core/ext/upb-gen/envoy/config/metrics/v3/stats.upb.h +31 -0
  152. data/src/core/ext/upb-gen/envoy/config/metrics/v3/stats.upb_minitable.c +5 -3
  153. data/src/core/ext/upb-gen/envoy/config/overload/v3/overload.upb.h +2 -1
  154. data/src/core/ext/upb-gen/envoy/config/rbac/v3/rbac.upb.h +63 -0
  155. data/src/core/ext/upb-gen/envoy/config/rbac/v3/rbac.upb_minitable.c +12 -7
  156. data/src/core/ext/upb-gen/envoy/config/route/v3/route.upb.h +97 -81
  157. data/src/core/ext/upb-gen/envoy/config/route/v3/route.upb_minitable.c +40 -23
  158. data/src/core/ext/upb-gen/envoy/config/route/v3/route_components.upb.h +604 -228
  159. data/src/core/ext/upb-gen/envoy/config/route/v3/route_components.upb_minitable.c +146 -100
  160. data/src/core/ext/upb-gen/envoy/config/tap/v3/common.upb.h +30 -0
  161. data/src/core/ext/upb-gen/envoy/config/tap/v3/common.upb_minitable.c +5 -3
  162. data/src/core/ext/upb-gen/envoy/config/trace/v3/opentelemetry.upb.h +35 -3
  163. data/src/core/ext/upb-gen/envoy/config/trace/v3/opentelemetry.upb_minitable.c +7 -4
  164. data/src/core/ext/upb-gen/envoy/config/trace/v3/zipkin.upb.h +66 -14
  165. data/src/core/ext/upb-gen/envoy/config/trace/v3/zipkin.upb_minitable.c +22 -11
  166. data/src/core/ext/upb-gen/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +87 -0
  167. data/src/core/ext/upb-gen/envoy/extensions/clusters/aggregate/v3/cluster.upb_minitable.c +29 -2
  168. data/src/core/ext/upb-gen/envoy/extensions/clusters/aggregate/v3/cluster.upb_minitable.h +2 -0
  169. data/src/core/ext/upb-gen/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +0 -1
  170. data/src/core/ext/upb-gen/envoy/extensions/filters/http/rbac/v3/rbac.upb_minitable.c +0 -1
  171. data/src/core/ext/upb-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h +20 -4
  172. data/src/core/ext/upb-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb_minitable.c +5 -4
  173. data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +239 -60
  174. data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb_minitable.c +59 -28
  175. data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb_minitable.h +2 -0
  176. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/call_credentials/access_token/v3/access_token_credentials.upb.h +89 -0
  177. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/call_credentials/access_token/v3/access_token_credentials.upb_minitable.c +50 -0
  178. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/call_credentials/access_token/v3/access_token_credentials.upb_minitable.h +32 -0
  179. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/tls/v3/tls_credentials.upb.h +135 -0
  180. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/tls/v3/tls_credentials.upb_minitable.c +53 -0
  181. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/tls/v3/tls_credentials.upb_minitable.h +32 -0
  182. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/xds/v3/xds_credentials.upb.h +105 -0
  183. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/xds/v3/xds_credentials.upb_minitable.c +51 -0
  184. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/xds/v3/xds_credentials.upb_minitable.h +32 -0
  185. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.h +32 -0
  186. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb_minitable.c +6 -3
  187. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/common/v3/common.upb.h +206 -0
  188. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/common/v3/common.upb_minitable.c +41 -8
  189. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/common/v3/common.upb_minitable.h +2 -0
  190. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/common.upb.h +64 -0
  191. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/common.upb_minitable.c +4 -3
  192. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +64 -0
  193. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/secret.upb_minitable.c +31 -5
  194. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/secret.upb_minitable.h +2 -0
  195. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +283 -14
  196. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +48 -11
  197. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +2 -0
  198. data/src/core/ext/upb-gen/envoy/type/http/v3/cookie.upb.h +144 -6
  199. data/src/core/ext/upb-gen/envoy/type/http/v3/cookie.upb_minitable.c +35 -7
  200. data/src/core/ext/upb-gen/envoy/type/http/v3/cookie.upb_minitable.h +2 -0
  201. data/src/core/ext/upb-gen/envoy/type/tracing/v3/custom_tag.upb.h +42 -21
  202. data/src/core/ext/upb-gen/envoy/type/tracing/v3/custom_tag.upb_minitable.c +9 -8
  203. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb.h +164 -1
  204. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.c +37 -6
  205. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.h +2 -0
  206. data/src/core/ext/upb-gen/xds/type/matcher/v3/cel.upb.h +0 -1
  207. data/src/core/ext/upb-gen/xds/type/matcher/v3/cel.upb_minitable.c +0 -1
  208. data/src/core/ext/upb-gen/xds/type/matcher/v3/http_inputs.upb.h +0 -1
  209. data/src/core/ext/upb-gen/xds/type/matcher/v3/http_inputs.upb_minitable.c +0 -1
  210. data/src/core/ext/upb-gen/xds/type/matcher/v3/matcher.upb.h +26 -11
  211. data/src/core/ext/upb-gen/xds/type/matcher/v3/matcher.upb_minitable.c +8 -8
  212. data/src/core/ext/upb-gen/xds/type/matcher/v3/string.upb.h +33 -0
  213. data/src/core/ext/upb-gen/xds/type/matcher/v3/string.upb_minitable.c +14 -3
  214. data/src/core/ext/upb-gen/xds/type/v3/cel.upb.h +90 -10
  215. data/src/core/ext/upb-gen/xds/type/v3/cel.upb_minitable.c +18 -7
  216. data/src/core/ext/upbdefs-gen/cel/expr/checked.upbdefs.c +248 -0
  217. data/src/core/ext/upbdefs-gen/cel/expr/checked.upbdefs.h +97 -0
  218. data/src/core/ext/upbdefs-gen/cel/expr/syntax.upbdefs.c +283 -0
  219. data/src/core/ext/upbdefs-gen/cel/expr/syntax.upbdefs.h +107 -0
  220. data/src/core/ext/upbdefs-gen/envoy/config/accesslog/v3/accesslog.upbdefs.c +213 -211
  221. data/src/core/ext/upbdefs-gen/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +635 -614
  222. data/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/cluster.upbdefs.c +1012 -1000
  223. data/src/core/ext/upbdefs-gen/envoy/config/common/matcher/v3/matcher.upbdefs.c +276 -273
  224. data/src/core/ext/upbdefs-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upbdefs.c +152 -0
  225. data/src/core/ext/upbdefs-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upbdefs.h +47 -0
  226. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/address.upbdefs.c +149 -144
  227. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/base.upbdefs.c +367 -370
  228. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/cel.upbdefs.c +63 -0
  229. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/cel.upbdefs.h +37 -0
  230. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/grpc_service.upbdefs.c +297 -284
  231. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/protocol.upbdefs.c +492 -469
  232. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/proxy_protocol.upbdefs.c +74 -43
  233. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/proxy_protocol.upbdefs.h +10 -0
  234. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/substitution_format_string.upbdefs.c +60 -59
  235. data/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +202 -184
  236. data/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +5 -0
  237. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/listener.upbdefs.c +354 -339
  238. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/listener.upbdefs.h +5 -0
  239. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/quic_config.upbdefs.c +28 -19
  240. data/src/core/ext/upbdefs-gen/envoy/config/metrics/v3/metrics_service.upbdefs.c +30 -27
  241. data/src/core/ext/upbdefs-gen/envoy/config/metrics/v3/stats.upbdefs.c +71 -66
  242. data/src/core/ext/upbdefs-gen/envoy/config/overload/v3/overload.upbdefs.c +94 -91
  243. data/src/core/ext/upbdefs-gen/envoy/config/rbac/v3/rbac.upbdefs.c +386 -369
  244. data/src/core/ext/upbdefs-gen/envoy/config/route/v3/route.upbdefs.c +60 -57
  245. data/src/core/ext/upbdefs-gen/envoy/config/route/v3/route_components.upbdefs.c +1974 -1884
  246. data/src/core/ext/upbdefs-gen/envoy/config/tap/v3/common.upbdefs.c +119 -112
  247. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/opentelemetry.upbdefs.c +62 -51
  248. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/zipkin.upbdefs.c +109 -88
  249. data/src/core/ext/upbdefs-gen/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +54 -36
  250. data/src/core/ext/upbdefs-gen/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +5 -0
  251. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +78 -84
  252. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c +48 -46
  253. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +1041 -984
  254. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +5 -0
  255. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +304 -290
  256. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +94 -77
  257. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +5 -0
  258. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +246 -193
  259. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +5 -0
  260. data/src/core/ext/upbdefs-gen/envoy/type/http/v3/cookie.upbdefs.c +37 -23
  261. data/src/core/ext/upbdefs-gen/envoy/type/http/v3/cookie.upbdefs.h +5 -0
  262. data/src/core/ext/upbdefs-gen/envoy/type/tracing/v3/custom_tag.upbdefs.c +5 -3
  263. data/src/core/ext/upbdefs-gen/google/api/http.upbdefs.c +4 -4
  264. data/src/core/ext/upbdefs-gen/google/api/httpbody.upbdefs.c +4 -5
  265. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.c +113 -87
  266. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.h +5 -0
  267. data/src/core/ext/upbdefs-gen/udpa/annotations/migrate.upbdefs.c +5 -5
  268. data/src/core/ext/upbdefs-gen/udpa/annotations/security.upbdefs.c +6 -5
  269. data/src/core/ext/upbdefs-gen/udpa/annotations/sensitive.upbdefs.c +5 -5
  270. data/src/core/ext/upbdefs-gen/udpa/annotations/status.upbdefs.c +5 -5
  271. data/src/core/ext/upbdefs-gen/udpa/annotations/versioning.upbdefs.c +5 -5
  272. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/cel.upbdefs.c +25 -30
  273. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/http_inputs.upbdefs.c +14 -20
  274. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/matcher.upbdefs.c +180 -183
  275. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/string.upbdefs.c +56 -47
  276. data/src/core/ext/upbdefs-gen/xds/type/v3/cel.upbdefs.c +69 -47
  277. data/src/core/filter/filter_chain.h +95 -0
  278. data/src/core/handshaker/http_connect/{http_connect_handshaker.cc → http_connect_client_handshaker.cc} +32 -31
  279. data/src/core/handshaker/http_connect/{http_connect_handshaker.h → http_connect_client_handshaker.h} +4 -4
  280. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +1 -1
  281. data/src/core/handshaker/http_connect/xds_http_proxy_mapper.cc +1 -1
  282. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +14 -13
  283. data/src/core/handshaker/security/secure_endpoint.cc +282 -68
  284. data/src/core/handshaker/security/secure_endpoint.h +0 -7
  285. data/src/core/lib/channel/channel_args.h +1 -1
  286. data/src/core/lib/channel/promise_based_filter.cc +17 -4
  287. data/src/core/lib/channel/promise_based_filter.h +3 -2
  288. data/src/core/lib/debug/trace_flags.cc +2 -0
  289. data/src/core/lib/debug/trace_flags.h +1 -0
  290. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +35 -8
  291. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +1 -2
  292. data/src/core/lib/event_engine/event_engine.cc +9 -0
  293. data/src/core/lib/event_engine/extensions/tcp_trace.h +0 -3
  294. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +2 -2
  295. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +1 -1
  296. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +34 -9
  297. data/src/core/lib/event_engine/posix_engine/posix_engine.h +24 -2
  298. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +1 -3
  299. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +141 -14
  300. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +19 -2
  301. data/src/core/lib/event_engine/posix_engine/posix_interface.h +7 -0
  302. data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +21 -3
  303. data/src/core/lib/event_engine/posix_engine/posix_interface_windows.cc +16 -0
  304. data/src/core/lib/experiments/experiments.cc +309 -201
  305. data/src/core/lib/experiments/experiments.h +141 -80
  306. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +2 -2
  307. data/src/core/lib/iomgr/resolve_address.h +0 -2
  308. data/src/core/lib/iomgr/resolved_address.h +0 -2
  309. data/src/core/lib/iomgr/tcp_posix.cc +13 -5
  310. data/src/core/lib/iomgr/tcp_server.cc +0 -5
  311. data/src/core/lib/iomgr/tcp_server.h +0 -7
  312. data/src/core/lib/iomgr/tcp_server_posix.cc +0 -17
  313. data/src/core/lib/iomgr/tcp_server_utils_posix.h +0 -3
  314. data/src/core/lib/iomgr/tcp_server_windows.cc +12 -51
  315. data/src/core/lib/promise/all_ok.h +17 -12
  316. data/src/core/lib/promise/cancel_callback.h +12 -13
  317. data/src/core/lib/promise/detail/join_state.h +626 -0
  318. data/src/core/lib/promise/detail/promise_factory.h +14 -14
  319. data/src/core/lib/promise/for_each.h +32 -8
  320. data/src/core/lib/promise/if.h +9 -7
  321. data/src/core/lib/promise/loop.h +18 -16
  322. data/src/core/lib/promise/map.h +54 -47
  323. data/src/core/lib/promise/mpsc.h +11 -10
  324. data/src/core/lib/promise/observable.h +6 -6
  325. data/src/core/lib/promise/party.h +25 -19
  326. data/src/core/lib/promise/poll.h +5 -5
  327. data/src/core/lib/promise/prioritized_race.h +10 -7
  328. data/src/core/lib/promise/promise.h +16 -11
  329. data/src/core/lib/promise/race.h +6 -5
  330. data/src/core/lib/promise/seq.h +109 -74
  331. data/src/core/lib/promise/try_join.h +14 -6
  332. data/src/core/lib/promise/try_seq.h +76 -60
  333. data/src/core/lib/resource_quota/api.cc +7 -0
  334. data/src/core/lib/resource_quota/arena.h +1 -1
  335. data/src/core/lib/resource_quota/memory_quota.cc +4 -1
  336. data/src/core/lib/resource_quota/resource_quota.cc +2 -1
  337. data/src/core/lib/resource_quota/resource_quota.h +3 -0
  338. data/src/core/lib/resource_quota/stream_quota.cc +77 -1
  339. data/src/core/lib/resource_quota/stream_quota.h +64 -1
  340. data/src/core/lib/resource_quota/telemetry.h +1 -1
  341. data/src/core/lib/surface/call.cc +13 -0
  342. data/src/core/lib/surface/call_utils.h +58 -43
  343. data/src/core/lib/surface/channel.h +1 -4
  344. data/src/core/lib/surface/completion_queue.cc +13 -6
  345. data/src/core/lib/surface/validate_metadata.cc +20 -15
  346. data/src/core/lib/surface/validate_metadata.h +3 -1
  347. data/src/core/lib/surface/version.cc +2 -2
  348. data/src/core/lib/transport/promise_endpoint.cc +1 -1
  349. data/src/core/lib/transport/promise_endpoint.h +1 -1
  350. data/src/core/lib/transport/transport.h +5 -0
  351. data/src/core/load_balancing/health_check_client.cc +1 -15
  352. data/src/core/load_balancing/health_check_client_internal.h +0 -2
  353. data/src/core/load_balancing/oob_backend_metric.cc +1 -5
  354. data/src/core/load_balancing/oob_backend_metric_internal.h +0 -1
  355. data/src/core/load_balancing/xds/xds_cluster_impl.cc +12 -9
  356. data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -2
  357. data/src/core/resolver/xds/xds_resolver.cc +162 -116
  358. data/src/core/server/server.cc +18 -1
  359. data/src/core/server/server.h +2 -0
  360. data/src/core/server/xds_server_config_fetcher.cc +4 -4
  361. data/src/core/telemetry/call_tracer.cc +87 -2
  362. data/src/core/telemetry/call_tracer.h +46 -8
  363. data/src/core/telemetry/instrument.cc +102 -40
  364. data/src/core/telemetry/instrument.h +246 -65
  365. data/src/core/tsi/fake_transport_security.cc +3 -1
  366. data/src/core/tsi/ssl_transport_security.cc +516 -137
  367. data/src/core/tsi/ssl_transport_security.h +28 -22
  368. data/src/core/tsi/ssl_transport_security_utils.cc +2 -2
  369. data/src/core/tsi/ssl_transport_security_utils.h +2 -2
  370. data/src/core/util/bitset.h +6 -0
  371. data/src/core/util/function_signature.h +3 -1
  372. data/src/core/util/http_client/httpcli_security_connector.cc +2 -1
  373. data/src/core/util/json/json_reader.cc +0 -4
  374. data/src/core/xds/grpc/certificate_provider_store.cc +2 -1
  375. data/src/core/xds/grpc/certificate_provider_store.h +3 -17
  376. data/src/core/xds/grpc/certificate_provider_store_interface.h +61 -0
  377. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +48 -0
  378. data/src/core/xds/grpc/xds_bootstrap_grpc.h +18 -0
  379. data/src/core/xds/grpc/xds_certificate_provider.cc +7 -2
  380. data/src/core/xds/grpc/xds_certificate_provider.h +13 -2
  381. data/src/core/xds/grpc/xds_client_grpc.cc +13 -6
  382. data/src/core/xds/grpc/xds_client_grpc.h +10 -7
  383. data/src/core/xds/grpc/xds_cluster.cc +18 -4
  384. data/src/core/xds/grpc/xds_cluster.h +17 -2
  385. data/src/core/xds/grpc/xds_cluster_parser.cc +36 -11
  386. data/src/core/xds/grpc/xds_common_types.cc +45 -0
  387. data/src/core/xds/grpc/xds_common_types.h +31 -0
  388. data/src/core/xds/grpc/xds_common_types_parser.cc +274 -16
  389. data/src/core/xds/grpc/xds_common_types_parser.h +12 -0
  390. data/src/core/xds/grpc/xds_http_fault_filter.cc +128 -24
  391. data/src/core/xds/grpc/xds_http_fault_filter.h +19 -10
  392. data/src/core/xds/grpc/xds_http_filter.cc +38 -0
  393. data/src/core/xds/grpc/xds_http_filter.h +70 -47
  394. data/src/core/xds/grpc/xds_http_filter_registry.cc +48 -14
  395. data/src/core/xds/grpc/xds_http_filter_registry.h +29 -15
  396. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +88 -22
  397. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +22 -11
  398. data/src/core/xds/grpc/xds_http_rbac_filter.cc +36 -20
  399. data/src/core/xds/grpc/xds_http_rbac_filter.h +19 -10
  400. data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +143 -26
  401. data/src/core/xds/grpc/xds_http_stateful_session_filter.h +19 -10
  402. data/src/core/xds/grpc/xds_listener.cc +4 -1
  403. data/src/core/xds/grpc/xds_listener.h +10 -2
  404. data/src/core/xds/grpc/xds_listener_parser.cc +23 -18
  405. data/src/core/xds/grpc/xds_matcher.cc +40 -5
  406. data/src/core/xds/grpc/xds_matcher.h +13 -0
  407. data/src/core/xds/grpc/xds_matcher_action.h +1 -1
  408. data/src/core/xds/grpc/xds_matcher_parse.cc +60 -40
  409. data/src/core/xds/grpc/xds_matcher_parse.h +2 -1
  410. data/src/core/xds/grpc/xds_route_config.cc +12 -1
  411. data/src/core/xds/grpc/xds_route_config.h +15 -2
  412. data/src/core/xds/grpc/xds_route_config_parser.cc +11 -5
  413. data/src/core/xds/grpc/xds_routing.cc +181 -6
  414. data/src/core/xds/grpc/xds_routing.h +57 -0
  415. data/src/core/xds/grpc/xds_server_grpc.cc +55 -43
  416. data/src/core/xds/grpc/xds_server_grpc.h +13 -6
  417. data/src/core/xds/grpc/xds_server_grpc_interface.h +3 -2
  418. data/src/core/xds/grpc/xds_transport_grpc.cc +12 -6
  419. data/src/core/xds/grpc/xds_transport_grpc.h +5 -1
  420. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +12 -8
  421. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +18 -12
  422. data/src/ruby/lib/grpc/version.rb +1 -1
  423. data/src/ruby/pb/generate_proto_ruby.sh +1 -1
  424. metadata +42 -6
  425. data/src/core/ext/transport/chttp2/transport/security_frame.cc +0 -31
  426. data/src/core/handshaker/security/legacy_secure_endpoint.cc +0 -597
@@ -17,6 +17,9 @@
17
17
 
18
18
  #include <grpc/support/port_platform.h>
19
19
 
20
+ #include <type_traits>
21
+ #include <utility>
22
+
20
23
  #include "src/core/call/call_arena_allocator.h"
21
24
  #include "src/core/call/call_filters.h"
22
25
  #include "src/core/call/channelz_context.h"
@@ -61,15 +64,15 @@ class CallSpine final : public Party, public channelz::DataSource {
61
64
  // Add a callback to be called when server trailing metadata is received and
62
65
  // return true.
63
66
  // If CallOnDone has already been invoked, does nothing and returns false.
64
- GRPC_MUST_USE_RESULT bool OnDone(absl::AnyInvocable<void(bool)> fn) {
67
+ GRPC_MUST_USE_RESULT bool OnDone(absl::AnyInvocable<void(bool)>&& fn) {
65
68
  if (call_filters().WasServerTrailingMetadataPulled()) {
66
69
  return false;
67
70
  }
68
71
  if (on_done_ == nullptr) {
69
- on_done_ = std::move(fn);
72
+ on_done_ = std::forward<absl::AnyInvocable<void(bool)>>(fn);
70
73
  return true;
71
74
  }
72
- on_done_ = [first = std::move(fn),
75
+ on_done_ = [first = std::forward<absl::AnyInvocable<void(bool)>>(fn),
73
76
  next = std::move(on_done_)](bool cancelled) mutable {
74
77
  first(cancelled);
75
78
  next(cancelled);
@@ -136,11 +139,11 @@ class CallSpine final : public Party, public channelz::DataSource {
136
139
  // the rest of the call.
137
140
  // The resulting (returned) promise will resolve to Empty.
138
141
  template <typename Promise>
139
- auto CancelIfFails(Promise promise) {
142
+ auto CancelIfFails(Promise&& promise) {
140
143
  GRPC_DCHECK(GetContext<Activity>() == this);
141
- using P = promise_detail::PromiseLike<Promise>;
144
+ using P = promise_detail::PromiseLike<std::decay_t<Promise>>;
142
145
  using ResultType = typename P::Result;
143
- return Map(std::move(promise),
146
+ return Map(std::forward<Promise>(promise),
144
147
  [self = RefAsSubclass<CallSpine>()](ResultType r) {
145
148
  self->CancelIfFailed(r);
146
149
  });
@@ -160,48 +163,54 @@ class CallSpine final : public Party, public channelz::DataSource {
160
163
  // Spawn a promise that returns Empty{} and save some boilerplate handling
161
164
  // that detail.
162
165
  template <typename PromiseFactory>
163
- void SpawnInfallible(absl::string_view name, PromiseFactory promise_factory) {
164
- Spawn(name, std::move(promise_factory), [](Empty) {});
166
+ void SpawnInfallible(absl::string_view name,
167
+ PromiseFactory&& promise_factory) {
168
+ Spawn(name, std::forward<PromiseFactory>(promise_factory), [](Empty) {});
165
169
  }
166
170
 
167
171
  // Spawn a promise that returns some status-like type; if the status
168
172
  // represents failure automatically cancel the rest of the call.
169
173
  template <typename PromiseFactory>
170
- void SpawnGuarded(absl::string_view name, PromiseFactory promise_factory,
174
+ void SpawnGuarded(absl::string_view name, PromiseFactory&& promise_factory,
171
175
  DebugLocation whence = {}) {
172
176
  using FactoryType =
173
- promise_detail::OncePromiseFactory<void, PromiseFactory>;
177
+ promise_detail::OncePromiseFactory<void, std::decay_t<PromiseFactory>>;
174
178
  using PromiseType = typename FactoryType::Promise;
175
179
  using ResultType = typename PromiseType::Result;
176
180
  static_assert(
177
181
  std::is_same<bool,
178
182
  decltype(IsStatusOk(std::declval<ResultType>()))>::value,
179
183
  "SpawnGuarded promise must return a status-like object");
180
- Spawn(name, std::move(promise_factory), [this, whence](ResultType r) {
181
- if (!IsStatusOk(r)) {
182
- GRPC_TRACE_LOG(promise_primitives, INFO)
183
- << "SpawnGuarded sees failure: " << r
184
- << " (source: " << whence.file() << ":" << whence.line() << ")";
185
- auto status = StatusCast<ServerMetadataHandle>(std::move(r));
186
- status->Set(GrpcCallWasCancelled(), true);
187
- PushServerTrailingMetadata(std::move(status));
188
- }
189
- });
184
+ Spawn(name, std::forward<PromiseFactory>(promise_factory),
185
+ [this, whence](ResultType&& r) {
186
+ if (!IsStatusOk(r)) {
187
+ GRPC_TRACE_LOG(promise_primitives, INFO)
188
+ << "SpawnGuarded sees failure: " << r
189
+ << " (source: " << whence.file() << ":" << whence.line()
190
+ << ")";
191
+ auto status =
192
+ StatusCast<ServerMetadataHandle>(std::forward<ResultType>(r));
193
+ status->Set(GrpcCallWasCancelled(), true);
194
+ PushServerTrailingMetadata(std::move(status));
195
+ }
196
+ });
190
197
  }
191
198
 
192
199
  // Wrap a promise so that if the call completes that promise is cancelled.
193
200
  template <typename Promise>
194
- auto UntilCallCompletes(Promise promise) {
195
- using Result = PromiseResult<Promise>;
196
- return PrioritizedRace(std::move(promise), Map(WasCancelled(), [](bool) {
201
+ auto UntilCallCompletes(Promise&& promise) {
202
+ using Result = PromiseResult<std::decay_t<Promise>>;
203
+ return PrioritizedRace(std::forward<Promise>(promise),
204
+ Map(WasCancelled(), [](bool) {
197
205
  return FailureStatusCast<Result>(Failure{});
198
206
  }));
199
207
  }
200
208
 
201
209
  template <typename PromiseFactory>
202
210
  void SpawnGuardedUntilCallCompletes(absl::string_view name,
203
- PromiseFactory promise_factory) {
204
- SpawnGuarded(name, [this, promise_factory]() mutable {
211
+ PromiseFactory&& promise_factory) {
212
+ SpawnGuarded(name, [this, promise_factory = std::forward<PromiseFactory>(
213
+ promise_factory)]() mutable {
205
214
  return UntilCallCompletes(promise_factory());
206
215
  });
207
216
  }
@@ -353,9 +362,9 @@ class CallInitiator {
353
362
  // the rest of the call.
354
363
  // The resulting (returned) promise will resolve to Empty.
355
364
  template <typename Promise>
356
- auto CancelIfFails(Promise promise) {
365
+ auto CancelIfFails(Promise&& promise) {
357
366
  GRPC_DCHECK_NE(spine_.get(), nullptr);
358
- return spine_->CancelIfFails(std::move(promise));
367
+ return spine_->CancelIfFails(std::forward<Promise>(promise));
359
368
  }
360
369
 
361
370
  auto PullServerInitialMetadata() {
@@ -419,40 +428,44 @@ class CallInitiator {
419
428
  spine_->SpawnCancel();
420
429
  }
421
430
 
422
- GRPC_MUST_USE_RESULT bool OnDone(absl::AnyInvocable<void(bool)> fn) {
431
+ GRPC_MUST_USE_RESULT bool OnDone(absl::AnyInvocable<void(bool)>&& fn) {
423
432
  GRPC_DCHECK_NE(spine_.get(), nullptr);
424
- return spine_->OnDone(std::move(fn));
433
+ return spine_->OnDone(std::forward<absl::AnyInvocable<void(bool)>>(fn));
425
434
  }
426
435
 
427
436
  template <typename Promise>
428
- auto UntilCallCompletes(Promise promise) {
437
+ auto UntilCallCompletes(Promise&& promise) {
429
438
  GRPC_DCHECK_NE(spine_.get(), nullptr);
430
- return spine_->UntilCallCompletes(std::move(promise));
439
+ return spine_->UntilCallCompletes(std::forward<Promise>(promise));
431
440
  }
432
441
 
433
442
  template <typename PromiseFactory>
434
- void SpawnGuarded(absl::string_view name, PromiseFactory promise_factory) {
443
+ void SpawnGuarded(absl::string_view name, PromiseFactory&& promise_factory) {
435
444
  GRPC_DCHECK_NE(spine_.get(), nullptr);
436
- spine_->SpawnGuarded(name, std::move(promise_factory));
445
+ spine_->SpawnGuarded(name, std::forward<PromiseFactory>(promise_factory));
437
446
  }
438
447
 
439
448
  template <typename PromiseFactory>
440
449
  void SpawnGuardedUntilCallCompletes(absl::string_view name,
441
- PromiseFactory promise_factory) {
450
+ PromiseFactory&& promise_factory) {
442
451
  GRPC_DCHECK_NE(spine_.get(), nullptr);
443
- spine_->SpawnGuardedUntilCallCompletes(name, std::move(promise_factory));
452
+ spine_->SpawnGuardedUntilCallCompletes(
453
+ name, std::forward<PromiseFactory>(promise_factory));
444
454
  }
445
455
 
446
456
  template <typename PromiseFactory>
447
- void SpawnInfallible(absl::string_view name, PromiseFactory promise_factory) {
457
+ void SpawnInfallible(absl::string_view name,
458
+ PromiseFactory&& promise_factory) {
448
459
  GRPC_DCHECK_NE(spine_.get(), nullptr);
449
- spine_->SpawnInfallible(name, std::move(promise_factory));
460
+ spine_->SpawnInfallible(name,
461
+ std::forward<PromiseFactory>(promise_factory));
450
462
  }
451
463
 
452
464
  template <typename PromiseFactory>
453
- auto SpawnWaitable(absl::string_view name, PromiseFactory promise_factory) {
465
+ auto SpawnWaitable(absl::string_view name, PromiseFactory&& promise_factory) {
454
466
  GRPC_DCHECK_NE(spine_.get(), nullptr);
455
- return spine_->SpawnWaitable(name, std::move(promise_factory));
467
+ return spine_->SpawnWaitable(name,
468
+ std::forward<PromiseFactory>(promise_factory));
456
469
  }
457
470
 
458
471
  bool WasCancelledPushed() const {
@@ -501,16 +514,16 @@ class CallHandler {
501
514
  spine_->SpawnPushServerTrailingMetadata(std::move(status));
502
515
  }
503
516
 
504
- GRPC_MUST_USE_RESULT bool OnDone(absl::AnyInvocable<void(bool)> fn) {
505
- return spine_->OnDone(std::move(fn));
517
+ GRPC_MUST_USE_RESULT bool OnDone(absl::AnyInvocable<void(bool)>&& fn) {
518
+ return spine_->OnDone(std::forward<absl::AnyInvocable<void(bool)>>(fn));
506
519
  }
507
520
 
508
521
  // Wrap a promise so that if it returns failure it automatically cancels
509
522
  // the rest of the call.
510
523
  // The resulting (returned) promise will resolve to Empty.
511
524
  template <typename Promise>
512
- auto CancelIfFails(Promise promise) {
513
- return spine_->CancelIfFails(std::move(promise));
525
+ auto CancelIfFails(Promise&& promise) {
526
+ return spine_->CancelIfFails(std::forward<Promise>(promise));
514
527
  }
515
528
 
516
529
  auto PushMessage(MessageHandle message) {
@@ -530,30 +543,35 @@ class CallHandler {
530
543
  }
531
544
 
532
545
  template <typename Promise>
533
- auto UntilCallCompletes(Promise promise) {
534
- return spine_->UntilCallCompletes(std::move(promise));
546
+ auto UntilCallCompletes(Promise&& promise) {
547
+ return spine_->UntilCallCompletes(std::forward<Promise>(promise));
535
548
  }
536
549
 
537
550
  template <typename PromiseFactory>
538
- void SpawnGuarded(absl::string_view name, PromiseFactory promise_factory,
551
+ void SpawnGuarded(absl::string_view name, PromiseFactory&& promise_factory,
539
552
  DebugLocation whence = {}) {
540
- spine_->SpawnGuarded(name, std::move(promise_factory), whence);
553
+ spine_->SpawnGuarded(name, std::forward<PromiseFactory>(promise_factory),
554
+ whence);
541
555
  }
542
556
 
543
557
  template <typename PromiseFactory>
544
558
  void SpawnGuardedUntilCallCompletes(absl::string_view name,
545
- PromiseFactory promise_factory) {
546
- spine_->SpawnGuardedUntilCallCompletes(name, std::move(promise_factory));
559
+ PromiseFactory&& promise_factory) {
560
+ spine_->SpawnGuardedUntilCallCompletes(
561
+ name, std::forward<PromiseFactory>(promise_factory));
547
562
  }
548
563
 
549
564
  template <typename PromiseFactory>
550
- void SpawnInfallible(absl::string_view name, PromiseFactory promise_factory) {
551
- spine_->SpawnInfallible(name, std::move(promise_factory));
565
+ void SpawnInfallible(absl::string_view name,
566
+ PromiseFactory&& promise_factory) {
567
+ spine_->SpawnInfallible(name,
568
+ std::forward<PromiseFactory>(promise_factory));
552
569
  }
553
570
 
554
571
  template <typename PromiseFactory>
555
- auto SpawnWaitable(absl::string_view name, PromiseFactory promise_factory) {
556
- return spine_->SpawnWaitable(name, std::move(promise_factory));
572
+ auto SpawnWaitable(absl::string_view name, PromiseFactory&& promise_factory) {
573
+ return spine_->SpawnWaitable(name,
574
+ std::forward<PromiseFactory>(promise_factory));
557
575
  }
558
576
 
559
577
  void AddChildCall(const CallInitiator& initiator) {
@@ -577,35 +595,40 @@ class UnstartedCallHandler {
577
595
  spine_->PushServerTrailingMetadata(std::move(status));
578
596
  }
579
597
 
580
- GRPC_MUST_USE_RESULT bool OnDone(absl::AnyInvocable<void(bool)> fn) {
581
- return spine_->OnDone(std::move(fn));
598
+ GRPC_MUST_USE_RESULT bool OnDone(absl::AnyInvocable<void(bool)>&& fn) {
599
+ return spine_->OnDone(std::forward<absl::AnyInvocable<void(bool)>>(fn));
582
600
  }
583
601
 
584
602
  template <typename Promise>
585
- auto CancelIfFails(Promise promise) {
586
- return spine_->CancelIfFails(std::move(promise));
603
+ auto CancelIfFails(Promise&& promise) {
604
+ return spine_->CancelIfFails(std::forward<Promise>(promise));
587
605
  }
588
606
 
589
607
  template <typename PromiseFactory>
590
- void SpawnGuarded(absl::string_view name, PromiseFactory promise_factory,
608
+ void SpawnGuarded(absl::string_view name, PromiseFactory&& promise_factory,
591
609
  DebugLocation whence = {}) {
592
- spine_->SpawnGuarded(name, std::move(promise_factory), whence);
610
+ spine_->SpawnGuarded(name, std::forward<PromiseFactory>(promise_factory),
611
+ whence);
593
612
  }
594
613
 
595
614
  template <typename PromiseFactory>
596
615
  void SpawnGuardedUntilCallCompletes(absl::string_view name,
597
- PromiseFactory promise_factory) {
598
- spine_->SpawnGuardedUntilCallCompletes(name, std::move(promise_factory));
616
+ PromiseFactory&& promise_factory) {
617
+ spine_->SpawnGuardedUntilCallCompletes(
618
+ name, std::forward<PromiseFactory>(promise_factory));
599
619
  }
600
620
 
601
621
  template <typename PromiseFactory>
602
- void SpawnInfallible(absl::string_view name, PromiseFactory promise_factory) {
603
- spine_->SpawnInfallible(name, std::move(promise_factory));
622
+ void SpawnInfallible(absl::string_view name,
623
+ PromiseFactory&& promise_factory) {
624
+ spine_->SpawnInfallible(name,
625
+ std::forward<PromiseFactory>(promise_factory));
604
626
  }
605
627
 
606
628
  template <typename PromiseFactory>
607
- auto SpawnWaitable(absl::string_view name, PromiseFactory promise_factory) {
608
- return spine_->SpawnWaitable(name, std::move(promise_factory));
629
+ auto SpawnWaitable(absl::string_view name, PromiseFactory&& promise_factory) {
630
+ return spine_->SpawnWaitable(name,
631
+ std::forward<PromiseFactory>(promise_factory));
609
632
  }
610
633
 
611
634
  ClientMetadata& UnprocessedClientInitialMetadata() {
@@ -636,12 +659,12 @@ CallInitiatorAndHandler MakeCallPair(
636
659
  ClientMetadataHandle client_initial_metadata, RefCountedPtr<Arena> arena);
637
660
 
638
661
  template <typename CallHalf>
639
- auto MessagesFrom(CallHalf h) {
662
+ auto MessagesFrom(CallHalf&& h) {
640
663
  struct Wrapper {
641
- CallHalf h;
664
+ std::decay_t<CallHalf> h;
642
665
  auto Next() { return h.PullMessage(); }
643
666
  };
644
- return Wrapper{std::move(h)};
667
+ return Wrapper{std::forward<CallHalf>(h)};
645
668
  }
646
669
 
647
670
  template <typename CallHalf>
@@ -92,6 +92,9 @@ class CallState {
92
92
  // PULL: server -> client
93
93
 
94
94
  // Poll for initial metadata to be available.
95
+ // One and only one call to GRPC_OP_RECV_INITIAL_METADATA MUST be made on the
96
+ // client. By extension, this function is also expected to be called exactly
97
+ // once.
95
98
  Poll<bool> PollPullServerInitialMetadataAvailable();
96
99
  // Finish pulling server initial metadata.
97
100
  void FinishPullServerInitialMetadata();
@@ -209,6 +212,7 @@ class CallState {
209
212
  kReading,
210
213
  // Main call loop: processing one message
211
214
  kProcessingServerToClientMessage,
215
+ kDone,
212
216
  kTerminated,
213
217
  };
214
218
  static const char* ServerToClientPullStateString(
@@ -232,6 +236,8 @@ class CallState {
232
236
  return "Reading";
233
237
  case ServerToClientPullState::kProcessingServerToClientMessage:
234
238
  return "ProcessingServerToClientMessage";
239
+ case ServerToClientPullState::kDone:
240
+ return "Done";
235
241
  case ServerToClientPullState::kTerminated:
236
242
  return "Terminated";
237
243
  }
@@ -354,6 +360,7 @@ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION inline void CallState::Start() {
354
360
  case ServerToClientPullState::kIdle:
355
361
  case ServerToClientPullState::kReading:
356
362
  case ServerToClientPullState::kProcessingServerToClientMessage:
363
+ case ServerToClientPullState::kDone:
357
364
  LOG(FATAL) << "Start called twice; "
358
365
  << GRPC_DUMP_ARGS(server_to_client_pull_state_);
359
366
  case ServerToClientPullState::kTerminated:
@@ -747,7 +754,12 @@ CallState::PollPullServerInitialMetadataAvailable() {
747
754
  case ServerToClientPullState::kUnstartedReading:
748
755
  if (server_to_client_push_state_ ==
749
756
  ServerToClientPushState::kTrailersOnly) {
757
+ GRPC_DCHECK(server_trailing_metadata_state_ ==
758
+ ServerTrailingMetadataState::kPushedCancel ||
759
+ server_trailing_metadata_state_ ==
760
+ ServerTrailingMetadataState::kPulledCancel);
750
761
  server_to_client_pull_state_ = ServerToClientPullState::kTerminated;
762
+ server_to_client_pull_waiter_.Wake();
751
763
  return false;
752
764
  }
753
765
  server_to_client_push_waiter_.pending();
@@ -766,6 +778,8 @@ CallState::PollPullServerInitialMetadataAvailable() {
766
778
  LOG(FATAL) << "PollPullServerInitialMetadataAvailable called twice; "
767
779
  << GRPC_DUMP_ARGS(server_to_client_pull_state_,
768
780
  server_to_client_push_state_);
781
+ // If trailing metadata has been pulled, initial metadata cannot be pulled.
782
+ case ServerToClientPullState::kDone:
769
783
  case ServerToClientPullState::kTerminated:
770
784
  return false;
771
785
  }
@@ -829,6 +843,7 @@ CallState::FinishPullServerInitialMetadata() {
829
843
  LOG(FATAL) << "Out of order FinishPullServerInitialMetadata; "
830
844
  << GRPC_DUMP_ARGS(server_to_client_pull_state_,
831
845
  server_to_client_push_state_);
846
+ case ServerToClientPullState::kDone:
832
847
  case ServerToClientPullState::kTerminated:
833
848
  return;
834
849
  }
@@ -870,12 +885,28 @@ CallState::PollPullServerToClientMessageAvailable() {
870
885
  switch (server_to_client_pull_state_) {
871
886
  case ServerToClientPullState::kUnstarted:
872
887
  server_to_client_pull_state_ = ServerToClientPullState::kUnstartedReading;
888
+ [[fallthrough]];
889
+ case ServerToClientPullState::kUnstartedReading:
890
+ if (server_to_client_push_state_ ==
891
+ ServerToClientPushState::kTrailersOnly) {
892
+ // Here we do not transition to kDone because this poll would return a
893
+ // null message (based on whether the trailing metadata was cancelled)
894
+ // which MUST be interpreted as end of stream.
895
+ server_to_client_pull_state_ = ServerToClientPullState::kTerminated;
896
+ server_to_client_pull_waiter_.Wake();
897
+ GRPC_DCHECK(server_trailing_metadata_state_ !=
898
+ ServerTrailingMetadataState::kNotPushed);
899
+ return WasCancelledPushed() ? Failure{} : ValueOrFailure<bool>{false};
900
+ }
901
+ // When TrailersOnly is pushed, server_to_client_push_state_ is modified
902
+ // and the server_to_client_push_waiter_ is woken up. If this promise only
903
+ // waits on server_to_client_pull_waiter_, it may never be polled.
904
+ server_to_client_push_waiter_.pending();
873
905
  return server_to_client_pull_waiter_.pending();
874
906
  case ServerToClientPullState::kProcessingServerInitialMetadata:
875
907
  server_to_client_pull_state_ =
876
908
  ServerToClientPullState::kProcessingServerInitialMetadataReading;
877
909
  return server_to_client_pull_waiter_.pending();
878
- case ServerToClientPullState::kUnstartedReading:
879
910
  case ServerToClientPullState::kProcessingServerInitialMetadataReading:
880
911
  return server_to_client_pull_waiter_.pending();
881
912
  case ServerToClientPullState::kStarted:
@@ -884,8 +915,19 @@ CallState::PollPullServerToClientMessageAvailable() {
884
915
  case ServerToClientPullState::kStartedReading:
885
916
  if (server_to_client_push_state_ ==
886
917
  ServerToClientPushState::kTrailersOnly) {
887
- return false;
918
+ // Here we do not transition to kDone because this poll would return a
919
+ // null message (based on whether the trailing metadata was cancelled)
920
+ // which MUST be interpreted as end of stream.
921
+ server_to_client_pull_state_ = ServerToClientPullState::kTerminated;
922
+ server_to_client_pull_waiter_.Wake();
923
+ GRPC_DCHECK(server_trailing_metadata_state_ !=
924
+ ServerTrailingMetadataState::kNotPushed);
925
+ return WasCancelledPushed() ? Failure{} : ValueOrFailure<bool>{false};
888
926
  }
927
+ // When TrailersOnly is pushed, server_to_client_push_state_ is modified
928
+ // and the server_to_client_push_waiter_ is woken up. If this promise only
929
+ // waits on server_to_client_pull_waiter_, it may never be polled.
930
+ server_to_client_push_waiter_.pending();
889
931
  return server_to_client_pull_waiter_.pending();
890
932
  case ServerToClientPullState::kIdle:
891
933
  server_to_client_pull_state_ = ServerToClientPullState::kReading;
@@ -898,6 +940,12 @@ CallState::PollPullServerToClientMessageAvailable() {
898
940
  "processing a message; "
899
941
  << GRPC_DUMP_ARGS(server_to_client_pull_state_,
900
942
  server_to_client_push_state_);
943
+ case ServerToClientPullState::kDone:
944
+ // Return EndOfStream to the upper layer. Any further attempts to read
945
+ // message will be treated as failures.
946
+ server_to_client_pull_state_ = ServerToClientPullState::kTerminated;
947
+ server_to_client_pull_waiter_.Wake();
948
+ return false;
901
949
  case ServerToClientPullState::kTerminated:
902
950
  return Failure{};
903
951
  }
@@ -949,6 +997,7 @@ CallState::PollPullServerToClientMessageStarted() {
949
997
  case ServerToClientPullState::kReading:
950
998
  case ServerToClientPullState::kProcessingServerToClientMessage:
951
999
  return Success{};
1000
+ case ServerToClientPullState::kDone:
952
1001
  case ServerToClientPullState::kTerminated:
953
1002
  return Failure{};
954
1003
  }
@@ -977,6 +1026,7 @@ CallState::FinishPullServerToClientMessage() {
977
1026
  << GRPC_DUMP_ARGS(server_to_client_pull_state_,
978
1027
  server_to_client_push_state_);
979
1028
  case ServerToClientPullState::kReading:
1029
+ case ServerToClientPullState::kDone:
980
1030
  LOG(FATAL) << "FinishPullServerToClientMessage called before "
981
1031
  << "PollPullServerToClientMessageAvailable; "
982
1032
  << GRPC_DUMP_ARGS(server_to_client_pull_state_,
@@ -1027,6 +1077,7 @@ CallState::PollServerTrailingMetadataAvailable() {
1027
1077
  case ServerToClientPullState::kProcessingServerToClientMessage:
1028
1078
  case ServerToClientPullState::kProcessingServerInitialMetadataReading:
1029
1079
  case ServerToClientPullState::kUnstartedReading:
1080
+ server_trailing_metadata_waiter_.pending();
1030
1081
  return server_to_client_pull_waiter_.pending();
1031
1082
  case ServerToClientPullState::kStartedReading:
1032
1083
  case ServerToClientPullState::kReading:
@@ -1045,6 +1096,7 @@ CallState::PollServerTrailingMetadataAvailable() {
1045
1096
  case ServerToClientPushState::
1046
1097
  kPushedServerInitialMetadataAndPushedMessage:
1047
1098
  case ServerToClientPushState::kPushedMessage:
1099
+ server_trailing_metadata_waiter_.pending();
1048
1100
  server_to_client_push_waiter_.pending();
1049
1101
  return server_to_client_pull_waiter_.pending();
1050
1102
  }
@@ -1057,19 +1109,23 @@ CallState::PollServerTrailingMetadataAvailable() {
1057
1109
  break; // Ready for processing
1058
1110
  }
1059
1111
  return server_trailing_metadata_waiter_.pending();
1112
+ case ServerToClientPullState::kDone:
1060
1113
  case ServerToClientPullState::kTerminated:
1061
1114
  break;
1062
1115
  }
1063
- server_to_client_pull_state_ = ServerToClientPullState::kTerminated;
1064
- server_to_client_pull_waiter_.Wake();
1116
+
1065
1117
  switch (server_trailing_metadata_state_) {
1066
1118
  case ServerTrailingMetadataState::kPushed:
1067
1119
  server_trailing_metadata_state_ = ServerTrailingMetadataState::kPulled;
1120
+ server_to_client_pull_state_ = ServerToClientPullState::kDone;
1121
+ server_to_client_pull_waiter_.Wake();
1068
1122
  server_trailing_metadata_waiter_.Wake();
1069
1123
  break;
1070
1124
  case ServerTrailingMetadataState::kPushedCancel:
1071
1125
  server_trailing_metadata_state_ =
1072
1126
  ServerTrailingMetadataState::kPulledCancel;
1127
+ server_to_client_pull_state_ = ServerToClientPullState::kTerminated;
1128
+ server_to_client_pull_waiter_.Wake();
1073
1129
  server_trailing_metadata_waiter_.Wake();
1074
1130
  break;
1075
1131
  case ServerTrailingMetadataState::kNotPushed:
@@ -211,7 +211,7 @@ void ClientCall::CancelWithError(grpc_error_handle error) {
211
211
  }
212
212
 
213
213
  template <typename Batch>
214
- void ClientCall::ScheduleCommittedBatch(Batch batch) {
214
+ void ClientCall::ScheduleCommittedBatch(Batch&& batch) {
215
215
  GRPC_LATENT_SEE_SCOPE("ClientCall::ScheduleCommittedBatch");
216
216
  auto cur_state = call_state_.load(std::memory_order_acquire);
217
217
  while (true) {
@@ -219,12 +219,12 @@ void ClientCall::ScheduleCommittedBatch(Batch batch) {
219
219
  case kUnstarted:
220
220
  default: { // UnorderedStart
221
221
  auto pending = std::make_unique<UnorderedStart>();
222
- pending->start_pending_batch = [this,
223
- batch = std::move(batch)]() mutable {
224
- started_call_initiator_.SpawnInfallible(
225
- "batch",
226
- GRPC_LATENT_SEE_PROMISE("ClientCallBatch", std::move(batch)));
227
- };
222
+ pending->start_pending_batch =
223
+ [this, batch = std::forward<Batch>(batch)]() mutable {
224
+ started_call_initiator_.SpawnInfallible(
225
+ "batch", GRPC_LATENT_SEE_PROMISE("ClientCallBatch",
226
+ std::forward<Batch>(batch)));
227
+ };
228
228
  while (true) {
229
229
  pending->next = reinterpret_cast<UnorderedStart*>(cur_state);
230
230
  if (call_state_.compare_exchange_strong(
@@ -244,8 +244,8 @@ void ClientCall::ScheduleCommittedBatch(Batch batch) {
244
244
  }
245
245
  case kStarted:
246
246
  started_call_initiator_.SpawnInfallible(
247
- "batch",
248
- GRPC_LATENT_SEE_PROMISE("ClientCallBatch", std::move(batch)));
247
+ "batch", GRPC_LATENT_SEE_PROMISE("ClientCallBatch",
248
+ std::forward<Batch>(batch)));
249
249
  return;
250
250
  case kCancelled:
251
251
  return;
@@ -130,7 +130,7 @@ class ClientCall final
130
130
  void CommitBatch(const grpc_op* ops, size_t nops, void* notify_tag,
131
131
  bool is_notify_tag_closure);
132
132
  template <typename Batch>
133
- void ScheduleCommittedBatch(Batch batch);
133
+ void ScheduleCommittedBatch(Batch&& batch);
134
134
  Party::WakeupHold StartCall(const grpc_op& send_initial_metadata_op);
135
135
  // Attempt to start the call and send handler down the stack; returns true if
136
136
  // state was updated, false otherwise (with cur_state updated to the new
@@ -59,6 +59,8 @@ bool IsMetadataKeyAllowedInDebugOutput(absl::string_view key) {
59
59
  if (key == UserAgentMetadata::key()) return true;
60
60
  if (key == W3CTraceParentMetadata::key()) return true;
61
61
  if (key == XEnvoyPeerMetadata::key()) return true;
62
+ if (key == XForwardedForMetadata::key()) return true;
63
+ if (key == XForwardedHostMetadata::key()) return true;
62
64
  // go/keep-sorted end
63
65
  // go/keep-sorted start
64
66
  if (key == GrpcCallWasCancelled::DebugKey()) return true;