grpc 1.42.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 (739) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +85 -34
  3. data/include/grpc/event_engine/event_engine.h +37 -13
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +1 -31
  5. data/include/grpc/event_engine/memory_allocator.h +27 -11
  6. data/include/grpc/event_engine/memory_request.h +57 -0
  7. data/include/grpc/grpc_security.h +276 -145
  8. data/include/grpc/grpc_security_constants.h +1 -14
  9. data/include/grpc/impl/codegen/port_platform.h +7 -3
  10. data/src/core/ext/filters/client_channel/backend_metric.cc +6 -7
  11. data/src/core/ext/filters/client_channel/backend_metric.h +3 -2
  12. data/src/core/ext/filters/client_channel/client_channel.cc +81 -40
  13. data/src/core/ext/filters/client_channel/client_channel.h +5 -4
  14. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -2
  15. data/src/core/ext/filters/client_channel/dynamic_filters.cc +4 -4
  16. data/src/core/ext/filters/client_channel/health/health_check_client.h +1 -1
  17. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +12 -14
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +1 -2
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -2
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -2
  21. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -3
  22. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +27 -80
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +82 -34
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +47 -91
  25. data/src/core/ext/filters/client_channel/lb_policy.h +75 -59
  26. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +3 -3
  27. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +2 -2
  28. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +8 -12
  29. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +3 -3
  30. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +6 -12
  31. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +222 -294
  32. data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -7
  33. data/src/core/ext/filters/client_channel/resolver_registry.h +1 -2
  34. data/src/core/ext/filters/client_channel/subchannel.cc +4 -4
  35. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
  36. data/src/core/ext/filters/http/client/http_client_filter.cc +14 -30
  37. data/src/core/ext/filters/http/http_filters_plugin.cc +3 -5
  38. data/src/core/ext/filters/http/server/http_server_filter.cc +11 -28
  39. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +67 -0
  40. data/src/core/ext/filters/server_config_selector/server_config_selector.h +70 -0
  41. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +265 -0
  42. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +32 -0
  43. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +4 -20
  44. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +0 -2
  45. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +8 -5
  46. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +11 -14
  47. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +6 -3
  48. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +54 -79
  49. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +2 -3
  50. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +9 -13
  51. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +6 -6
  52. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +53 -62
  53. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -2
  54. data/src/core/ext/transport/chttp2/transport/context_list.cc +2 -3
  55. data/src/core/ext/transport/chttp2/transport/context_list.h +2 -3
  56. data/src/core/ext/transport/chttp2/transport/flow_control.cc +8 -8
  57. data/src/core/ext/transport/chttp2/transport/flow_control.h +2 -2
  58. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +83 -19
  59. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +33 -1
  60. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +66 -92
  61. data/src/core/ext/transport/chttp2/transport/internal.h +8 -4
  62. data/src/core/ext/transport/inproc/inproc_transport.cc +16 -7
  63. data/src/core/ext/transport/inproc/inproc_transport.h +1 -1
  64. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +197 -165
  65. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +2 -0
  66. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +41 -0
  67. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +18 -0
  68. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +26 -2
  69. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -0
  70. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +107 -82
  71. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +2 -0
  72. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +188 -160
  73. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +2 -0
  74. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +35 -22
  75. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +2 -0
  76. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +253 -218
  77. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +2 -0
  78. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +16 -5
  79. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +2 -0
  80. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +36 -25
  81. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +2 -0
  82. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +56 -39
  83. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +2 -0
  84. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +16 -5
  85. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +2 -0
  86. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +162 -128
  87. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +2 -0
  88. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +51 -36
  89. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +2 -0
  90. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +15 -4
  91. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +2 -0
  92. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +25 -13
  93. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +2 -0
  94. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +114 -90
  95. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +2 -0
  96. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +89 -71
  97. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +2 -0
  98. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +17 -6
  99. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +2 -0
  100. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +117 -93
  101. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +2 -0
  102. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +13 -2
  103. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +2 -0
  104. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +21 -9
  105. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +2 -0
  106. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +18 -7
  107. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +2 -0
  108. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +22 -11
  109. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +2 -0
  110. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +17 -6
  111. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +2 -0
  112. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +41 -27
  113. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +2 -0
  114. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +59 -43
  115. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +2 -0
  116. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +58 -43
  117. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +2 -0
  118. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +15 -4
  119. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +2 -0
  120. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +73 -57
  121. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +2 -0
  122. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +81 -64
  123. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +2 -0
  124. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +25 -14
  125. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +2 -0
  126. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +19 -7
  127. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +2 -0
  128. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +63 -45
  129. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +2 -0
  130. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +66 -47
  131. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +2 -0
  132. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +93 -75
  133. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +2 -0
  134. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +41 -28
  135. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +2 -0
  136. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +503 -440
  137. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2 -0
  138. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +26 -13
  139. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +2 -0
  140. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +21 -9
  141. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +2 -0
  142. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +13 -2
  143. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +2 -0
  144. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +35 -20
  145. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +2 -0
  146. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +44 -31
  147. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +2 -0
  148. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +22 -11
  149. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +2 -0
  150. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +210 -181
  151. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +2 -0
  152. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +7 -0
  153. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +5 -3
  154. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +64 -48
  155. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +2 -0
  156. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +33 -20
  157. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +2 -0
  158. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +81 -65
  159. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +2 -0
  160. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +12 -1
  161. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +2 -0
  162. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +12 -1
  163. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +2 -0
  164. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +75 -58
  165. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +2 -0
  166. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +12 -1
  167. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +2 -0
  168. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +12 -1
  169. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +2 -0
  170. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +25 -13
  171. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +2 -0
  172. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +12 -1
  173. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +2 -0
  174. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +12 -1
  175. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +2 -0
  176. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +61 -46
  177. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +2 -0
  178. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +26 -12
  179. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +2 -0
  180. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +22 -10
  181. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +2 -0
  182. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +17 -6
  183. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +2 -0
  184. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +16 -5
  185. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +2 -0
  186. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +15 -4
  187. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +2 -0
  188. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +27 -14
  189. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +2 -0
  190. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +25 -13
  191. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +2 -0
  192. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +20 -8
  193. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +2 -0
  194. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +30 -17
  195. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +2 -0
  196. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +38 -21
  197. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +2 -0
  198. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +41 -26
  199. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +2 -0
  200. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.c +7 -0
  201. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +2 -0
  202. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +17 -5
  203. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +2 -0
  204. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +22 -9
  205. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +2 -0
  206. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +15 -4
  207. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +2 -0
  208. data/src/core/ext/upb-generated/google/api/annotations.upb.c +20 -0
  209. data/src/core/ext/upb-generated/google/api/annotations.upb.h +7 -0
  210. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +116 -93
  211. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +2 -0
  212. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.c +102 -0
  213. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.h +306 -0
  214. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.c +56 -0
  215. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.h +135 -0
  216. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +122 -98
  217. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +2 -0
  218. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.c +115 -0
  219. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.h +371 -0
  220. data/src/core/ext/upb-generated/google/api/http.upb.c +35 -22
  221. data/src/core/ext/upb-generated/google/api/http.upb.h +2 -0
  222. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +14 -3
  223. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +2 -0
  224. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +247 -210
  225. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +2 -0
  226. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +14 -3
  227. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +2 -0
  228. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +12 -1
  229. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +2 -0
  230. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +37 -23
  231. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +2 -0
  232. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +14 -3
  233. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +2 -0
  234. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +37 -18
  235. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +2 -0
  236. data/src/core/ext/upb-generated/google/rpc/status.upb.c +17 -6
  237. data/src/core/ext/upb-generated/google/rpc/status.upb.h +2 -0
  238. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +26 -14
  239. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +2 -0
  240. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +105 -83
  241. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +2 -0
  242. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +20 -8
  243. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +2 -0
  244. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +16 -4
  245. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +2 -0
  246. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +65 -47
  247. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +34 -36
  248. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +26 -13
  249. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +2 -0
  250. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +67 -7
  251. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +27 -0
  252. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +27 -3
  253. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +7 -0
  254. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +19 -0
  255. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +7 -0
  256. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +27 -3
  257. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +7 -0
  258. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +26 -2
  259. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -0
  260. data/src/core/ext/upb-generated/validate/validate.upb.c +320 -251
  261. data/src/core/ext/upb-generated/validate/validate.upb.h +20 -0
  262. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +54 -9
  263. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +17 -0
  264. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +13 -2
  265. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +2 -0
  266. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +24 -12
  267. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +2 -0
  268. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +19 -7
  269. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +2 -0
  270. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +18 -7
  271. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +2 -0
  272. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +27 -15
  273. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +2 -0
  274. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +18 -7
  275. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +2 -0
  276. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +28 -15
  277. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +2 -0
  278. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +16 -5
  279. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +2 -0
  280. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +2 -49
  281. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +2 -2
  282. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +2 -7
  283. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +2 -35
  284. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +2 -41
  285. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +2 -11
  286. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +2 -55
  287. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +2 -7
  288. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +2 -7
  289. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +2 -19
  290. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +2 -7
  291. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +2 -53
  292. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +2 -15
  293. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +2 -7
  294. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +2 -9
  295. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +2 -33
  296. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +2 -21
  297. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +2 -7
  298. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +2 -33
  299. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +2 -7
  300. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c +2 -9
  301. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +2 -7
  302. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +2 -7
  303. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c +2 -7
  304. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +2 -13
  305. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +2 -17
  306. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +2 -15
  307. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +2 -7
  308. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +2 -17
  309. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +2 -19
  310. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +2 -7
  311. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +2 -9
  312. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +2 -21
  313. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +2 -23
  314. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +2 -11
  315. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +2 -111
  316. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +2 -11
  317. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +2 -9
  318. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +2 -7
  319. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +2 -15
  320. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +2 -11
  321. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +2 -7
  322. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +2 -43
  323. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +2 -2
  324. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +2 -17
  325. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +2 -11
  326. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +2 -17
  327. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +2 -7
  328. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +2 -7
  329. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +2 -19
  330. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +2 -7
  331. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +2 -7
  332. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +2 -9
  333. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +2 -7
  334. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +2 -7
  335. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +2 -15
  336. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c +2 -13
  337. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +2 -9
  338. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +2 -7
  339. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +2 -7
  340. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +2 -7
  341. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +2 -11
  342. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +2 -9
  343. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +2 -9
  344. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +2 -11
  345. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +2 -19
  346. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +2 -15
  347. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +2 -2
  348. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +2 -9
  349. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +2 -11
  350. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +2 -7
  351. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +2 -2
  352. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +2 -11
  353. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +2 -7
  354. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +2 -59
  355. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +2 -7
  356. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +2 -7
  357. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +2 -13
  358. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +2 -7
  359. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +2 -23
  360. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +2 -7
  361. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +2 -11
  362. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +2 -7
  363. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +2 -2
  364. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +2 -7
  365. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +2 -7
  366. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +2 -51
  367. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +2 -13
  368. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +2 -7
  369. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +2 -9
  370. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +2 -9
  371. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +2 -7
  372. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +2 -9
  373. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +2 -7
  374. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +2 -7
  375. data/src/core/ext/xds/certificate_provider_registry.cc +1 -1
  376. data/src/core/ext/xds/certificate_provider_store.h +1 -1
  377. data/src/core/ext/xds/xds_api.cc +409 -304
  378. data/src/core/ext/xds/xds_api.h +3 -1
  379. data/src/core/ext/xds/xds_bootstrap.cc +6 -3
  380. data/src/core/ext/xds/xds_certificate_provider.h +1 -2
  381. data/src/core/ext/xds/xds_channel_stack_modifier.cc +3 -4
  382. data/src/core/ext/xds/xds_client.cc +395 -291
  383. data/src/core/ext/xds/xds_client.h +47 -38
  384. data/src/core/ext/xds/xds_routing.cc +247 -0
  385. data/src/core/ext/xds/xds_routing.h +98 -0
  386. data/src/core/ext/xds/xds_server_config_fetcher.cc +975 -261
  387. data/src/core/lib/avl/avl.h +389 -88
  388. data/src/core/lib/backoff/backoff.cc +2 -2
  389. data/src/core/lib/channel/channel_args.cc +17 -17
  390. data/src/core/lib/channel/channel_args.h +11 -10
  391. data/src/core/lib/channel/channel_args_preconditioning.cc +47 -0
  392. data/src/core/lib/channel/channel_args_preconditioning.h +62 -0
  393. data/src/core/lib/channel/channel_stack_builder.cc +0 -2
  394. data/src/core/lib/channel/channel_trace.cc +6 -6
  395. data/src/core/lib/channel/channelz.cc +1 -1
  396. data/src/core/lib/compression/compression_args.cc +7 -5
  397. data/src/core/lib/compression/compression_args.h +6 -4
  398. data/src/core/lib/config/core_configuration.cc +3 -1
  399. data/src/core/lib/config/core_configuration.h +11 -0
  400. data/src/core/lib/debug/trace.h +2 -2
  401. data/src/core/lib/event_engine/{endpoint_config.cc → channel_args_endpoint_config.cc} +2 -1
  402. data/src/core/lib/event_engine/{endpoint_config_internal.h → channel_args_endpoint_config.h} +3 -3
  403. data/src/core/lib/event_engine/event_engine.cc +0 -13
  404. data/src/core/lib/event_engine/event_engine_factory.cc +49 -0
  405. data/src/core/lib/event_engine/event_engine_factory.h +33 -0
  406. data/src/core/lib/event_engine/memory_allocator.cc +70 -0
  407. data/src/core/lib/gpr/tls.h +6 -0
  408. data/src/core/lib/gprpp/cpp_impl_of.h +45 -0
  409. data/src/core/lib/gprpp/global_config_env.cc +7 -7
  410. data/src/core/lib/gprpp/global_config_env.h +2 -2
  411. data/src/core/lib/gprpp/manual_constructor.h +2 -3
  412. data/src/core/lib/gprpp/orphanable.h +1 -1
  413. data/src/core/lib/gprpp/ref_counted.h +1 -1
  414. data/src/core/lib/gprpp/ref_counted_ptr.h +2 -4
  415. data/src/core/lib/gprpp/status_helper.h +1 -1
  416. data/src/core/lib/gprpp/table.h +13 -1
  417. data/src/core/lib/http/httpcli.cc +30 -26
  418. data/src/core/lib/http/httpcli.h +14 -12
  419. data/src/core/lib/iomgr/buffer_list.cc +9 -9
  420. data/src/core/lib/iomgr/buffer_list.h +13 -13
  421. data/src/core/lib/iomgr/call_combiner.cc +2 -3
  422. data/src/core/lib/iomgr/endpoint.h +0 -1
  423. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -24
  424. data/src/core/lib/iomgr/endpoint_cfstream.h +4 -4
  425. data/src/core/lib/iomgr/endpoint_pair_posix.cc +9 -11
  426. data/src/core/lib/iomgr/endpoint_pair_windows.cc +5 -14
  427. data/src/core/lib/iomgr/event_engine/endpoint.cc +2 -3
  428. data/src/core/lib/iomgr/event_engine/iomgr.cc +5 -25
  429. data/src/core/lib/iomgr/event_engine/resolver.cc +3 -2
  430. data/src/core/lib/iomgr/event_engine/tcp.cc +7 -5
  431. data/src/core/lib/iomgr/event_engine/timer.cc +4 -3
  432. data/src/core/lib/iomgr/exec_ctx.h +11 -11
  433. data/src/core/lib/iomgr/executor.cc +12 -15
  434. data/src/core/lib/iomgr/executor.h +1 -1
  435. data/src/core/lib/iomgr/tcp_client.cc +2 -4
  436. data/src/core/lib/iomgr/tcp_client.h +1 -3
  437. data/src/core/lib/iomgr/tcp_client_cfstream.cc +1 -9
  438. data/src/core/lib/iomgr/tcp_client_custom.cc +4 -10
  439. data/src/core/lib/iomgr/tcp_client_posix.cc +7 -23
  440. data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
  441. data/src/core/lib/iomgr/tcp_client_windows.cc +1 -10
  442. data/src/core/lib/iomgr/tcp_custom.cc +9 -36
  443. data/src/core/lib/iomgr/tcp_custom.h +0 -1
  444. data/src/core/lib/iomgr/tcp_posix.cc +28 -33
  445. data/src/core/lib/iomgr/tcp_posix.h +1 -3
  446. data/src/core/lib/iomgr/tcp_server.cc +4 -6
  447. data/src/core/lib/iomgr/tcp_server.h +6 -8
  448. data/src/core/lib/iomgr/tcp_server_custom.cc +5 -15
  449. data/src/core/lib/iomgr/tcp_server_posix.cc +18 -22
  450. data/src/core/lib/iomgr/tcp_server_utils_posix.h +19 -18
  451. data/src/core/lib/iomgr/tcp_server_windows.cc +5 -12
  452. data/src/core/lib/iomgr/tcp_windows.cc +2 -7
  453. data/src/core/lib/iomgr/tcp_windows.h +1 -2
  454. data/src/core/lib/iomgr/unix_sockets_posix.cc +1 -1
  455. data/src/core/lib/iomgr/unix_sockets_posix.h +1 -1
  456. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +1 -1
  457. data/src/core/lib/iomgr/work_serializer.cc +115 -44
  458. data/src/core/lib/iomgr/work_serializer.h +16 -4
  459. data/src/core/lib/json/json_reader.cc +83 -35
  460. data/src/core/lib/json/json_util.cc +1 -1
  461. data/src/core/lib/promise/activity.cc +115 -0
  462. data/src/core/lib/promise/activity.h +499 -0
  463. data/src/core/lib/promise/context.h +86 -0
  464. data/src/core/lib/promise/detail/basic_seq.h +407 -0
  465. data/src/core/lib/promise/detail/promise_factory.h +189 -0
  466. data/src/core/lib/promise/detail/promise_like.h +85 -0
  467. data/src/core/lib/promise/detail/status.h +44 -0
  468. data/src/core/lib/promise/detail/switch.h +1455 -0
  469. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +48 -0
  470. data/src/core/lib/promise/loop.h +108 -0
  471. data/src/core/lib/promise/map.h +88 -0
  472. data/src/core/lib/promise/poll.h +60 -0
  473. data/src/core/lib/promise/race.h +84 -0
  474. data/src/core/lib/promise/seq.h +71 -0
  475. data/src/core/lib/resource_quota/api.cc +108 -0
  476. data/src/core/lib/resource_quota/api.h +41 -0
  477. data/src/core/lib/resource_quota/memory_quota.cc +454 -0
  478. data/src/core/lib/resource_quota/memory_quota.h +421 -0
  479. data/src/core/lib/resource_quota/resource_quota.cc +33 -0
  480. data/src/core/lib/resource_quota/resource_quota.h +58 -0
  481. data/src/core/lib/resource_quota/thread_quota.cc +43 -0
  482. data/src/core/lib/resource_quota/thread_quota.h +57 -0
  483. data/src/core/lib/resource_quota/trace.cc +19 -0
  484. data/src/core/lib/resource_quota/trace.h +24 -0
  485. data/src/core/lib/security/authorization/evaluate_args.cc +13 -19
  486. data/src/core/lib/security/authorization/evaluate_args.h +2 -1
  487. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +3 -1
  488. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +11 -12
  489. data/src/core/lib/security/credentials/external/external_account_credentials.cc +9 -10
  490. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +3 -4
  491. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +4 -6
  492. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -1
  493. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +4 -6
  494. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +18 -22
  495. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +11 -12
  496. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +7 -8
  497. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +201 -0
  498. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +106 -0
  499. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +11 -90
  500. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +19 -82
  501. data/src/core/lib/security/credentials/tls/tls_credentials.cc +21 -10
  502. data/src/core/lib/security/credentials/xds/xds_credentials.cc +28 -33
  503. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +3 -3
  504. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +2 -2
  505. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +3 -4
  506. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  507. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +7 -7
  508. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -2
  509. data/src/core/lib/security/security_connector/local/local_security_connector.cc +4 -1
  510. data/src/core/lib/security/security_connector/ssl_utils.cc +10 -2
  511. data/src/core/lib/security/security_connector/ssl_utils.h +1 -1
  512. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +344 -195
  513. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +64 -41
  514. data/src/core/lib/security/transport/security_handshaker.cc +2 -2
  515. data/src/core/lib/slice/percent_encoding.cc +30 -86
  516. data/src/core/lib/slice/percent_encoding.h +5 -11
  517. data/src/core/lib/slice/slice.cc +7 -7
  518. data/src/core/lib/slice/slice.h +341 -0
  519. data/src/core/lib/slice/slice_buffer.cc +4 -0
  520. data/src/core/lib/slice/slice_intern.cc +1 -1
  521. data/src/core/lib/slice/slice_refcount.h +5 -1
  522. data/src/core/lib/slice/slice_refcount_base.h +19 -11
  523. data/src/core/lib/slice/static_slice.cc +331 -483
  524. data/src/core/lib/slice/static_slice.h +101 -132
  525. data/src/core/lib/surface/builtins.cc +1 -1
  526. data/src/core/lib/surface/call.cc +85 -59
  527. data/src/core/lib/surface/channel.cc +4 -29
  528. data/src/core/lib/surface/channel.h +2 -12
  529. data/src/core/lib/surface/completion_queue.cc +2 -2
  530. data/src/core/lib/surface/init.cc +0 -1
  531. data/src/core/lib/surface/lame_client.cc +24 -17
  532. data/src/core/lib/surface/server.cc +22 -22
  533. data/src/core/lib/surface/server.h +8 -9
  534. data/src/core/lib/surface/validate_metadata.cc +2 -2
  535. data/src/core/lib/surface/version.cc +2 -2
  536. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  537. data/src/core/lib/transport/byte_stream.cc +4 -0
  538. data/src/core/lib/transport/metadata.h +4 -4
  539. data/src/core/lib/transport/metadata_batch.cc +5 -0
  540. data/src/core/lib/transport/metadata_batch.h +174 -99
  541. data/src/core/lib/transport/parsed_metadata.cc +35 -0
  542. data/src/core/lib/transport/parsed_metadata.h +180 -61
  543. data/src/core/lib/transport/pid_controller.cc +4 -4
  544. data/src/core/lib/transport/static_metadata.cc +529 -614
  545. data/src/core/lib/transport/static_metadata.h +0 -18
  546. data/src/core/lib/transport/transport.cc +4 -26
  547. data/src/core/lib/transport/transport.h +0 -1
  548. data/src/core/lib/transport/transport_op_string.cc +1 -1
  549. data/src/core/lib/uri/uri_parser.cc +19 -19
  550. data/src/core/lib/uri/uri_parser.h +2 -0
  551. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -2
  552. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  553. data/src/core/tsi/local_transport_security.cc +15 -15
  554. data/src/core/tsi/ssl_transport_security.cc +30 -1
  555. data/src/core/tsi/ssl_transport_security.h +1 -0
  556. data/src/ruby/ext/grpc/extconf.rb +1 -1
  557. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +6 -10
  558. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +9 -15
  559. data/src/ruby/lib/grpc/version.rb +1 -1
  560. data/third_party/abseil-cpp/absl/algorithm/container.h +101 -91
  561. data/third_party/abseil-cpp/absl/base/attributes.h +64 -31
  562. data/third_party/abseil-cpp/absl/base/config.h +67 -37
  563. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +1 -26
  564. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -1
  565. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +2 -0
  566. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +69 -0
  567. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +4 -4
  568. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +16 -0
  569. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +4 -4
  570. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  571. data/third_party/abseil-cpp/absl/container/fixed_array.h +0 -5
  572. data/third_party/abseil-cpp/absl/container/inlined_vector.h +105 -97
  573. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +17 -15
  574. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +18 -102
  575. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +37 -78
  576. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +388 -423
  577. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +3 -2
  578. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -8
  579. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +251 -120
  580. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +11 -1
  581. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +12 -11
  582. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +6 -2
  583. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +12 -5
  584. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +110 -0
  585. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +234 -0
  586. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +25 -7
  587. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +8 -2
  588. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +21 -3
  589. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +2 -0
  590. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +2 -0
  591. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +14 -0
  592. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +72 -0
  593. data/third_party/abseil-cpp/absl/functional/function_ref.h +4 -1
  594. data/third_party/abseil-cpp/absl/hash/hash.h +22 -0
  595. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +15 -16
  596. data/third_party/abseil-cpp/absl/hash/internal/hash.h +88 -37
  597. data/third_party/abseil-cpp/absl/hash/internal/{wyhash.cc → low_level_hash.cc} +23 -11
  598. data/third_party/abseil-cpp/absl/hash/internal/{wyhash.h → low_level_hash.h} +14 -12
  599. data/third_party/abseil-cpp/absl/memory/memory.h +1 -1
  600. data/third_party/abseil-cpp/absl/meta/type_traits.h +32 -2
  601. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -10
  602. data/third_party/abseil-cpp/absl/numeric/int128.h +146 -73
  603. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +19 -25
  604. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +73 -70
  605. data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.cc +4 -4
  606. data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.h +6 -6
  607. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +230 -0
  608. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +5 -5
  609. data/third_party/abseil-cpp/absl/status/status.cc +9 -17
  610. data/third_party/abseil-cpp/absl/status/status.h +19 -15
  611. data/third_party/abseil-cpp/absl/status/statusor.cc +34 -2
  612. data/third_party/abseil-cpp/absl/status/statusor.h +31 -21
  613. data/third_party/abseil-cpp/absl/strings/charconv.cc +3 -3
  614. data/third_party/abseil-cpp/absl/strings/charconv.h +3 -2
  615. data/third_party/abseil-cpp/absl/strings/cord.cc +453 -359
  616. data/third_party/abseil-cpp/absl/strings/cord.h +197 -70
  617. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +1 -1
  618. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +6 -0
  619. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +140 -63
  620. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +1128 -0
  621. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +939 -0
  622. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +185 -0
  623. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +265 -0
  624. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +68 -0
  625. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +211 -0
  626. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +129 -0
  627. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.h +50 -0
  628. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +7 -7
  629. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +55 -181
  630. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +42 -24
  631. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +4 -0
  632. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc +96 -0
  633. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +85 -0
  634. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +139 -0
  635. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +131 -0
  636. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +445 -0
  637. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +298 -0
  638. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +87 -0
  639. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_scope.h +71 -0
  640. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +121 -0
  641. data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +48 -2
  642. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +8 -0
  643. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +3 -4
  644. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +1 -1
  645. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +6 -6
  646. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +36 -18
  647. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +62 -73
  648. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +24 -16
  649. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +35 -35
  650. data/third_party/abseil-cpp/absl/strings/numbers.cc +1 -1
  651. data/third_party/abseil-cpp/absl/strings/numbers.h +34 -0
  652. data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
  653. data/third_party/abseil-cpp/absl/strings/str_format.h +1 -2
  654. data/third_party/abseil-cpp/absl/strings/string_view.cc +16 -21
  655. data/third_party/abseil-cpp/absl/strings/string_view.h +120 -39
  656. data/third_party/abseil-cpp/absl/strings/substitute.cc +2 -1
  657. data/third_party/abseil-cpp/absl/strings/substitute.h +99 -74
  658. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +25 -15
  659. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +5 -3
  660. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -1
  661. data/third_party/abseil-cpp/absl/synchronization/mutex.h +3 -3
  662. data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -3
  663. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +93 -20
  664. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +1 -1
  665. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +2 -1
  666. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +83 -21
  667. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +49 -0
  668. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +1 -1
  669. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -3
  670. data/third_party/abseil-cpp/absl/time/time.h +67 -36
  671. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +1 -1
  672. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +2 -2
  673. data/third_party/abseil-cpp/absl/types/span.h +3 -3
  674. data/third_party/boringssl-with-bazel/err_data.c +681 -677
  675. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +19 -11
  676. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +41 -30
  677. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +1 -1
  678. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +59 -47
  679. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +24 -28
  680. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +5 -0
  681. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +28 -0
  682. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +48 -272
  683. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +8 -6
  684. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +3 -1
  685. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +2 -2
  686. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +7 -7
  687. data/third_party/boringssl-with-bazel/src/crypto/mem.c +18 -0
  688. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +5 -1
  689. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +59 -23
  690. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +2 -18
  691. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +8 -2
  692. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +216 -11
  693. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -1
  694. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
  695. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c +1 -1
  696. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -1
  697. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c +1 -1
  698. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +1 -1
  699. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +1 -0
  700. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +0 -1
  701. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +21 -4
  702. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +971 -253
  703. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +3 -3
  704. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +0 -1
  705. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +4 -12
  706. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +17 -41
  707. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +12 -27
  708. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +8 -10
  709. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +29 -55
  710. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +3 -9
  711. data/third_party/boringssl-with-bazel/src/include/openssl/pool.h +7 -1
  712. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +24 -28
  713. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +6 -9
  714. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +12 -43
  715. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +4 -3
  716. data/third_party/boringssl-with-bazel/src/ssl/internal.h +3 -3
  717. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +4 -0
  718. data/third_party/upb/upb/decode.c +309 -178
  719. data/third_party/upb/upb/decode_fast.c +1 -1
  720. data/third_party/upb/upb/decode_internal.h +1 -0
  721. data/third_party/upb/upb/def.c +330 -85
  722. data/third_party/upb/upb/def.h +45 -14
  723. data/third_party/upb/upb/def.hpp +17 -4
  724. data/third_party/upb/upb/encode.c +100 -40
  725. data/third_party/upb/upb/msg.c +22 -9
  726. data/third_party/upb/upb/msg_internal.h +90 -8
  727. data/third_party/upb/upb/reflection.c +98 -58
  728. data/third_party/upb/upb/reflection.h +6 -2
  729. data/third_party/upb/upb/text_encode.c +3 -3
  730. data/third_party/upb/upb/upb.c +8 -0
  731. metadata +116 -56
  732. data/src/core/lib/avl/avl.cc +0 -306
  733. data/src/core/lib/gprpp/match.h +0 -73
  734. data/src/core/lib/gprpp/overload.h +0 -59
  735. data/src/core/lib/iomgr/event_engine/iomgr.h +0 -42
  736. data/src/core/lib/iomgr/resource_quota.cc +0 -1106
  737. data/src/core/lib/iomgr/resource_quota.h +0 -226
  738. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +0 -93
  739. 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
 
@@ -91,6 +89,7 @@
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"
@@ -345,104 +344,6 @@ std::string XdsApi::RdsUpdate::ToString() const {
345
344
  return absl::StrJoin(vhosts, "");
346
345
  }
347
346
 
348
- namespace {
349
-
350
- // Better match type has smaller value.
351
- enum MatchType {
352
- EXACT_MATCH,
353
- SUFFIX_MATCH,
354
- PREFIX_MATCH,
355
- UNIVERSE_MATCH,
356
- INVALID_MATCH,
357
- };
358
-
359
- // Returns true if match succeeds.
360
- bool DomainMatch(MatchType match_type, const std::string& domain_pattern_in,
361
- const std::string& expected_host_name_in) {
362
- // Normalize the args to lower-case. Domain matching is case-insensitive.
363
- std::string domain_pattern = domain_pattern_in;
364
- std::string expected_host_name = expected_host_name_in;
365
- std::transform(domain_pattern.begin(), domain_pattern.end(),
366
- domain_pattern.begin(),
367
- [](unsigned char c) { return std::tolower(c); });
368
- std::transform(expected_host_name.begin(), expected_host_name.end(),
369
- expected_host_name.begin(),
370
- [](unsigned char c) { return std::tolower(c); });
371
- if (match_type == EXACT_MATCH) {
372
- return domain_pattern == expected_host_name;
373
- } else if (match_type == SUFFIX_MATCH) {
374
- // Asterisk must match at least one char.
375
- if (expected_host_name.size() < domain_pattern.size()) return false;
376
- absl::string_view pattern_suffix(domain_pattern.c_str() + 1);
377
- absl::string_view host_suffix(expected_host_name.c_str() +
378
- expected_host_name.size() -
379
- pattern_suffix.size());
380
- return pattern_suffix == host_suffix;
381
- } else if (match_type == PREFIX_MATCH) {
382
- // Asterisk must match at least one char.
383
- if (expected_host_name.size() < domain_pattern.size()) return false;
384
- absl::string_view pattern_prefix(domain_pattern.c_str(),
385
- domain_pattern.size() - 1);
386
- absl::string_view host_prefix(expected_host_name.c_str(),
387
- pattern_prefix.size());
388
- return pattern_prefix == host_prefix;
389
- } else {
390
- return match_type == UNIVERSE_MATCH;
391
- }
392
- }
393
-
394
- MatchType DomainPatternMatchType(const std::string& domain_pattern) {
395
- if (domain_pattern.empty()) return INVALID_MATCH;
396
- if (domain_pattern.find('*') == std::string::npos) return EXACT_MATCH;
397
- if (domain_pattern == "*") return UNIVERSE_MATCH;
398
- if (domain_pattern[0] == '*') return SUFFIX_MATCH;
399
- if (domain_pattern[domain_pattern.size() - 1] == '*') return PREFIX_MATCH;
400
- return INVALID_MATCH;
401
- }
402
-
403
- } // namespace
404
-
405
- XdsApi::RdsUpdate::VirtualHost* XdsApi::RdsUpdate::FindVirtualHostForDomain(
406
- const std::string& domain) {
407
- // Find the best matched virtual host.
408
- // The search order for 4 groups of domain patterns:
409
- // 1. Exact match.
410
- // 2. Suffix match (e.g., "*ABC").
411
- // 3. Prefix match (e.g., "ABC*").
412
- // 4. Universe match (i.e., "*").
413
- // Within each group, longest match wins.
414
- // If the same best matched domain pattern appears in multiple virtual hosts,
415
- // the first matched virtual host wins.
416
- VirtualHost* target_vhost = nullptr;
417
- MatchType best_match_type = INVALID_MATCH;
418
- size_t longest_match = 0;
419
- // Check each domain pattern in each virtual host to determine the best
420
- // matched virtual host.
421
- for (VirtualHost& vhost : virtual_hosts) {
422
- for (const std::string& domain_pattern : vhost.domains) {
423
- // Check the match type first. Skip the pattern if it's not better than
424
- // current match.
425
- const MatchType match_type = DomainPatternMatchType(domain_pattern);
426
- // This should be caught by RouteConfigParse().
427
- GPR_ASSERT(match_type != INVALID_MATCH);
428
- if (match_type > best_match_type) continue;
429
- if (match_type == best_match_type &&
430
- domain_pattern.size() <= longest_match) {
431
- continue;
432
- }
433
- // Skip if match fails.
434
- if (!DomainMatch(match_type, domain_pattern, domain)) continue;
435
- // Choose this match.
436
- target_vhost = &vhost;
437
- best_match_type = match_type;
438
- longest_match = domain_pattern.size();
439
- if (best_match_type == EXACT_MATCH) break;
440
- }
441
- if (best_match_type == EXACT_MATCH) break;
442
- }
443
- return target_vhost;
444
- }
445
-
446
347
  //
447
348
  // XdsApi::CommonTlsContext::CertificateValidationContext
448
349
  //
@@ -821,23 +722,20 @@ std::string XdsApi::EdsUpdate::ToString() const {
821
722
  // XdsApi
822
723
  //
823
724
 
824
- const char* XdsApi::kLdsTypeUrl =
825
- "type.googleapis.com/envoy.config.listener.v3.Listener";
826
- const char* XdsApi::kRdsTypeUrl =
827
- "type.googleapis.com/envoy.config.route.v3.RouteConfiguration";
828
- const char* XdsApi::kCdsTypeUrl =
829
- "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";
830
730
  const char* XdsApi::kEdsTypeUrl =
831
- "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment";
731
+ "envoy.config.endpoint.v3.ClusterLoadAssignment";
832
732
 
833
733
  namespace {
834
734
 
835
- const char* kLdsV2TypeUrl = "type.googleapis.com/envoy.api.v2.Listener";
836
- const char* kRdsV2TypeUrl =
837
- "type.googleapis.com/envoy.api.v2.RouteConfiguration";
838
- const char* kCdsV2TypeUrl = "type.googleapis.com/envoy.api.v2.Cluster";
839
- const char* kEdsV2TypeUrl =
840
- "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";
841
739
 
842
740
  bool IsLdsInternal(absl::string_view type_url, bool* is_v2 = nullptr) {
843
741
  if (type_url == XdsApi::kLdsTypeUrl) return true;
@@ -860,13 +758,85 @@ bool IsEdsInternal(absl::string_view type_url, bool* /*is_v2*/ = nullptr) {
860
758
  return type_url == XdsApi::kEdsTypeUrl || type_url == kEdsV2TypeUrl;
861
759
  }
862
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
+
863
833
  absl::StatusOr<XdsApi::ResourceName> ParseResourceNameInternal(
864
834
  absl::string_view name,
865
835
  std::function<bool(absl::string_view, bool*)> is_expected_type) {
866
836
  // Old-style names use the empty string for authority.
867
- // ID is prefixed with "old:" to indicate that it's an old-style name.
837
+ // authority is prefixed with "old:" to indicate that it's an old-style name.
868
838
  if (!absl::StartsWith(name, "xdstp:")) {
869
- return XdsApi::ResourceName{"", absl::StrCat("old:", name)};
839
+ return XdsApi::ResourceName{"old:", std::string(name)};
870
840
  }
871
841
  // New style name. Parse URI.
872
842
  auto uri = URI::Parse(name);
@@ -882,9 +852,9 @@ absl::StatusOr<XdsApi::ResourceName> ParseResourceNameInternal(
882
852
  uri->query_parameter_map().begin(), uri->query_parameter_map().end());
883
853
  std::sort(query_parameters.begin(), query_parameters.end());
884
854
  return XdsApi::ResourceName{
885
- uri->authority(),
855
+ absl::StrCat("xdstp:", uri->authority()),
886
856
  absl::StrCat(
887
- "xdstp:", path_parts.second, (query_parameters.empty() ? "?" : ""),
857
+ path_parts.second, (query_parameters.empty() ? "?" : ""),
888
858
  absl::StrJoin(query_parameters, "&", absl::PairFormatter("=")))};
889
859
  }
890
860
 
@@ -971,9 +941,8 @@ absl::StatusOr<XdsApi::ResourceName> XdsApi::ParseResourceName(
971
941
  std::string XdsApi::ConstructFullResourceName(absl::string_view authority,
972
942
  absl::string_view resource_type,
973
943
  absl::string_view name) {
974
- if (absl::StartsWith(name, "xdstp:")) {
975
- return absl::StrCat("xdstp://", authority, "/", resource_type,
976
- absl::StripPrefix(name, "xdstp:"));
944
+ if (absl::ConsumePrefix(&authority, "xdstp:")) {
945
+ return absl::StrCat("xdstp://", authority, "/", resource_type, "/", name);
977
946
  } else {
978
947
  return std::string(absl::StripPrefix(name, "old:"));
979
948
  }
@@ -981,16 +950,6 @@ std::string XdsApi::ConstructFullResourceName(absl::string_view authority,
981
950
 
982
951
  namespace {
983
952
 
984
- struct EncodingContext {
985
- XdsClient* client; // Used only for logging. Unsafe for dereferencing.
986
- TraceFlag* tracer;
987
- upb_symtab* symtab;
988
- upb_arena* arena;
989
- bool use_v3;
990
- const CertificateProviderStore::PluginDefinitionMap*
991
- certificate_provider_definition_map;
992
- };
993
-
994
953
  // Works for both std::string and absl::string_view.
995
954
  template <typename T>
996
955
  inline upb_strview StdStringToUpbString(const T& str) {
@@ -1170,25 +1129,6 @@ grpc_slice SerializeDiscoveryRequest(
1170
1129
  return grpc_slice_from_copied_buffer(output, output_length);
1171
1130
  }
1172
1131
 
1173
- absl::string_view TypeUrlExternalToInternal(bool use_v3,
1174
- const std::string& type_url) {
1175
- if (!use_v3) {
1176
- if (type_url == XdsApi::kLdsTypeUrl) {
1177
- return kLdsV2TypeUrl;
1178
- }
1179
- if (type_url == XdsApi::kRdsTypeUrl) {
1180
- return kRdsV2TypeUrl;
1181
- }
1182
- if (type_url == XdsApi::kCdsTypeUrl) {
1183
- return kCdsV2TypeUrl;
1184
- }
1185
- if (type_url == XdsApi::kEdsTypeUrl) {
1186
- return kEdsV2TypeUrl;
1187
- }
1188
- }
1189
- return type_url;
1190
- }
1191
-
1192
1132
  } // namespace
1193
1133
 
1194
1134
  grpc_slice XdsApi::CreateAdsRequest(
@@ -1210,8 +1150,10 @@ grpc_slice XdsApi::CreateAdsRequest(
1210
1150
  // Set type_url.
1211
1151
  absl::string_view real_type_url =
1212
1152
  TypeUrlExternalToInternal(server.ShouldUseV3(), type_url);
1153
+ std::string real_type_url_str =
1154
+ absl::StrCat("type.googleapis.com/", real_type_url);
1213
1155
  envoy_service_discovery_v3_DiscoveryRequest_set_type_url(
1214
- request, StdStringToUpbString(real_type_url));
1156
+ request, StdStringToUpbString(real_type_url_str));
1215
1157
  // Set version_info.
1216
1158
  if (!version.empty()) {
1217
1159
  envoy_service_discovery_v3_DiscoveryRequest_set_version_info(
@@ -1263,7 +1205,7 @@ grpc_slice XdsApi::CreateAdsRequest(
1263
1205
  for (const auto& p : a.second) {
1264
1206
  absl::string_view resource_id = p;
1265
1207
  resource_name_storage.push_back(
1266
- ConstructFullResourceName(authority, type_url, resource_id));
1208
+ ConstructFullResourceName(authority, real_type_url, resource_id));
1267
1209
  envoy_service_discovery_v3_DiscoveryRequest_add_resource_names(
1268
1210
  request, StdStringToUpbString(resource_name_storage.back()),
1269
1211
  arena.ptr());
@@ -1909,7 +1851,6 @@ grpc_error_handle RouteConfigParse(
1909
1851
  const EncodingContext& context,
1910
1852
  const envoy_config_route_v3_RouteConfiguration* route_config,
1911
1853
  bool /*is_v2*/, XdsApi::RdsUpdate* rds_update) {
1912
- MaybeLogRouteConfiguration(context, route_config);
1913
1854
  // Get the virtual hosts.
1914
1855
  size_t num_virtual_hosts;
1915
1856
  const envoy_config_route_v3_VirtualHost* const* virtual_hosts =
@@ -1924,8 +1865,7 @@ grpc_error_handle RouteConfigParse(
1924
1865
  virtual_hosts[i], &domain_size);
1925
1866
  for (size_t j = 0; j < domain_size; ++j) {
1926
1867
  std::string domain_pattern = UpbStringToStdString(domains[j]);
1927
- const MatchType match_type = DomainPatternMatchType(domain_pattern);
1928
- if (match_type == INVALID_MATCH) {
1868
+ if (!XdsRouting::IsValidDomainPattern(domain_pattern)) {
1929
1869
  return GRPC_ERROR_CREATE_FROM_CPP_STRING(
1930
1870
  absl::StrCat("Invalid domain pattern \"", domain_pattern, "\"."));
1931
1871
  }
@@ -3480,124 +3420,239 @@ grpc_error_handle EdsResourceParse(
3480
3420
  return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing EDS resource", &errors);
3481
3421
  }
3482
3422
 
3483
- template <typename ProtoParseFunction, typename ProtoResourceNameFunction,
3484
- typename ResourceTypeSelectorFunction, typename ProtoLogFunction,
3485
- typename ResourceParseFunction, typename UpdateMap>
3486
- grpc_error_handle AdsResponseParse(
3487
- const EncodingContext& context, ProtoParseFunction proto_parse_function,
3488
- ProtoResourceNameFunction proto_resource_name_function,
3489
- ResourceTypeSelectorFunction resource_type_selector_function,
3490
- ProtoLogFunction proto_log_function,
3491
- ResourceParseFunction resource_parse_function,
3492
- const char* resource_type_string,
3493
- const envoy_service_discovery_v3_DiscoveryResponse* response,
3494
- const std::map<absl::string_view /*authority*/,
3495
- std::set<absl::string_view /*name*/>>&
3496
- subscribed_resource_names,
3497
- UpdateMap* update_map,
3498
- std::set<XdsApi::ResourceName>* resource_names_failed) {
3499
- std::vector<grpc_error_handle> errors;
3500
- // Get the resources from the response.
3501
- size_t size;
3502
- const google_protobuf_Any* const* resources =
3503
- envoy_service_discovery_v3_DiscoveryResponse_resources(response, &size);
3504
- for (size_t i = 0; i < size; ++i) {
3505
- // Check the type_url of the resource.
3506
- absl::string_view type_url =
3507
- UpbStringToAbsl(google_protobuf_Any_type_url(resources[i]));
3508
- bool is_v2 = false;
3509
- if (!resource_type_selector_function(type_url, &is_v2)) {
3510
- errors.push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING(
3511
- absl::StrCat("resource index ", i, ": Resource is not ",
3512
- resource_type_string, ".")));
3513
- continue;
3514
- }
3515
- // Parse the resource.
3516
- upb_strview serialized_resource = google_protobuf_Any_value(resources[i]);
3517
- auto* resource = proto_parse_function(
3518
- serialized_resource.data, serialized_resource.size, context.arena);
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);
3519
3438
  if (resource == nullptr) {
3520
- errors.push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING(
3521
- absl::StrCat("resource index ", i, ": Can't parse ",
3522
- resource_type_string, " resource.")));
3523
- continue;
3439
+ return absl::InvalidArgumentError("Can't parse Listener resource.");
3524
3440
  }
3525
- proto_log_function(context, resource);
3526
- // Check the resource name. Ignore unexpected names.
3527
- std::string resource_name =
3528
- UpbStringToStdString(proto_resource_name_function(resource));
3529
- auto resource_name_status = ParseResourceNameInternal(
3530
- resource_name, resource_type_selector_function);
3531
- if (!resource_name_status.ok()) {
3532
- errors.push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
3533
- "Cannot parse xDS resource name \"", resource_name, "\"")));
3534
- continue;
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);
3535
3455
  }
3536
- auto iter = subscribed_resource_names.find(resource_name_status->authority);
3537
- if (iter == subscribed_resource_names.end() ||
3538
- iter->second.find(resource_name_status->id) == iter->second.end()) {
3539
- continue;
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);
3475
+ if (resource == nullptr) {
3476
+ return absl::InvalidArgumentError("Can't parse Listener resource.");
3540
3477
  }
3541
- // Fail on duplicate resources.
3542
- if (update_map->find(*resource_name_status) != update_map->end()) {
3543
- errors.push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING(
3544
- absl::StrCat("duplicate resource name \"", resource_name, "\"")));
3545
- resource_names_failed->insert(*resource_name_status);
3546
- 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);
3547
3492
  }
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.");
3514
+ }
3515
+ MaybeLogCluster(context, resource);
3548
3516
  // Validate resource.
3549
- 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>();
3550
3521
  grpc_error_handle error =
3551
- resource_parse_function(context, resource, is_v2, &update);
3522
+ CdsResourceParse(context, resource, is_v2, &cluster_data->resource);
3552
3523
  if (error != GRPC_ERROR_NONE) {
3553
- errors.push_back(
3554
- grpc_error_add_child(GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
3555
- resource_name, ": validation error")),
3556
- error));
3557
- resource_names_failed->insert(*resource_name_status);
3524
+ result.resource =
3525
+ absl::InvalidArgumentError(grpc_error_std_string(error));
3526
+ GRPC_ERROR_UNREF(error);
3558
3527
  } else {
3559
- // Store result in update map, in both validated and serialized form.
3560
- auto& resource_data = (*update_map)[*resource_name_status];
3561
- resource_data.resource = std::move(update);
3562
- resource_data.serialized_proto =
3563
- UpbStringToStdString(serialized_resource);
3528
+ result.resource = std::move(cluster_data);
3564
3529
  }
3530
+ return std::move(result);
3565
3531
  }
3566
- return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing ADS response", &errors);
3567
- }
3532
+ };
3568
3533
 
3569
- std::string TypeUrlInternalToExternal(absl::string_view type_url) {
3570
- if (type_url == kLdsV2TypeUrl) {
3571
- return XdsApi::kLdsTypeUrl;
3572
- } else if (type_url == kRdsV2TypeUrl) {
3573
- return XdsApi::kRdsTypeUrl;
3574
- } else if (type_url == kCdsV2TypeUrl) {
3575
- return XdsApi::kCdsTypeUrl;
3576
- } else if (type_url == kEdsV2TypeUrl) {
3577
- return XdsApi::kEdsTypeUrl;
3578
- }
3579
- return std::string(type_url);
3580
- }
3534
+ class EndpointResourceType : public XdsResourceType {
3535
+ public:
3536
+ struct EndpointData : public ResourceData {
3537
+ XdsApi::EdsUpdate resource;
3538
+ };
3581
3539
 
3582
- upb_strview LdsResourceName(
3583
- const envoy_config_listener_v3_Listener* lds_resource) {
3584
- return envoy_config_listener_v3_Listener_name(lds_resource);
3585
- }
3540
+ absl::string_view type_url() const override { return XdsApi::kEdsTypeUrl; }
3541
+ absl::string_view v2_type_url() const override { return kEdsV2TypeUrl; }
3586
3542
 
3587
- upb_strview RdsResourceName(
3588
- const envoy_config_route_v3_RouteConfiguration* rds_resource) {
3589
- return envoy_config_route_v3_RouteConfiguration_name(rds_resource);
3590
- }
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
+ };
3591
3570
 
3592
- upb_strview CdsResourceName(
3593
- const envoy_config_cluster_v3_Cluster* cds_resource) {
3594
- 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;
3595
3636
  }
3596
3637
 
3597
- upb_strview EdsResourceName(
3598
- const envoy_config_endpoint_v3_ClusterLoadAssignment* eds_resource) {
3599
- return envoy_config_endpoint_v3_ClusterLoadAssignment_cluster_name(
3600
- 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;
3601
3656
  }
3602
3657
 
3603
3658
  } // namespace
@@ -3637,41 +3692,88 @@ XdsApi::AdsParseResult XdsApi::ParseAdsResponse(
3637
3692
  }
3638
3693
  MaybeLogDiscoveryResponse(context, response);
3639
3694
  // Record the type_url, the version_info, and the nonce of the response.
3640
- result.type_url = TypeUrlInternalToExternal(UpbStringToAbsl(
3641
- 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/"));
3642
3699
  result.version = UpbStringToStdString(
3643
3700
  envoy_service_discovery_v3_DiscoveryResponse_version_info(response));
3644
3701
  result.nonce = UpbStringToStdString(
3645
3702
  envoy_service_discovery_v3_DiscoveryResponse_nonce(response));
3646
- // Parse the response according to the resource type.
3647
- // TODO(roth): When we have time, consider defining an interface for the
3648
- // methods of each resource type, so that we don't have to pass
3649
- // individual functions into each call to AdsResponseParse().
3650
- if (IsLds(result.type_url)) {
3651
- result.parse_error = AdsResponseParse(
3652
- context, envoy_config_listener_v3_Listener_parse, LdsResourceName,
3653
- IsLdsInternal, MaybeLogListener, LdsResourceParse, "LDS", response,
3654
- subscribed_listener_names, &result.lds_update_map,
3655
- &result.resource_names_failed);
3656
- } else if (IsRds(result.type_url)) {
3657
- result.parse_error = AdsResponseParse(
3658
- context, envoy_config_route_v3_RouteConfiguration_parse,
3659
- RdsResourceName, IsRdsInternal, MaybeLogRouteConfiguration,
3660
- RouteConfigParse, "RDS", response, subscribed_route_config_names,
3661
- &result.rds_update_map, &result.resource_names_failed);
3662
- } else if (IsCds(result.type_url)) {
3663
- result.parse_error = AdsResponseParse(
3664
- context, envoy_config_cluster_v3_Cluster_parse, CdsResourceName,
3665
- IsCdsInternal, MaybeLogCluster, CdsResourceParse, "CDS", response,
3666
- subscribed_cluster_names, &result.cds_update_map,
3667
- &result.resource_names_failed);
3668
- } else if (IsEds(result.type_url)) {
3669
- result.parse_error = AdsResponseParse(
3670
- context, envoy_config_endpoint_v3_ClusterLoadAssignment_parse,
3671
- EdsResourceName, IsEdsInternal, MaybeLogClusterLoadAssignment,
3672
- EdsResourceParse, "EDS", response, subscribed_eds_service_names,
3673
- &result.eds_update_map, &result.resource_names_failed);
3674
- }
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);
3675
3777
  return result;
3676
3778
  }
3677
3779
 
@@ -3910,9 +4012,12 @@ std::string XdsApi::AssembleClientConfig(
3910
4012
  PopulateNode(context, node_, build_version_, user_agent_name_,
3911
4013
  user_agent_version_, node);
3912
4014
  // Dump each resource.
4015
+ std::vector<std::string> type_url_storage;
3913
4016
  for (const auto& p : resource_type_metadata_map) {
3914
4017
  absl::string_view type_url = p.first;
3915
4018
  const ResourceMetadataMap& resource_metadata_map = p.second;
4019
+ type_url_storage.emplace_back(
4020
+ absl::StrCat("type.googleapis.com/", type_url));
3916
4021
  for (const auto& q : resource_metadata_map) {
3917
4022
  absl::string_view resource_name = q.first;
3918
4023
  const ResourceMetadata& metadata = *q.second;
@@ -3920,7 +4025,7 @@ std::string XdsApi::AssembleClientConfig(
3920
4025
  envoy_service_status_v3_ClientConfig_add_generic_xds_configs(
3921
4026
  client_config, context.arena);
3922
4027
  envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_type_url(
3923
- entry, StdStringToUpbString(type_url));
4028
+ entry, StdStringToUpbString(type_url_storage.back()));
3924
4029
  envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_name(
3925
4030
  entry, StdStringToUpbString(resource_name));
3926
4031
  envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_client_status(
@@ -3933,8 +4038,8 @@ std::string XdsApi::AssembleClientConfig(
3933
4038
  auto* any_field =
3934
4039
  envoy_service_status_v3_ClientConfig_GenericXdsConfig_mutable_xds_config(
3935
4040
  entry, context.arena);
3936
- google_protobuf_Any_set_type_url(any_field,
3937
- StdStringToUpbString(type_url));
4041
+ google_protobuf_Any_set_type_url(
4042
+ any_field, StdStringToUpbString(type_url_storage.back()));
3938
4043
  google_protobuf_Any_set_value(
3939
4044
  any_field, StdStringToUpbString(metadata.serialized_proto));
3940
4045
  }