grpc 1.41.0 → 1.43.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (1056) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +126 -62
  3. data/etc/roots.pem +335 -326
  4. data/include/grpc/event_engine/event_engine.h +118 -54
  5. data/include/grpc/event_engine/internal/memory_allocator_impl.h +68 -0
  6. data/include/grpc/event_engine/memory_allocator.h +226 -0
  7. data/include/grpc/event_engine/memory_request.h +57 -0
  8. data/include/grpc/grpc.h +4 -0
  9. data/include/grpc/grpc_security.h +294 -145
  10. data/include/grpc/grpc_security_constants.h +2 -14
  11. data/include/grpc/impl/codegen/port_platform.h +14 -3
  12. data/src/core/ext/filters/client_channel/backend_metric.cc +21 -23
  13. data/src/core/ext/filters/client_channel/backend_metric.h +3 -2
  14. data/src/core/ext/filters/client_channel/backup_poller.cc +2 -1
  15. data/src/core/ext/filters/client_channel/channel_connectivity.cc +71 -89
  16. data/src/core/ext/filters/client_channel/client_channel.cc +254 -278
  17. data/src/core/ext/filters/client_channel/client_channel.h +79 -31
  18. data/src/core/ext/filters/client_channel/client_channel_factory.cc +1 -1
  19. data/src/core/ext/filters/client_channel/client_channel_factory.h +17 -19
  20. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +7 -14
  21. data/src/core/ext/filters/client_channel/config_selector.cc +1 -1
  22. data/src/core/ext/filters/client_channel/config_selector.h +4 -5
  23. data/src/core/ext/filters/client_channel/connector.h +18 -18
  24. data/src/core/ext/filters/client_channel/dynamic_filters.cc +5 -5
  25. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +0 -1
  26. data/src/core/ext/filters/client_channel/health/health_check_client.cc +12 -11
  27. data/src/core/ext/filters/client_channel/health/health_check_client.h +1 -1
  28. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +12 -14
  29. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
  30. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -0
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -15
  32. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +167 -84
  33. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +4 -0
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -2
  36. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -2
  37. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -4
  38. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +23 -7
  39. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -10
  40. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +4 -6
  41. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +2502 -0
  42. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +6 -1
  43. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +7 -1
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +32 -81
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +1 -1
  46. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +87 -34
  47. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -1
  48. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +53 -106
  49. data/src/core/ext/filters/client_channel/lb_policy.h +86 -60
  50. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -0
  51. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +139 -0
  52. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +14 -8
  53. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +2 -2
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +11 -15
  55. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +12 -39
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +21 -1
  57. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +9 -5
  58. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +3 -1
  59. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +6 -12
  60. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +281 -344
  61. data/src/core/ext/filters/client_channel/resolver.h +1 -1
  62. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -0
  63. data/src/core/ext/filters/client_channel/resolver_registry.cc +12 -15
  64. data/src/core/ext/filters/client_channel/resolver_registry.h +1 -2
  65. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
  66. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +1 -1
  67. data/src/core/ext/filters/client_channel/retry_filter.cc +48 -86
  68. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  69. data/src/core/ext/filters/client_channel/retry_throttle.cc +17 -48
  70. data/src/core/ext/filters/client_channel/server_address.h +1 -1
  71. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +49 -36
  72. data/src/core/ext/filters/client_channel/subchannel.cc +89 -147
  73. data/src/core/ext/filters/client_channel/subchannel.h +29 -49
  74. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +22 -7
  75. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +11 -2
  76. data/src/core/ext/filters/client_idle/client_idle_filter.cc +27 -210
  77. data/src/core/ext/filters/client_idle/idle_filter_state.cc +96 -0
  78. data/src/core/ext/filters/client_idle/idle_filter_state.h +66 -0
  79. data/src/core/ext/filters/deadline/deadline_filter.cc +23 -26
  80. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +20 -20
  81. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -1
  82. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  83. data/src/core/ext/filters/http/client/http_client_filter.cc +48 -67
  84. data/src/core/ext/filters/http/client_authority_filter.cc +14 -15
  85. data/src/core/ext/filters/http/http_filters_plugin.cc +51 -71
  86. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +17 -12
  87. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +1 -1
  88. data/src/core/ext/filters/http/server/http_server_filter.cc +69 -83
  89. data/src/core/ext/filters/max_age/max_age_filter.cc +24 -26
  90. data/src/core/ext/filters/message_size/message_size_filter.cc +19 -16
  91. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  92. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +67 -0
  93. data/src/core/ext/filters/server_config_selector/server_config_selector.h +70 -0
  94. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +265 -0
  95. data/src/core/ext/filters/{workarounds/workaround_cronet_compression_filter.h → server_config_selector/server_config_selector_filter.h} +11 -6
  96. data/src/core/ext/{filters/client_channel → service_config}/service_config.cc +2 -2
  97. data/src/core/ext/{filters/client_channel → service_config}/service_config.h +4 -4
  98. data/src/core/ext/service_config/service_config_call_data.h +72 -0
  99. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.cc +3 -3
  100. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.h +8 -6
  101. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +4 -23
  102. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +0 -2
  103. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +25 -27
  104. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +11 -14
  105. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +32 -52
  106. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +68 -95
  107. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +2 -3
  108. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +9 -13
  109. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +6 -6
  110. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +108 -116
  111. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -2
  112. data/src/core/ext/transport/chttp2/transport/context_list.cc +2 -3
  113. data/src/core/ext/transport/chttp2/transport/context_list.h +2 -3
  114. data/src/core/ext/transport/chttp2/transport/flow_control.cc +26 -23
  115. data/src/core/ext/transport/chttp2/transport/flow_control.h +6 -6
  116. data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -4
  117. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
  118. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -1
  119. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -3
  120. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
  121. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +1 -1
  122. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +119 -15
  123. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +41 -5
  124. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +1 -1
  125. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +195 -183
  126. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +27 -8
  127. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +12 -25
  128. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +37 -30
  129. data/src/core/ext/transport/chttp2/transport/internal.h +12 -7
  130. data/src/core/ext/transport/chttp2/transport/parsing.cc +30 -173
  131. data/src/core/ext/transport/chttp2/transport/popularity_count.h +1 -1
  132. data/src/core/ext/transport/chttp2/transport/writing.cc +29 -22
  133. data/src/core/ext/transport/inproc/inproc_transport.cc +121 -116
  134. data/src/core/ext/transport/inproc/inproc_transport.h +1 -1
  135. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +197 -165
  136. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +2 -0
  137. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +41 -0
  138. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +18 -0
  139. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +26 -2
  140. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -0
  141. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +107 -82
  142. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +2 -0
  143. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +188 -160
  144. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +2 -0
  145. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +35 -22
  146. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +2 -0
  147. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +277 -208
  148. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +141 -1
  149. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +16 -5
  150. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +2 -0
  151. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +36 -25
  152. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +2 -0
  153. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +56 -39
  154. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +2 -0
  155. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +16 -5
  156. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +2 -0
  157. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +171 -125
  158. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +55 -4
  159. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +51 -36
  160. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +2 -0
  161. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +15 -4
  162. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +2 -0
  163. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +25 -13
  164. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +2 -0
  165. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +114 -90
  166. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +2 -0
  167. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +90 -71
  168. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +17 -0
  169. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +17 -6
  170. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +2 -0
  171. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +121 -92
  172. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +25 -0
  173. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +13 -2
  174. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +2 -0
  175. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +21 -9
  176. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +2 -0
  177. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +18 -7
  178. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +2 -0
  179. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +22 -11
  180. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +2 -0
  181. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +17 -6
  182. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +2 -0
  183. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +41 -27
  184. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +2 -0
  185. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +59 -44
  186. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +2 -0
  187. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +58 -43
  188. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +2 -0
  189. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +15 -4
  190. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +2 -0
  191. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +73 -57
  192. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +2 -0
  193. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +81 -64
  194. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +2 -0
  195. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +25 -14
  196. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +2 -0
  197. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +19 -7
  198. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +2 -0
  199. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +63 -45
  200. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +2 -0
  201. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +66 -47
  202. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +2 -0
  203. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +99 -78
  204. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +19 -0
  205. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +41 -28
  206. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +2 -0
  207. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +508 -442
  208. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +51 -19
  209. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +26 -13
  210. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +2 -0
  211. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +21 -9
  212. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +2 -0
  213. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +13 -2
  214. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +2 -0
  215. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +35 -20
  216. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +2 -0
  217. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +44 -31
  218. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +2 -0
  219. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +22 -11
  220. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +2 -0
  221. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +210 -181
  222. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +2 -0
  223. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +7 -0
  224. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +5 -3
  225. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +64 -48
  226. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +2 -0
  227. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +33 -20
  228. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +2 -0
  229. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +81 -65
  230. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +2 -0
  231. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +12 -1
  232. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +2 -0
  233. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +12 -1
  234. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +2 -0
  235. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +75 -58
  236. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +2 -0
  237. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +12 -1
  238. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +2 -0
  239. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +12 -1
  240. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +2 -0
  241. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +25 -13
  242. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +2 -0
  243. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +12 -1
  244. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +2 -0
  245. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +12 -1
  246. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +2 -0
  247. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +61 -46
  248. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +2 -0
  249. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +26 -12
  250. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +2 -0
  251. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +22 -10
  252. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +2 -0
  253. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +17 -6
  254. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +2 -0
  255. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +16 -5
  256. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +2 -0
  257. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +15 -4
  258. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +2 -0
  259. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +27 -14
  260. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +2 -0
  261. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +25 -13
  262. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +2 -0
  263. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +20 -8
  264. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +2 -0
  265. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +30 -17
  266. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +2 -0
  267. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +38 -21
  268. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +2 -0
  269. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +41 -26
  270. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +2 -0
  271. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.c +7 -0
  272. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +2 -0
  273. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +17 -5
  274. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +2 -0
  275. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +22 -9
  276. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +2 -0
  277. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +15 -4
  278. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +2 -0
  279. data/src/core/ext/upb-generated/google/api/annotations.upb.c +20 -0
  280. data/src/core/ext/upb-generated/google/api/annotations.upb.h +7 -0
  281. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +116 -93
  282. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +2 -0
  283. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.c +102 -0
  284. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.h +306 -0
  285. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.c +56 -0
  286. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.h +135 -0
  287. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +122 -98
  288. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +2 -0
  289. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.c +115 -0
  290. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.h +371 -0
  291. data/src/core/ext/upb-generated/google/api/http.upb.c +35 -22
  292. data/src/core/ext/upb-generated/google/api/http.upb.h +2 -0
  293. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +14 -3
  294. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +2 -0
  295. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +247 -210
  296. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +2 -0
  297. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +14 -3
  298. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +2 -0
  299. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +12 -1
  300. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +2 -0
  301. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +37 -23
  302. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +2 -0
  303. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +14 -3
  304. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +2 -0
  305. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +37 -18
  306. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +2 -0
  307. data/src/core/ext/upb-generated/google/rpc/status.upb.c +17 -6
  308. data/src/core/ext/upb-generated/google/rpc/status.upb.h +2 -0
  309. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +26 -14
  310. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +2 -0
  311. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +105 -83
  312. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +2 -0
  313. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +20 -8
  314. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +2 -0
  315. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +16 -4
  316. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +2 -0
  317. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +65 -47
  318. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +34 -36
  319. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +68 -0
  320. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +156 -0
  321. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +67 -7
  322. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +27 -0
  323. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +27 -5
  324. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +7 -0
  325. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +19 -0
  326. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +7 -0
  327. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +27 -3
  328. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +7 -0
  329. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +26 -2
  330. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -0
  331. data/src/core/ext/upb-generated/validate/validate.upb.c +320 -251
  332. data/src/core/ext/upb-generated/validate/validate.upb.h +20 -0
  333. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +103 -0
  334. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +199 -0
  335. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +14 -3
  336. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +2 -0
  337. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +25 -13
  338. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +2 -0
  339. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +20 -8
  340. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +2 -0
  341. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +19 -8
  342. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +2 -0
  343. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +28 -16
  344. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +2 -0
  345. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +19 -8
  346. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +2 -0
  347. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +71 -0
  348. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +132 -0
  349. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +44 -0
  350. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +85 -0
  351. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +2 -49
  352. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +2 -2
  353. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +2 -7
  354. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +2 -35
  355. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +2 -41
  356. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +2 -11
  357. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +307 -336
  358. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +10 -0
  359. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +2 -7
  360. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +2 -7
  361. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +2 -19
  362. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +2 -7
  363. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +100 -138
  364. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +5 -0
  365. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +2 -15
  366. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +2 -7
  367. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +2 -9
  368. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +2 -33
  369. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +61 -77
  370. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +2 -7
  371. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +61 -79
  372. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +2 -7
  373. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c +2 -9
  374. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +2 -7
  375. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +2 -7
  376. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c +2 -7
  377. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +2 -13
  378. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +80 -99
  379. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +2 -15
  380. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +2 -7
  381. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +2 -17
  382. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +2 -19
  383. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +2 -7
  384. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +2 -9
  385. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +2 -21
  386. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +2 -23
  387. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +2 -11
  388. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +325 -427
  389. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +2 -11
  390. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +2 -9
  391. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +2 -7
  392. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +2 -15
  393. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +2 -11
  394. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +2 -7
  395. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +2 -43
  396. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +2 -2
  397. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +2 -17
  398. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +2 -11
  399. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +2 -17
  400. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +2 -7
  401. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +2 -7
  402. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +2 -19
  403. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +2 -7
  404. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +2 -7
  405. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +2 -9
  406. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +2 -7
  407. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +2 -7
  408. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +2 -15
  409. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c +2 -13
  410. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +2 -9
  411. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +2 -7
  412. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +2 -7
  413. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +2 -7
  414. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +2 -11
  415. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +2 -9
  416. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +2 -9
  417. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +2 -11
  418. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +2 -19
  419. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +2 -15
  420. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +2 -2
  421. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +2 -9
  422. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +2 -11
  423. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +2 -7
  424. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +2 -2
  425. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +2 -11
  426. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +2 -7
  427. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +2 -59
  428. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +2 -7
  429. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +2 -7
  430. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +2 -13
  431. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +2 -7
  432. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +2 -23
  433. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +2 -7
  434. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +7 -15
  435. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +21 -30
  436. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +6 -5
  437. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +7 -10
  438. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +7 -11
  439. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +2 -51
  440. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +64 -0
  441. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +50 -0
  442. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +15 -19
  443. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +27 -33
  444. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +18 -24
  445. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +19 -23
  446. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +35 -41
  447. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +21 -25
  448. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +40 -0
  449. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +35 -0
  450. data/src/core/ext/xds/certificate_provider_registry.cc +1 -1
  451. data/src/core/ext/xds/certificate_provider_store.h +1 -1
  452. data/src/core/ext/xds/xds_api.cc +693 -625
  453. data/src/core/ext/xds/xds_api.h +137 -83
  454. data/src/core/ext/xds/xds_bootstrap.cc +6 -3
  455. data/src/core/ext/xds/xds_bootstrap.h +10 -0
  456. data/src/core/ext/xds/xds_certificate_provider.cc +3 -3
  457. data/src/core/ext/xds/xds_certificate_provider.h +1 -2
  458. data/src/core/ext/xds/xds_channel_stack_modifier.cc +112 -0
  459. data/src/core/ext/xds/xds_channel_stack_modifier.h +52 -0
  460. data/src/core/ext/xds/xds_client.cc +752 -435
  461. data/src/core/ext/xds/xds_client.h +83 -69
  462. data/src/core/ext/xds/xds_client_stats.h +1 -1
  463. data/src/core/ext/xds/xds_routing.cc +247 -0
  464. data/src/core/ext/xds/xds_routing.h +98 -0
  465. data/src/core/ext/xds/xds_server_config_fetcher.cc +976 -264
  466. data/src/core/lib/address_utils/parse_address.cc +2 -0
  467. data/src/core/lib/avl/avl.h +389 -88
  468. data/src/core/lib/backoff/backoff.cc +3 -3
  469. data/src/core/lib/channel/channel_args.cc +25 -7
  470. data/src/core/lib/channel/channel_args.h +11 -1
  471. data/src/core/lib/channel/channel_args_preconditioning.cc +47 -0
  472. data/src/core/lib/channel/channel_args_preconditioning.h +62 -0
  473. data/src/core/lib/channel/channel_stack_builder.cc +3 -5
  474. data/src/core/lib/channel/channel_trace.cc +7 -7
  475. data/src/core/lib/channel/channel_trace.h +1 -1
  476. data/src/core/lib/channel/channelz.cc +3 -3
  477. data/src/core/lib/channel/channelz.h +2 -2
  478. data/src/core/lib/channel/channelz_registry.cc +1 -1
  479. data/src/core/lib/channel/channelz_registry.h +1 -1
  480. data/src/core/lib/channel/connected_channel.cc +1 -3
  481. data/src/core/lib/channel/connected_channel.h +1 -2
  482. data/src/core/lib/compression/compression.cc +2 -2
  483. data/src/core/lib/compression/compression_args.cc +13 -9
  484. data/src/core/lib/compression/compression_args.h +6 -4
  485. data/src/core/lib/compression/compression_internal.cc +2 -2
  486. data/src/core/lib/compression/compression_internal.h +1 -1
  487. data/src/core/lib/config/core_configuration.cc +46 -2
  488. data/src/core/lib/config/core_configuration.h +50 -1
  489. data/src/core/lib/debug/stats.cc +1 -1
  490. data/src/core/lib/debug/stats_data.cc +13 -13
  491. data/src/core/lib/debug/trace.h +2 -2
  492. data/src/core/lib/event_engine/{endpoint_config.cc → channel_args_endpoint_config.cc} +2 -1
  493. data/src/core/lib/event_engine/{endpoint_config_internal.h → channel_args_endpoint_config.h} +3 -3
  494. data/src/core/lib/event_engine/event_engine.cc +0 -13
  495. data/src/core/lib/event_engine/event_engine_factory.cc +49 -0
  496. data/src/core/lib/event_engine/event_engine_factory.h +33 -0
  497. data/src/core/lib/event_engine/memory_allocator.cc +70 -0
  498. data/src/core/lib/gpr/atm.cc +1 -1
  499. data/src/core/lib/gpr/cpu_posix.cc +1 -1
  500. data/src/core/lib/gpr/string.cc +2 -2
  501. data/src/core/lib/gpr/tls.h +7 -1
  502. data/src/core/lib/gpr/useful.h +79 -32
  503. data/src/core/lib/gprpp/arena.h +10 -0
  504. data/src/core/lib/gprpp/bitset.h +38 -16
  505. data/src/core/lib/gprpp/chunked_vector.h +211 -0
  506. data/src/core/lib/gprpp/construct_destruct.h +1 -1
  507. data/src/core/lib/gprpp/cpp_impl_of.h +45 -0
  508. data/src/core/lib/gprpp/global_config_env.cc +7 -7
  509. data/src/core/lib/gprpp/global_config_env.h +2 -2
  510. data/src/core/lib/gprpp/manual_constructor.h +2 -3
  511. data/src/core/lib/gprpp/memory.h +6 -0
  512. data/src/core/lib/gprpp/orphanable.h +1 -1
  513. data/src/core/lib/gprpp/ref_counted.h +1 -1
  514. data/src/core/lib/gprpp/ref_counted_ptr.h +2 -4
  515. data/src/core/lib/gprpp/status_helper.cc +23 -3
  516. data/src/core/lib/gprpp/status_helper.h +13 -2
  517. data/src/core/lib/gprpp/table.h +423 -0
  518. data/src/core/lib/http/httpcli.cc +220 -198
  519. data/src/core/lib/http/httpcli.h +14 -12
  520. data/src/core/lib/http/parser.cc +2 -2
  521. data/src/core/lib/iomgr/buffer_list.cc +9 -9
  522. data/src/core/lib/iomgr/buffer_list.h +13 -13
  523. data/src/core/lib/iomgr/call_combiner.cc +29 -12
  524. data/src/core/lib/iomgr/combiner.cc +6 -21
  525. data/src/core/lib/iomgr/endpoint.h +0 -1
  526. data/src/core/lib/iomgr/endpoint_cfstream.cc +14 -30
  527. data/src/core/lib/iomgr/endpoint_cfstream.h +4 -4
  528. data/src/core/lib/iomgr/endpoint_pair_posix.cc +9 -11
  529. data/src/core/lib/iomgr/endpoint_pair_windows.cc +5 -14
  530. data/src/core/lib/iomgr/error.cc +113 -52
  531. data/src/core/lib/iomgr/error.h +50 -9
  532. data/src/core/lib/iomgr/error_cfstream.cc +5 -0
  533. data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -2
  534. data/src/core/lib/iomgr/ev_epollex_linux.cc +7 -7
  535. data/src/core/lib/iomgr/ev_poll_posix.cc +29 -20
  536. data/src/core/lib/iomgr/event_engine/closure.cc +41 -18
  537. data/src/core/lib/iomgr/event_engine/closure.h +10 -1
  538. data/src/core/lib/iomgr/event_engine/endpoint.cc +5 -6
  539. data/src/core/lib/iomgr/event_engine/iomgr.cc +6 -26
  540. data/src/core/lib/iomgr/event_engine/pollset.cc +5 -4
  541. data/src/core/lib/iomgr/event_engine/resolver.cc +12 -8
  542. data/src/core/lib/iomgr/event_engine/tcp.cc +16 -13
  543. data/src/core/lib/iomgr/event_engine/timer.cc +10 -4
  544. data/src/core/lib/iomgr/exec_ctx.cc +1 -9
  545. data/src/core/lib/iomgr/exec_ctx.h +11 -11
  546. data/src/core/lib/iomgr/executor/mpmcqueue.cc +5 -7
  547. data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -8
  548. data/src/core/lib/iomgr/executor.cc +16 -33
  549. data/src/core/lib/iomgr/executor.h +1 -1
  550. data/src/core/lib/iomgr/iomgr.cc +3 -1
  551. data/src/core/lib/iomgr/iomgr_internal.cc +4 -9
  552. data/src/core/lib/iomgr/iomgr_internal.h +3 -2
  553. data/src/core/lib/iomgr/load_file.cc +2 -2
  554. data/src/core/lib/iomgr/lockfree_event.cc +18 -0
  555. data/src/core/lib/iomgr/pollset_custom.cc +1 -1
  556. data/src/core/lib/iomgr/pollset_custom.h +1 -1
  557. data/src/core/lib/iomgr/resolve_address_posix.cc +5 -7
  558. data/src/core/lib/iomgr/socket_factory_posix.cc +2 -2
  559. data/src/core/lib/iomgr/socket_mutator.cc +2 -2
  560. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -2
  561. data/src/core/lib/iomgr/tcp_client.cc +2 -4
  562. data/src/core/lib/iomgr/tcp_client.h +1 -3
  563. data/src/core/lib/iomgr/tcp_client_cfstream.cc +6 -12
  564. data/src/core/lib/iomgr/tcp_client_custom.cc +5 -11
  565. data/src/core/lib/iomgr/tcp_client_posix.cc +16 -41
  566. data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
  567. data/src/core/lib/iomgr/tcp_client_windows.cc +3 -13
  568. data/src/core/lib/iomgr/tcp_custom.cc +9 -36
  569. data/src/core/lib/iomgr/tcp_custom.h +0 -1
  570. data/src/core/lib/iomgr/tcp_posix.cc +32 -38
  571. data/src/core/lib/iomgr/tcp_posix.h +1 -3
  572. data/src/core/lib/iomgr/tcp_server.cc +4 -6
  573. data/src/core/lib/iomgr/tcp_server.h +6 -8
  574. data/src/core/lib/iomgr/tcp_server_custom.cc +7 -16
  575. data/src/core/lib/iomgr/tcp_server_posix.cc +20 -25
  576. data/src/core/lib/iomgr/tcp_server_utils_posix.h +19 -18
  577. data/src/core/lib/iomgr/tcp_server_windows.cc +9 -17
  578. data/src/core/lib/iomgr/tcp_windows.cc +4 -9
  579. data/src/core/lib/iomgr/tcp_windows.h +1 -2
  580. data/src/core/lib/iomgr/timer_generic.cc +13 -13
  581. data/src/core/lib/iomgr/timer_heap.cc +1 -1
  582. data/src/core/lib/iomgr/unix_sockets_posix.cc +1 -1
  583. data/src/core/lib/iomgr/unix_sockets_posix.h +1 -1
  584. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +1 -1
  585. data/src/core/lib/iomgr/work_serializer.cc +115 -44
  586. data/src/core/lib/iomgr/work_serializer.h +16 -4
  587. data/src/core/lib/json/json_reader.cc +83 -35
  588. data/src/core/lib/json/json_util.cc +69 -1
  589. data/src/core/lib/json/json_util.h +57 -99
  590. data/src/core/lib/json/json_writer.cc +0 -3
  591. data/src/core/lib/promise/activity.cc +115 -0
  592. data/src/core/lib/promise/activity.h +499 -0
  593. data/src/core/lib/promise/context.h +86 -0
  594. data/src/core/lib/promise/detail/basic_seq.h +407 -0
  595. data/src/core/lib/promise/detail/promise_factory.h +189 -0
  596. data/src/core/lib/promise/detail/promise_like.h +85 -0
  597. data/src/core/lib/promise/detail/status.h +44 -0
  598. data/src/core/lib/promise/detail/switch.h +1455 -0
  599. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +48 -0
  600. data/src/core/lib/promise/loop.h +108 -0
  601. data/src/core/lib/promise/map.h +88 -0
  602. data/src/core/lib/promise/poll.h +60 -0
  603. data/src/core/lib/promise/race.h +84 -0
  604. data/src/core/lib/promise/seq.h +71 -0
  605. data/src/core/lib/resource_quota/api.cc +108 -0
  606. data/src/core/lib/resource_quota/api.h +41 -0
  607. data/src/core/lib/resource_quota/memory_quota.cc +454 -0
  608. data/src/core/lib/resource_quota/memory_quota.h +421 -0
  609. data/src/core/lib/resource_quota/resource_quota.cc +33 -0
  610. data/src/core/lib/resource_quota/resource_quota.h +58 -0
  611. data/src/core/lib/{transport/authority_override.h → resource_quota/thread_quota.cc} +22 -16
  612. data/src/core/lib/resource_quota/thread_quota.h +57 -0
  613. data/src/core/lib/resource_quota/trace.cc +19 -0
  614. data/src/core/lib/resource_quota/trace.h +24 -0
  615. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  616. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
  617. data/src/core/lib/security/authorization/evaluate_args.cc +20 -24
  618. data/src/core/lib/security/authorization/evaluate_args.h +2 -1
  619. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +15 -1
  620. data/src/core/lib/security/context/security_context.cc +4 -2
  621. data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
  622. data/src/core/lib/security/credentials/credentials.cc +4 -2
  623. data/src/core/lib/security/credentials/credentials.h +6 -1
  624. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +11 -12
  625. data/src/core/lib/security/credentials/external/external_account_credentials.cc +56 -21
  626. data/src/core/lib/security/credentials/external/external_account_credentials.h +1 -0
  627. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +3 -4
  628. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +5 -7
  629. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -1
  630. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +9 -15
  631. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +18 -22
  632. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -2
  633. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +11 -12
  634. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +7 -8
  635. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +201 -0
  636. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +106 -0
  637. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +11 -90
  638. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +19 -82
  639. data/src/core/lib/security/credentials/tls/tls_credentials.cc +21 -10
  640. data/src/core/lib/security/credentials/xds/xds_credentials.cc +28 -33
  641. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +3 -3
  642. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +2 -2
  643. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +5 -6
  644. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  645. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +7 -7
  646. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -2
  647. data/src/core/lib/security/security_connector/local/local_security_connector.cc +4 -1
  648. data/src/core/lib/security/security_connector/security_connector.cc +9 -4
  649. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  650. data/src/core/lib/security/security_connector/ssl_utils.cc +11 -3
  651. data/src/core/lib/security/security_connector/ssl_utils.h +1 -1
  652. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +345 -195
  653. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +64 -43
  654. data/src/core/lib/security/transport/client_auth_filter.cc +5 -5
  655. data/src/core/lib/security/transport/security_handshaker.cc +75 -45
  656. data/src/core/lib/security/transport/server_auth_filter.cc +3 -5
  657. data/src/core/lib/security/transport/tsi_error.cc +3 -5
  658. data/src/core/lib/slice/percent_encoding.cc +30 -86
  659. data/src/core/lib/slice/percent_encoding.h +5 -11
  660. data/src/core/lib/slice/slice.cc +7 -23
  661. data/src/core/lib/slice/slice.h +341 -0
  662. data/src/core/lib/slice/slice_api.cc +39 -0
  663. data/src/core/lib/slice/slice_buffer.cc +9 -5
  664. data/src/core/lib/slice/slice_intern.cc +9 -14
  665. data/src/core/lib/slice/slice_internal.h +1 -244
  666. data/src/core/lib/slice/slice_refcount.cc +17 -0
  667. data/src/core/lib/slice/slice_refcount.h +125 -0
  668. data/src/core/lib/slice/slice_refcount_base.h +181 -0
  669. data/src/core/lib/slice/slice_split.cc +100 -0
  670. data/src/core/lib/slice/slice_split.h +40 -0
  671. data/src/core/lib/slice/slice_string_helpers.cc +0 -83
  672. data/src/core/lib/slice/slice_string_helpers.h +0 -11
  673. data/src/core/lib/slice/static_slice.cc +377 -0
  674. data/src/core/lib/slice/static_slice.h +300 -0
  675. data/src/core/lib/surface/builtins.cc +49 -0
  676. data/src/core/lib/surface/builtins.h +26 -0
  677. data/src/core/lib/surface/call.cc +171 -162
  678. data/src/core/lib/surface/call.h +0 -6
  679. data/src/core/lib/surface/channel.cc +23 -61
  680. data/src/core/lib/surface/channel.h +2 -21
  681. data/src/core/lib/surface/channel_init.cc +23 -76
  682. data/src/core/lib/surface/channel_init.h +52 -44
  683. data/src/core/lib/surface/completion_queue.cc +8 -7
  684. data/src/core/lib/surface/init.cc +0 -40
  685. data/src/core/lib/surface/init_secure.cc +17 -14
  686. data/src/core/lib/surface/lame_client.cc +41 -27
  687. data/src/core/lib/surface/lame_client.h +1 -1
  688. data/src/core/lib/surface/server.cc +45 -37
  689. data/src/core/lib/surface/server.h +25 -19
  690. data/src/core/lib/surface/validate_metadata.cc +7 -4
  691. data/src/core/lib/surface/version.cc +2 -2
  692. data/src/core/lib/transport/bdp_estimator.cc +2 -2
  693. data/src/core/lib/transport/byte_stream.cc +4 -0
  694. data/src/core/lib/transport/error_utils.cc +42 -17
  695. data/src/core/lib/transport/error_utils.h +1 -1
  696. data/src/core/lib/transport/metadata.cc +31 -10
  697. data/src/core/lib/transport/metadata.h +6 -5
  698. data/src/core/lib/transport/metadata_batch.cc +40 -371
  699. data/src/core/lib/transport/metadata_batch.h +980 -71
  700. data/src/core/lib/transport/{authority_override.cc → parsed_metadata.cc} +12 -17
  701. data/src/core/lib/transport/parsed_metadata.h +382 -0
  702. data/src/core/lib/transport/pid_controller.cc +4 -4
  703. data/src/core/lib/transport/static_metadata.cc +632 -849
  704. data/src/core/lib/transport/static_metadata.h +115 -397
  705. data/src/core/lib/transport/status_metadata.cc +1 -0
  706. data/src/core/lib/transport/transport.cc +8 -31
  707. data/src/core/lib/transport/transport.h +0 -1
  708. data/src/core/lib/transport/transport_op_string.cc +40 -20
  709. data/src/core/lib/uri/uri_parser.cc +19 -19
  710. data/src/core/lib/uri/uri_parser.h +2 -0
  711. data/src/core/plugin_registry/grpc_plugin_registry.cc +66 -43
  712. data/src/core/tsi/alts/crypt/aes_gcm.cc +3 -1
  713. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +13 -12
  714. data/src/core/tsi/alts/frame_protector/frame_handler.cc +10 -11
  715. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +2 -3
  716. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +12 -2
  717. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  718. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +2 -2
  719. data/src/core/tsi/fake_transport_security.cc +15 -7
  720. data/src/core/tsi/local_transport_security.cc +43 -80
  721. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +16 -50
  722. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -3
  723. data/src/core/tsi/ssl_transport_security.cc +40 -3
  724. data/src/core/tsi/ssl_transport_security.h +1 -0
  725. data/src/core/tsi/transport_security.cc +12 -0
  726. data/src/core/tsi/transport_security.h +16 -1
  727. data/src/core/tsi/transport_security_interface.h +26 -0
  728. data/src/ruby/ext/grpc/extconf.rb +12 -9
  729. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +10 -10
  730. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +15 -15
  731. data/src/ruby/lib/grpc/version.rb +1 -1
  732. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -2
  733. data/src/ruby/spec/client_server_spec.rb +1 -1
  734. data/third_party/abseil-cpp/absl/algorithm/container.h +101 -91
  735. data/third_party/abseil-cpp/absl/base/attributes.h +64 -31
  736. data/third_party/abseil-cpp/absl/base/config.h +67 -37
  737. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +1 -26
  738. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -1
  739. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +2 -0
  740. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +69 -0
  741. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +4 -4
  742. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +15 -10
  743. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +16 -0
  744. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +4 -4
  745. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  746. data/third_party/abseil-cpp/absl/container/fixed_array.h +0 -5
  747. data/third_party/abseil-cpp/absl/container/inlined_vector.h +105 -97
  748. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +17 -15
  749. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +18 -102
  750. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +37 -78
  751. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +388 -423
  752. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +3 -2
  753. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -8
  754. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +251 -120
  755. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +11 -1
  756. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +12 -11
  757. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +6 -2
  758. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +12 -5
  759. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +110 -0
  760. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +234 -0
  761. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +25 -7
  762. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +8 -2
  763. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +21 -3
  764. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +2 -0
  765. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +2 -0
  766. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +14 -0
  767. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +72 -0
  768. data/third_party/abseil-cpp/absl/functional/function_ref.h +4 -1
  769. data/third_party/abseil-cpp/absl/hash/hash.h +22 -0
  770. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +15 -16
  771. data/third_party/abseil-cpp/absl/hash/internal/hash.h +88 -37
  772. data/third_party/abseil-cpp/absl/hash/internal/{wyhash.cc → low_level_hash.cc} +23 -11
  773. data/third_party/abseil-cpp/absl/hash/internal/{wyhash.h → low_level_hash.h} +14 -12
  774. data/third_party/abseil-cpp/absl/memory/memory.h +1 -1
  775. data/third_party/abseil-cpp/absl/meta/type_traits.h +32 -2
  776. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -10
  777. data/third_party/abseil-cpp/absl/numeric/int128.h +146 -73
  778. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +19 -25
  779. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +73 -70
  780. data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.cc +4 -4
  781. data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.h +6 -6
  782. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +230 -0
  783. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +5 -5
  784. data/third_party/abseil-cpp/absl/status/status.cc +9 -17
  785. data/third_party/abseil-cpp/absl/status/status.h +19 -15
  786. data/third_party/abseil-cpp/absl/status/statusor.cc +34 -2
  787. data/third_party/abseil-cpp/absl/status/statusor.h +31 -21
  788. data/third_party/abseil-cpp/absl/strings/charconv.cc +3 -3
  789. data/third_party/abseil-cpp/absl/strings/charconv.h +3 -2
  790. data/third_party/abseil-cpp/absl/strings/cord.cc +453 -359
  791. data/third_party/abseil-cpp/absl/strings/cord.h +197 -70
  792. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +1 -1
  793. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +6 -0
  794. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +140 -63
  795. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +1128 -0
  796. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +939 -0
  797. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +185 -0
  798. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +265 -0
  799. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +68 -0
  800. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +211 -0
  801. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +129 -0
  802. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.h +50 -0
  803. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +7 -7
  804. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +55 -181
  805. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +42 -24
  806. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +4 -0
  807. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc +96 -0
  808. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +85 -0
  809. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +139 -0
  810. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +131 -0
  811. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +445 -0
  812. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +298 -0
  813. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +87 -0
  814. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_scope.h +71 -0
  815. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +121 -0
  816. data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +48 -2
  817. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +8 -0
  818. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +3 -4
  819. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +1 -1
  820. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +6 -6
  821. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +36 -18
  822. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +62 -73
  823. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +24 -16
  824. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +35 -35
  825. data/third_party/abseil-cpp/absl/strings/numbers.cc +1 -1
  826. data/third_party/abseil-cpp/absl/strings/numbers.h +34 -0
  827. data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
  828. data/third_party/abseil-cpp/absl/strings/str_format.h +1 -2
  829. data/third_party/abseil-cpp/absl/strings/string_view.cc +16 -21
  830. data/third_party/abseil-cpp/absl/strings/string_view.h +120 -39
  831. data/third_party/abseil-cpp/absl/strings/substitute.cc +2 -1
  832. data/third_party/abseil-cpp/absl/strings/substitute.h +99 -74
  833. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +25 -15
  834. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +5 -3
  835. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -1
  836. data/third_party/abseil-cpp/absl/synchronization/mutex.h +3 -3
  837. data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -3
  838. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +93 -20
  839. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +1 -1
  840. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +2 -1
  841. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +83 -21
  842. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +49 -0
  843. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +1 -1
  844. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -3
  845. data/third_party/abseil-cpp/absl/time/time.h +67 -36
  846. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +1 -1
  847. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +2 -2
  848. data/third_party/abseil-cpp/absl/types/span.h +3 -3
  849. data/third_party/address_sorting/address_sorting_posix.c +1 -0
  850. data/third_party/boringssl-with-bazel/err_data.c +684 -674
  851. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +19 -11
  852. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +21 -22
  853. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c +0 -2
  854. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +5 -0
  855. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +15 -22
  856. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +54 -37
  857. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c +19 -29
  858. data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/a_strex.c +268 -271
  859. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +106 -153
  860. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +3 -3
  861. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +0 -39
  862. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +59 -47
  863. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c +1 -1
  864. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +24 -28
  865. data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/charmap.h +0 -0
  866. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +5 -0
  867. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +66 -0
  868. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +56 -280
  869. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +289 -198
  870. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +8 -8
  871. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +9 -13
  872. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +8 -6
  873. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +1 -0
  874. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +11 -8
  875. data/third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c +1 -7
  876. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +1 -5
  877. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +0 -4
  878. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +1 -7
  879. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +1 -6
  880. data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +3 -17
  881. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +4 -6
  882. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +3 -1
  883. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c +9 -0
  884. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +8 -0
  885. data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +38 -47
  886. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c +45 -65
  887. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +1 -0
  888. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +2 -2
  889. data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +32 -34
  890. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +21 -3
  891. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c +3 -2
  892. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +5 -2
  893. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +5 -9
  894. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +10 -0
  895. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c +10 -11
  896. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h +1 -3
  897. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +4 -7
  898. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +4 -7
  899. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +1 -1
  900. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +1 -1
  901. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +24 -9
  902. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +4 -2
  903. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +7 -7
  904. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +35 -35
  905. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +11 -10
  906. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +10 -37
  907. data/third_party/boringssl-with-bazel/src/crypto/internal.h +39 -0
  908. data/third_party/boringssl-with-bazel/src/crypto/mem.c +30 -9
  909. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c +0 -9
  910. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c +0 -2
  911. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +0 -8
  912. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c +0 -2
  913. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c +0 -4
  914. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/internal.h +16 -7
  915. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +9 -4
  916. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +151 -12
  917. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  918. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +5 -1
  919. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +59 -23
  920. data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +6 -6
  921. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +2 -18
  922. data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +2 -0
  923. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +189 -3
  924. data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +246 -0
  925. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +11 -2
  926. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +0 -2
  927. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +0 -179
  928. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c +4 -2
  929. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +0 -5
  930. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +1 -0
  931. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +11 -50
  932. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +1 -1
  933. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +2 -4
  934. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +0 -16
  935. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +22 -18
  936. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +11 -8
  937. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +232 -11
  938. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +2 -1
  939. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +2 -2
  940. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c +1 -1
  941. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +2 -1
  942. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c +1 -1
  943. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +5 -4
  944. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +24 -5
  945. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +18 -8
  946. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -0
  947. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +6 -7
  948. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c +4 -0
  949. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +5 -0
  950. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +21 -4
  951. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c +112 -55
  952. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c +2 -1
  953. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +0 -2
  954. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
  955. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +71 -26
  956. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +1326 -469
  957. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +5 -12
  958. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +10 -5
  959. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +3 -1
  960. data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +3 -3
  961. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +9 -0
  962. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +8 -2
  963. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +4 -12
  964. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +17 -41
  965. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +12 -27
  966. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +8 -10
  967. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +29 -55
  968. data/third_party/boringssl-with-bazel/src/include/openssl/hkdf.h +4 -0
  969. data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +9 -3
  970. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +0 -20
  971. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +15 -14
  972. data/third_party/boringssl-with-bazel/src/include/openssl/pool.h +7 -1
  973. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +29 -28
  974. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +37 -15
  975. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +34 -23
  976. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +31 -32
  977. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +541 -134
  978. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +16 -695
  979. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +52 -11
  980. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +266 -357
  981. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +90 -152
  982. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +15 -13
  983. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +75 -79
  984. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +96 -97
  985. data/third_party/boringssl-with-bazel/src/ssl/internal.h +66 -46
  986. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +2 -2
  987. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +2 -2
  988. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +6 -12
  989. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +4 -0
  990. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +14 -17
  991. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +14 -27
  992. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +203 -203
  993. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +30 -41
  994. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +47 -33
  995. data/third_party/re2/re2/compile.cc +91 -109
  996. data/third_party/re2/re2/dfa.cc +27 -39
  997. data/third_party/re2/re2/filtered_re2.cc +18 -2
  998. data/third_party/re2/re2/filtered_re2.h +10 -5
  999. data/third_party/re2/re2/nfa.cc +1 -1
  1000. data/third_party/re2/re2/parse.cc +42 -23
  1001. data/third_party/re2/re2/perl_groups.cc +34 -34
  1002. data/third_party/re2/re2/prefilter.cc +3 -2
  1003. data/third_party/re2/re2/prog.cc +182 -4
  1004. data/third_party/re2/re2/prog.h +28 -9
  1005. data/third_party/re2/re2/re2.cc +87 -118
  1006. data/third_party/re2/re2/re2.h +156 -141
  1007. data/third_party/re2/re2/regexp.cc +12 -5
  1008. data/third_party/re2/re2/regexp.h +8 -2
  1009. data/third_party/re2/re2/set.cc +31 -9
  1010. data/third_party/re2/re2/set.h +9 -4
  1011. data/third_party/re2/re2/simplify.cc +11 -3
  1012. data/third_party/re2/re2/tostring.cc +1 -1
  1013. data/third_party/re2/re2/walker-inl.h +1 -1
  1014. data/third_party/re2/util/mutex.h +2 -2
  1015. data/third_party/re2/util/pcre.h +3 -3
  1016. data/third_party/upb/upb/decode.c +309 -178
  1017. data/third_party/upb/upb/decode_fast.c +1 -1
  1018. data/third_party/upb/upb/decode_internal.h +1 -0
  1019. data/third_party/upb/upb/def.c +330 -85
  1020. data/third_party/upb/upb/def.h +45 -14
  1021. data/third_party/upb/upb/def.hpp +17 -4
  1022. data/third_party/upb/upb/encode.c +100 -40
  1023. data/third_party/upb/upb/msg.c +22 -9
  1024. data/third_party/upb/upb/msg_internal.h +90 -8
  1025. data/third_party/upb/upb/reflection.c +98 -58
  1026. data/third_party/upb/upb/reflection.h +6 -2
  1027. data/third_party/upb/upb/text_encode.c +3 -3
  1028. data/third_party/upb/upb/upb.c +8 -0
  1029. metadata +160 -87
  1030. data/include/grpc/event_engine/slice_allocator.h +0 -71
  1031. data/src/core/ext/filters/client_channel/service_config_call_data.h +0 -126
  1032. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +0 -211
  1033. data/src/core/ext/filters/workarounds/workaround_utils.cc +0 -53
  1034. data/src/core/ext/filters/workarounds/workaround_utils.h +0 -39
  1035. data/src/core/ext/transport/chttp2/client/authority.cc +0 -42
  1036. data/src/core/ext/transport/chttp2/client/authority.h +0 -36
  1037. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +0 -67
  1038. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +0 -74
  1039. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +0 -66
  1040. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +0 -58
  1041. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +0 -58
  1042. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +0 -130
  1043. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.c +0 -33
  1044. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +0 -83
  1045. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +0 -44
  1046. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +0 -35
  1047. data/src/core/lib/avl/avl.cc +0 -306
  1048. data/src/core/lib/gprpp/match.h +0 -73
  1049. data/src/core/lib/gprpp/overload.h +0 -59
  1050. data/src/core/lib/iomgr/event_engine/iomgr.h +0 -42
  1051. data/src/core/lib/iomgr/resource_quota.cc +0 -1104
  1052. data/src/core/lib/iomgr/resource_quota.h +0 -226
  1053. data/src/core/lib/iomgr/udp_server.cc +0 -747
  1054. data/src/core/lib/iomgr/udp_server.h +0 -103
  1055. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +0 -93
  1056. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +0 -217
@@ -1,20 +1,18 @@
1
- /*
2
- *
3
- * Copyright 2018 gRPC authors.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License");
6
- * you may not use this file except in compliance with the License.
7
- * You may obtain a copy of the License at
8
- *
9
- * http://www.apache.org/licenses/LICENSE-2.0
10
- *
11
- * Unless required by applicable law or agreed to in writing, software
12
- * distributed under the License is distributed on an "AS IS" BASIS,
13
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- * See the License for the specific language governing permissions and
15
- * limitations under the License.
16
- *
17
- */
1
+ //
2
+ // Copyright 2018 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
+ //
18
16
 
19
17
  #include <grpc/support/port_platform.h>
20
18
 
@@ -82,24 +80,25 @@
82
80
  #include "google/protobuf/timestamp.upb.h"
83
81
  #include "google/protobuf/wrappers.upb.h"
84
82
  #include "google/rpc/status.upb.h"
85
- #include "udpa/type/v1/typed_struct.upb.h"
86
83
  #include "upb/text_encode.h"
87
84
  #include "upb/upb.h"
88
85
  #include "upb/upb.hpp"
86
+ #include "xds/type/v3/typed_struct.upb.h"
89
87
 
90
88
  #include <grpc/impl/codegen/log.h>
91
89
  #include <grpc/support/alloc.h>
92
90
  #include <grpc/support/string_util.h>
93
91
 
92
+ #include "src/core/ext/xds/xds_routing.h"
94
93
  #include "src/core/lib/address_utils/sockaddr_utils.h"
95
94
  #include "src/core/lib/gpr/env.h"
96
95
  #include "src/core/lib/gpr/string.h"
97
- #include "src/core/lib/gpr/useful.h"
98
96
  #include "src/core/lib/gprpp/host_port.h"
99
97
  #include "src/core/lib/iomgr/error.h"
100
98
  #include "src/core/lib/iomgr/sockaddr.h"
101
99
  #include "src/core/lib/iomgr/socket_utils.h"
102
100
  #include "src/core/lib/slice/slice_utils.h"
101
+ #include "src/core/lib/uri/uri_parser.h"
103
102
 
104
103
  namespace grpc_core {
105
104
 
@@ -116,11 +115,58 @@ bool XdsAggregateAndLogicalDnsClusterEnabled() {
116
115
  return parse_succeeded && parsed_value;
117
116
  }
118
117
 
118
+ // TODO(yashykt): Remove once RBAC is no longer experimental
119
+ bool XdsRbacEnabled() {
120
+ char* value = gpr_getenv("GRPC_XDS_EXPERIMENTAL_RBAC");
121
+ bool parsed_value;
122
+ bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
123
+ gpr_free(value);
124
+ return parse_succeeded && parsed_value;
125
+ }
126
+
127
+ //
128
+ // XdsApi::RetryPolicy
129
+ //
130
+
131
+ std::string XdsApi::RetryPolicy::RetryBackOff::ToString() const {
132
+ std::vector<std::string> contents;
133
+ contents.push_back(
134
+ absl::StrCat("RetryBackOff Base: ", base_interval.ToString()));
135
+ contents.push_back(
136
+ absl::StrCat("RetryBackOff max: ", max_interval.ToString()));
137
+ return absl::StrJoin(contents, ",");
138
+ }
139
+
140
+ std::string XdsApi::RetryPolicy::ToString() const {
141
+ std::vector<std::string> contents;
142
+ contents.push_back(absl::StrFormat("num_retries=%d", num_retries));
143
+ contents.push_back(retry_back_off.ToString());
144
+ return absl::StrCat("{", absl::StrJoin(contents, ","), "}");
145
+ }
146
+
147
+ //
148
+ // XdsApi::Route::Matchers
149
+ //
150
+
151
+ std::string XdsApi::Route::Matchers::ToString() const {
152
+ std::vector<std::string> contents;
153
+ contents.push_back(
154
+ absl::StrFormat("PathMatcher{%s}", path_matcher.ToString()));
155
+ for (const HeaderMatcher& header_matcher : header_matchers) {
156
+ contents.push_back(header_matcher.ToString());
157
+ }
158
+ if (fraction_per_million.has_value()) {
159
+ contents.push_back(absl::StrFormat("Fraction Per Million %d",
160
+ fraction_per_million.value()));
161
+ }
162
+ return absl::StrJoin(contents, "\n");
163
+ }
164
+
119
165
  //
120
- // XdsApi::Route::HashPolicy
166
+ // XdsApi::Route::RouteAction::HashPolicy
121
167
  //
122
168
 
123
- XdsApi::Route::HashPolicy::HashPolicy(const HashPolicy& other)
169
+ XdsApi::Route::RouteAction::HashPolicy::HashPolicy(const HashPolicy& other)
124
170
  : type(other.type),
125
171
  header_name(other.header_name),
126
172
  regex_substitution(other.regex_substitution) {
@@ -130,8 +176,8 @@ XdsApi::Route::HashPolicy::HashPolicy(const HashPolicy& other)
130
176
  }
131
177
  }
132
178
 
133
- XdsApi::Route::HashPolicy& XdsApi::Route::HashPolicy::operator=(
134
- const HashPolicy& other) {
179
+ XdsApi::Route::RouteAction::HashPolicy&
180
+ XdsApi::Route::RouteAction::HashPolicy::operator=(const HashPolicy& other) {
135
181
  type = other.type;
136
182
  header_name = other.header_name;
137
183
  if (other.regex != nullptr) {
@@ -142,14 +188,14 @@ XdsApi::Route::HashPolicy& XdsApi::Route::HashPolicy::operator=(
142
188
  return *this;
143
189
  }
144
190
 
145
- XdsApi::Route::HashPolicy::HashPolicy(HashPolicy&& other) noexcept
191
+ XdsApi::Route::RouteAction::HashPolicy::HashPolicy(HashPolicy&& other) noexcept
146
192
  : type(other.type),
147
193
  header_name(std::move(other.header_name)),
148
194
  regex(std::move(other.regex)),
149
195
  regex_substitution(std::move(other.regex_substitution)) {}
150
196
 
151
- XdsApi::Route::HashPolicy& XdsApi::Route::HashPolicy::operator=(
152
- HashPolicy&& other) noexcept {
197
+ XdsApi::Route::RouteAction::HashPolicy&
198
+ XdsApi::Route::RouteAction::HashPolicy::operator=(HashPolicy&& other) noexcept {
153
199
  type = other.type;
154
200
  header_name = std::move(other.header_name);
155
201
  regex = std::move(other.regex);
@@ -157,7 +203,7 @@ XdsApi::Route::HashPolicy& XdsApi::Route::HashPolicy::operator=(
157
203
  return *this;
158
204
  }
159
205
 
160
- bool XdsApi::Route::HashPolicy::HashPolicy::operator==(
206
+ bool XdsApi::Route::RouteAction::HashPolicy::HashPolicy::operator==(
161
207
  const HashPolicy& other) const {
162
208
  if (type != other.type) return false;
163
209
  if (type == Type::HEADER) {
@@ -173,7 +219,7 @@ bool XdsApi::Route::HashPolicy::HashPolicy::operator==(
173
219
  return true;
174
220
  }
175
221
 
176
- std::string XdsApi::Route::HashPolicy::ToString() const {
222
+ std::string XdsApi::Route::RouteAction::HashPolicy::ToString() const {
177
223
  std::vector<std::string> contents;
178
224
  switch (type) {
179
225
  case Type::HEADER:
@@ -194,43 +240,10 @@ std::string XdsApi::Route::HashPolicy::ToString() const {
194
240
  }
195
241
 
196
242
  //
197
- // XdsApi::Route::RetryPolicy
198
- //
199
- std::string XdsApi::Route::RetryPolicy::RetryBackOff::ToString() const {
200
- std::vector<std::string> contents;
201
- contents.push_back(
202
- absl::StrCat("RetryBackOff Base: ", base_interval.ToString()));
203
- contents.push_back(
204
- absl::StrCat("RetryBackOff max: ", max_interval.ToString()));
205
- return absl::StrJoin(contents, ",");
206
- }
207
-
208
- std::string XdsApi::Route::RetryPolicy::ToString() const {
209
- std::vector<std::string> contents;
210
- contents.push_back(absl::StrFormat("num_retries=%d", num_retries));
211
- contents.push_back(retry_back_off.ToString());
212
- return absl::StrJoin(contents, ",");
213
- }
214
-
215
- //
216
- // XdsApi::Route
243
+ // XdsApi::Route::RouteAction::ClusterWeight
217
244
  //
218
245
 
219
- std::string XdsApi::Route::Matchers::ToString() const {
220
- std::vector<std::string> contents;
221
- contents.push_back(
222
- absl::StrFormat("PathMatcher{%s}", path_matcher.ToString()));
223
- for (const HeaderMatcher& header_matcher : header_matchers) {
224
- contents.push_back(header_matcher.ToString());
225
- }
226
- if (fraction_per_million.has_value()) {
227
- contents.push_back(absl::StrFormat("Fraction Per Million %d",
228
- fraction_per_million.value()));
229
- }
230
- return absl::StrJoin(contents, "\n");
231
- }
232
-
233
- std::string XdsApi::Route::ClusterWeight::ToString() const {
246
+ std::string XdsApi::Route::RouteAction::ClusterWeight::ToString() const {
234
247
  std::vector<std::string> contents;
235
248
  contents.push_back(absl::StrCat("cluster=", name));
236
249
  contents.push_back(absl::StrCat("weight=", weight));
@@ -247,15 +260,17 @@ std::string XdsApi::Route::ClusterWeight::ToString() const {
247
260
  return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
248
261
  }
249
262
 
250
- std::string XdsApi::Route::ToString() const {
263
+ //
264
+ // XdsApi::Route::RouteAction
265
+ //
266
+
267
+ std::string XdsApi::Route::RouteAction::ToString() const {
251
268
  std::vector<std::string> contents;
252
- contents.push_back(matchers.ToString());
253
269
  for (const HashPolicy& hash_policy : hash_policies) {
254
270
  contents.push_back(absl::StrCat("hash_policy=", hash_policy.ToString()));
255
271
  }
256
272
  if (retry_policy.has_value()) {
257
- contents.push_back(
258
- absl::StrCat("retry_policy={", retry_policy->ToString(), "}"));
273
+ contents.push_back(absl::StrCat("retry_policy=", retry_policy->ToString()));
259
274
  }
260
275
  if (!cluster_name.empty()) {
261
276
  contents.push_back(absl::StrFormat("Cluster name: %s", cluster_name));
@@ -266,6 +281,25 @@ std::string XdsApi::Route::ToString() const {
266
281
  if (max_stream_duration.has_value()) {
267
282
  contents.push_back(max_stream_duration->ToString());
268
283
  }
284
+ return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
285
+ }
286
+
287
+ //
288
+ // XdsApi::Route
289
+ //
290
+
291
+ std::string XdsApi::Route::ToString() const {
292
+ std::vector<std::string> contents;
293
+ contents.push_back(matchers.ToString());
294
+ auto* route_action = absl::get_if<XdsApi::Route::RouteAction>(&action);
295
+ if (route_action != nullptr) {
296
+ contents.push_back(absl::StrCat("route=", route_action->ToString()));
297
+ } else if (absl::holds_alternative<XdsApi::Route::NonForwardingAction>(
298
+ action)) {
299
+ contents.push_back("non_forwarding_action={}");
300
+ } else {
301
+ contents.push_back("unknown_action={}");
302
+ }
269
303
  if (!typed_per_filter_config.empty()) {
270
304
  contents.push_back("typed_per_filter_config={");
271
305
  for (const auto& p : typed_per_filter_config) {
@@ -310,104 +344,6 @@ std::string XdsApi::RdsUpdate::ToString() const {
310
344
  return absl::StrJoin(vhosts, "");
311
345
  }
312
346
 
313
- namespace {
314
-
315
- // Better match type has smaller value.
316
- enum MatchType {
317
- EXACT_MATCH,
318
- SUFFIX_MATCH,
319
- PREFIX_MATCH,
320
- UNIVERSE_MATCH,
321
- INVALID_MATCH,
322
- };
323
-
324
- // Returns true if match succeeds.
325
- bool DomainMatch(MatchType match_type, const std::string& domain_pattern_in,
326
- const std::string& expected_host_name_in) {
327
- // Normalize the args to lower-case. Domain matching is case-insensitive.
328
- std::string domain_pattern = domain_pattern_in;
329
- std::string expected_host_name = expected_host_name_in;
330
- std::transform(domain_pattern.begin(), domain_pattern.end(),
331
- domain_pattern.begin(),
332
- [](unsigned char c) { return std::tolower(c); });
333
- std::transform(expected_host_name.begin(), expected_host_name.end(),
334
- expected_host_name.begin(),
335
- [](unsigned char c) { return std::tolower(c); });
336
- if (match_type == EXACT_MATCH) {
337
- return domain_pattern == expected_host_name;
338
- } else if (match_type == SUFFIX_MATCH) {
339
- // Asterisk must match at least one char.
340
- if (expected_host_name.size() < domain_pattern.size()) return false;
341
- absl::string_view pattern_suffix(domain_pattern.c_str() + 1);
342
- absl::string_view host_suffix(expected_host_name.c_str() +
343
- expected_host_name.size() -
344
- pattern_suffix.size());
345
- return pattern_suffix == host_suffix;
346
- } else if (match_type == PREFIX_MATCH) {
347
- // Asterisk must match at least one char.
348
- if (expected_host_name.size() < domain_pattern.size()) return false;
349
- absl::string_view pattern_prefix(domain_pattern.c_str(),
350
- domain_pattern.size() - 1);
351
- absl::string_view host_prefix(expected_host_name.c_str(),
352
- pattern_prefix.size());
353
- return pattern_prefix == host_prefix;
354
- } else {
355
- return match_type == UNIVERSE_MATCH;
356
- }
357
- }
358
-
359
- MatchType DomainPatternMatchType(const std::string& domain_pattern) {
360
- if (domain_pattern.empty()) return INVALID_MATCH;
361
- if (domain_pattern.find('*') == std::string::npos) return EXACT_MATCH;
362
- if (domain_pattern == "*") return UNIVERSE_MATCH;
363
- if (domain_pattern[0] == '*') return SUFFIX_MATCH;
364
- if (domain_pattern[domain_pattern.size() - 1] == '*') return PREFIX_MATCH;
365
- return INVALID_MATCH;
366
- }
367
-
368
- } // namespace
369
-
370
- XdsApi::RdsUpdate::VirtualHost* XdsApi::RdsUpdate::FindVirtualHostForDomain(
371
- const std::string& domain) {
372
- // Find the best matched virtual host.
373
- // The search order for 4 groups of domain patterns:
374
- // 1. Exact match.
375
- // 2. Suffix match (e.g., "*ABC").
376
- // 3. Prefix match (e.g., "ABC*").
377
- // 4. Universe match (i.e., "*").
378
- // Within each group, longest match wins.
379
- // If the same best matched domain pattern appears in multiple virtual hosts,
380
- // the first matched virtual host wins.
381
- VirtualHost* target_vhost = nullptr;
382
- MatchType best_match_type = INVALID_MATCH;
383
- size_t longest_match = 0;
384
- // Check each domain pattern in each virtual host to determine the best
385
- // matched virtual host.
386
- for (VirtualHost& vhost : virtual_hosts) {
387
- for (const std::string& domain_pattern : vhost.domains) {
388
- // Check the match type first. Skip the pattern if it's not better than
389
- // current match.
390
- const MatchType match_type = DomainPatternMatchType(domain_pattern);
391
- // This should be caught by RouteConfigParse().
392
- GPR_ASSERT(match_type != INVALID_MATCH);
393
- if (match_type > best_match_type) continue;
394
- if (match_type == best_match_type &&
395
- domain_pattern.size() <= longest_match) {
396
- continue;
397
- }
398
- // Skip if match fails.
399
- if (!DomainMatch(match_type, domain_pattern, domain)) continue;
400
- // Choose this match.
401
- target_vhost = &vhost;
402
- best_match_type = match_type;
403
- longest_match = domain_pattern.size();
404
- if (best_match_type == EXACT_MATCH) break;
405
- }
406
- if (best_match_type == EXACT_MATCH) break;
407
- }
408
- return target_vhost;
409
- }
410
-
411
347
  //
412
348
  // XdsApi::CommonTlsContext::CertificateValidationContext
413
349
  //
@@ -786,25 +722,22 @@ std::string XdsApi::EdsUpdate::ToString() const {
786
722
  // XdsApi
787
723
  //
788
724
 
789
- const char* XdsApi::kLdsTypeUrl =
790
- "type.googleapis.com/envoy.config.listener.v3.Listener";
791
- const char* XdsApi::kRdsTypeUrl =
792
- "type.googleapis.com/envoy.config.route.v3.RouteConfiguration";
793
- const char* XdsApi::kCdsTypeUrl =
794
- "type.googleapis.com/envoy.config.cluster.v3.Cluster";
725
+ // TODO(roth): All constants and functions for individual resource types
726
+ // should be merged into the XdsResourceType abstraction.
727
+ const char* XdsApi::kLdsTypeUrl = "envoy.config.listener.v3.Listener";
728
+ const char* XdsApi::kRdsTypeUrl = "envoy.config.route.v3.RouteConfiguration";
729
+ const char* XdsApi::kCdsTypeUrl = "envoy.config.cluster.v3.Cluster";
795
730
  const char* XdsApi::kEdsTypeUrl =
796
- "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment";
731
+ "envoy.config.endpoint.v3.ClusterLoadAssignment";
797
732
 
798
733
  namespace {
799
734
 
800
- const char* kLdsV2TypeUrl = "type.googleapis.com/envoy.api.v2.Listener";
801
- const char* kRdsV2TypeUrl =
802
- "type.googleapis.com/envoy.api.v2.RouteConfiguration";
803
- const char* kCdsV2TypeUrl = "type.googleapis.com/envoy.api.v2.Cluster";
804
- const char* kEdsV2TypeUrl =
805
- "type.googleapis.com/envoy.api.v2.ClusterLoadAssignment";
735
+ const char* kLdsV2TypeUrl = "envoy.api.v2.Listener";
736
+ const char* kRdsV2TypeUrl = "envoy.api.v2.RouteConfiguration";
737
+ const char* kCdsV2TypeUrl = "envoy.api.v2.Cluster";
738
+ const char* kEdsV2TypeUrl = "envoy.api.v2.ClusterLoadAssignment";
806
739
 
807
- bool IsLds(absl::string_view type_url, bool* is_v2 = nullptr) {
740
+ bool IsLdsInternal(absl::string_view type_url, bool* is_v2 = nullptr) {
808
741
  if (type_url == XdsApi::kLdsTypeUrl) return true;
809
742
  if (type_url == kLdsV2TypeUrl) {
810
743
  if (is_v2 != nullptr) *is_v2 = true;
@@ -813,18 +746,118 @@ bool IsLds(absl::string_view type_url, bool* is_v2 = nullptr) {
813
746
  return false;
814
747
  }
815
748
 
816
- bool IsRds(absl::string_view type_url, bool* /*is_v2*/ = nullptr) {
749
+ bool IsRdsInternal(absl::string_view type_url, bool* /*is_v2*/ = nullptr) {
817
750
  return type_url == XdsApi::kRdsTypeUrl || type_url == kRdsV2TypeUrl;
818
751
  }
819
752
 
820
- bool IsCds(absl::string_view type_url, bool* /*is_v2*/ = nullptr) {
753
+ bool IsCdsInternal(absl::string_view type_url, bool* /*is_v2*/ = nullptr) {
821
754
  return type_url == XdsApi::kCdsTypeUrl || type_url == kCdsV2TypeUrl;
822
755
  }
823
756
 
824
- bool IsEds(absl::string_view type_url, bool* /*is_v2*/ = nullptr) {
757
+ bool IsEdsInternal(absl::string_view type_url, bool* /*is_v2*/ = nullptr) {
825
758
  return type_url == XdsApi::kEdsTypeUrl || type_url == kEdsV2TypeUrl;
826
759
  }
827
760
 
761
+ absl::string_view TypeUrlExternalToInternal(bool use_v3,
762
+ const std::string& type_url) {
763
+ if (!use_v3) {
764
+ if (type_url == XdsApi::kLdsTypeUrl) {
765
+ return kLdsV2TypeUrl;
766
+ }
767
+ if (type_url == XdsApi::kRdsTypeUrl) {
768
+ return kRdsV2TypeUrl;
769
+ }
770
+ if (type_url == XdsApi::kCdsTypeUrl) {
771
+ return kCdsV2TypeUrl;
772
+ }
773
+ if (type_url == XdsApi::kEdsTypeUrl) {
774
+ return kEdsV2TypeUrl;
775
+ }
776
+ }
777
+ return type_url;
778
+ }
779
+
780
+ std::string TypeUrlInternalToExternal(absl::string_view type_url) {
781
+ if (type_url == kLdsV2TypeUrl) {
782
+ return XdsApi::kLdsTypeUrl;
783
+ } else if (type_url == kRdsV2TypeUrl) {
784
+ return XdsApi::kRdsTypeUrl;
785
+ } else if (type_url == kCdsV2TypeUrl) {
786
+ return XdsApi::kCdsTypeUrl;
787
+ } else if (type_url == kEdsV2TypeUrl) {
788
+ return XdsApi::kEdsTypeUrl;
789
+ }
790
+ return std::string(type_url);
791
+ }
792
+
793
+ struct EncodingContext {
794
+ XdsClient* client; // Used only for logging. Unsafe for dereferencing.
795
+ TraceFlag* tracer;
796
+ upb_symtab* symtab;
797
+ upb_arena* arena;
798
+ bool use_v3;
799
+ const CertificateProviderStore::PluginDefinitionMap*
800
+ certificate_provider_definition_map;
801
+ };
802
+
803
+ class XdsResourceType {
804
+ public:
805
+ // A base type for resource data.
806
+ struct ResourceData {};
807
+
808
+ struct DecodeResult {
809
+ std::string name;
810
+ absl::StatusOr<std::unique_ptr<ResourceData>> resource;
811
+ };
812
+
813
+ virtual ~XdsResourceType() = default;
814
+
815
+ virtual absl::string_view type_url() const = 0;
816
+
817
+ virtual absl::string_view v2_type_url() const = 0;
818
+
819
+ virtual absl::StatusOr<DecodeResult> Decode(
820
+ const EncodingContext& context, absl::string_view serialized_resource,
821
+ bool is_v2) const = 0;
822
+
823
+ bool IsType(absl::string_view resource_type, bool* is_v2) const {
824
+ if (resource_type == type_url()) return true;
825
+ if (resource_type == v2_type_url()) {
826
+ if (is_v2 != nullptr) *is_v2 = true;
827
+ return true;
828
+ }
829
+ return false;
830
+ }
831
+ };
832
+
833
+ absl::StatusOr<XdsApi::ResourceName> ParseResourceNameInternal(
834
+ absl::string_view name,
835
+ std::function<bool(absl::string_view, bool*)> is_expected_type) {
836
+ // Old-style names use the empty string for authority.
837
+ // authority is prefixed with "old:" to indicate that it's an old-style name.
838
+ if (!absl::StartsWith(name, "xdstp:")) {
839
+ return XdsApi::ResourceName{"old:", std::string(name)};
840
+ }
841
+ // New style name. Parse URI.
842
+ auto uri = URI::Parse(name);
843
+ if (!uri.ok()) return uri.status();
844
+ // Split the resource type off of the path to get the id.
845
+ std::pair<absl::string_view, absl::string_view> path_parts =
846
+ absl::StrSplit(uri->path(), absl::MaxSplits('/', 1));
847
+ if (!is_expected_type(path_parts.first, nullptr)) {
848
+ return absl::InvalidArgumentError(
849
+ "xdstp URI path must indicate valid xDS resource type");
850
+ }
851
+ std::vector<std::pair<absl::string_view, absl::string_view>> query_parameters(
852
+ uri->query_parameter_map().begin(), uri->query_parameter_map().end());
853
+ std::sort(query_parameters.begin(), query_parameters.end());
854
+ return XdsApi::ResourceName{
855
+ absl::StrCat("xdstp:", uri->authority()),
856
+ absl::StrCat(
857
+ path_parts.second, (query_parameters.empty() ? "?" : ""),
858
+ absl::StrJoin(query_parameters, "&", absl::PairFormatter("=")))};
859
+ }
860
+
828
861
  } // namespace
829
862
 
830
863
  // If gRPC is built with -DGRPC_XDS_USER_AGENT_NAME_SUFFIX="...", that string
@@ -881,17 +914,41 @@ XdsApi::XdsApi(XdsClient* client, TraceFlag* tracer,
881
914
  XdsHttpFilterRegistry::PopulateSymtab(symtab_.ptr());
882
915
  }
883
916
 
884
- namespace {
917
+ bool XdsApi::IsLds(absl::string_view type_url) {
918
+ return IsLdsInternal(type_url);
919
+ }
885
920
 
886
- struct EncodingContext {
887
- XdsClient* client; // Used only for logging. Unsafe for dereferencing.
888
- TraceFlag* tracer;
889
- upb_symtab* symtab;
890
- upb_arena* arena;
891
- bool use_v3;
892
- const CertificateProviderStore::PluginDefinitionMap*
893
- certificate_provider_definition_map;
894
- };
921
+ bool XdsApi::IsRds(absl::string_view type_url) {
922
+ return IsRdsInternal(type_url);
923
+ }
924
+
925
+ bool XdsApi::IsCds(absl::string_view type_url) {
926
+ return IsCdsInternal(type_url);
927
+ }
928
+
929
+ bool XdsApi::IsEds(absl::string_view type_url) {
930
+ return IsEdsInternal(type_url);
931
+ }
932
+
933
+ absl::StatusOr<XdsApi::ResourceName> XdsApi::ParseResourceName(
934
+ absl::string_view name, bool (*is_expected_type)(absl::string_view)) {
935
+ return ParseResourceNameInternal(
936
+ name, [is_expected_type](absl::string_view type, bool*) {
937
+ return is_expected_type(type);
938
+ });
939
+ }
940
+
941
+ std::string XdsApi::ConstructFullResourceName(absl::string_view authority,
942
+ absl::string_view resource_type,
943
+ absl::string_view name) {
944
+ if (absl::ConsumePrefix(&authority, "xdstp:")) {
945
+ return absl::StrCat("xdstp://", authority, "/", resource_type, "/", name);
946
+ } else {
947
+ return std::string(absl::StripPrefix(name, "old:"));
948
+ }
949
+ }
950
+
951
+ namespace {
895
952
 
896
953
  // Works for both std::string and absl::string_view.
897
954
  template <typename T>
@@ -1072,30 +1129,12 @@ grpc_slice SerializeDiscoveryRequest(
1072
1129
  return grpc_slice_from_copied_buffer(output, output_length);
1073
1130
  }
1074
1131
 
1075
- absl::string_view TypeUrlExternalToInternal(bool use_v3,
1076
- const std::string& type_url) {
1077
- if (!use_v3) {
1078
- if (type_url == XdsApi::kLdsTypeUrl) {
1079
- return kLdsV2TypeUrl;
1080
- }
1081
- if (type_url == XdsApi::kRdsTypeUrl) {
1082
- return kRdsV2TypeUrl;
1083
- }
1084
- if (type_url == XdsApi::kCdsTypeUrl) {
1085
- return kCdsV2TypeUrl;
1086
- }
1087
- if (type_url == XdsApi::kEdsTypeUrl) {
1088
- return kEdsV2TypeUrl;
1089
- }
1090
- }
1091
- return type_url;
1092
- }
1093
-
1094
1132
  } // namespace
1095
1133
 
1096
1134
  grpc_slice XdsApi::CreateAdsRequest(
1097
1135
  const XdsBootstrap::XdsServer& server, const std::string& type_url,
1098
- const std::set<absl::string_view>& resource_names,
1136
+ const std::map<absl::string_view /*authority*/,
1137
+ std::set<absl::string_view /*name*/>>& resource_names,
1099
1138
  const std::string& version, const std::string& nonce,
1100
1139
  grpc_error_handle error, bool populate_node) {
1101
1140
  upb::Arena arena;
@@ -1111,8 +1150,10 @@ grpc_slice XdsApi::CreateAdsRequest(
1111
1150
  // Set type_url.
1112
1151
  absl::string_view real_type_url =
1113
1152
  TypeUrlExternalToInternal(server.ShouldUseV3(), type_url);
1153
+ std::string real_type_url_str =
1154
+ absl::StrCat("type.googleapis.com/", real_type_url);
1114
1155
  envoy_service_discovery_v3_DiscoveryRequest_set_type_url(
1115
- request, StdStringToUpbString(real_type_url));
1156
+ request, StdStringToUpbString(real_type_url_str));
1116
1157
  // Set version_info.
1117
1158
  if (!version.empty()) {
1118
1159
  envoy_service_discovery_v3_DiscoveryRequest_set_version_info(
@@ -1148,10 +1189,27 @@ grpc_slice XdsApi::CreateAdsRequest(
1148
1189
  PopulateNode(context, node_, build_version_, user_agent_name_,
1149
1190
  user_agent_version_, node_msg);
1150
1191
  }
1192
+ // A vector for temporary local storage of resource name strings.
1193
+ std::vector<std::string> resource_name_storage;
1194
+ // Make sure the vector is sized right up-front, so that reallocations
1195
+ // don't move the strings out from under the upb proto object that
1196
+ // points to them.
1197
+ size_t size = 0;
1198
+ for (const auto& p : resource_names) {
1199
+ size += p.second.size();
1200
+ }
1201
+ resource_name_storage.reserve(size);
1151
1202
  // Add resource_names.
1152
- for (const auto& resource_name : resource_names) {
1153
- envoy_service_discovery_v3_DiscoveryRequest_add_resource_names(
1154
- request, StdStringToUpbString(resource_name), arena.ptr());
1203
+ for (const auto& a : resource_names) {
1204
+ absl::string_view authority = a.first;
1205
+ for (const auto& p : a.second) {
1206
+ absl::string_view resource_id = p;
1207
+ resource_name_storage.push_back(
1208
+ ConstructFullResourceName(authority, real_type_url, resource_id));
1209
+ envoy_service_discovery_v3_DiscoveryRequest_add_resource_names(
1210
+ request, StdStringToUpbString(resource_name_storage.back()),
1211
+ arena.ptr());
1212
+ }
1155
1213
  }
1156
1214
  MaybeLogDiscoveryRequest(context, request);
1157
1215
  return SerializeDiscoveryRequest(context, request);
@@ -1438,16 +1496,17 @@ grpc_error_handle ExtractHttpFilterTypeName(const EncodingContext& context,
1438
1496
  const google_protobuf_Any* any,
1439
1497
  absl::string_view* filter_type) {
1440
1498
  *filter_type = UpbStringToAbsl(google_protobuf_Any_type_url(any));
1441
- if (*filter_type == "type.googleapis.com/udpa.type.v1.TypedStruct") {
1499
+ if (*filter_type == "type.googleapis.com/xds.type.v3.TypedStruct" ||
1500
+ *filter_type == "type.googleapis.com/udpa.type.v1.TypedStruct") {
1442
1501
  upb_strview any_value = google_protobuf_Any_value(any);
1443
- const auto* typed_struct = udpa_type_v1_TypedStruct_parse(
1502
+ const auto* typed_struct = xds_type_v3_TypedStruct_parse(
1444
1503
  any_value.data, any_value.size, context.arena);
1445
1504
  if (typed_struct == nullptr) {
1446
1505
  return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1447
1506
  "could not parse TypedStruct from filter config");
1448
1507
  }
1449
1508
  *filter_type =
1450
- UpbStringToAbsl(udpa_type_v1_TypedStruct_type_url(typed_struct));
1509
+ UpbStringToAbsl(xds_type_v3_TypedStruct_type_url(typed_struct));
1451
1510
  }
1452
1511
  *filter_type = absl::StripPrefix(*filter_type, "type.googleapis.com/");
1453
1512
  return GRPC_ERROR_NONE;
@@ -1528,9 +1587,9 @@ XdsApi::Duration DurationParse(const google_protobuf_Duration* proto_duration) {
1528
1587
  grpc_error_handle RetryPolicyParse(
1529
1588
  const EncodingContext& context,
1530
1589
  const envoy_config_route_v3_RetryPolicy* retry_policy,
1531
- absl::optional<XdsApi::Route::RetryPolicy>* retry) {
1590
+ absl::optional<XdsApi::RetryPolicy>* retry) {
1532
1591
  std::vector<grpc_error_handle> errors;
1533
- XdsApi::Route::RetryPolicy retry_to_return;
1592
+ XdsApi::RetryPolicy retry_to_return;
1534
1593
  auto retry_on = UpbStringToStdString(
1535
1594
  envoy_config_route_v3_RetryPolicy_retry_on(retry_policy));
1536
1595
  std::vector<absl::string_view> codes = absl::StrSplit(retry_on, ',');
@@ -1552,10 +1611,6 @@ grpc_error_handle RetryPolicyParse(
1552
1611
  }
1553
1612
  }
1554
1613
  }
1555
- // TODO(donnadionne): when we add support for per_try_timeout, we will need to
1556
- // return a policy if per_try_timeout is set even if retry_on specified no
1557
- // supported policies.
1558
- if (retry_to_return.retry_on.Empty()) return GRPC_ERROR_NONE;
1559
1614
  const google_protobuf_UInt32Value* num_retries =
1560
1615
  envoy_config_route_v3_RetryPolicy_num_retries(retry_policy);
1561
1616
  if (num_retries != nullptr) {
@@ -1614,11 +1669,8 @@ grpc_error_handle RetryPolicyParse(
1614
1669
 
1615
1670
  grpc_error_handle RouteActionParse(const EncodingContext& context,
1616
1671
  const envoy_config_route_v3_Route* route_msg,
1617
- XdsApi::Route* route, bool* ignore_route) {
1618
- if (!envoy_config_route_v3_Route_has_route(route_msg)) {
1619
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1620
- "No RouteAction found in route.");
1621
- }
1672
+ XdsApi::Route::RouteAction* route,
1673
+ bool* ignore_route) {
1622
1674
  const envoy_config_route_v3_RouteAction* route_action =
1623
1675
  envoy_config_route_v3_Route_route(route_msg);
1624
1676
  // Get the cluster or weighted_clusters in the RouteAction.
@@ -1647,7 +1699,7 @@ grpc_error_handle RouteActionParse(const EncodingContext& context,
1647
1699
  for (size_t j = 0; j < clusters_size; ++j) {
1648
1700
  const envoy_config_route_v3_WeightedCluster_ClusterWeight*
1649
1701
  cluster_weight = clusters[j];
1650
- XdsApi::Route::ClusterWeight cluster;
1702
+ XdsApi::Route::RouteAction::ClusterWeight cluster;
1651
1703
  cluster.name = UpbStringToStdString(
1652
1704
  envoy_config_route_v3_WeightedCluster_ClusterWeight_name(
1653
1705
  cluster_weight));
@@ -1716,7 +1768,7 @@ grpc_error_handle RouteActionParse(const EncodingContext& context,
1716
1768
  for (size_t i = 0; i < size; ++i) {
1717
1769
  const envoy_config_route_v3_RouteAction_HashPolicy* hash_policy =
1718
1770
  hash_policies[i];
1719
- XdsApi::Route::HashPolicy policy;
1771
+ XdsApi::Route::RouteAction::HashPolicy policy;
1720
1772
  policy.terminal =
1721
1773
  envoy_config_route_v3_RouteAction_HashPolicy_terminal(hash_policy);
1722
1774
  const envoy_config_route_v3_RouteAction_HashPolicy_Header* header;
@@ -1724,7 +1776,7 @@ grpc_error_handle RouteActionParse(const EncodingContext& context,
1724
1776
  filter_state;
1725
1777
  if ((header = envoy_config_route_v3_RouteAction_HashPolicy_header(
1726
1778
  hash_policy)) != nullptr) {
1727
- policy.type = XdsApi::Route::HashPolicy::Type::HEADER;
1779
+ policy.type = XdsApi::Route::RouteAction::HashPolicy::Type::HEADER;
1728
1780
  policy.header_name = UpbStringToStdString(
1729
1781
  envoy_config_route_v3_RouteAction_HashPolicy_Header_header_name(
1730
1782
  header));
@@ -1768,7 +1820,7 @@ grpc_error_handle RouteActionParse(const EncodingContext& context,
1768
1820
  envoy_config_route_v3_RouteAction_HashPolicy_FilterState_key(
1769
1821
  filter_state));
1770
1822
  if (key == "io.grpc.channel_id") {
1771
- policy.type = XdsApi::Route::HashPolicy::Type::CHANNEL_ID;
1823
+ policy.type = XdsApi::Route::RouteAction::HashPolicy::Type::CHANNEL_ID;
1772
1824
  } else {
1773
1825
  gpr_log(GPR_DEBUG,
1774
1826
  "RouteAction HashPolicy contains policy specifier "
@@ -1787,7 +1839,7 @@ grpc_error_handle RouteActionParse(const EncodingContext& context,
1787
1839
  const envoy_config_route_v3_RetryPolicy* retry_policy =
1788
1840
  envoy_config_route_v3_RouteAction_retry_policy(route_action);
1789
1841
  if (retry_policy != nullptr) {
1790
- absl::optional<XdsApi::Route::RetryPolicy> retry;
1842
+ absl::optional<XdsApi::RetryPolicy> retry;
1791
1843
  grpc_error_handle error = RetryPolicyParse(context, retry_policy, &retry);
1792
1844
  if (error != GRPC_ERROR_NONE) return error;
1793
1845
  route->retry_policy = retry;
@@ -1799,7 +1851,6 @@ grpc_error_handle RouteConfigParse(
1799
1851
  const EncodingContext& context,
1800
1852
  const envoy_config_route_v3_RouteConfiguration* route_config,
1801
1853
  bool /*is_v2*/, XdsApi::RdsUpdate* rds_update) {
1802
- MaybeLogRouteConfiguration(context, route_config);
1803
1854
  // Get the virtual hosts.
1804
1855
  size_t num_virtual_hosts;
1805
1856
  const envoy_config_route_v3_VirtualHost* const* virtual_hosts =
@@ -1814,8 +1865,7 @@ grpc_error_handle RouteConfigParse(
1814
1865
  virtual_hosts[i], &domain_size);
1815
1866
  for (size_t j = 0; j < domain_size; ++j) {
1816
1867
  std::string domain_pattern = UpbStringToStdString(domains[j]);
1817
- const MatchType match_type = DomainPatternMatchType(domain_pattern);
1818
- if (match_type == INVALID_MATCH) {
1868
+ if (!XdsRouting::IsValidDomainPattern(domain_pattern)) {
1819
1869
  return GRPC_ERROR_CREATE_FROM_CPP_STRING(
1820
1870
  absl::StrCat("Invalid domain pattern \"", domain_pattern, "\"."));
1821
1871
  }
@@ -1837,7 +1887,7 @@ grpc_error_handle RouteConfigParse(
1837
1887
  if (error != GRPC_ERROR_NONE) return error;
1838
1888
  }
1839
1889
  // Parse retry policy.
1840
- absl::optional<XdsApi::Route::RetryPolicy> virtual_host_retry_policy;
1890
+ absl::optional<XdsApi::RetryPolicy> virtual_host_retry_policy;
1841
1891
  const envoy_config_route_v3_RetryPolicy* retry_policy =
1842
1892
  envoy_config_route_v3_VirtualHost_retry_policy(virtual_hosts[i]);
1843
1893
  if (retry_policy != nullptr) {
@@ -1876,11 +1926,21 @@ grpc_error_handle RouteConfigParse(
1876
1926
  if (error != GRPC_ERROR_NONE) return error;
1877
1927
  error = RouteRuntimeFractionParse(match, &route);
1878
1928
  if (error != GRPC_ERROR_NONE) return error;
1879
- error = RouteActionParse(context, routes[j], &route, &ignore_route);
1880
- if (error != GRPC_ERROR_NONE) return error;
1881
- if (ignore_route) continue;
1882
- if (route.retry_policy == absl::nullopt && retry_policy != nullptr) {
1883
- route.retry_policy = virtual_host_retry_policy;
1929
+ if (envoy_config_route_v3_Route_has_route(routes[j])) {
1930
+ route.action.emplace<XdsApi::Route::RouteAction>();
1931
+ auto& route_action =
1932
+ absl::get<XdsApi::Route::RouteAction>(route.action);
1933
+ error =
1934
+ RouteActionParse(context, routes[j], &route_action, &ignore_route);
1935
+ if (error != GRPC_ERROR_NONE) return error;
1936
+ if (ignore_route) continue;
1937
+ if (route_action.retry_policy == absl::nullopt &&
1938
+ retry_policy != nullptr) {
1939
+ route_action.retry_policy = virtual_host_retry_policy;
1940
+ }
1941
+ } else if (envoy_config_route_v3_Route_has_non_forwarding_action(
1942
+ routes[j])) {
1943
+ route.action.emplace<XdsApi::Route::NonForwardingAction>();
1884
1944
  }
1885
1945
  if (context.use_v3) {
1886
1946
  grpc_error_handle error = ParseTypedPerFilterConfig<
@@ -2237,32 +2297,47 @@ grpc_error_handle HttpConnectionManagerParse(
2237
2297
  absl::StrFormat("Filter %s is not supported on %s", filter_type,
2238
2298
  is_client ? "clients" : "servers"));
2239
2299
  }
2240
- if (i < num_filters - 1) {
2300
+ absl::StatusOr<XdsHttpFilterImpl::FilterConfig> filter_config =
2301
+ filter_impl->GenerateFilterConfig(google_protobuf_Any_value(any),
2302
+ context.arena);
2303
+ if (!filter_config.ok()) {
2304
+ return GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
2305
+ "filter config for type ", filter_type,
2306
+ " failed to parse: ", filter_config.status().ToString()));
2307
+ }
2308
+ http_connection_manager->http_filters.emplace_back(
2309
+ XdsApi::LdsUpdate::HttpConnectionManager::HttpFilter{
2310
+ std::string(name), std::move(*filter_config)});
2311
+ }
2312
+ if (http_connection_manager->http_filters.empty()) {
2313
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2314
+ "Expected at least one HTTP filter");
2315
+ }
2316
+ // Make sure that the last filter is terminal and non-last filters are
2317
+ // non-terminal. Note that this check is being performed in a separate loop
2318
+ // to take care of the case where there are two terminal filters in the list
2319
+ // out of which only one gets added in the final list.
2320
+ for (const auto& http_filter : http_connection_manager->http_filters) {
2321
+ const XdsHttpFilterImpl* filter_impl =
2322
+ XdsHttpFilterRegistry::GetFilterForType(
2323
+ http_filter.config.config_proto_type_name);
2324
+ if (&http_filter != &http_connection_manager->http_filters.back()) {
2241
2325
  // Filters before the last filter must not be terminal.
2242
2326
  if (filter_impl->IsTerminalFilter()) {
2243
2327
  return GRPC_ERROR_CREATE_FROM_CPP_STRING(
2244
- absl::StrCat("terminal filter for config type ", filter_type,
2328
+ absl::StrCat("terminal filter for config type ",
2329
+ http_filter.config.config_proto_type_name,
2245
2330
  " must be the last filter in the chain"));
2246
2331
  }
2247
2332
  } else {
2248
2333
  // The last filter must be terminal.
2249
2334
  if (!filter_impl->IsTerminalFilter()) {
2250
2335
  return GRPC_ERROR_CREATE_FROM_CPP_STRING(
2251
- absl::StrCat("non-terminal filter for config type ", filter_type,
2336
+ absl::StrCat("non-terminal filter for config type ",
2337
+ http_filter.config.config_proto_type_name,
2252
2338
  " is the last filter in the chain"));
2253
2339
  }
2254
2340
  }
2255
- absl::StatusOr<XdsHttpFilterImpl::FilterConfig> filter_config =
2256
- filter_impl->GenerateFilterConfig(google_protobuf_Any_value(any),
2257
- context.arena);
2258
- if (!filter_config.ok()) {
2259
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
2260
- "filter config for type ", filter_type,
2261
- " failed to parse: ", filter_config.status().ToString()));
2262
- }
2263
- http_connection_manager->http_filters.emplace_back(
2264
- XdsApi::LdsUpdate::HttpConnectionManager::HttpFilter{
2265
- std::string(name), std::move(*filter_config)});
2266
2341
  }
2267
2342
  } else {
2268
2343
  // If using a v2 config, we just hard-code a list containing only the
@@ -2273,7 +2348,10 @@ grpc_error_handle HttpConnectionManagerParse(
2273
2348
  XdsApi::LdsUpdate::HttpConnectionManager::HttpFilter{
2274
2349
  "router", {kXdsHttpRouterFilterConfigName, Json()}});
2275
2350
  }
2276
- if (is_client) {
2351
+ // Guarding parsing of RouteConfig on the server side with the environmental
2352
+ // variable since that's the first feature on the server side that will be
2353
+ // using this.
2354
+ if (is_client || XdsRbacEnabled()) {
2277
2355
  // Found inlined route_config. Parse it to find the cluster_name.
2278
2356
  if (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_route_config(
2279
2357
  http_connection_manager_proto)) {
@@ -2508,6 +2586,8 @@ grpc_error_handle FilterChainParse(
2508
2586
  filter_chain_match, &filter_chain->filter_chain_match);
2509
2587
  if (error != GRPC_ERROR_NONE) errors.push_back(error);
2510
2588
  }
2589
+ filter_chain->filter_chain_data =
2590
+ std::make_shared<XdsApi::LdsUpdate::FilterChainData>();
2511
2591
  // Parse the filters list. Currently we only support HttpConnectionManager.
2512
2592
  size_t size = 0;
2513
2593
  auto* filters =
@@ -2543,8 +2623,6 @@ grpc_error_handle FilterChainParse(
2543
2623
  "Could not parse HttpConnectionManager config from filter "
2544
2624
  "typed_config"));
2545
2625
  } else {
2546
- filter_chain->filter_chain_data =
2547
- std::make_shared<XdsApi::LdsUpdate::FilterChainData>();
2548
2626
  grpc_error_handle error = HttpConnectionManagerParse(
2549
2627
  false /* is_client */, context, http_connection_manager, is_v2,
2550
2628
  &filter_chain->filter_chain_data->http_connection_manager);
@@ -3277,7 +3355,7 @@ grpc_error_handle DropParseAndAppend(
3277
3355
  return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Unknown denominator type");
3278
3356
  }
3279
3357
  // Cap numerator to 1000000.
3280
- numerator = GPR_MIN(numerator, 1000000);
3358
+ numerator = std::min(numerator, 1000000u);
3281
3359
  drop_config->AddCategory(std::move(category), numerator);
3282
3360
  return GRPC_ERROR_NONE;
3283
3361
  }
@@ -3342,123 +3420,257 @@ grpc_error_handle EdsResourceParse(
3342
3420
  return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing EDS resource", &errors);
3343
3421
  }
3344
3422
 
3345
- template <typename ProtoParseFunction, typename ProtoResourceNameFunction,
3346
- typename ResourceTypeSelectorFunction, typename ProtoLogFunction,
3347
- typename ResourceParseFunction, typename UpdateMap>
3348
- grpc_error_handle AdsResponseParse(
3349
- const EncodingContext& context, ProtoParseFunction proto_parse_function,
3350
- ProtoResourceNameFunction proto_resource_name_function,
3351
- ResourceTypeSelectorFunction resource_type_selector_function,
3352
- ProtoLogFunction proto_log_function,
3353
- ResourceParseFunction resource_parse_function,
3354
- const envoy_service_discovery_v3_DiscoveryResponse* response,
3355
- const char* resource_type_string,
3356
- const std::set<absl::string_view>& expected_resource_names,
3357
- UpdateMap* update_map, std::set<std::string>* resource_names_failed) {
3358
- std::vector<grpc_error_handle> errors;
3359
- // Get the resources from the response.
3360
- size_t size;
3361
- const google_protobuf_Any* const* resources =
3362
- envoy_service_discovery_v3_DiscoveryResponse_resources(response, &size);
3363
- for (size_t i = 0; i < size; ++i) {
3364
- // Check the type_url of the resource.
3365
- absl::string_view type_url =
3366
- UpbStringToAbsl(google_protobuf_Any_type_url(resources[i]));
3367
- bool is_v2 = false;
3368
- if (!resource_type_selector_function(type_url, &is_v2)) {
3369
- errors.push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING(
3370
- absl::StrCat("resource index ", i, ": Resource is not ",
3371
- resource_type_string, ".")));
3372
- continue;
3423
+ class ListenerResourceType : public XdsResourceType {
3424
+ public:
3425
+ struct ListenerData : public ResourceData {
3426
+ XdsApi::LdsUpdate resource;
3427
+ };
3428
+
3429
+ absl::string_view type_url() const override { return XdsApi::kLdsTypeUrl; }
3430
+ absl::string_view v2_type_url() const override { return kLdsV2TypeUrl; }
3431
+
3432
+ absl::StatusOr<DecodeResult> Decode(const EncodingContext& context,
3433
+ absl::string_view serialized_resource,
3434
+ bool is_v2) const override {
3435
+ // Parse serialized proto.
3436
+ auto* resource = envoy_config_listener_v3_Listener_parse(
3437
+ serialized_resource.data(), serialized_resource.size(), context.arena);
3438
+ if (resource == nullptr) {
3439
+ return absl::InvalidArgumentError("Can't parse Listener resource.");
3440
+ }
3441
+ MaybeLogListener(context, resource);
3442
+ // Validate resource.
3443
+ DecodeResult result;
3444
+ result.name =
3445
+ UpbStringToStdString(envoy_config_listener_v3_Listener_name(resource));
3446
+ auto listener_data = absl::make_unique<ListenerData>();
3447
+ grpc_error_handle error =
3448
+ LdsResourceParse(context, resource, is_v2, &listener_data->resource);
3449
+ if (error != GRPC_ERROR_NONE) {
3450
+ result.resource =
3451
+ absl::InvalidArgumentError(grpc_error_std_string(error));
3452
+ GRPC_ERROR_UNREF(error);
3453
+ } else {
3454
+ result.resource = std::move(listener_data);
3373
3455
  }
3374
- // Parse the resource.
3375
- upb_strview serialized_resource = google_protobuf_Any_value(resources[i]);
3376
- auto* resource = proto_parse_function(
3377
- serialized_resource.data, serialized_resource.size, context.arena);
3456
+ return std::move(result);
3457
+ }
3458
+ };
3459
+
3460
+ class RouteConfigResourceType : public XdsResourceType {
3461
+ public:
3462
+ struct RouteConfigData : public ResourceData {
3463
+ XdsApi::RdsUpdate resource;
3464
+ };
3465
+
3466
+ absl::string_view type_url() const override { return XdsApi::kRdsTypeUrl; }
3467
+ absl::string_view v2_type_url() const override { return kRdsV2TypeUrl; }
3468
+
3469
+ absl::StatusOr<DecodeResult> Decode(const EncodingContext& context,
3470
+ absl::string_view serialized_resource,
3471
+ bool is_v2) const override {
3472
+ // Parse serialized proto.
3473
+ auto* resource = envoy_config_route_v3_RouteConfiguration_parse(
3474
+ serialized_resource.data(), serialized_resource.size(), context.arena);
3378
3475
  if (resource == nullptr) {
3379
- errors.push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING(
3380
- absl::StrCat("resource index ", i, ": Can't parse ",
3381
- resource_type_string, " resource.")));
3382
- continue;
3476
+ return absl::InvalidArgumentError("Can't parse Listener resource.");
3383
3477
  }
3384
- proto_log_function(context, resource);
3385
- // Check the resource name. Ignore unexpected names.
3386
- std::string resource_name =
3387
- UpbStringToStdString(proto_resource_name_function(resource));
3388
- if (expected_resource_names.find(resource_name) ==
3389
- expected_resource_names.end()) {
3390
- continue;
3478
+ MaybeLogRouteConfiguration(context, resource);
3479
+ // Validate resource.
3480
+ DecodeResult result;
3481
+ result.name = UpbStringToStdString(
3482
+ envoy_config_route_v3_RouteConfiguration_name(resource));
3483
+ auto route_config_data = absl::make_unique<RouteConfigData>();
3484
+ grpc_error_handle error = RouteConfigParse(context, resource, is_v2,
3485
+ &route_config_data->resource);
3486
+ if (error != GRPC_ERROR_NONE) {
3487
+ result.resource =
3488
+ absl::InvalidArgumentError(grpc_error_std_string(error));
3489
+ GRPC_ERROR_UNREF(error);
3490
+ } else {
3491
+ result.resource = std::move(route_config_data);
3391
3492
  }
3392
- // Fail on duplicate resources.
3393
- if (update_map->find(resource_name) != update_map->end()) {
3394
- errors.push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING(
3395
- absl::StrCat("duplicate resource name \"", resource_name, "\"")));
3396
- resource_names_failed->insert(resource_name);
3397
- continue;
3493
+ return std::move(result);
3494
+ }
3495
+ };
3496
+
3497
+ class ClusterResourceType : public XdsResourceType {
3498
+ public:
3499
+ struct ClusterData : public ResourceData {
3500
+ XdsApi::CdsUpdate resource;
3501
+ };
3502
+
3503
+ absl::string_view type_url() const override { return XdsApi::kCdsTypeUrl; }
3504
+ absl::string_view v2_type_url() const override { return kCdsV2TypeUrl; }
3505
+
3506
+ absl::StatusOr<DecodeResult> Decode(const EncodingContext& context,
3507
+ absl::string_view serialized_resource,
3508
+ bool is_v2) const override {
3509
+ // Parse serialized proto.
3510
+ auto* resource = envoy_config_cluster_v3_Cluster_parse(
3511
+ serialized_resource.data(), serialized_resource.size(), context.arena);
3512
+ if (resource == nullptr) {
3513
+ return absl::InvalidArgumentError("Can't parse Listener resource.");
3398
3514
  }
3515
+ MaybeLogCluster(context, resource);
3399
3516
  // Validate resource.
3400
- decltype(UpdateMap::mapped_type::resource) update;
3517
+ DecodeResult result;
3518
+ result.name =
3519
+ UpbStringToStdString(envoy_config_cluster_v3_Cluster_name(resource));
3520
+ auto cluster_data = absl::make_unique<ClusterData>();
3401
3521
  grpc_error_handle error =
3402
- resource_parse_function(context, resource, is_v2, &update);
3522
+ CdsResourceParse(context, resource, is_v2, &cluster_data->resource);
3403
3523
  if (error != GRPC_ERROR_NONE) {
3404
- errors.push_back(
3405
- grpc_error_add_child(GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
3406
- resource_name, ": validation error")),
3407
- error));
3408
- resource_names_failed->insert(resource_name);
3524
+ result.resource =
3525
+ absl::InvalidArgumentError(grpc_error_std_string(error));
3526
+ GRPC_ERROR_UNREF(error);
3409
3527
  } else {
3410
- // Store result in update map, in both validated and serialized form.
3411
- auto& resource_data = (*update_map)[resource_name];
3412
- resource_data.resource = std::move(update);
3413
- resource_data.serialized_proto =
3414
- UpbStringToStdString(serialized_resource);
3528
+ result.resource = std::move(cluster_data);
3415
3529
  }
3530
+ return std::move(result);
3416
3531
  }
3417
- return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing ADS response", &errors);
3418
- }
3532
+ };
3419
3533
 
3420
- std::string TypeUrlInternalToExternal(absl::string_view type_url) {
3421
- if (type_url == kLdsV2TypeUrl) {
3422
- return XdsApi::kLdsTypeUrl;
3423
- } else if (type_url == kRdsV2TypeUrl) {
3424
- return XdsApi::kRdsTypeUrl;
3425
- } else if (type_url == kCdsV2TypeUrl) {
3426
- return XdsApi::kCdsTypeUrl;
3427
- } else if (type_url == kEdsV2TypeUrl) {
3428
- return XdsApi::kEdsTypeUrl;
3429
- }
3430
- return std::string(type_url);
3431
- }
3534
+ class EndpointResourceType : public XdsResourceType {
3535
+ public:
3536
+ struct EndpointData : public ResourceData {
3537
+ XdsApi::EdsUpdate resource;
3538
+ };
3432
3539
 
3433
- upb_strview LdsResourceName(
3434
- const envoy_config_listener_v3_Listener* lds_resource) {
3435
- return envoy_config_listener_v3_Listener_name(lds_resource);
3436
- }
3540
+ absl::string_view type_url() const override { return XdsApi::kEdsTypeUrl; }
3541
+ absl::string_view v2_type_url() const override { return kEdsV2TypeUrl; }
3437
3542
 
3438
- upb_strview RdsResourceName(
3439
- const envoy_config_route_v3_RouteConfiguration* rds_resource) {
3440
- return envoy_config_route_v3_RouteConfiguration_name(rds_resource);
3441
- }
3543
+ absl::StatusOr<DecodeResult> Decode(const EncodingContext& context,
3544
+ absl::string_view serialized_resource,
3545
+ bool is_v2) const override {
3546
+ // Parse serialized proto.
3547
+ auto* resource = envoy_config_endpoint_v3_ClusterLoadAssignment_parse(
3548
+ serialized_resource.data(), serialized_resource.size(), context.arena);
3549
+ if (resource == nullptr) {
3550
+ return absl::InvalidArgumentError("Can't parse Listener resource.");
3551
+ }
3552
+ MaybeLogClusterLoadAssignment(context, resource);
3553
+ // Validate resource.
3554
+ DecodeResult result;
3555
+ result.name = UpbStringToStdString(
3556
+ envoy_config_endpoint_v3_ClusterLoadAssignment_cluster_name(resource));
3557
+ auto endpoint_data = absl::make_unique<EndpointData>();
3558
+ grpc_error_handle error =
3559
+ EdsResourceParse(context, resource, is_v2, &endpoint_data->resource);
3560
+ if (error != GRPC_ERROR_NONE) {
3561
+ result.resource =
3562
+ absl::InvalidArgumentError(grpc_error_std_string(error));
3563
+ GRPC_ERROR_UNREF(error);
3564
+ } else {
3565
+ result.resource = std::move(endpoint_data);
3566
+ }
3567
+ return std::move(result);
3568
+ }
3569
+ };
3442
3570
 
3443
- upb_strview CdsResourceName(
3444
- const envoy_config_cluster_v3_Cluster* cds_resource) {
3445
- return envoy_config_cluster_v3_Cluster_name(cds_resource);
3571
+ grpc_error_handle AdsResourceParse(
3572
+ const EncodingContext& context, XdsResourceType* type, size_t idx,
3573
+ const google_protobuf_Any* resource_any,
3574
+ const std::map<absl::string_view /*authority*/,
3575
+ std::set<absl::string_view /*name*/>>&
3576
+ subscribed_resource_names,
3577
+ std::function<grpc_error_handle(
3578
+ absl::string_view, XdsApi::ResourceName,
3579
+ std::unique_ptr<XdsResourceType::ResourceData>, std::string)>
3580
+ add_result_func,
3581
+ std::set<XdsApi::ResourceName>* resource_names_failed) {
3582
+ // Check the type_url of the resource.
3583
+ absl::string_view type_url = absl::StripPrefix(
3584
+ UpbStringToAbsl(google_protobuf_Any_type_url(resource_any)),
3585
+ "type.googleapis.com/");
3586
+ bool is_v2 = false;
3587
+ if (!type->IsType(type_url, &is_v2)) {
3588
+ return GRPC_ERROR_CREATE_FROM_CPP_STRING(
3589
+ absl::StrCat("resource index ", idx, ": found resource type ", type_url,
3590
+ " in response for type ", type->type_url()));
3591
+ }
3592
+ // Parse the resource.
3593
+ absl::string_view serialized_resource =
3594
+ UpbStringToAbsl(google_protobuf_Any_value(resource_any));
3595
+ absl::StatusOr<XdsResourceType::DecodeResult> result =
3596
+ type->Decode(context, serialized_resource, is_v2);
3597
+ if (!result.ok()) {
3598
+ return GRPC_ERROR_CREATE_FROM_CPP_STRING(
3599
+ absl::StrCat("resource index ", idx, ": ", result.status().ToString()));
3600
+ }
3601
+ // Check the resource name.
3602
+ auto resource_name = ParseResourceNameInternal(
3603
+ result->name, [type](absl::string_view type_url, bool* is_v2) {
3604
+ return type->IsType(type_url, is_v2);
3605
+ });
3606
+ if (!resource_name.ok()) {
3607
+ return GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
3608
+ "resource index ", idx, ": Cannot parse xDS resource name \"",
3609
+ result->name, "\""));
3610
+ }
3611
+ // Ignore unexpected names.
3612
+ auto iter = subscribed_resource_names.find(resource_name->authority);
3613
+ if (iter == subscribed_resource_names.end() ||
3614
+ iter->second.find(resource_name->id) == iter->second.end()) {
3615
+ return GRPC_ERROR_NONE;
3616
+ }
3617
+ // Check that resource was valid.
3618
+ if (!result->resource.ok()) {
3619
+ resource_names_failed->insert(*resource_name);
3620
+ return GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
3621
+ "resource index ", idx, ": ", result->name,
3622
+ ": validation error: ", result->resource.status().ToString()));
3623
+ }
3624
+ // Add result.
3625
+ grpc_error_handle error = add_result_func(result->name, *resource_name,
3626
+ std::move(*result->resource),
3627
+ std::string(serialized_resource));
3628
+ if (error != GRPC_ERROR_NONE) {
3629
+ resource_names_failed->insert(*resource_name);
3630
+ return grpc_error_add_child(
3631
+ GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
3632
+ "resource index ", idx, ": ", result->name, ": validation error")),
3633
+ error);
3634
+ }
3635
+ return GRPC_ERROR_NONE;
3446
3636
  }
3447
3637
 
3448
- upb_strview EdsResourceName(
3449
- const envoy_config_endpoint_v3_ClusterLoadAssignment* eds_resource) {
3450
- return envoy_config_endpoint_v3_ClusterLoadAssignment_cluster_name(
3451
- eds_resource);
3638
+ template <typename UpdateMap, typename ResourceTypeData>
3639
+ grpc_error_handle AddResult(
3640
+ UpdateMap* update_map, absl::string_view resource_name_string,
3641
+ XdsApi::ResourceName resource_name,
3642
+ std::unique_ptr<XdsResourceType::ResourceData> resource,
3643
+ std::string serialized_resource) {
3644
+ // Reject duplicate names.
3645
+ if (update_map->find(resource_name) != update_map->end()) {
3646
+ return GRPC_ERROR_CREATE_FROM_CPP_STRING(
3647
+ absl::StrCat("duplicate resource name \"", resource_name_string, "\""));
3648
+ }
3649
+ // Save result.
3650
+ auto& resource_data = (*update_map)[resource_name];
3651
+ ResourceTypeData* typed_resource =
3652
+ static_cast<ResourceTypeData*>(resource.get());
3653
+ resource_data.resource = std::move(typed_resource->resource);
3654
+ resource_data.serialized_proto = std::move(serialized_resource);
3655
+ return GRPC_ERROR_NONE;
3452
3656
  }
3453
3657
 
3454
3658
  } // namespace
3455
3659
 
3456
3660
  XdsApi::AdsParseResult XdsApi::ParseAdsResponse(
3457
3661
  const XdsBootstrap::XdsServer& server, const grpc_slice& encoded_response,
3458
- const std::set<absl::string_view>& expected_listener_names,
3459
- const std::set<absl::string_view>& expected_route_configuration_names,
3460
- const std::set<absl::string_view>& expected_cluster_names,
3461
- const std::set<absl::string_view>& expected_eds_service_names) {
3662
+ const std::map<absl::string_view /*authority*/,
3663
+ std::set<absl::string_view /*name*/>>&
3664
+ subscribed_listener_names,
3665
+ const std::map<absl::string_view /*authority*/,
3666
+ std::set<absl::string_view /*name*/>>&
3667
+ subscribed_route_config_names,
3668
+ const std::map<absl::string_view /*authority*/,
3669
+ std::set<absl::string_view /*name*/>>&
3670
+ subscribed_cluster_names,
3671
+ const std::map<absl::string_view /*authority*/,
3672
+ std::set<absl::string_view /*name*/>>&
3673
+ subscribed_eds_service_names) {
3462
3674
  AdsParseResult result;
3463
3675
  upb::Arena arena;
3464
3676
  const EncodingContext context = {client_,
@@ -3480,41 +3692,88 @@ XdsApi::AdsParseResult XdsApi::ParseAdsResponse(
3480
3692
  }
3481
3693
  MaybeLogDiscoveryResponse(context, response);
3482
3694
  // Record the type_url, the version_info, and the nonce of the response.
3483
- result.type_url = TypeUrlInternalToExternal(UpbStringToAbsl(
3484
- envoy_service_discovery_v3_DiscoveryResponse_type_url(response)));
3695
+ result.type_url = TypeUrlInternalToExternal(absl::StripPrefix(
3696
+ UpbStringToAbsl(
3697
+ envoy_service_discovery_v3_DiscoveryResponse_type_url(response)),
3698
+ "type.googleapis.com/"));
3485
3699
  result.version = UpbStringToStdString(
3486
3700
  envoy_service_discovery_v3_DiscoveryResponse_version_info(response));
3487
3701
  result.nonce = UpbStringToStdString(
3488
3702
  envoy_service_discovery_v3_DiscoveryResponse_nonce(response));
3489
- // Parse the response according to the resource type.
3490
- // TODO(roth): When we have time, consider defining an interface for the
3491
- // methods of each resource type, so that we don't have to pass
3492
- // individual functions into each call to AdsResponseParse().
3493
- if (IsLds(result.type_url)) {
3494
- result.parse_error = AdsResponseParse(
3495
- context, envoy_config_listener_v3_Listener_parse, LdsResourceName,
3496
- IsLds, MaybeLogListener, LdsResourceParse, response, "LDS",
3497
- expected_listener_names, &result.lds_update_map,
3498
- &result.resource_names_failed);
3499
- } else if (IsRds(result.type_url)) {
3500
- result.parse_error = AdsResponseParse(
3501
- context, envoy_config_route_v3_RouteConfiguration_parse,
3502
- RdsResourceName, IsRds, MaybeLogRouteConfiguration, RouteConfigParse,
3503
- response, "RDS", expected_route_configuration_names,
3504
- &result.rds_update_map, &result.resource_names_failed);
3505
- } else if (IsCds(result.type_url)) {
3506
- result.parse_error = AdsResponseParse(
3507
- context, envoy_config_cluster_v3_Cluster_parse, CdsResourceName, IsCds,
3508
- MaybeLogCluster, CdsResourceParse, response, "CDS",
3509
- expected_cluster_names, &result.cds_update_map,
3510
- &result.resource_names_failed);
3511
- } else if (IsEds(result.type_url)) {
3512
- result.parse_error = AdsResponseParse(
3513
- context, envoy_config_endpoint_v3_ClusterLoadAssignment_parse,
3514
- EdsResourceName, IsEds, MaybeLogClusterLoadAssignment, EdsResourceParse,
3515
- response, "EDS", expected_eds_service_names, &result.eds_update_map,
3516
- &result.resource_names_failed);
3517
- }
3703
+ // Get the resources from the response.
3704
+ std::vector<grpc_error_handle> errors;
3705
+ size_t size;
3706
+ const google_protobuf_Any* const* resources =
3707
+ envoy_service_discovery_v3_DiscoveryResponse_resources(response, &size);
3708
+ for (size_t i = 0; i < size; ++i) {
3709
+ // Parse the response according to the resource type.
3710
+ // TODO(roth): When we have time, change the API here to avoid the need
3711
+ // for templating and conditionals.
3712
+ grpc_error_handle parse_error = GRPC_ERROR_NONE;
3713
+ if (IsLds(result.type_url)) {
3714
+ ListenerResourceType resource_type;
3715
+ auto& update_map = result.lds_update_map;
3716
+ parse_error = AdsResourceParse(
3717
+ context, &resource_type, i, resources[i], subscribed_listener_names,
3718
+ [&update_map](absl::string_view resource_name_string,
3719
+ XdsApi::ResourceName resource_name,
3720
+ std::unique_ptr<XdsResourceType::ResourceData> resource,
3721
+ std::string serialized_resource) {
3722
+ return AddResult<LdsUpdateMap, ListenerResourceType::ListenerData>(
3723
+ &update_map, resource_name_string, std::move(resource_name),
3724
+ std::move(resource), std::move(serialized_resource));
3725
+ },
3726
+ &result.resource_names_failed);
3727
+ } else if (IsRds(result.type_url)) {
3728
+ RouteConfigResourceType resource_type;
3729
+ auto& update_map = result.rds_update_map;
3730
+ parse_error = AdsResourceParse(
3731
+ context, &resource_type, i, resources[i],
3732
+ subscribed_route_config_names,
3733
+ [&update_map](absl::string_view resource_name_string,
3734
+ XdsApi::ResourceName resource_name,
3735
+ std::unique_ptr<XdsResourceType::ResourceData> resource,
3736
+ std::string serialized_resource) {
3737
+ return AddResult<RdsUpdateMap,
3738
+ RouteConfigResourceType::RouteConfigData>(
3739
+ &update_map, resource_name_string, std::move(resource_name),
3740
+ std::move(resource), std::move(serialized_resource));
3741
+ },
3742
+ &result.resource_names_failed);
3743
+ } else if (IsCds(result.type_url)) {
3744
+ ClusterResourceType resource_type;
3745
+ auto& update_map = result.cds_update_map;
3746
+ parse_error = AdsResourceParse(
3747
+ context, &resource_type, i, resources[i], subscribed_cluster_names,
3748
+ [&update_map](absl::string_view resource_name_string,
3749
+ XdsApi::ResourceName resource_name,
3750
+ std::unique_ptr<XdsResourceType::ResourceData> resource,
3751
+ std::string serialized_resource) {
3752
+ return AddResult<CdsUpdateMap, ClusterResourceType::ClusterData>(
3753
+ &update_map, resource_name_string, std::move(resource_name),
3754
+ std::move(resource), std::move(serialized_resource));
3755
+ },
3756
+ &result.resource_names_failed);
3757
+ } else if (IsEds(result.type_url)) {
3758
+ EndpointResourceType resource_type;
3759
+ auto& update_map = result.eds_update_map;
3760
+ parse_error = AdsResourceParse(
3761
+ context, &resource_type, i, resources[i],
3762
+ subscribed_eds_service_names,
3763
+ [&update_map](absl::string_view resource_name_string,
3764
+ XdsApi::ResourceName resource_name,
3765
+ std::unique_ptr<XdsResourceType::ResourceData> resource,
3766
+ std::string serialized_resource) {
3767
+ return AddResult<EdsUpdateMap, EndpointResourceType::EndpointData>(
3768
+ &update_map, resource_name_string, std::move(resource_name),
3769
+ std::move(resource), std::move(serialized_resource));
3770
+ },
3771
+ &result.resource_names_failed);
3772
+ }
3773
+ if (parse_error != GRPC_ERROR_NONE) errors.push_back(parse_error);
3774
+ }
3775
+ result.parse_error =
3776
+ GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing ADS response", &errors);
3518
3777
  return result;
3519
3778
  }
3520
3779
 
@@ -3726,6 +3985,7 @@ grpc_error_handle XdsApi::ParseLrsResponse(
3726
3985
  }
3727
3986
 
3728
3987
  namespace {
3988
+
3729
3989
  google_protobuf_Timestamp* GrpcMillisToTimestamp(const EncodingContext& context,
3730
3990
  grpc_millis value) {
3731
3991
  google_protobuf_Timestamp* timestamp =
@@ -3736,218 +3996,6 @@ google_protobuf_Timestamp* GrpcMillisToTimestamp(const EncodingContext& context,
3736
3996
  return timestamp;
3737
3997
  }
3738
3998
 
3739
- envoy_admin_v3_UpdateFailureState* CreateUpdateFailureStateUpb(
3740
- const EncodingContext& context,
3741
- const XdsApi::ResourceMetadata* resource_metadata) {
3742
- auto* update_failure_state =
3743
- envoy_admin_v3_UpdateFailureState_new(context.arena);
3744
- envoy_admin_v3_UpdateFailureState_set_details(
3745
- update_failure_state,
3746
- StdStringToUpbString(resource_metadata->failed_details));
3747
- envoy_admin_v3_UpdateFailureState_set_version_info(
3748
- update_failure_state,
3749
- StdStringToUpbString(resource_metadata->failed_version));
3750
- envoy_admin_v3_UpdateFailureState_set_last_update_attempt(
3751
- update_failure_state,
3752
- GrpcMillisToTimestamp(context, resource_metadata->failed_update_time));
3753
- return update_failure_state;
3754
- }
3755
-
3756
- void DumpLdsConfig(const EncodingContext& context,
3757
- const XdsApi::ResourceTypeMetadata& resource_type_metadata,
3758
- envoy_service_status_v3_PerXdsConfig* per_xds_config) {
3759
- upb_strview kLdsTypeUrlUpb = upb_strview_makez(XdsApi::kLdsTypeUrl);
3760
- auto* listener_config_dump =
3761
- envoy_service_status_v3_PerXdsConfig_mutable_listener_config(
3762
- per_xds_config, context.arena);
3763
- envoy_admin_v3_ListenersConfigDump_set_version_info(
3764
- listener_config_dump,
3765
- StdStringToUpbString(resource_type_metadata.version));
3766
- for (auto& p : resource_type_metadata.resource_metadata_map) {
3767
- absl::string_view name = p.first;
3768
- const XdsApi::ResourceMetadata* meta = p.second;
3769
- const upb_strview name_upb = StdStringToUpbString(name);
3770
- auto* dynamic_listener =
3771
- envoy_admin_v3_ListenersConfigDump_add_dynamic_listeners(
3772
- listener_config_dump, context.arena);
3773
- envoy_admin_v3_ListenersConfigDump_DynamicListener_set_name(
3774
- dynamic_listener, name_upb);
3775
- envoy_admin_v3_ListenersConfigDump_DynamicListener_set_client_status(
3776
- dynamic_listener, meta->client_status);
3777
- if (!meta->serialized_proto.empty()) {
3778
- // Set in-effective listeners
3779
- auto* dynamic_listener_state =
3780
- envoy_admin_v3_ListenersConfigDump_DynamicListener_mutable_active_state(
3781
- dynamic_listener, context.arena);
3782
- envoy_admin_v3_ListenersConfigDump_DynamicListenerState_set_version_info(
3783
- dynamic_listener_state, StdStringToUpbString(meta->version));
3784
- envoy_admin_v3_ListenersConfigDump_DynamicListenerState_set_last_updated(
3785
- dynamic_listener_state,
3786
- GrpcMillisToTimestamp(context, meta->update_time));
3787
- auto* listener_any =
3788
- envoy_admin_v3_ListenersConfigDump_DynamicListenerState_mutable_listener(
3789
- dynamic_listener_state, context.arena);
3790
- google_protobuf_Any_set_type_url(listener_any, kLdsTypeUrlUpb);
3791
- google_protobuf_Any_set_value(
3792
- listener_any, StdStringToUpbString(meta->serialized_proto));
3793
- }
3794
- if (meta->client_status == XdsApi::ResourceMetadata::NACKED) {
3795
- // Set error_state if NACKED
3796
- envoy_admin_v3_ListenersConfigDump_DynamicListener_set_error_state(
3797
- dynamic_listener, CreateUpdateFailureStateUpb(context, meta));
3798
- }
3799
- }
3800
- }
3801
-
3802
- void DumpRdsConfig(const EncodingContext& context,
3803
- const XdsApi::ResourceTypeMetadata& resource_type_metadata,
3804
- envoy_service_status_v3_PerXdsConfig* per_xds_config) {
3805
- upb_strview kRdsTypeUrlUpb = upb_strview_makez(XdsApi::kRdsTypeUrl);
3806
- auto* route_config_dump =
3807
- envoy_service_status_v3_PerXdsConfig_mutable_route_config(per_xds_config,
3808
- context.arena);
3809
- for (auto& p : resource_type_metadata.resource_metadata_map) {
3810
- absl::string_view name = p.first;
3811
- const XdsApi::ResourceMetadata* meta = p.second;
3812
- const upb_strview name_upb = StdStringToUpbString(name);
3813
- auto* dynamic_route_config =
3814
- envoy_admin_v3_RoutesConfigDump_add_dynamic_route_configs(
3815
- route_config_dump, context.arena);
3816
- envoy_admin_v3_RoutesConfigDump_DynamicRouteConfig_set_client_status(
3817
- dynamic_route_config, meta->client_status);
3818
- auto* route_config_any =
3819
- envoy_admin_v3_RoutesConfigDump_DynamicRouteConfig_mutable_route_config(
3820
- dynamic_route_config, context.arena);
3821
- if (!meta->serialized_proto.empty()) {
3822
- // Set in-effective route configs
3823
- envoy_admin_v3_RoutesConfigDump_DynamicRouteConfig_set_version_info(
3824
- dynamic_route_config, StdStringToUpbString(meta->version));
3825
- envoy_admin_v3_RoutesConfigDump_DynamicRouteConfig_set_last_updated(
3826
- dynamic_route_config,
3827
- GrpcMillisToTimestamp(context, meta->update_time));
3828
- google_protobuf_Any_set_type_url(route_config_any, kRdsTypeUrlUpb);
3829
- google_protobuf_Any_set_value(
3830
- route_config_any, StdStringToUpbString(meta->serialized_proto));
3831
- } else {
3832
- // If there isn't a working route config, we still need to print the
3833
- // name.
3834
- auto* route_config =
3835
- envoy_config_route_v3_RouteConfiguration_new(context.arena);
3836
- envoy_config_route_v3_RouteConfiguration_set_name(route_config, name_upb);
3837
- size_t length;
3838
- char* bytes = envoy_config_route_v3_RouteConfiguration_serialize(
3839
- route_config, context.arena, &length);
3840
- google_protobuf_Any_set_type_url(route_config_any, kRdsTypeUrlUpb);
3841
- google_protobuf_Any_set_value(route_config_any,
3842
- upb_strview_make(bytes, length));
3843
- }
3844
- if (meta->client_status == XdsApi::ResourceMetadata::NACKED) {
3845
- // Set error_state if NACKED
3846
- envoy_admin_v3_RoutesConfigDump_DynamicRouteConfig_set_error_state(
3847
- dynamic_route_config, CreateUpdateFailureStateUpb(context, meta));
3848
- }
3849
- }
3850
- }
3851
-
3852
- void DumpCdsConfig(const EncodingContext& context,
3853
- const XdsApi::ResourceTypeMetadata& resource_type_metadata,
3854
- envoy_service_status_v3_PerXdsConfig* per_xds_config) {
3855
- upb_strview kCdsTypeUrlUpb = upb_strview_makez(XdsApi::kCdsTypeUrl);
3856
- auto* cluster_config_dump =
3857
- envoy_service_status_v3_PerXdsConfig_mutable_cluster_config(
3858
- per_xds_config, context.arena);
3859
- envoy_admin_v3_ClustersConfigDump_set_version_info(
3860
- cluster_config_dump,
3861
- StdStringToUpbString(resource_type_metadata.version));
3862
- for (auto& p : resource_type_metadata.resource_metadata_map) {
3863
- absl::string_view name = p.first;
3864
- const XdsApi::ResourceMetadata* meta = p.second;
3865
- const upb_strview name_upb = StdStringToUpbString(name);
3866
- auto* dynamic_cluster =
3867
- envoy_admin_v3_ClustersConfigDump_add_dynamic_active_clusters(
3868
- cluster_config_dump, context.arena);
3869
- envoy_admin_v3_ClustersConfigDump_DynamicCluster_set_client_status(
3870
- dynamic_cluster, meta->client_status);
3871
- auto* cluster_any =
3872
- envoy_admin_v3_ClustersConfigDump_DynamicCluster_mutable_cluster(
3873
- dynamic_cluster, context.arena);
3874
- if (!meta->serialized_proto.empty()) {
3875
- // Set in-effective clusters
3876
- envoy_admin_v3_ClustersConfigDump_DynamicCluster_set_version_info(
3877
- dynamic_cluster, StdStringToUpbString(meta->version));
3878
- envoy_admin_v3_ClustersConfigDump_DynamicCluster_set_last_updated(
3879
- dynamic_cluster, GrpcMillisToTimestamp(context, meta->update_time));
3880
- google_protobuf_Any_set_type_url(cluster_any, kCdsTypeUrlUpb);
3881
- google_protobuf_Any_set_value(
3882
- cluster_any, StdStringToUpbString(meta->serialized_proto));
3883
- } else {
3884
- // If there isn't a working cluster, we still need to print the name.
3885
- auto* cluster = envoy_config_cluster_v3_Cluster_new(context.arena);
3886
- envoy_config_cluster_v3_Cluster_set_name(cluster, name_upb);
3887
- size_t length;
3888
- char* bytes = envoy_config_cluster_v3_Cluster_serialize(
3889
- cluster, context.arena, &length);
3890
- google_protobuf_Any_set_type_url(cluster_any, kCdsTypeUrlUpb);
3891
- google_protobuf_Any_set_value(cluster_any,
3892
- upb_strview_make(bytes, length));
3893
- }
3894
- if (meta->client_status == XdsApi::ResourceMetadata::NACKED) {
3895
- // Set error_state if NACKED
3896
- envoy_admin_v3_ClustersConfigDump_DynamicCluster_set_error_state(
3897
- dynamic_cluster, CreateUpdateFailureStateUpb(context, meta));
3898
- }
3899
- }
3900
- }
3901
-
3902
- void DumpEdsConfig(const EncodingContext& context,
3903
- const XdsApi::ResourceTypeMetadata& resource_type_metadata,
3904
- envoy_service_status_v3_PerXdsConfig* per_xds_config) {
3905
- upb_strview kEdsTypeUrlUpb = upb_strview_makez(XdsApi::kEdsTypeUrl);
3906
- auto* endpoint_config_dump =
3907
- envoy_service_status_v3_PerXdsConfig_mutable_endpoint_config(
3908
- per_xds_config, context.arena);
3909
- for (auto& p : resource_type_metadata.resource_metadata_map) {
3910
- absl::string_view name = p.first;
3911
- const XdsApi::ResourceMetadata* meta = p.second;
3912
- const upb_strview name_upb = StdStringToUpbString(name);
3913
- auto* dynamic_endpoint =
3914
- envoy_admin_v3_EndpointsConfigDump_add_dynamic_endpoint_configs(
3915
- endpoint_config_dump, context.arena);
3916
- envoy_admin_v3_EndpointsConfigDump_DynamicEndpointConfig_set_client_status(
3917
- dynamic_endpoint, meta->client_status);
3918
- auto* endpoint_any =
3919
- envoy_admin_v3_EndpointsConfigDump_DynamicEndpointConfig_mutable_endpoint_config(
3920
- dynamic_endpoint, context.arena);
3921
- if (!meta->serialized_proto.empty()) {
3922
- // Set in-effective endpoints
3923
- envoy_admin_v3_EndpointsConfigDump_DynamicEndpointConfig_set_version_info(
3924
- dynamic_endpoint, StdStringToUpbString(meta->version));
3925
- envoy_admin_v3_EndpointsConfigDump_DynamicEndpointConfig_set_last_updated(
3926
- dynamic_endpoint, GrpcMillisToTimestamp(context, meta->update_time));
3927
- google_protobuf_Any_set_type_url(endpoint_any, kEdsTypeUrlUpb);
3928
- google_protobuf_Any_set_value(
3929
- endpoint_any, StdStringToUpbString(meta->serialized_proto));
3930
- } else {
3931
- // If there isn't a working endpoint, we still need to print the name.
3932
- auto* cluster_load_assignment =
3933
- envoy_config_endpoint_v3_ClusterLoadAssignment_new(context.arena);
3934
- envoy_config_endpoint_v3_ClusterLoadAssignment_set_cluster_name(
3935
- cluster_load_assignment, name_upb);
3936
- size_t length;
3937
- char* bytes = envoy_config_endpoint_v3_ClusterLoadAssignment_serialize(
3938
- cluster_load_assignment, context.arena, &length);
3939
- google_protobuf_Any_set_type_url(endpoint_any, kEdsTypeUrlUpb);
3940
- google_protobuf_Any_set_value(endpoint_any,
3941
- upb_strview_make(bytes, length));
3942
- }
3943
- if (meta->client_status == XdsApi::ResourceMetadata::NACKED) {
3944
- // Set error_state if NACKED
3945
- envoy_admin_v3_EndpointsConfigDump_DynamicEndpointConfig_set_error_state(
3946
- dynamic_endpoint, CreateUpdateFailureStateUpb(context, meta));
3947
- }
3948
- }
3949
- }
3950
-
3951
3999
  } // namespace
3952
4000
 
3953
4001
  std::string XdsApi::AssembleClientConfig(
@@ -3963,33 +4011,53 @@ std::string XdsApi::AssembleClientConfig(
3963
4011
  arena.ptr(), true, certificate_provider_definition_map_};
3964
4012
  PopulateNode(context, node_, build_version_, user_agent_name_,
3965
4013
  user_agent_version_, node);
3966
- // Dump each xDS-type config into PerXdsConfig
3967
- for (auto& p : resource_type_metadata_map) {
4014
+ // Dump each resource.
4015
+ std::vector<std::string> type_url_storage;
4016
+ for (const auto& p : resource_type_metadata_map) {
3968
4017
  absl::string_view type_url = p.first;
3969
- const ResourceTypeMetadata& resource_type_metadata = p.second;
3970
- if (type_url == kLdsTypeUrl) {
3971
- auto* per_xds_config =
3972
- envoy_service_status_v3_ClientConfig_add_xds_config(client_config,
3973
- context.arena);
3974
- DumpLdsConfig(context, resource_type_metadata, per_xds_config);
3975
- } else if (type_url == kRdsTypeUrl) {
3976
- auto* per_xds_config =
3977
- envoy_service_status_v3_ClientConfig_add_xds_config(client_config,
3978
- context.arena);
3979
- DumpRdsConfig(context, resource_type_metadata, per_xds_config);
3980
- } else if (type_url == kCdsTypeUrl) {
3981
- auto* per_xds_config =
3982
- envoy_service_status_v3_ClientConfig_add_xds_config(client_config,
3983
- context.arena);
3984
- DumpCdsConfig(context, resource_type_metadata, per_xds_config);
3985
- } else if (type_url == kEdsTypeUrl) {
3986
- auto* per_xds_config =
3987
- envoy_service_status_v3_ClientConfig_add_xds_config(client_config,
3988
- context.arena);
3989
- DumpEdsConfig(context, resource_type_metadata, per_xds_config);
3990
- } else {
3991
- gpr_log(GPR_ERROR, "invalid type_url %s", std::string(type_url).c_str());
3992
- return "";
4018
+ const ResourceMetadataMap& resource_metadata_map = p.second;
4019
+ type_url_storage.emplace_back(
4020
+ absl::StrCat("type.googleapis.com/", type_url));
4021
+ for (const auto& q : resource_metadata_map) {
4022
+ absl::string_view resource_name = q.first;
4023
+ const ResourceMetadata& metadata = *q.second;
4024
+ auto* entry =
4025
+ envoy_service_status_v3_ClientConfig_add_generic_xds_configs(
4026
+ client_config, context.arena);
4027
+ envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_type_url(
4028
+ entry, StdStringToUpbString(type_url_storage.back()));
4029
+ envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_name(
4030
+ entry, StdStringToUpbString(resource_name));
4031
+ envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_client_status(
4032
+ entry, metadata.client_status);
4033
+ if (!metadata.serialized_proto.empty()) {
4034
+ envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_version_info(
4035
+ entry, StdStringToUpbString(metadata.version));
4036
+ envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_last_updated(
4037
+ entry, GrpcMillisToTimestamp(context, metadata.update_time));
4038
+ auto* any_field =
4039
+ envoy_service_status_v3_ClientConfig_GenericXdsConfig_mutable_xds_config(
4040
+ entry, context.arena);
4041
+ google_protobuf_Any_set_type_url(
4042
+ any_field, StdStringToUpbString(type_url_storage.back()));
4043
+ google_protobuf_Any_set_value(
4044
+ any_field, StdStringToUpbString(metadata.serialized_proto));
4045
+ }
4046
+ if (metadata.client_status == XdsApi::ResourceMetadata::NACKED) {
4047
+ auto* update_failure_state =
4048
+ envoy_admin_v3_UpdateFailureState_new(context.arena);
4049
+ envoy_admin_v3_UpdateFailureState_set_details(
4050
+ update_failure_state,
4051
+ StdStringToUpbString(metadata.failed_details));
4052
+ envoy_admin_v3_UpdateFailureState_set_version_info(
4053
+ update_failure_state,
4054
+ StdStringToUpbString(metadata.failed_version));
4055
+ envoy_admin_v3_UpdateFailureState_set_last_update_attempt(
4056
+ update_failure_state,
4057
+ GrpcMillisToTimestamp(context, metadata.failed_update_time));
4058
+ envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_error_state(
4059
+ entry, update_failure_state);
4060
+ }
3993
4061
  }
3994
4062
  }
3995
4063
  // Serialize the upb message to bytes