grpc 1.75.0.pre1 → 1.76.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 (387) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +18 -5
  3. data/include/grpc/credentials.h +21 -5
  4. data/src/core/call/call_filters.cc +4 -4
  5. data/src/core/call/call_filters.h +36 -36
  6. data/src/core/call/call_spine.h +27 -27
  7. data/src/core/call/client_call.cc +6 -5
  8. data/src/core/call/filter_fusion.h +5 -5
  9. data/src/core/call/metadata_batch.h +3 -3
  10. data/src/core/call/security_context.cc +1 -1
  11. data/src/core/call/server_call.cc +4 -4
  12. data/src/core/call/server_call.h +1 -1
  13. data/src/core/channelz/channelz.cc +12 -18
  14. data/src/core/channelz/channelz.h +32 -16
  15. data/src/core/channelz/channelz_registry.h +11 -0
  16. data/src/core/channelz/property_list.cc +18 -0
  17. data/src/core/channelz/property_list.h +10 -1
  18. data/src/core/channelz/text_encode.cc +66 -0
  19. data/src/core/channelz/text_encode.h +29 -0
  20. data/src/core/channelz/v2tov1/convert.cc +11 -0
  21. data/src/core/channelz/v2tov1/legacy_api.cc +15 -8
  22. data/src/core/channelz/ztrace_collector.h +247 -86
  23. data/src/core/client_channel/backup_poller.cc +5 -6
  24. data/src/core/client_channel/client_channel.cc +20 -13
  25. data/src/core/client_channel/client_channel_filter.cc +53 -45
  26. data/src/core/client_channel/client_channel_filter.h +2 -2
  27. data/src/core/client_channel/client_channel_internal.h +3 -4
  28. data/src/core/client_channel/config_selector.h +3 -3
  29. data/src/core/client_channel/dynamic_filters.cc +3 -3
  30. data/src/core/client_channel/global_subchannel_pool.cc +0 -37
  31. data/src/core/client_channel/global_subchannel_pool.h +0 -27
  32. data/src/core/client_channel/load_balanced_call_destination.cc +7 -7
  33. data/src/core/client_channel/local_subchannel_pool.cc +4 -4
  34. data/src/core/client_channel/retry_filter.h +3 -3
  35. data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -5
  36. data/src/core/client_channel/subchannel.cc +8 -8
  37. data/src/core/client_channel/subchannel_stream_client.cc +4 -4
  38. data/src/core/config/config_vars.cc +30 -1
  39. data/src/core/config/config_vars.h +21 -0
  40. data/src/core/config/core_configuration.cc +5 -5
  41. data/src/core/config/core_configuration.h +7 -7
  42. data/src/core/config/load_config.cc +12 -0
  43. data/src/core/config/load_config.h +2 -0
  44. data/src/core/credentials/call/call_credentials.h +2 -2
  45. data/src/core/credentials/call/call_creds_util.cc +4 -3
  46. data/src/core/credentials/call/composite/composite_call_credentials.cc +4 -4
  47. data/src/core/credentials/call/external/aws_external_account_credentials.cc +3 -3
  48. data/src/core/credentials/call/external/external_account_credentials.cc +1 -1
  49. data/src/core/credentials/call/external/url_external_account_credentials.cc +1 -1
  50. data/src/core/credentials/call/iam/iam_credentials.cc +4 -4
  51. data/src/core/credentials/call/jwt/json_token.cc +3 -3
  52. data/src/core/credentials/call/jwt/jwt_credentials.cc +2 -2
  53. data/src/core/credentials/call/jwt/jwt_verifier.cc +14 -13
  54. data/src/core/credentials/call/oauth2/oauth2_credentials.cc +20 -12
  55. data/src/core/credentials/call/plugin/plugin_credentials.cc +2 -2
  56. data/src/core/credentials/transport/alts/alts_credentials.cc +4 -4
  57. data/src/core/credentials/transport/alts/alts_security_connector.cc +14 -12
  58. data/src/core/credentials/transport/alts/grpc_alts_credentials_client_options.cc +22 -2
  59. data/src/core/credentials/transport/alts/grpc_alts_credentials_options.cc +10 -1
  60. data/src/core/credentials/transport/alts/grpc_alts_credentials_options.h +31 -0
  61. data/src/core/credentials/transport/alts/grpc_alts_credentials_server_options.cc +8 -3
  62. data/src/core/credentials/transport/composite/composite_channel_credentials.cc +5 -5
  63. data/src/core/credentials/transport/fake/fake_security_connector.cc +2 -2
  64. data/src/core/credentials/transport/google_default/google_default_credentials.cc +78 -28
  65. data/src/core/credentials/transport/insecure/insecure_security_connector.cc +3 -3
  66. data/src/core/credentials/transport/local/local_security_connector.cc +8 -8
  67. data/src/core/credentials/transport/security_connector.cc +5 -5
  68. data/src/core/credentials/transport/ssl/ssl_credentials.cc +12 -12
  69. data/src/core/credentials/transport/ssl/ssl_credentials.h +2 -2
  70. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +3 -3
  71. data/src/core/credentials/transport/tls/certificate_provider_registry.cc +2 -2
  72. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +24 -24
  73. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +5 -5
  74. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +2 -2
  75. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.cc +2 -2
  76. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.h +2 -2
  77. data/src/core/credentials/transport/tls/grpc_tls_credentials_options.cc +17 -17
  78. data/src/core/credentials/transport/tls/ssl_utils.cc +14 -9
  79. data/src/core/credentials/transport/tls/tls_credentials.cc +2 -2
  80. data/src/core/credentials/transport/tls/tls_security_connector.cc +11 -11
  81. data/src/core/credentials/transport/transport_credentials.cc +2 -2
  82. data/src/core/credentials/transport/transport_credentials.h +2 -2
  83. data/src/core/credentials/transport/xds/xds_credentials.cc +5 -5
  84. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +2 -0
  85. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +1 -1
  86. data/src/core/ext/filters/http/message_compress/compression_filter.cc +8 -8
  87. data/src/core/ext/filters/http/message_compress/compression_filter.h +3 -3
  88. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +7 -7
  89. data/src/core/ext/transport/chttp2/alpn/alpn.cc +2 -2
  90. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +10 -9
  91. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +10 -7
  92. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +5 -5
  93. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +6 -6
  94. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +96 -88
  95. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  96. data/src/core/ext/transport/chttp2/transport/flow_control.h +12 -7
  97. data/src/core/ext/transport/chttp2/transport/flow_control_manager.h +60 -0
  98. data/src/core/ext/transport/chttp2/transport/frame.cc +32 -10
  99. data/src/core/ext/transport/chttp2/transport/frame.h +16 -2
  100. data/src/core/ext/transport/chttp2/transport/frame_data.cc +2 -2
  101. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +4 -4
  102. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -2
  103. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -2
  104. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +3 -3
  105. data/src/core/ext/transport/chttp2/transport/header_assembler.h +28 -12
  106. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +2 -2
  107. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -2
  108. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +8 -8
  109. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.cc +2 -2
  110. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +2 -2
  111. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -27
  112. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -3
  113. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +4 -4
  114. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +543 -366
  115. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +198 -277
  116. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +3 -0
  117. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +11 -0
  118. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +179 -0
  119. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +51 -23
  120. data/src/core/ext/transport/chttp2/transport/http2_transport.h +13 -6
  121. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +115 -71
  122. data/src/core/ext/transport/chttp2/transport/internal.h +6 -14
  123. data/src/core/ext/transport/chttp2/transport/message_assembler.h +7 -7
  124. data/src/core/ext/transport/chttp2/transport/parsing.cc +17 -15
  125. data/src/core/ext/transport/chttp2/transport/ping_callbacks.cc +2 -2
  126. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +62 -26
  127. data/src/core/ext/transport/chttp2/transport/ping_promise.h +58 -22
  128. data/src/core/ext/transport/chttp2/transport/stream.h +207 -0
  129. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +328 -187
  130. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +7 -7
  131. data/src/core/ext/transport/chttp2/transport/transport_common.cc +17 -1
  132. data/src/core/ext/transport/chttp2/transport/transport_common.h +52 -0
  133. data/src/core/ext/transport/chttp2/transport/varint.h +2 -2
  134. data/src/core/ext/transport/chttp2/transport/writable_streams.h +181 -79
  135. data/src/core/ext/transport/chttp2/transport/write_size_policy.cc +2 -2
  136. data/src/core/ext/transport/chttp2/transport/writing.cc +3 -3
  137. data/src/core/ext/transport/inproc/inproc_transport.cc +1 -1
  138. data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +3 -3
  139. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb.h +740 -0
  140. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.c +218 -0
  141. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.h +46 -0
  142. data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb.h +87 -55
  143. data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb_minitable.c +23 -21
  144. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.c +80 -0
  145. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.h +47 -0
  146. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.c +129 -0
  147. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.h +72 -0
  148. data/src/core/filter/auth/server_auth_filter.cc +2 -2
  149. data/src/core/handshaker/handshaker.cc +3 -3
  150. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +2 -2
  151. data/src/core/handshaker/security/legacy_secure_endpoint.cc +2 -2
  152. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +31 -8
  153. data/src/core/handshaker/security/secure_endpoint.cc +16 -6
  154. data/src/core/handshaker/security/security_handshaker.cc +3 -3
  155. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +2 -2
  156. data/src/core/lib/channel/channel_stack.cc +8 -5
  157. data/src/core/lib/channel/channel_stack.h +3 -0
  158. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -0
  159. data/src/core/lib/channel/connected_channel.cc +2 -2
  160. data/src/core/lib/channel/promise_based_filter.cc +69 -64
  161. data/src/core/lib/channel/promise_based_filter.h +16 -15
  162. data/src/core/lib/compression/compression_internal.cc +2 -2
  163. data/src/core/lib/compression/message_compress.cc +7 -7
  164. data/src/core/lib/event_engine/ares_resolver.cc +22 -20
  165. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +2 -2
  166. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +2 -2
  167. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +2 -2
  168. data/src/core/lib/event_engine/extensions/channelz.h +2 -2
  169. data/src/core/lib/event_engine/extensions/supports_fd.h +5 -5
  170. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +8 -8
  171. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +10 -10
  172. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +2 -2
  173. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +23 -22
  174. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +11 -11
  175. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +168 -170
  176. data/src/core/lib/event_engine/posix_engine/posix_engine.h +33 -54
  177. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +4 -3
  178. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +5 -5
  179. data/src/core/lib/event_engine/posix_engine/posix_interface.h +1 -1
  180. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1 -1
  181. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +3 -3
  182. data/src/core/lib/event_engine/resolved_address.cc +3 -3
  183. data/src/core/lib/event_engine/shim.cc +8 -11
  184. data/src/core/lib/event_engine/shim.h +2 -1
  185. data/src/core/lib/event_engine/slice.cc +2 -2
  186. data/src/core/lib/event_engine/tcp_socket_utils.cc +11 -11
  187. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +7 -7
  188. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +31 -31
  189. data/src/core/lib/event_engine/windows/iocp.cc +10 -10
  190. data/src/core/lib/event_engine/windows/win_socket.cc +6 -6
  191. data/src/core/lib/event_engine/windows/windows_endpoint.cc +11 -11
  192. data/src/core/lib/event_engine/windows/windows_engine.cc +16 -14
  193. data/src/core/lib/event_engine/windows/windows_listener.cc +7 -7
  194. data/src/core/lib/experiments/experiments.cc +105 -18
  195. data/src/core/lib/experiments/experiments.h +43 -11
  196. data/src/core/lib/iomgr/call_combiner.cc +3 -3
  197. data/src/core/lib/iomgr/endpoint_cfstream.cc +6 -6
  198. data/src/core/lib/iomgr/endpoint_pair_posix.cc +5 -5
  199. data/src/core/lib/iomgr/endpoint_pair_windows.cc +15 -14
  200. data/src/core/lib/iomgr/ev_epoll1_linux.cc +15 -15
  201. data/src/core/lib/iomgr/ev_poll_posix.cc +11 -11
  202. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +5 -4
  203. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +1 -1
  204. data/src/core/lib/iomgr/iocp_windows.cc +8 -8
  205. data/src/core/lib/iomgr/iomgr_windows.cc +3 -3
  206. data/src/core/lib/iomgr/lockfree_event.cc +2 -2
  207. data/src/core/lib/iomgr/polling_entity.cc +3 -3
  208. data/src/core/lib/iomgr/socket_utils_common_posix.cc +2 -2
  209. data/src/core/lib/iomgr/socket_windows.cc +4 -4
  210. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -4
  211. data/src/core/lib/iomgr/tcp_client_windows.cc +4 -4
  212. data/src/core/lib/iomgr/tcp_posix.cc +42 -42
  213. data/src/core/lib/iomgr/tcp_server.cc +5 -0
  214. data/src/core/lib/iomgr/tcp_server.h +7 -0
  215. data/src/core/lib/iomgr/tcp_server_posix.cc +47 -27
  216. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
  217. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -5
  218. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
  219. data/src/core/lib/iomgr/tcp_server_windows.cc +68 -29
  220. data/src/core/lib/iomgr/tcp_windows.cc +7 -7
  221. data/src/core/lib/iomgr/timer_generic.cc +2 -2
  222. data/src/core/lib/iomgr/timer_manager.cc +2 -2
  223. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -2
  224. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +2 -2
  225. data/src/core/lib/promise/activity.cc +2 -2
  226. data/src/core/lib/promise/activity.h +6 -6
  227. data/src/core/lib/promise/context.h +2 -2
  228. data/src/core/lib/promise/detail/join_state.h +9 -9
  229. data/src/core/lib/promise/detail/seq_state.h +13 -13
  230. data/src/core/lib/promise/detail/status.h +2 -2
  231. data/src/core/lib/promise/for_each.h +5 -5
  232. data/src/core/lib/promise/interceptor_list.h +2 -2
  233. data/src/core/lib/promise/latch.h +7 -7
  234. data/src/core/lib/promise/mpsc.cc +26 -26
  235. data/src/core/lib/promise/mpsc.h +2 -2
  236. data/src/core/lib/promise/observable.h +4 -4
  237. data/src/core/lib/promise/party.cc +32 -25
  238. data/src/core/lib/promise/party.h +16 -19
  239. data/src/core/lib/promise/pipe.h +15 -15
  240. data/src/core/lib/promise/poll.h +5 -4
  241. data/src/core/lib/promise/promise.h +0 -2
  242. data/src/core/lib/promise/sleep.cc +3 -1
  243. data/src/core/lib/promise/status_flag.h +7 -7
  244. data/src/core/lib/promise/try_join.h +2 -2
  245. data/src/core/lib/promise/try_seq.h +2 -2
  246. data/src/core/lib/resource_quota/arena.h +15 -2
  247. data/src/core/lib/resource_quota/connection_quota.cc +9 -7
  248. data/src/core/lib/resource_quota/memory_quota.cc +45 -24
  249. data/src/core/lib/resource_quota/memory_quota.h +48 -16
  250. data/src/core/lib/resource_quota/telemetry.h +54 -0
  251. data/src/core/lib/resource_quota/thread_quota.cc +2 -2
  252. data/src/core/lib/resource_tracker/resource_tracker.cc +33 -0
  253. data/src/core/lib/resource_tracker/resource_tracker.h +46 -0
  254. data/src/core/lib/security/authorization/audit_logging.cc +5 -5
  255. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +2 -2
  256. data/src/core/lib/security/authorization/stdout_logger.cc +3 -3
  257. data/src/core/lib/surface/byte_buffer_reader.cc +2 -2
  258. data/src/core/lib/surface/call.cc +16 -14
  259. data/src/core/lib/surface/call.h +1 -1
  260. data/src/core/lib/surface/call_utils.cc +2 -2
  261. data/src/core/lib/surface/call_utils.h +2 -2
  262. data/src/core/lib/surface/channel.cc +4 -4
  263. data/src/core/lib/surface/channel_create.cc +10 -6
  264. data/src/core/lib/surface/channel_init.cc +80 -23
  265. data/src/core/lib/surface/channel_init.h +26 -11
  266. data/src/core/lib/surface/completion_queue.cc +17 -16
  267. data/src/core/lib/surface/completion_queue_factory.cc +7 -7
  268. data/src/core/lib/surface/connection_context.h +45 -2
  269. data/src/core/lib/surface/filter_stack_call.cc +12 -23
  270. data/src/core/lib/surface/filter_stack_call.h +3 -4
  271. data/src/core/lib/surface/legacy_channel.cc +7 -7
  272. data/src/core/lib/surface/validate_metadata.h +2 -2
  273. data/src/core/lib/surface/version.cc +2 -2
  274. data/src/core/lib/transport/bdp_estimator.cc +2 -2
  275. data/src/core/lib/transport/bdp_estimator.h +3 -3
  276. data/src/core/lib/transport/promise_endpoint.cc +3 -3
  277. data/src/core/lib/transport/promise_endpoint.h +8 -8
  278. data/src/core/lib/transport/timeout_encoding.cc +4 -4
  279. data/src/core/load_balancing/child_policy_handler.cc +4 -4
  280. data/src/core/load_balancing/endpoint_list.cc +2 -2
  281. data/src/core/load_balancing/grpclb/grpclb.cc +24 -24
  282. data/src/core/load_balancing/health_check_client.cc +4 -4
  283. data/src/core/load_balancing/health_check_client_internal.h +2 -2
  284. data/src/core/load_balancing/lb_policy_registry.cc +2 -2
  285. data/src/core/load_balancing/oob_backend_metric.cc +4 -4
  286. data/src/core/load_balancing/oob_backend_metric_internal.h +2 -2
  287. data/src/core/load_balancing/outlier_detection/outlier_detection.cc +2 -2
  288. data/src/core/load_balancing/pick_first/pick_first.cc +14 -14
  289. data/src/core/load_balancing/priority/priority.cc +23 -24
  290. data/src/core/load_balancing/ring_hash/ring_hash.cc +3 -3
  291. data/src/core/load_balancing/rls/rls.cc +13 -13
  292. data/src/core/load_balancing/round_robin/round_robin.cc +9 -9
  293. data/src/core/load_balancing/weighted_round_robin/static_stride_scheduler.cc +3 -3
  294. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +33 -26
  295. data/src/core/load_balancing/weighted_target/weighted_target.cc +5 -5
  296. data/src/core/load_balancing/xds/cds.cc +76 -32
  297. data/src/core/load_balancing/xds/xds_cluster_impl.cc +3 -3
  298. data/src/core/load_balancing/xds/xds_override_host.cc +4 -4
  299. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  300. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +33 -33
  301. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +10 -10
  302. data/src/core/resolver/dns/dns_resolver_plugin.cc +6 -3
  303. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +2 -2
  304. data/src/core/resolver/endpoint_addresses.cc +3 -3
  305. data/src/core/resolver/endpoint_addresses.h +3 -0
  306. data/src/core/resolver/fake/fake_resolver.cc +2 -2
  307. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +41 -54
  308. data/src/core/resolver/polling_resolver.cc +3 -3
  309. data/src/core/resolver/resolver_registry.cc +5 -4
  310. data/src/core/resolver/xds/xds_dependency_manager.cc +5 -5
  311. data/src/core/resolver/xds/xds_resolver.cc +9 -9
  312. data/src/core/server/server.cc +38 -38
  313. data/src/core/server/server_call_tracer_filter.h +4 -4
  314. data/src/core/server/server_config_selector_filter.cc +2 -2
  315. data/src/core/server/xds_server_config_fetcher.cc +9 -8
  316. data/src/core/service_config/service_config_impl.h +2 -2
  317. data/src/core/telemetry/call_tracer.cc +39 -49
  318. data/src/core/telemetry/call_tracer.h +199 -22
  319. data/src/core/telemetry/histogram.h +205 -0
  320. data/src/core/telemetry/instrument.cc +719 -0
  321. data/src/core/telemetry/instrument.h +932 -0
  322. data/src/core/telemetry/metrics.cc +13 -5
  323. data/src/core/telemetry/metrics.h +3 -1
  324. data/src/core/telemetry/stats_data.cc +0 -19
  325. data/src/core/telemetry/stats_data.h +0 -19
  326. data/src/core/transport/auth_context.cc +2 -2
  327. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +78 -45
  328. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -0
  329. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +3 -3
  330. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +39 -31
  331. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +3 -3
  332. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +3 -3
  333. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +7 -7
  334. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +3 -3
  335. data/src/core/tsi/fake_transport_security.cc +4 -4
  336. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +4 -4
  337. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +9 -9
  338. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +3 -3
  339. data/src/core/tsi/ssl_transport_security.cc +26 -25
  340. data/src/core/tsi/ssl_transport_security_utils.cc +9 -9
  341. data/src/core/util/chunked_vector.h +4 -4
  342. data/src/core/util/event_log.cc +2 -2
  343. data/src/core/util/gcp_metadata_query.cc +2 -2
  344. data/src/core/util/grpc_check.cc +22 -0
  345. data/src/core/util/grpc_check.h +103 -0
  346. data/src/core/util/http_client/httpcli.cc +3 -3
  347. data/src/core/util/http_client/parser.cc +4 -4
  348. data/src/core/util/latent_see.h +7 -4
  349. data/src/core/util/lru_cache.h +4 -4
  350. data/src/core/util/memory_usage.h +16 -0
  351. data/src/core/util/posix/directory_reader.cc +3 -2
  352. data/src/core/util/posix/sync.cc +24 -24
  353. data/src/core/util/postmortem_emit.cc +52 -0
  354. data/src/core/util/postmortem_emit.h +30 -0
  355. data/src/core/util/ref_counted_ptr.h +5 -0
  356. data/src/core/util/trie_lookup.h +170 -0
  357. data/src/core/util/unique_ptr_with_bitset.h +5 -5
  358. data/src/core/xds/grpc/xds_bootstrap_grpc.h +6 -1
  359. data/src/core/xds/grpc/xds_certificate_provider.cc +3 -3
  360. data/src/core/xds/grpc/xds_client_grpc.cc +34 -15
  361. data/src/core/xds/grpc/xds_client_grpc.h +4 -1
  362. data/src/core/xds/grpc/xds_cluster_parser.cc +2 -2
  363. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +2 -2
  364. data/src/core/xds/grpc/xds_endpoint_parser.cc +2 -2
  365. data/src/core/xds/grpc/xds_http_filter_registry.cc +4 -3
  366. data/src/core/xds/grpc/xds_listener_parser.cc +3 -3
  367. data/src/core/xds/grpc/xds_matcher.cc +277 -0
  368. data/src/core/xds/grpc/xds_matcher.h +432 -0
  369. data/src/core/xds/grpc/xds_matcher_action.cc +47 -0
  370. data/src/core/xds/grpc/xds_matcher_action.h +48 -0
  371. data/src/core/xds/grpc/xds_matcher_context.cc +29 -0
  372. data/src/core/xds/grpc/xds_matcher_context.h +46 -0
  373. data/src/core/xds/grpc/xds_matcher_input.cc +79 -0
  374. data/src/core/xds/grpc/xds_matcher_input.h +105 -0
  375. data/src/core/xds/grpc/xds_matcher_parse.cc +356 -0
  376. data/src/core/xds/grpc/xds_matcher_parse.h +39 -0
  377. data/src/core/xds/grpc/xds_metadata.cc +4 -3
  378. data/src/core/xds/grpc/xds_route_config_parser.cc +6 -6
  379. data/src/core/xds/grpc/xds_routing.cc +3 -3
  380. data/src/core/xds/grpc/xds_transport_grpc.cc +10 -10
  381. data/src/core/xds/xds_client/lrs_client.cc +6 -6
  382. data/src/core/xds/xds_client/xds_client.cc +9 -9
  383. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +2 -2
  384. data/src/ruby/lib/grpc/version.rb +1 -1
  385. data/third_party/abseil-cpp/absl/container/internal/node_slot_policy.h +95 -0
  386. data/third_party/abseil-cpp/absl/container/node_hash_map.h +687 -0
  387. metadata +37 -2
@@ -0,0 +1,432 @@
1
+ //
2
+ // Copyright 2025 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
16
+
17
+ #ifndef GRPC_SRC_CORE_XDS_GRPC_XDS_MATCHER_H
18
+ #define GRPC_SRC_CORE_XDS_GRPC_XDS_MATCHER_H
19
+
20
+ #include <memory>
21
+ #include <optional>
22
+ #include <string>
23
+ #include <utility>
24
+ #include <variant>
25
+ #include <vector>
26
+
27
+ #include "absl/container/flat_hash_map.h"
28
+ #include "absl/container/inlined_vector.h"
29
+ #include "absl/strings/str_cat.h"
30
+ #include "src/core/util/down_cast.h"
31
+ #include "src/core/util/matchers.h"
32
+ #include "src/core/util/trie_lookup.h"
33
+ #include "src/core/util/unique_type_name.h"
34
+
35
+ namespace grpc_core {
36
+
37
+ //
38
+ // XdsMatcher
39
+ //
40
+
41
+ // Base class for xDS matchers.
42
+ class XdsMatcher {
43
+ public:
44
+ // An interface implemented by the caller to provide the context from
45
+ // which the inputs will extract data. There can be different context
46
+ // implementations for different use cases -- for example, there will
47
+ // be an implementation that provides data about a data plane RPC for
48
+ // use in per-RPC matching decisions, but there could also be an
49
+ // implementation that provides data about incoming TCP connections
50
+ // for L4 routing decisions.
51
+ class MatchContext {
52
+ public:
53
+ virtual ~MatchContext() = default;
54
+ // Returns the type of context. The caller will use this to
55
+ // determine which type to down-cast to.
56
+ virtual UniqueTypeName type() const = 0;
57
+ };
58
+
59
+ // Produces match input from MatchContext.
60
+ // There will be one subclass for each proto type that we support in
61
+ // the input fields.
62
+ template <typename T>
63
+ class InputValue {
64
+ public:
65
+ using ProducedType = T;
66
+
67
+ virtual ~InputValue() = default;
68
+ virtual UniqueTypeName type() const = 0;
69
+ virtual bool Equals(const InputValue<T>& other) const = 0;
70
+ // Gets the value to be matched from context.
71
+ virtual std::optional<T> GetValue(const MatchContext& context) const = 0;
72
+ virtual std::string ToString() const = 0;
73
+ };
74
+
75
+ // An action to be returned if the conditions match.
76
+ // There will be one subclass for each proto type that we support in
77
+ // the action field.
78
+ class Action {
79
+ public:
80
+ virtual ~Action() = default;
81
+ virtual bool Equals(const Action& other) const = 0;
82
+ virtual std::string ToString() const = 0;
83
+ // The protobuf type of the action.
84
+ virtual UniqueTypeName type() const = 0;
85
+ };
86
+
87
+ // Actions found while executing the match.
88
+ using Result = absl::InlinedVector<Action*, 1>;
89
+
90
+ // What to do if a match is successful.
91
+ // If this contains an action, the action will be added to the set of
92
+ // actions to return. If keep_matching is false, matching will return
93
+ // true without evaluating any further matches; otherwise, matching
94
+ // will continue to find a final match.
95
+ struct OnMatch {
96
+ // Constructor for Action variant
97
+ OnMatch(std::unique_ptr<Action> act_ptr, bool km)
98
+ : action(std::move(act_ptr)), keep_matching(km) {}
99
+
100
+ // Constructor for XdsMatcher variant
101
+ OnMatch(std::unique_ptr<XdsMatcher> matcher_ptr, bool km)
102
+ : action(std::move(matcher_ptr)), keep_matching(km) {}
103
+
104
+ bool operator==(const OnMatch& other) const;
105
+ bool operator!=(const OnMatch& other) const { return !(*this == other); }
106
+
107
+ bool FindMatches(const MatchContext& context, Result& result) const;
108
+ std::string ToString() const;
109
+
110
+ std::variant<std::unique_ptr<Action>, std::unique_ptr<XdsMatcher>> action;
111
+ bool keep_matching = false;
112
+ };
113
+
114
+ virtual ~XdsMatcher() = default;
115
+
116
+ virtual UniqueTypeName type() const = 0;
117
+ virtual bool Equals(const XdsMatcher& other) const = 0;
118
+ virtual std::string ToString() const = 0;
119
+
120
+ // Finds matching actions, which are added to result.
121
+ // Returns true if the match is successful, in which case result will
122
+ // contain at least one action.
123
+ // Note that if a match is found but has keep_matching=true, the
124
+ // action will be added to result, but the match will not be
125
+ // considered successful.
126
+ virtual bool FindMatches(const MatchContext& context,
127
+ Result& result) const = 0;
128
+ };
129
+
130
+ //
131
+ // XdsMatcherList
132
+ //
133
+
134
+ // Evaluates a list of predicates and corresponding actions.
135
+ // The first matching predicate wins.
136
+ class XdsMatcherList : public XdsMatcher {
137
+ public:
138
+ // Base class for predicates.
139
+ class Predicate {
140
+ public:
141
+ virtual ~Predicate() = default;
142
+ // Returns true if the predicate is true.
143
+ virtual bool Match(const XdsMatcher::MatchContext& context) const = 0;
144
+ virtual UniqueTypeName type() const = 0;
145
+ virtual bool Equals(const Predicate& other) const = 0;
146
+ virtual std::string ToString() const = 0;
147
+ };
148
+
149
+ // Interface for matching against an input value.
150
+ template <typename T>
151
+ class InputMatcher {
152
+ public:
153
+ using ConsumedType = T;
154
+
155
+ virtual ~InputMatcher() = default;
156
+ virtual UniqueTypeName type() const = 0;
157
+ // Returns true if the matcher matches the input.
158
+ virtual bool Match(const std::optional<T>& input) const = 0;
159
+ virtual bool Equals(const InputMatcher<T>& other) const = 0;
160
+ virtual std::string ToString() const = 0;
161
+ };
162
+
163
+ class StringInputMatcher;
164
+
165
+ // Predicate implementations -- see below.
166
+ class AndPredicate;
167
+ class OrPredicate;
168
+ class NotPredicate;
169
+
170
+ struct FieldMatcher {
171
+ FieldMatcher(std::unique_ptr<Predicate> predicate, OnMatch on_match)
172
+ : predicate(std::move(predicate)), on_match(std::move(on_match)) {}
173
+
174
+ bool operator==(const FieldMatcher& other) const {
175
+ return on_match == other.on_match && predicate->Equals(*other.predicate);
176
+ }
177
+ bool operator!=(const FieldMatcher& other) const {
178
+ return !(*this == other);
179
+ }
180
+
181
+ std::string ToString() const {
182
+ return absl::StrCat("{predicate=", predicate->ToString(),
183
+ ", on_match=", on_match.ToString(), "}");
184
+ }
185
+
186
+ std::unique_ptr<Predicate> predicate;
187
+ OnMatch on_match;
188
+ };
189
+
190
+ // Factory method for creating a SinglePredicate.
191
+ template <typename InputType, typename MatcherType>
192
+ static absl::enable_if_t<
193
+ std::is_same<typename InputType::ProducedType,
194
+ typename MatcherType::ConsumedType>::value,
195
+ std::unique_ptr<Predicate>>
196
+ CreateSinglePredicate(std::unique_ptr<InputType> input,
197
+ std::unique_ptr<MatcherType> matcher) {
198
+ return std::make_unique<
199
+ XdsMatcherList::SinglePredicate<typename InputType::ProducedType>>(
200
+ std::move(input), std::move(matcher));
201
+ }
202
+
203
+ // Alternative template specialization to return null in the case where
204
+ // the input produces a different type than the matcher consumes.
205
+ template <typename InputType, typename MatcherType>
206
+ static absl::enable_if_t<
207
+ !std::is_same<typename InputType::ProducedType,
208
+ typename MatcherType::ConsumedType>::value,
209
+ std::unique_ptr<Predicate>>
210
+ CreateSinglePredicate(std::unique_ptr<InputType> /*input*/,
211
+ std::unique_ptr<MatcherType> /*matcher*/) {
212
+ return nullptr;
213
+ }
214
+
215
+ XdsMatcherList(std::vector<FieldMatcher> matchers,
216
+ std::optional<OnMatch> on_no_match)
217
+ : matchers_(std::move(matchers)), on_no_match_(std::move(on_no_match)) {}
218
+
219
+ static UniqueTypeName Type() {
220
+ return GRPC_UNIQUE_TYPE_NAME_HERE("XdsMatcherList");
221
+ }
222
+ UniqueTypeName type() const override { return Type(); }
223
+ bool Equals(const XdsMatcher& other) const override;
224
+ std::string ToString() const override;
225
+ bool FindMatches(const MatchContext& context, Result& result) const override;
226
+
227
+ private:
228
+ template <typename T>
229
+ class SinglePredicate;
230
+
231
+ std::vector<FieldMatcher> matchers_;
232
+ std::optional<OnMatch> on_no_match_;
233
+ };
234
+
235
+ //
236
+ // Predicates
237
+ //
238
+
239
+ // A predicate that evaluates a single input with a specified matcher.
240
+ template <typename T>
241
+ class XdsMatcherList::SinglePredicate : public XdsMatcherList::Predicate {
242
+ public:
243
+ SinglePredicate(std::unique_ptr<InputValue<T>> input,
244
+ std::unique_ptr<InputMatcher<T>> input_matcher)
245
+ : input_(std::move(input)), input_matcher_(std::move(input_matcher)) {}
246
+
247
+ bool Match(const XdsMatcher::MatchContext& context) const override {
248
+ auto input = input_->GetValue(context);
249
+ return input_matcher_->Match(input);
250
+ }
251
+ static UniqueTypeName Type() {
252
+ return GRPC_UNIQUE_TYPE_NAME_HERE("XdsMatcherSinglePredicate");
253
+ }
254
+ UniqueTypeName type() const override { return Type(); }
255
+ bool Equals(const Predicate& other) const override {
256
+ if (type() != other.type()) return false;
257
+ const auto& o = DownCast<const SinglePredicate<T>&>(other);
258
+ return input_->Equals(*o.input_) &&
259
+ input_matcher_->Equals(*o.input_matcher_);
260
+ }
261
+
262
+ std::string ToString() const override {
263
+ return absl::StrCat("SinglePredicate{input=", input_->ToString(),
264
+ ", matcher=", input_matcher_->ToString(), "}");
265
+ }
266
+
267
+ private:
268
+ std::unique_ptr<InputValue<T>> input_;
269
+ std::unique_ptr<InputMatcher<T>> input_matcher_;
270
+ };
271
+
272
+ // Matches against a string.
273
+ class XdsMatcherList::StringInputMatcher
274
+ : public XdsMatcherList::InputMatcher<absl::string_view> {
275
+ public:
276
+ explicit StringInputMatcher(StringMatcher matcher)
277
+ : matcher_(std::move(matcher)) {}
278
+
279
+ bool Match(const std::optional<absl::string_view>& input) const override {
280
+ return matcher_.Match(input.value_or(""));
281
+ }
282
+ static UniqueTypeName Type() {
283
+ return GRPC_UNIQUE_TYPE_NAME_HERE("StringInputMatcher");
284
+ }
285
+ UniqueTypeName type() const override { return Type(); }
286
+ bool Equals(const InputMatcher<absl::string_view>& other) const override {
287
+ if (type() != other.type()) return false;
288
+ const auto& o = DownCast<const StringInputMatcher&>(other);
289
+ return matcher_ == o.matcher_;
290
+ }
291
+
292
+ std::string ToString() const override { return matcher_.ToString(); }
293
+
294
+ private:
295
+ StringMatcher matcher_;
296
+ };
297
+
298
+ // A predicate that evaluates a list of predicates, returning true if
299
+ // all predicates are true.
300
+ class XdsMatcherList::AndPredicate : public XdsMatcherList::Predicate {
301
+ public:
302
+ static std::unique_ptr<AndPredicate> Create(
303
+ std::vector<std::unique_ptr<Predicate>> predicates) {
304
+ for (const auto& predicate : predicates) {
305
+ if (predicate == nullptr) return nullptr;
306
+ }
307
+ return std::unique_ptr<AndPredicate>(
308
+ new AndPredicate(std::move(predicates)));
309
+ }
310
+
311
+ bool Match(const XdsMatcher::MatchContext& context) const override;
312
+ static UniqueTypeName Type() {
313
+ return GRPC_UNIQUE_TYPE_NAME_HERE("XdsMatcherListAndPredicate");
314
+ }
315
+ UniqueTypeName type() const override { return Type(); }
316
+ bool Equals(const Predicate& other) const override;
317
+ std::string ToString() const override;
318
+
319
+ private:
320
+ explicit AndPredicate(std::vector<std::unique_ptr<Predicate>> predicates)
321
+ : predicates_(std::move(predicates)) {}
322
+ std::vector<std::unique_ptr<Predicate>> predicates_;
323
+ };
324
+
325
+ // A predicate that evaluates a list of predicates, returning true if
326
+ // any one predicate is true.
327
+ class XdsMatcherList::OrPredicate : public XdsMatcherList::Predicate {
328
+ public:
329
+ static std::unique_ptr<OrPredicate> Create(
330
+ std::vector<std::unique_ptr<Predicate>> predicates) {
331
+ for (const auto& predicate : predicates) {
332
+ if (predicate == nullptr) return nullptr;
333
+ }
334
+ return std::unique_ptr<OrPredicate>(new OrPredicate(std::move(predicates)));
335
+ }
336
+ bool Match(const XdsMatcher::MatchContext& context) const override;
337
+ static UniqueTypeName Type() {
338
+ return GRPC_UNIQUE_TYPE_NAME_HERE("XdsMatcherListOrPredicate");
339
+ }
340
+ UniqueTypeName type() const override { return Type(); }
341
+
342
+ bool Equals(const Predicate& other) const override;
343
+ std::string ToString() const override;
344
+
345
+ private:
346
+ explicit OrPredicate(std::vector<std::unique_ptr<Predicate>> predicates)
347
+ : predicates_(std::move(predicates)) {}
348
+ std::vector<std::unique_ptr<Predicate>> predicates_;
349
+ };
350
+
351
+ // A predicate that inverts another predicate.
352
+ class XdsMatcherList::NotPredicate : public XdsMatcherList::Predicate {
353
+ public:
354
+ static std::unique_ptr<NotPredicate> Create(
355
+ std::unique_ptr<Predicate> predicate) {
356
+ if (predicate == nullptr) {
357
+ return nullptr;
358
+ }
359
+ return std::unique_ptr<NotPredicate>(
360
+ new NotPredicate(std::move(predicate)));
361
+ }
362
+ bool Match(const XdsMatcher::MatchContext& context) const override {
363
+ return !predicate_->Match(context);
364
+ }
365
+ static UniqueTypeName Type() {
366
+ return GRPC_UNIQUE_TYPE_NAME_HERE("XdsMatcherListNotPredicate");
367
+ }
368
+ UniqueTypeName type() const override { return Type(); }
369
+ bool Equals(const Predicate& other) const override {
370
+ const auto& o = DownCast<const NotPredicate&>(other);
371
+ return predicate_->Equals(*o.predicate_);
372
+ }
373
+
374
+ std::string ToString() const override {
375
+ return absl::StrCat("Not{", predicate_->ToString(), "}");
376
+ }
377
+
378
+ private:
379
+ explicit NotPredicate(std::unique_ptr<Predicate> predicate)
380
+ : predicate_(std::move(predicate)) {}
381
+ std::unique_ptr<Predicate> predicate_;
382
+ };
383
+
384
+ //
385
+ // XdsMatcherExactMap
386
+ //
387
+
388
+ class XdsMatcherExactMap : public XdsMatcher {
389
+ public:
390
+ XdsMatcherExactMap(std::unique_ptr<InputValue<absl::string_view>> input,
391
+ absl::flat_hash_map<std::string, OnMatch> map,
392
+ std::optional<OnMatch> on_no_match)
393
+ : input_(std::move(input)),
394
+ map_(std::move(map)),
395
+ on_no_match_(std::move(on_no_match)) {}
396
+
397
+ static UniqueTypeName Type() {
398
+ return GRPC_UNIQUE_TYPE_NAME_HERE("XdsMatcherExactMap");
399
+ }
400
+ UniqueTypeName type() const override { return Type(); }
401
+ bool Equals(const XdsMatcher& other) const override;
402
+ std::string ToString() const override;
403
+ bool FindMatches(const MatchContext& context, Result& result) const override;
404
+
405
+ private:
406
+ std::unique_ptr<InputValue<absl::string_view>> input_;
407
+ absl::flat_hash_map<std::string, OnMatch> map_;
408
+ std::optional<OnMatch> on_no_match_;
409
+ };
410
+
411
+ class XdsMatcherPrefixMap : public XdsMatcher {
412
+ public:
413
+ XdsMatcherPrefixMap(std::unique_ptr<InputValue<absl::string_view>> input,
414
+ absl::flat_hash_map<std::string, XdsMatcher::OnMatch> map,
415
+ std::optional<OnMatch> on_no_match);
416
+ static UniqueTypeName Type() {
417
+ return GRPC_UNIQUE_TYPE_NAME_HERE("XdsMatcherPrefixMap");
418
+ }
419
+ UniqueTypeName type() const override { return Type(); }
420
+ bool Equals(const XdsMatcher& other) const override;
421
+ std::string ToString() const override;
422
+ bool FindMatches(const MatchContext& context, Result& result) const override;
423
+
424
+ private:
425
+ TrieLookupTree<XdsMatcher::OnMatch> root_;
426
+ std::unique_ptr<InputValue<absl::string_view>> input_;
427
+ std::optional<OnMatch> on_no_match_;
428
+ };
429
+
430
+ } // namespace grpc_core
431
+
432
+ #endif // GRPC_SRC_CORE_XDS_GRPC_XDS_MATCHER_H
@@ -0,0 +1,47 @@
1
+ // Copyright 2025 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include "src/core/xds/grpc/xds_matcher_action.h"
16
+
17
+ #include <memory>
18
+ #include <variant>
19
+
20
+ #include "src/core/xds/grpc/xds_common_types.h"
21
+
22
+ namespace grpc_core {
23
+
24
+ void XdsMatcherActionRegistry::AddActionFactory(
25
+ std::unique_ptr<XdsMatcherActionFactory> factory) {
26
+ factories_.emplace(factory->type(), std::move(factory));
27
+ }
28
+
29
+ std::unique_ptr<XdsMatcher::Action>
30
+ XdsMatcherActionRegistry::ParseAndCreateAction(
31
+ const XdsResourceType::DecodeContext& context, const XdsExtension& action,
32
+ ValidationErrors* errors) const {
33
+ const auto it = factories_.find(action.type);
34
+ if (it == factories_.cend()) {
35
+ errors->AddError("Unsupported Action. Not found in registry");
36
+ return nullptr;
37
+ }
38
+ const absl::string_view* serialized_value =
39
+ std::get_if<absl::string_view>(&action.value);
40
+ if (serialized_value == nullptr) {
41
+ errors->AddError("Unsuppored action format (Json found instead of string)");
42
+ return nullptr;
43
+ }
44
+ return it->second->ParseAndCreateAction(context, *serialized_value, errors);
45
+ }
46
+
47
+ } // namespace grpc_core
@@ -0,0 +1,48 @@
1
+ // Copyright 2025 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef GRPC_SRC_CORE_XDS_GRPC_XDS_MATCHER_ACTION_H
16
+ #define GRPC_SRC_CORE_XDS_GRPC_XDS_MATCHER_ACTION_H
17
+
18
+ #include "src/core/xds/grpc/xds_common_types.h"
19
+ #include "src/core/xds/grpc/xds_matcher.h"
20
+ #include "src/core/xds/xds_client/xds_resource_type.h"
21
+
22
+ namespace grpc_core {
23
+
24
+ class XdsMatcherActionFactory {
25
+ public:
26
+ virtual absl::string_view type() const = 0;
27
+ virtual std::unique_ptr<XdsMatcher::Action> ParseAndCreateAction(
28
+ const XdsResourceType::DecodeContext& context,
29
+ absl::string_view serialized_value, ValidationErrors* errors) const = 0;
30
+ virtual ~XdsMatcherActionFactory() = default;
31
+ };
32
+
33
+ class XdsMatcherActionRegistry {
34
+ public:
35
+ void AddActionFactory(std::unique_ptr<XdsMatcherActionFactory> factory);
36
+ std::unique_ptr<XdsMatcher::Action> ParseAndCreateAction(
37
+ const XdsResourceType::DecodeContext& context, const XdsExtension& action,
38
+ ValidationErrors* errors) const;
39
+
40
+ private:
41
+ using FactoryMap =
42
+ std::map<absl::string_view, std::unique_ptr<XdsMatcherActionFactory>>;
43
+ FactoryMap factories_;
44
+ };
45
+
46
+ } // namespace grpc_core
47
+
48
+ #endif // GRPC_SRC_CORE_XDS_GRPC_XDS_MATCHER_ACTION_H
@@ -0,0 +1,29 @@
1
+ // Copyright 2025 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include "src/core/xds/grpc/xds_matcher_context.h"
16
+
17
+ namespace grpc_core {
18
+
19
+ std::optional<absl::string_view> RpcMatchContext::GetHeaderValue(
20
+ absl::string_view header_name) const {
21
+ if (absl::EndsWith(header_name, "-bin")) {
22
+ return std::nullopt;
23
+ } else if (header_name == "content-type") {
24
+ return "application/grpc";
25
+ }
26
+ return initial_metadata_->GetStringValue(header_name, &buffer_);
27
+ }
28
+
29
+ } // namespace grpc_core
@@ -0,0 +1,46 @@
1
+ // Copyright 2025 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef GRPC_SRC_CORE_XDS_GRPC_XDS_MATCHER_CONTEXT_H
16
+ #define GRPC_SRC_CORE_XDS_GRPC_XDS_MATCHER_CONTEXT_H
17
+
18
+ #include "src/core/call/metadata_batch.h"
19
+ #include "src/core/xds/grpc/xds_matcher.h"
20
+
21
+ namespace grpc_core {
22
+
23
+ class RpcMatchContext : public XdsMatcher::MatchContext {
24
+ public:
25
+ explicit RpcMatchContext(grpc_metadata_batch* initial_metadata)
26
+ : initial_metadata_(initial_metadata) {}
27
+
28
+ static UniqueTypeName Type() {
29
+ return GRPC_UNIQUE_TYPE_NAME_HERE("rpc_context");
30
+ }
31
+ UniqueTypeName type() const override { return Type(); }
32
+
33
+ // Returns the metadata value(s) for the specified key.
34
+ // As special cases, binary headers return a value of std::nullopt, and
35
+ // "content-type" header returns "application/grpc".
36
+ std::optional<absl::string_view> GetHeaderValue(
37
+ absl::string_view header_name) const;
38
+
39
+ private:
40
+ grpc_metadata_batch* initial_metadata_;
41
+ mutable std::string buffer_;
42
+ };
43
+
44
+ } // namespace grpc_core
45
+
46
+ #endif // GRPC_SRC_CORE_XDS_GRPC_XDS_MATCHER_CONTEXT_H
@@ -0,0 +1,79 @@
1
+ // Copyright 2025 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include "src/core/xds/grpc/xds_matcher_input.h"
16
+
17
+ #include "envoy/type/matcher/v3/http_inputs.upb.h"
18
+ #include "src/core/util/upb_utils.h"
19
+ #include "src/core/xds/grpc/xds_matcher.h"
20
+ #include "src/core/xds/grpc/xds_matcher_context.h"
21
+
22
+ namespace grpc_core {
23
+ std::optional<absl::string_view> MetadataInput::GetValue(
24
+ const XdsMatcher::MatchContext& context) const {
25
+ CHECK_EQ(context.type(), RpcMatchContext::Type());
26
+ return DownCast<const RpcMatchContext&>(context).GetHeaderValue(key_);
27
+ }
28
+
29
+ std::unique_ptr<XdsMatcher::InputValue<absl::string_view>>
30
+ MetadataInputFactory::ParseAndCreateInput(
31
+ const XdsResourceType::DecodeContext& context,
32
+ absl::string_view serialized_value, ValidationErrors* errors) const {
33
+ auto http_header_input =
34
+ envoy_type_matcher_v3_HttpRequestHeaderMatchInput_parse(
35
+ serialized_value.data(), serialized_value.size(), context.arena);
36
+ if (http_header_input == nullptr) {
37
+ errors->AddError("Failed to parse HttpRequestHeaderMatchInput");
38
+ return nullptr;
39
+ }
40
+ // extract header name (Key for metadata match)
41
+ auto header_name = UpbStringToStdString(
42
+ envoy_type_matcher_v3_HttpRequestHeaderMatchInput_header_name(
43
+ http_header_input));
44
+ return std::make_unique<MetadataInput>(header_name);
45
+ }
46
+
47
+ template <>
48
+ XdsMatcherInputRegistry<absl::string_view>::XdsMatcherInputRegistry() {
49
+ // Add factories
50
+ factories_.emplace(MetadataInputFactory::Type(),
51
+ std::make_unique<MetadataInputFactory>());
52
+ }
53
+
54
+ template <>
55
+ std::unique_ptr<XdsMatcher::InputValue<absl::string_view>>
56
+ XdsMatcherInputRegistry<absl::string_view>::ParseAndCreateInput(
57
+ const XdsResourceType::DecodeContext& context, const XdsExtension& input,
58
+ const UniqueTypeName& matcher_context, ValidationErrors* errors) const {
59
+ const auto it = factories_.find(input.type);
60
+ if (it == factories_.cend()) {
61
+ errors->AddError(absl::StrCat("Unsupported Input type:", input.type));
62
+ return nullptr;
63
+ }
64
+ if (it->second->context_type() != matcher_context) {
65
+ errors->AddError(
66
+ absl::StrCat("Unsupported context:", it->second->context_type(),
67
+ ". Parser supported context:", matcher_context));
68
+ return nullptr;
69
+ }
70
+ const absl::string_view* serialized_value =
71
+ std::get_if<absl::string_view>(&input.value);
72
+ if (serialized_value == nullptr) {
73
+ errors->AddError("Unsuppored input format (Json found instead of string)");
74
+ return nullptr;
75
+ }
76
+ return it->second->ParseAndCreateInput(context, *serialized_value, errors);
77
+ }
78
+
79
+ } // namespace grpc_core