grpc 1.42.0 → 1.51.0

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 (2080) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +705 -451
  3. data/include/grpc/compression.h +1 -1
  4. data/include/grpc/event_engine/endpoint_config.h +11 -5
  5. data/include/grpc/event_engine/event_engine.h +122 -44
  6. data/include/grpc/event_engine/internal/memory_allocator_impl.h +1 -31
  7. data/include/grpc/event_engine/memory_allocator.h +27 -26
  8. data/include/grpc/event_engine/memory_request.h +57 -0
  9. data/include/grpc/event_engine/port.h +1 -1
  10. data/include/grpc/event_engine/slice.h +286 -0
  11. data/include/grpc/event_engine/slice_buffer.h +135 -0
  12. data/include/grpc/grpc.h +43 -27
  13. data/include/grpc/grpc_posix.h +20 -19
  14. data/include/grpc/grpc_security.h +323 -195
  15. data/include/grpc/grpc_security_constants.h +1 -14
  16. data/include/grpc/impl/codegen/atm_gcc_atomic.h +19 -28
  17. data/include/grpc/impl/codegen/atm_gcc_sync.h +0 -2
  18. data/include/grpc/impl/codegen/atm_windows.h +0 -2
  19. data/include/grpc/impl/codegen/compression_types.h +2 -3
  20. data/include/grpc/impl/codegen/connectivity_state.h +2 -1
  21. data/include/grpc/impl/codegen/gpr_types.h +2 -1
  22. data/include/grpc/impl/codegen/grpc_types.h +31 -30
  23. data/include/grpc/impl/codegen/port_platform.h +107 -47
  24. data/include/grpc/impl/codegen/slice.h +5 -2
  25. data/include/grpc/slice.h +0 -11
  26. data/src/core/ext/filters/census/grpc_context.cc +3 -0
  27. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +315 -0
  28. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +142 -0
  29. data/src/core/ext/filters/channel_idle/idle_filter_state.cc +96 -0
  30. data/src/core/ext/filters/channel_idle/idle_filter_state.h +68 -0
  31. data/src/core/ext/filters/client_channel/backend_metric.cc +20 -16
  32. data/src/core/ext/filters/client_channel/backend_metric.h +19 -8
  33. data/src/core/ext/filters/client_channel/backup_poller.cc +23 -19
  34. data/src/core/ext/filters/client_channel/backup_poller.h +2 -4
  35. data/src/core/ext/filters/client_channel/channel_connectivity.cc +54 -30
  36. data/src/core/ext/filters/client_channel/client_channel.cc +684 -615
  37. data/src/core/ext/filters/client_channel/client_channel.h +103 -58
  38. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +2 -6
  39. data/src/core/ext/filters/client_channel/client_channel_channelz.h +12 -2
  40. data/src/core/ext/filters/client_channel/client_channel_factory.cc +2 -26
  41. data/src/core/ext/filters/client_channel/client_channel_factory.h +8 -8
  42. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +9 -41
  43. data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
  44. data/src/core/ext/filters/client_channel/client_channel_service_config.h +111 -0
  45. data/src/core/ext/filters/client_channel/config_selector.cc +1 -0
  46. data/src/core/ext/filters/client_channel/config_selector.h +21 -11
  47. data/src/core/ext/filters/client_channel/connector.h +13 -8
  48. data/src/core/ext/filters/client_channel/dynamic_filters.cc +36 -51
  49. data/src/core/ext/filters/client_channel/dynamic_filters.h +19 -10
  50. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +4 -22
  51. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +6 -15
  52. data/src/core/ext/filters/client_channel/health/health_check_client.cc +139 -583
  53. data/src/core/ext/filters/client_channel/health/health_check_client.h +26 -160
  54. data/src/core/ext/filters/client_channel/http_proxy.cc +96 -130
  55. data/src/core/ext/filters/client_channel/http_proxy.h +25 -1
  56. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +12 -8
  57. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +7 -5
  58. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +49 -0
  59. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +36 -15
  60. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +15 -9
  61. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +21 -19
  62. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +1 -0
  63. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +380 -313
  64. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +0 -7
  65. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +15 -3
  66. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +6 -2
  67. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +2 -5
  68. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +8 -2
  69. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +26 -16
  70. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +10 -8
  71. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +415 -0
  72. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +57 -0
  73. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +1152 -0
  74. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +94 -0
  75. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +228 -207
  76. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +491 -452
  77. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +523 -391
  78. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +16 -6
  79. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +636 -626
  80. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +280 -254
  81. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +147 -134
  82. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +275 -223
  83. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +266 -249
  84. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
  85. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.h +64 -0
  86. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +288 -277
  87. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +213 -182
  88. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +589 -737
  89. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +364 -0
  90. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +4 -0
  91. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +1 -0
  92. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +43 -33
  93. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +676 -334
  94. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +30 -13
  95. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +29 -24
  96. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +51 -71
  97. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +358 -357
  98. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +55 -40
  99. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +3 -2
  100. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +2 -0
  101. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +2 -1
  102. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +124 -255
  103. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +37 -49
  104. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +18 -3
  105. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +190 -102
  106. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +258 -0
  107. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +123 -0
  108. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +56 -61
  109. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +648 -503
  110. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +3 -1
  111. data/src/core/ext/filters/client_channel/retry_filter.cc +382 -294
  112. data/src/core/ext/filters/client_channel/retry_filter.h +1 -0
  113. data/src/core/ext/filters/client_channel/retry_service_config.cc +198 -232
  114. data/src/core/ext/filters/client_channel/retry_service_config.h +41 -32
  115. data/src/core/ext/filters/client_channel/retry_throttle.cc +18 -39
  116. data/src/core/ext/filters/client_channel/retry_throttle.h +26 -13
  117. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +37 -19
  118. data/src/core/ext/filters/client_channel/subchannel.cc +272 -319
  119. data/src/core/ext/filters/client_channel/subchannel.h +100 -47
  120. data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +38 -0
  121. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +17 -77
  122. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +20 -26
  123. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +470 -0
  124. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +222 -0
  125. data/src/core/ext/filters/deadline/deadline_filter.cc +48 -39
  126. data/src/core/ext/filters/deadline/deadline_filter.h +11 -4
  127. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +179 -403
  128. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +38 -6
  129. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
  130. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h +112 -0
  131. data/src/core/ext/filters/http/client/http_client_filter.cc +106 -551
  132. data/src/core/ext/filters/http/client/http_client_filter.h +35 -5
  133. data/src/core/ext/filters/http/client_authority_filter.cc +43 -112
  134. data/src/core/ext/filters/http/client_authority_filter.h +28 -6
  135. data/src/core/ext/filters/http/http_filters_plugin.cc +35 -28
  136. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +112 -333
  137. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +1 -2
  138. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +85 -161
  139. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +1 -0
  140. data/src/core/ext/filters/http/server/http_server_filter.cc +100 -476
  141. data/src/core/ext/filters/http/server/http_server_filter.h +37 -3
  142. data/src/core/ext/filters/message_size/message_size_filter.cc +130 -159
  143. data/src/core/ext/filters/message_size/message_size_filter.h +41 -17
  144. data/src/core/ext/filters/rbac/rbac_filter.cc +174 -0
  145. data/src/core/ext/filters/rbac/rbac_filter.h +84 -0
  146. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +819 -0
  147. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +86 -0
  148. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +62 -0
  149. data/src/core/ext/filters/server_config_selector/server_config_selector.h +85 -0
  150. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +160 -0
  151. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +33 -0
  152. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +268 -110
  153. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +9 -9
  154. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +387 -216
  155. data/src/core/ext/transport/chttp2/server/chttp2_server.h +5 -5
  156. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +7 -7
  157. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +2 -1
  158. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +2 -1
  159. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +1 -1
  160. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +791 -1179
  161. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +16 -5
  162. data/src/core/ext/transport/chttp2/transport/context_list.cc +6 -3
  163. data/src/core/ext/transport/chttp2/transport/context_list.h +6 -4
  164. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +287 -0
  165. data/src/core/ext/transport/chttp2/transport/decode_huff.h +1018 -0
  166. data/src/core/ext/transport/chttp2/transport/flow_control.cc +297 -285
  167. data/src/core/ext/transport/chttp2/transport/flow_control.h +191 -293
  168. data/src/core/ext/transport/chttp2/transport/frame.h +0 -4
  169. data/src/core/ext/transport/chttp2/transport/frame_data.cc +66 -218
  170. data/src/core/ext/transport/chttp2/transport/frame_data.h +13 -36
  171. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +16 -13
  172. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -1
  173. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +12 -7
  174. data/src/core/ext/transport/chttp2/transport/frame_ping.h +3 -0
  175. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +21 -9
  176. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +3 -0
  177. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +27 -59
  178. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -0
  179. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +15 -16
  180. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +3 -0
  181. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +7 -1
  182. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +381 -260
  183. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +106 -147
  184. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +5 -2
  185. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +12 -1
  186. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +157 -229
  187. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +8 -2
  188. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +143 -42
  189. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +50 -50
  190. data/src/core/ext/transport/chttp2/transport/http2_settings.h +0 -1
  191. data/src/core/ext/transport/chttp2/transport/internal.h +74 -163
  192. data/src/core/ext/transport/chttp2/transport/parsing.cc +170 -91
  193. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +11 -11
  194. data/src/core/ext/transport/chttp2/transport/stream_map.cc +1 -1
  195. data/src/core/ext/transport/chttp2/transport/stream_map.h +1 -0
  196. data/src/core/ext/transport/chttp2/transport/varint.cc +2 -3
  197. data/src/core/ext/transport/chttp2/transport/varint.h +13 -8
  198. data/src/core/ext/transport/chttp2/transport/writing.cc +150 -183
  199. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -5
  200. data/src/core/ext/transport/inproc/inproc_transport.cc +237 -323
  201. data/src/core/ext/transport/inproc/inproc_transport.h +4 -5
  202. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.c +117 -0
  203. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.h +502 -0
  204. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c +121 -0
  205. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.h +569 -0
  206. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +60 -341
  207. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +280 -1355
  208. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.c +352 -0
  209. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.h +1768 -0
  210. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.c +56 -0
  211. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.h +159 -0
  212. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.c +64 -0
  213. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.h +189 -0
  214. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.c +46 -0
  215. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.h +128 -0
  216. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.c +43 -0
  217. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.h +106 -0
  218. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.c +43 -0
  219. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.h +101 -0
  220. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.c +106 -0
  221. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.h +613 -0
  222. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.c +48 -0
  223. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.h +107 -0
  224. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +43 -0
  225. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +51 -0
  226. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +30 -4
  227. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +54 -17
  228. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +143 -116
  229. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +730 -385
  230. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +241 -199
  231. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +1360 -663
  232. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +49 -28
  233. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +213 -90
  234. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +321 -271
  235. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +1776 -826
  236. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +20 -7
  237. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +47 -23
  238. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +60 -27
  239. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +277 -98
  240. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.c +299 -0
  241. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.h +1437 -0
  242. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +74 -53
  243. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +383 -189
  244. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +21 -7
  245. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +50 -24
  246. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +215 -176
  247. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +1179 -583
  248. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +105 -45
  249. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +554 -166
  250. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +19 -6
  251. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +43 -23
  252. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +16 -22
  253. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +46 -100
  254. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.c +58 -0
  255. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.h +159 -0
  256. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +145 -117
  257. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +821 -409
  258. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +141 -92
  259. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +773 -348
  260. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +21 -8
  261. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +62 -30
  262. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +204 -125
  263. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +1068 -398
  264. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +17 -4
  265. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +33 -16
  266. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +27 -13
  267. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +92 -48
  268. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +22 -9
  269. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +80 -33
  270. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +26 -13
  271. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +98 -48
  272. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +21 -8
  273. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +51 -25
  274. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +51 -35
  275. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +207 -108
  276. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +74 -55
  277. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +374 -189
  278. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +70 -53
  279. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +378 -187
  280. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +19 -6
  281. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +39 -20
  282. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +122 -71
  283. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +660 -259
  284. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +104 -79
  285. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +589 -300
  286. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +31 -16
  287. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +109 -48
  288. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +27 -10
  289. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +98 -39
  290. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +53 -0
  291. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +140 -0
  292. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +82 -61
  293. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +446 -234
  294. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +86 -65
  295. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +443 -236
  296. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +139 -103
  297. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +649 -293
  298. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +45 -41
  299. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +255 -165
  300. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +706 -570
  301. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +4125 -1898
  302. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +38 -19
  303. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +161 -71
  304. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.c +241 -0
  305. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.h +1191 -0
  306. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c +44 -0
  307. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.h +92 -0
  308. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.c +49 -0
  309. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.h +107 -0
  310. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +27 -13
  311. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +86 -45
  312. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.c +52 -0
  313. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.h +138 -0
  314. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.c +63 -0
  315. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.h +254 -0
  316. data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.c +46 -0
  317. data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.h +98 -0
  318. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.c +47 -0
  319. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.h +98 -0
  320. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.c +69 -0
  321. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.h +221 -0
  322. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.c +33 -0
  323. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.h +43 -0
  324. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.c +71 -0
  325. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.h +226 -0
  326. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c +54 -0
  327. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.h +150 -0
  328. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +17 -4
  329. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +39 -23
  330. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +45 -28
  331. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +208 -111
  332. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +51 -36
  333. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +273 -131
  334. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +71 -0
  335. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +237 -0
  336. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +26 -13
  337. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +91 -42
  338. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +292 -224
  339. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +1679 -733
  340. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +52 -0
  341. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +168 -0
  342. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +46 -0
  343. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +98 -0
  344. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +9 -0
  345. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +6 -3
  346. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +107 -60
  347. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +607 -234
  348. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +41 -26
  349. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +169 -86
  350. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +126 -83
  351. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +651 -262
  352. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.c +62 -0
  353. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.h +168 -0
  354. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +15 -2
  355. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +26 -14
  356. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +206 -72
  357. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +1095 -255
  358. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +31 -17
  359. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +116 -61
  360. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +74 -57
  361. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +368 -185
  362. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.c +48 -0
  363. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.h +116 -0
  364. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +34 -18
  365. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +140 -80
  366. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +74 -0
  367. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +230 -0
  368. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +28 -14
  369. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +108 -56
  370. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +21 -8
  371. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +55 -30
  372. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +20 -7
  373. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +53 -26
  374. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +19 -6
  375. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +43 -23
  376. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +35 -20
  377. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +130 -68
  378. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +31 -17
  379. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +132 -64
  380. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +26 -12
  381. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +94 -52
  382. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +37 -22
  383. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +163 -82
  384. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +50 -31
  385. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +258 -144
  386. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +53 -36
  387. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +256 -130
  388. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.c +66 -0
  389. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.h +213 -0
  390. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.c +9 -0
  391. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +3 -0
  392. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.c +42 -0
  393. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.h +143 -0
  394. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +23 -9
  395. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +71 -35
  396. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +30 -15
  397. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +111 -51
  398. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.c +63 -0
  399. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.h +202 -0
  400. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_unit.upb.c +26 -0
  401. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_unit.upb.h +41 -0
  402. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +19 -6
  403. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +45 -18
  404. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.c +51 -0
  405. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.h +131 -0
  406. data/src/core/ext/upb-generated/google/api/annotations.upb.c +22 -0
  407. data/src/core/ext/upb-generated/google/api/annotations.upb.h +23 -0
  408. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +154 -125
  409. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +765 -381
  410. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +158 -126
  411. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +844 -401
  412. data/src/core/ext/upb-generated/google/api/http.upb.c +43 -28
  413. data/src/core/ext/upb-generated/google/api/http.upb.h +229 -114
  414. data/src/core/ext/upb-generated/google/api/httpbody.upb.c +46 -0
  415. data/src/core/ext/upb-generated/google/api/httpbody.upb.h +115 -0
  416. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +18 -5
  417. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +43 -21
  418. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +374 -282
  419. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +2199 -1029
  420. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +18 -5
  421. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +41 -19
  422. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +15 -2
  423. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +26 -14
  424. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +47 -31
  425. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +190 -92
  426. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +18 -5
  427. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +41 -19
  428. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +57 -36
  429. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +277 -148
  430. data/src/core/ext/upb-generated/google/rpc/status.upb.c +21 -8
  431. data/src/core/ext/upb-generated/google/rpc/status.upb.h +57 -29
  432. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c +84 -0
  433. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.h +335 -0
  434. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +32 -18
  435. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +108 -47
  436. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +135 -107
  437. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +726 -358
  438. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +27 -12
  439. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +85 -40
  440. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +22 -8
  441. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +65 -34
  442. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +81 -61
  443. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +435 -237
  444. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +34 -19
  445. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +124 -62
  446. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c +175 -0
  447. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h +792 -0
  448. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +75 -13
  449. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +206 -56
  450. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +31 -5
  451. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +59 -17
  452. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +21 -0
  453. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +16 -0
  454. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +31 -5
  455. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +61 -19
  456. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +30 -4
  457. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +54 -17
  458. data/src/core/ext/upb-generated/validate/validate.upb.c +406 -310
  459. data/src/core/ext/upb-generated/validate/validate.upb.h +2822 -1164
  460. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.c +110 -0
  461. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.h +290 -0
  462. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.c +55 -0
  463. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.h +112 -0
  464. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.c +38 -0
  465. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.h +46 -0
  466. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +64 -17
  467. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +191 -67
  468. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.c +53 -0
  469. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.h +103 -0
  470. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +17 -4
  471. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +35 -18
  472. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +30 -16
  473. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +107 -54
  474. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +25 -11
  475. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +58 -29
  476. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.c +46 -0
  477. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.h +107 -0
  478. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +22 -9
  479. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +60 -29
  480. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +33 -19
  481. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +139 -69
  482. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +22 -9
  483. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +63 -29
  484. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +36 -21
  485. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +106 -45
  486. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +47 -0
  487. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +113 -0
  488. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.c +207 -0
  489. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.h +914 -0
  490. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.c +52 -0
  491. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.h +151 -0
  492. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.c +65 -0
  493. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.h +226 -0
  494. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +20 -7
  495. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +47 -23
  496. data/src/core/ext/upbdefs-generated/envoy/admin/v3/certs.upbdefs.c +84 -0
  497. data/src/core/ext/upbdefs-generated/envoy/admin/v3/certs.upbdefs.h +55 -0
  498. data/src/core/ext/upbdefs-generated/envoy/admin/v3/clusters.upbdefs.c +127 -0
  499. data/src/core/ext/upbdefs-generated/envoy/admin/v3/clusters.upbdefs.h +50 -0
  500. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +75 -327
  501. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +16 -101
  502. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.c +256 -0
  503. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.h +115 -0
  504. data/src/core/ext/upbdefs-generated/envoy/admin/v3/init_dump.upbdefs.c +43 -0
  505. data/src/core/ext/upbdefs-generated/envoy/admin/v3/init_dump.upbdefs.h +40 -0
  506. data/src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.c +56 -0
  507. data/src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.h +40 -0
  508. data/src/core/ext/upbdefs-generated/envoy/admin/v3/memory.upbdefs.c +49 -0
  509. data/src/core/ext/upbdefs-generated/envoy/admin/v3/memory.upbdefs.h +35 -0
  510. data/src/core/ext/upbdefs-generated/envoy/admin/v3/metrics.upbdefs.c +46 -0
  511. data/src/core/ext/upbdefs-generated/envoy/admin/v3/metrics.upbdefs.h +35 -0
  512. data/src/core/ext/upbdefs-generated/envoy/admin/v3/mutex_stats.upbdefs.c +46 -0
  513. data/src/core/ext/upbdefs-generated/envoy/admin/v3/mutex_stats.upbdefs.h +35 -0
  514. data/src/core/ext/upbdefs-generated/envoy/admin/v3/server_info.upbdefs.c +142 -0
  515. data/src/core/ext/upbdefs-generated/envoy/admin/v3/server_info.upbdefs.h +40 -0
  516. data/src/core/ext/upbdefs-generated/envoy/admin/v3/tap.upbdefs.c +51 -0
  517. data/src/core/ext/upbdefs-generated/envoy/admin/v3/tap.upbdefs.h +35 -0
  518. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +10 -8
  519. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h +1 -1
  520. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +10 -13
  521. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h +4 -4
  522. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +120 -150
  523. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h +46 -46
  524. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +253 -280
  525. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +55 -55
  526. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +60 -62
  527. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h +10 -10
  528. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +387 -424
  529. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +76 -76
  530. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +16 -18
  531. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h +4 -4
  532. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +25 -23
  533. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h +4 -4
  534. data/src/core/ext/upbdefs-generated/envoy/config/common/matcher/v3/matcher.upbdefs.c +206 -0
  535. data/src/core/ext/upbdefs-generated/envoy/config/common/matcher/v3/matcher.upbdefs.h +105 -0
  536. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +17 -32
  537. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +22 -22
  538. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +17 -19
  539. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h +4 -4
  540. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +203 -246
  541. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +73 -73
  542. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +140 -116
  543. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +26 -16
  544. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +16 -19
  545. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h +4 -4
  546. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +24 -43
  547. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +4 -9
  548. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_method_list.upbdefs.c +53 -0
  549. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_method_list.upbdefs.h +40 -0
  550. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +23 -51
  551. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h +43 -43
  552. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +179 -187
  553. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +30 -25
  554. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +16 -19
  555. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h +4 -4
  556. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +254 -254
  557. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +53 -43
  558. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +14 -16
  559. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h +4 -4
  560. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c +16 -20
  561. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.h +7 -7
  562. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +16 -18
  563. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +4 -4
  564. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +26 -28
  565. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h +4 -4
  566. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c +15 -18
  567. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.h +4 -4
  568. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +20 -28
  569. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h +13 -13
  570. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +21 -33
  571. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +19 -19
  572. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +20 -30
  573. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h +16 -16
  574. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +16 -18
  575. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h +4 -4
  576. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +180 -165
  577. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +24 -19
  578. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +155 -166
  579. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h +22 -22
  580. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +21 -23
  581. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.h +4 -4
  582. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +46 -42
  583. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h +7 -7
  584. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/metrics_service.upbdefs.c +69 -0
  585. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/metrics_service.upbdefs.h +35 -0
  586. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +19 -35
  587. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h +25 -25
  588. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +19 -37
  589. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +28 -28
  590. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +194 -0
  591. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +75 -0
  592. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +82 -85
  593. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +7 -12
  594. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +874 -917
  595. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +170 -160
  596. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +54 -48
  597. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h +10 -10
  598. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.c +199 -0
  599. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.h +90 -0
  600. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/datadog.upbdefs.c +54 -0
  601. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/datadog.upbdefs.h +35 -0
  602. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/dynamic_ot.upbdefs.c +57 -0
  603. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/dynamic_ot.upbdefs.h +35 -0
  604. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +17 -21
  605. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h +7 -7
  606. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/lightstep.upbdefs.c +72 -0
  607. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/lightstep.upbdefs.h +35 -0
  608. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opencensus.upbdefs.c +99 -0
  609. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opencensus.upbdefs.h +35 -0
  610. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.c +47 -0
  611. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.h +35 -0
  612. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/service.upbdefs.c +52 -0
  613. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/service.upbdefs.h +35 -0
  614. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/skywalking.upbdefs.c +71 -0
  615. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/skywalking.upbdefs.h +40 -0
  616. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.c +61 -0
  617. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.h +30 -0
  618. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/xray.upbdefs.c +75 -0
  619. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/xray.upbdefs.h +40 -0
  620. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/zipkin.upbdefs.c +77 -0
  621. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/zipkin.upbdefs.h +35 -0
  622. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +17 -18
  623. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +4 -4
  624. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +19 -29
  625. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h +16 -16
  626. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +20 -26
  627. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h +10 -10
  628. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +80 -0
  629. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h +40 -0
  630. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +19 -20
  631. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +4 -4
  632. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +405 -410
  633. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +63 -58
  634. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +17 -13
  635. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h +1 -1
  636. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +174 -157
  637. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +24 -19
  638. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +21 -27
  639. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +10 -10
  640. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +219 -216
  641. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +24 -19
  642. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upbdefs.c +58 -0
  643. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upbdefs.h +40 -0
  644. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +16 -18
  645. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h +4 -4
  646. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +162 -107
  647. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +57 -22
  648. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +18 -22
  649. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h +7 -7
  650. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +125 -135
  651. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +16 -16
  652. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/cookie.upbdefs.c +46 -0
  653. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/cookie.upbdefs.h +35 -0
  654. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c +15 -23
  655. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.h +13 -13
  656. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/http_inputs.upbdefs.c +52 -0
  657. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/http_inputs.upbdefs.h +50 -0
  658. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +17 -21
  659. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h +7 -7
  660. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +17 -19
  661. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h +4 -4
  662. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +17 -19
  663. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h +4 -4
  664. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +17 -19
  665. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h +4 -4
  666. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +38 -43
  667. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h +10 -10
  668. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +17 -21
  669. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h +7 -7
  670. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +16 -21
  671. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.h +7 -7
  672. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +18 -24
  673. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h +10 -10
  674. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +15 -29
  675. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h +22 -22
  676. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +16 -26
  677. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h +16 -16
  678. data/src/core/ext/upbdefs-generated/envoy/type/v3/hash_policy.upbdefs.c +53 -0
  679. data/src/core/ext/upbdefs-generated/envoy/type/v3/hash_policy.upbdefs.h +45 -0
  680. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +12 -10
  681. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.h +1 -1
  682. data/src/core/ext/upbdefs-generated/envoy/type/v3/http_status.upbdefs.c +94 -0
  683. data/src/core/ext/upbdefs-generated/envoy/type/v3/http_status.upbdefs.h +35 -0
  684. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +14 -19
  685. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h +7 -7
  686. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +13 -19
  687. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h +10 -10
  688. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.c +69 -0
  689. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.h +40 -0
  690. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_unit.upbdefs.c +38 -0
  691. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_unit.upbdefs.h +30 -0
  692. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +13 -16
  693. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h +4 -4
  694. data/src/core/ext/upbdefs-generated/envoy/type/v3/token_bucket.upbdefs.c +57 -0
  695. data/src/core/ext/upbdefs-generated/envoy/type/v3/token_bucket.upbdefs.h +35 -0
  696. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +7 -7
  697. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h +1 -1
  698. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.c +154 -0
  699. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.h +95 -0
  700. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.c +153 -0
  701. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.h +100 -0
  702. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +5 -14
  703. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.h +10 -10
  704. data/src/core/ext/upbdefs-generated/google/api/httpbody.upbdefs.c +39 -0
  705. data/src/core/ext/upbdefs-generated/google/api/httpbody.upbdefs.h +35 -0
  706. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +5 -10
  707. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h +4 -4
  708. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +96 -151
  709. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h +82 -82
  710. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +5 -10
  711. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h +4 -4
  712. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +5 -10
  713. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h +4 -4
  714. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +5 -16
  715. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h +13 -13
  716. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +5 -10
  717. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h +4 -4
  718. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +5 -26
  719. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h +28 -28
  720. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +6 -11
  721. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h +4 -4
  722. data/src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c +67 -0
  723. data/src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.h +50 -0
  724. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c +99 -0
  725. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h +75 -0
  726. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +6 -15
  727. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h +10 -10
  728. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +7 -12
  729. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h +4 -4
  730. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +6 -6
  731. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h +1 -1
  732. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +6 -11
  733. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h +4 -4
  734. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +6 -11
  735. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h +4 -4
  736. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +8 -57
  737. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.h +70 -70
  738. data/src/core/ext/upbdefs-generated/xds/annotations/v3/migrate.upbdefs.c +63 -0
  739. data/src/core/ext/upbdefs-generated/xds/annotations/v3/migrate.upbdefs.h +45 -0
  740. data/src/core/ext/upbdefs-generated/xds/annotations/v3/security.upbdefs.c +47 -0
  741. data/src/core/ext/upbdefs-generated/xds/annotations/v3/security.upbdefs.h +35 -0
  742. data/src/core/ext/upbdefs-generated/xds/annotations/v3/sensitive.upbdefs.c +35 -0
  743. data/src/core/ext/upbdefs-generated/xds/annotations/v3/sensitive.upbdefs.h +30 -0
  744. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +6 -17
  745. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +13 -13
  746. data/src/core/ext/upbdefs-generated/xds/annotations/v3/versioning.upbdefs.c +40 -0
  747. data/src/core/ext/upbdefs-generated/xds/annotations/v3/versioning.upbdefs.h +35 -0
  748. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +7 -12
  749. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h +4 -4
  750. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +9 -16
  751. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h +7 -7
  752. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +6 -13
  753. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h +7 -7
  754. data/src/core/ext/upbdefs-generated/xds/core/v3/extension.upbdefs.c +41 -0
  755. data/src/core/ext/upbdefs-generated/xds/core/v3/extension.upbdefs.h +35 -0
  756. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +8 -13
  757. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h +4 -4
  758. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +8 -15
  759. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h +7 -7
  760. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +8 -13
  761. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h +4 -4
  762. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.c +126 -0
  763. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.h +80 -0
  764. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/regex.upbdefs.c +40 -0
  765. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/regex.upbdefs.h +40 -0
  766. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/string.upbdefs.c +52 -0
  767. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/string.upbdefs.h +40 -0
  768. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +7 -12
  769. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +4 -4
  770. data/src/core/ext/xds/certificate_provider_store.cc +75 -3
  771. data/src/core/ext/xds/certificate_provider_store.h +28 -2
  772. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +20 -14
  773. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +11 -3
  774. data/src/core/ext/xds/upb_utils.h +45 -0
  775. data/src/core/ext/xds/xds_api.cc +329 -3648
  776. data/src/core/ext/xds/xds_api.h +78 -630
  777. data/src/core/ext/xds/xds_bootstrap.cc +10 -443
  778. data/src/core/ext/xds/xds_bootstrap.h +44 -81
  779. data/src/core/ext/xds/xds_bootstrap_grpc.cc +361 -0
  780. data/src/core/ext/xds/xds_bootstrap_grpc.h +184 -0
  781. data/src/core/ext/xds/xds_certificate_provider.cc +36 -25
  782. data/src/core/ext/xds/xds_certificate_provider.h +35 -3
  783. data/src/core/ext/xds/xds_channel_stack_modifier.cc +27 -21
  784. data/src/core/ext/xds/xds_channel_stack_modifier.h +17 -4
  785. data/src/core/ext/xds/xds_client.cc +1278 -2037
  786. data/src/core/ext/xds/xds_client.h +158 -197
  787. data/src/core/ext/xds/xds_client_grpc.cc +210 -0
  788. data/src/core/ext/xds/xds_client_grpc.h +79 -0
  789. data/src/core/ext/xds/xds_client_stats.cc +18 -19
  790. data/src/core/ext/xds/xds_client_stats.h +9 -7
  791. data/src/core/ext/xds/xds_cluster.cc +659 -0
  792. data/src/core/ext/xds/xds_cluster.h +116 -0
  793. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +152 -0
  794. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +92 -0
  795. data/src/core/ext/xds/xds_common_types.cc +501 -0
  796. data/src/core/ext/xds/xds_common_types.h +108 -0
  797. data/src/core/ext/xds/xds_endpoint.cc +468 -0
  798. data/src/core/ext/xds/xds_endpoint.h +139 -0
  799. data/src/core/ext/xds/xds_http_fault_filter.cc +67 -59
  800. data/src/core/ext/xds/xds_http_fault_filter.h +18 -24
  801. data/src/core/ext/xds/xds_http_filters.cc +66 -66
  802. data/src/core/ext/xds/xds_http_filters.h +72 -24
  803. data/src/core/ext/xds/xds_http_rbac_filter.cc +505 -0
  804. data/src/core/ext/xds/xds_http_rbac_filter.h +58 -0
  805. data/src/core/ext/xds/xds_lb_policy_registry.cc +243 -0
  806. data/src/core/ext/xds/xds_lb_policy_registry.h +71 -0
  807. data/src/core/ext/xds/xds_listener.cc +1144 -0
  808. data/src/core/ext/xds/xds_listener.h +224 -0
  809. data/src/core/ext/xds/xds_resource_type.h +104 -0
  810. data/src/core/ext/xds/xds_resource_type_impl.h +86 -0
  811. data/src/core/ext/xds/xds_route_config.cc +1166 -0
  812. data/src/core/ext/xds/xds_route_config.h +241 -0
  813. data/src/core/ext/xds/xds_routing.cc +264 -0
  814. data/src/core/ext/xds/xds_routing.h +106 -0
  815. data/src/core/ext/xds/xds_server_config_fetcher.cc +1155 -324
  816. data/src/core/ext/xds/xds_transport.h +86 -0
  817. data/src/core/ext/xds/xds_transport_grpc.cc +356 -0
  818. data/src/core/ext/xds/xds_transport_grpc.h +135 -0
  819. data/src/core/lib/address_utils/parse_address.cc +36 -16
  820. data/src/core/lib/address_utils/parse_address.h +11 -2
  821. data/src/core/lib/address_utils/sockaddr_utils.cc +82 -51
  822. data/src/core/lib/address_utils/sockaddr_utils.h +9 -19
  823. data/src/core/lib/avl/avl.h +476 -88
  824. data/src/core/lib/backoff/backoff.cc +9 -40
  825. data/src/core/lib/backoff/backoff.h +12 -12
  826. data/src/core/lib/channel/call_finalization.h +88 -0
  827. data/src/core/lib/channel/call_tracer.h +16 -7
  828. data/src/core/lib/channel/channel_args.cc +274 -48
  829. data/src/core/lib/channel/channel_args.h +413 -12
  830. data/src/core/lib/channel/channel_args_preconditioning.cc +43 -0
  831. data/src/core/lib/channel/channel_args_preconditioning.h +62 -0
  832. data/src/core/lib/channel/channel_fwd.h +26 -0
  833. data/src/core/lib/channel/channel_stack.cc +64 -17
  834. data/src/core/lib/channel/channel_stack.h +96 -14
  835. data/src/core/lib/channel/channel_stack_builder.cc +18 -280
  836. data/src/core/lib/channel/channel_stack_builder.h +112 -150
  837. data/src/core/lib/channel/channel_stack_builder_impl.cc +113 -0
  838. data/src/core/lib/channel/channel_stack_builder_impl.h +48 -0
  839. data/src/core/lib/channel/channel_trace.cc +12 -22
  840. data/src/core/lib/channel/channel_trace.h +6 -3
  841. data/src/core/lib/channel/channelz.cc +36 -49
  842. data/src/core/lib/channel/channelz.h +24 -7
  843. data/src/core/lib/channel/channelz_registry.cc +11 -19
  844. data/src/core/lib/channel/channelz_registry.h +10 -9
  845. data/src/core/lib/channel/connected_channel.cc +704 -48
  846. data/src/core/lib/channel/connected_channel.h +3 -4
  847. data/src/core/lib/channel/context.h +11 -0
  848. data/src/core/lib/channel/promise_based_filter.cc +2126 -0
  849. data/src/core/lib/channel/promise_based_filter.h +848 -0
  850. data/src/core/lib/channel/status_util.cc +29 -0
  851. data/src/core/lib/channel/status_util.h +9 -2
  852. data/src/core/lib/compression/compression.cc +26 -113
  853. data/src/core/lib/compression/compression_internal.cc +170 -204
  854. data/src/core/lib/compression/compression_internal.h +68 -72
  855. data/src/core/lib/compression/message_compress.cc +18 -16
  856. data/src/core/lib/compression/message_compress.h +4 -5
  857. data/src/core/lib/config/core_configuration.cc +18 -3
  858. data/src/core/lib/config/core_configuration.h +133 -36
  859. data/src/core/lib/debug/event_log.cc +88 -0
  860. data/src/core/lib/debug/event_log.h +81 -0
  861. data/src/core/lib/debug/histogram_view.cc +69 -0
  862. data/src/core/lib/debug/histogram_view.h +37 -0
  863. data/src/core/lib/debug/stats.cc +31 -135
  864. data/src/core/lib/debug/stats.h +30 -37
  865. data/src/core/lib/debug/stats_data.cc +290 -638
  866. data/src/core/lib/debug/stats_data.h +263 -527
  867. data/src/core/lib/debug/trace.cc +0 -2
  868. data/src/core/lib/debug/trace.h +15 -14
  869. data/src/core/lib/event_engine/channel_args_endpoint_config.cc +40 -0
  870. data/src/core/lib/event_engine/channel_args_endpoint_config.h +49 -0
  871. data/src/core/lib/event_engine/common_closures.h +71 -0
  872. data/src/core/lib/event_engine/default_event_engine.cc +94 -0
  873. data/src/core/lib/event_engine/default_event_engine.h +49 -0
  874. data/src/core/lib/event_engine/default_event_engine_factory.cc +48 -0
  875. data/src/core/lib/event_engine/default_event_engine_factory.h +33 -0
  876. data/src/core/lib/event_engine/executor/executor.h +38 -0
  877. data/src/core/lib/event_engine/forkable.cc +101 -0
  878. data/src/core/lib/event_engine/forkable.h +61 -0
  879. data/src/core/lib/event_engine/handle_containers.h +67 -0
  880. data/src/core/lib/event_engine/memory_allocator.cc +74 -0
  881. data/src/core/lib/event_engine/poller.h +62 -0
  882. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +618 -0
  883. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +129 -0
  884. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +901 -0
  885. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
  886. data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
  887. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
  888. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.h +33 -0
  889. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
  890. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
  891. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +267 -0
  892. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
  893. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1270 -0
  894. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +682 -0
  895. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +577 -0
  896. data/src/core/lib/event_engine/posix_engine/posix_engine.h +245 -0
  897. data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
  898. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1081 -0
  899. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +361 -0
  900. data/src/core/lib/event_engine/posix_engine/timer.cc +311 -0
  901. data/src/core/lib/event_engine/posix_engine/timer.h +194 -0
  902. data/src/core/lib/event_engine/posix_engine/timer_heap.cc +107 -0
  903. data/src/core/lib/event_engine/posix_engine/timer_heap.h +56 -0
  904. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +174 -0
  905. data/src/core/lib/event_engine/posix_engine/timer_manager.h +114 -0
  906. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +301 -0
  907. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +179 -0
  908. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +126 -0
  909. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
  910. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +151 -0
  911. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +45 -0
  912. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
  913. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
  914. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
  915. data/src/core/lib/event_engine/resolved_address.cc +41 -0
  916. data/src/core/lib/event_engine/slice.cc +103 -0
  917. data/src/core/lib/event_engine/slice_buffer.cc +50 -0
  918. data/src/core/lib/event_engine/socket_notifier.h +55 -0
  919. data/src/core/lib/event_engine/thread_pool.cc +276 -0
  920. data/src/core/lib/event_engine/thread_pool.h +137 -0
  921. data/src/core/lib/event_engine/time_util.cc +30 -0
  922. data/src/core/lib/event_engine/time_util.h +32 -0
  923. data/src/core/lib/event_engine/trace.cc +18 -0
  924. data/src/core/lib/event_engine/trace.h +30 -0
  925. data/src/core/lib/event_engine/utils.cc +44 -0
  926. data/src/core/lib/event_engine/utils.h +36 -0
  927. data/src/core/lib/event_engine/windows/iocp.cc +155 -0
  928. data/src/core/lib/event_engine/windows/iocp.h +69 -0
  929. data/src/core/lib/event_engine/windows/win_socket.cc +196 -0
  930. data/src/core/lib/event_engine/windows/win_socket.h +120 -0
  931. data/src/core/lib/event_engine/windows/windows_engine.cc +165 -0
  932. data/src/core/lib/event_engine/windows/windows_engine.h +124 -0
  933. data/src/core/lib/experiments/config.cc +146 -0
  934. data/src/core/lib/experiments/config.h +43 -0
  935. data/src/core/lib/experiments/experiments.cc +86 -0
  936. data/src/core/lib/experiments/experiments.h +63 -0
  937. data/src/core/lib/gpr/alloc.cc +1 -9
  938. data/src/core/lib/gpr/cpu_linux.cc +6 -2
  939. data/src/core/lib/gpr/log.cc +5 -0
  940. data/src/core/lib/gpr/log_linux.cc +3 -4
  941. data/src/core/lib/gpr/log_windows.cc +0 -1
  942. data/src/core/lib/gpr/string.h +1 -1
  943. data/src/core/lib/gpr/string_util_windows.cc +3 -30
  944. data/src/core/lib/gpr/sync_abseil.cc +0 -14
  945. data/src/core/lib/gpr/sync_posix.cc +1 -14
  946. data/src/core/lib/gpr/time.cc +13 -10
  947. data/src/core/lib/gpr/time_posix.cc +6 -15
  948. data/src/core/lib/gpr/time_precise.h +1 -1
  949. data/src/core/lib/gpr/time_windows.cc +10 -7
  950. data/src/core/lib/gpr/tmpfile_posix.cc +3 -2
  951. data/src/core/lib/gpr/tmpfile_windows.cc +5 -7
  952. data/src/core/lib/gpr/useful.h +58 -0
  953. data/src/core/lib/gprpp/bitset.h +27 -14
  954. data/src/core/lib/gprpp/chunked_vector.h +49 -3
  955. data/src/core/lib/gprpp/construct_destruct.h +1 -0
  956. data/src/core/lib/gprpp/cpp_impl_of.h +49 -0
  957. data/src/core/lib/gprpp/debug_location.h +41 -7
  958. data/src/core/lib/gprpp/dual_ref_counted.h +1 -4
  959. data/src/core/lib/gprpp/env.h +53 -0
  960. data/src/core/lib/gprpp/env_linux.cc +80 -0
  961. data/src/core/lib/gprpp/env_posix.cc +47 -0
  962. data/src/core/lib/gprpp/env_windows.cc +56 -0
  963. data/src/core/lib/gprpp/examine_stack.h +0 -1
  964. data/src/core/lib/gprpp/fork.cc +17 -28
  965. data/src/core/lib/gprpp/fork.h +0 -8
  966. data/src/core/lib/gprpp/global_config.h +2 -4
  967. data/src/core/lib/gprpp/global_config_env.cc +16 -14
  968. data/src/core/lib/gprpp/global_config_env.h +5 -3
  969. data/src/core/lib/gprpp/global_config_generic.h +0 -4
  970. data/src/core/lib/gprpp/host_port.cc +2 -0
  971. data/src/core/lib/gprpp/load_file.cc +75 -0
  972. data/src/core/lib/gprpp/load_file.h +33 -0
  973. data/src/core/lib/gprpp/manual_constructor.h +0 -70
  974. data/src/core/lib/gprpp/match.h +2 -0
  975. data/src/core/lib/gprpp/memory.h +1 -5
  976. data/src/core/lib/gprpp/no_destruct.h +94 -0
  977. data/src/core/lib/gprpp/notification.h +67 -0
  978. data/src/core/lib/gprpp/orphanable.h +2 -5
  979. data/src/core/lib/gprpp/packed_table.h +40 -0
  980. data/src/core/lib/gprpp/per_cpu.h +46 -0
  981. data/src/core/lib/gprpp/ref_counted.h +4 -4
  982. data/src/core/lib/gprpp/ref_counted_ptr.h +23 -39
  983. data/src/core/lib/gprpp/single_set_ptr.h +87 -0
  984. data/src/core/lib/gprpp/sorted_pack.h +98 -0
  985. data/src/core/lib/gprpp/stat.h +0 -2
  986. data/src/core/lib/gprpp/stat_posix.cc +10 -4
  987. data/src/core/lib/gprpp/stat_windows.cc +3 -2
  988. data/src/core/lib/gprpp/status_helper.cc +75 -48
  989. data/src/core/lib/gprpp/status_helper.h +16 -21
  990. data/src/core/lib/gprpp/strerror.cc +41 -0
  991. data/src/core/lib/gprpp/strerror.h +29 -0
  992. data/src/core/lib/gprpp/sync.h +3 -1
  993. data/src/core/lib/gprpp/table.h +42 -2
  994. data/src/core/lib/gprpp/tchar.cc +49 -0
  995. data/src/core/lib/gprpp/tchar.h +33 -0
  996. data/src/core/lib/gprpp/thd.h +2 -5
  997. data/src/core/lib/gprpp/thd_posix.cc +4 -2
  998. data/src/core/lib/gprpp/thd_windows.cc +3 -2
  999. data/src/core/lib/gprpp/time.cc +234 -0
  1000. data/src/core/lib/gprpp/time.h +367 -0
  1001. data/src/core/lib/gprpp/time_averaged_stats.cc +60 -0
  1002. data/src/core/lib/gprpp/time_averaged_stats.h +79 -0
  1003. data/src/core/lib/gprpp/time_util.cc +4 -0
  1004. data/src/core/lib/gprpp/time_util.h +1 -1
  1005. data/src/core/lib/gprpp/unique_type_name.h +104 -0
  1006. data/src/core/lib/gprpp/validation_errors.cc +61 -0
  1007. data/src/core/lib/gprpp/validation_errors.h +127 -0
  1008. data/src/core/lib/gprpp/work_serializer.cc +247 -0
  1009. data/src/core/lib/gprpp/work_serializer.h +86 -0
  1010. data/src/core/lib/handshaker/proxy_mapper.h +53 -0
  1011. data/src/core/lib/handshaker/proxy_mapper_registry.cc +71 -0
  1012. data/src/core/lib/handshaker/proxy_mapper_registry.h +75 -0
  1013. data/src/core/lib/http/format_request.cc +62 -29
  1014. data/src/core/lib/http/format_request.h +10 -7
  1015. data/src/core/lib/http/httpcli.cc +313 -244
  1016. data/src/core/lib/http/httpcli.h +234 -90
  1017. data/src/core/lib/http/httpcli_security_connector.cc +84 -86
  1018. data/src/core/lib/http/httpcli_ssl_credentials.h +39 -0
  1019. data/src/core/lib/http/parser.cc +124 -65
  1020. data/src/core/lib/http/parser.h +18 -2
  1021. data/src/core/lib/iomgr/buffer_list.cc +110 -121
  1022. data/src/core/lib/iomgr/buffer_list.h +68 -52
  1023. data/src/core/lib/iomgr/call_combiner.cc +17 -40
  1024. data/src/core/lib/iomgr/call_combiner.h +3 -4
  1025. data/src/core/lib/iomgr/cfstream_handle.cc +13 -16
  1026. data/src/core/lib/iomgr/closure.h +68 -14
  1027. data/src/core/lib/iomgr/combiner.cc +11 -9
  1028. data/src/core/lib/iomgr/endpoint.cc +4 -4
  1029. data/src/core/lib/iomgr/endpoint.h +7 -6
  1030. data/src/core/lib/iomgr/endpoint_cfstream.cc +40 -53
  1031. data/src/core/lib/iomgr/endpoint_cfstream.h +4 -4
  1032. data/src/core/lib/iomgr/endpoint_pair_posix.cc +15 -11
  1033. data/src/core/lib/iomgr/endpoint_pair_windows.cc +5 -14
  1034. data/src/core/lib/iomgr/error.cc +30 -813
  1035. data/src/core/lib/iomgr/error.h +22 -295
  1036. data/src/core/lib/iomgr/error_cfstream.cc +0 -5
  1037. data/src/core/lib/iomgr/ev_apple.cc +10 -9
  1038. data/src/core/lib/iomgr/ev_epoll1_linux.cc +88 -84
  1039. data/src/core/lib/iomgr/ev_epoll1_linux.h +1 -1
  1040. data/src/core/lib/iomgr/ev_poll_posix.cc +123 -109
  1041. data/src/core/lib/iomgr/ev_poll_posix.h +2 -2
  1042. data/src/core/lib/iomgr/ev_posix.cc +58 -100
  1043. data/src/core/lib/iomgr/ev_posix.h +6 -4
  1044. data/src/core/lib/iomgr/exec_ctx.cc +14 -109
  1045. data/src/core/lib/iomgr/exec_ctx.h +24 -66
  1046. data/src/core/lib/iomgr/executor.cc +16 -21
  1047. data/src/core/lib/iomgr/executor.h +1 -4
  1048. data/src/core/lib/iomgr/fork_posix.cc +1 -0
  1049. data/src/core/lib/iomgr/internal_errqueue.cc +40 -47
  1050. data/src/core/lib/iomgr/internal_errqueue.h +1 -6
  1051. data/src/core/lib/iomgr/iocp_windows.cc +10 -10
  1052. data/src/core/lib/iomgr/iocp_windows.h +1 -1
  1053. data/src/core/lib/iomgr/iomgr.cc +6 -2
  1054. data/src/core/lib/iomgr/iomgr_fwd.h +26 -0
  1055. data/src/core/lib/iomgr/iomgr_posix.cc +4 -3
  1056. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +4 -2
  1057. data/src/core/lib/iomgr/iomgr_windows.cc +3 -2
  1058. data/src/core/lib/iomgr/load_file.cc +5 -9
  1059. data/src/core/lib/iomgr/lockfree_event.cc +10 -27
  1060. data/src/core/lib/iomgr/polling_entity.h +6 -0
  1061. data/src/core/lib/iomgr/pollset.cc +1 -1
  1062. data/src/core/lib/iomgr/pollset.h +5 -5
  1063. data/src/core/lib/iomgr/pollset_set.h +1 -3
  1064. data/src/core/lib/iomgr/pollset_windows.cc +6 -6
  1065. data/src/core/lib/iomgr/port.h +29 -12
  1066. data/src/core/lib/iomgr/python_util.h +2 -2
  1067. data/src/core/lib/iomgr/resolve_address.cc +16 -22
  1068. data/src/core/lib/iomgr/resolve_address.h +79 -46
  1069. data/src/core/lib/iomgr/resolve_address_impl.h +59 -0
  1070. data/src/core/lib/iomgr/resolve_address_posix.cc +112 -78
  1071. data/src/core/lib/iomgr/resolve_address_posix.h +63 -0
  1072. data/src/core/lib/iomgr/resolve_address_windows.cc +125 -81
  1073. data/src/core/lib/iomgr/resolve_address_windows.h +63 -0
  1074. data/src/core/lib/iomgr/resolved_address.h +39 -0
  1075. data/src/core/lib/iomgr/sockaddr.h +2 -3
  1076. data/src/core/lib/iomgr/sockaddr_posix.h +2 -0
  1077. data/src/core/lib/iomgr/sockaddr_utils_posix.cc +63 -0
  1078. data/src/core/lib/iomgr/sockaddr_windows.h +2 -0
  1079. data/src/core/lib/iomgr/socket_utils_common_posix.cc +44 -81
  1080. data/src/core/lib/iomgr/socket_utils_posix.cc +84 -1
  1081. data/src/core/lib/iomgr/socket_utils_posix.h +98 -6
  1082. data/src/core/lib/iomgr/socket_windows.cc +2 -2
  1083. data/src/core/lib/iomgr/socket_windows.h +0 -2
  1084. data/src/core/lib/iomgr/tcp_client.cc +11 -9
  1085. data/src/core/lib/iomgr/tcp_client.h +25 -15
  1086. data/src/core/lib/iomgr/tcp_client_cfstream.cc +28 -26
  1087. data/src/core/lib/iomgr/tcp_client_posix.cc +194 -85
  1088. data/src/core/lib/iomgr/tcp_client_posix.h +14 -12
  1089. data/src/core/lib/iomgr/tcp_client_windows.cc +33 -35
  1090. data/src/core/lib/iomgr/tcp_posix.cc +465 -254
  1091. data/src/core/lib/iomgr/tcp_posix.h +4 -4
  1092. data/src/core/lib/iomgr/tcp_server.cc +3 -4
  1093. data/src/core/lib/iomgr/tcp_server.h +5 -4
  1094. data/src/core/lib/iomgr/tcp_server_posix.cc +109 -101
  1095. data/src/core/lib/iomgr/tcp_server_utils_posix.h +21 -20
  1096. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +50 -49
  1097. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +19 -16
  1098. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +1 -1
  1099. data/src/core/lib/iomgr/tcp_server_windows.cc +45 -48
  1100. data/src/core/lib/iomgr/tcp_windows.cc +43 -46
  1101. data/src/core/lib/iomgr/tcp_windows.h +1 -3
  1102. data/src/core/lib/iomgr/timer.cc +2 -2
  1103. data/src/core/lib/iomgr/timer.h +18 -13
  1104. data/src/core/lib/iomgr/timer_generic.cc +108 -97
  1105. data/src/core/lib/iomgr/timer_manager.cc +14 -14
  1106. data/src/core/lib/iomgr/unix_sockets_posix.cc +20 -34
  1107. data/src/core/lib/iomgr/unix_sockets_posix.h +4 -7
  1108. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +6 -15
  1109. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +4 -5
  1110. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +10 -8
  1111. data/src/core/lib/iomgr/wakeup_fd_posix.cc +15 -12
  1112. data/src/core/lib/iomgr/wakeup_fd_posix.h +0 -2
  1113. data/src/core/lib/json/json.h +20 -24
  1114. data/src/core/lib/json/json_args.h +34 -0
  1115. data/src/core/lib/json/json_channel_args.h +42 -0
  1116. data/src/core/lib/json/json_object_loader.cc +207 -0
  1117. data/src/core/lib/json/json_object_loader.h +620 -0
  1118. data/src/core/lib/json/json_reader.cc +155 -75
  1119. data/src/core/lib/json/json_util.cc +17 -37
  1120. data/src/core/lib/json/json_util.h +18 -9
  1121. data/src/core/lib/json/json_writer.cc +6 -1
  1122. data/src/core/lib/load_balancing/lb_policy.cc +93 -0
  1123. data/src/core/lib/load_balancing/lb_policy.h +439 -0
  1124. data/src/core/lib/load_balancing/lb_policy_factory.h +49 -0
  1125. data/src/core/lib/load_balancing/lb_policy_registry.cc +141 -0
  1126. data/src/core/lib/load_balancing/lb_policy_registry.h +82 -0
  1127. data/src/core/lib/load_balancing/subchannel_interface.h +133 -0
  1128. data/src/core/lib/matchers/matchers.cc +10 -8
  1129. data/src/core/lib/matchers/matchers.h +2 -0
  1130. data/src/core/lib/promise/activity.cc +134 -0
  1131. data/src/core/lib/promise/activity.h +604 -0
  1132. data/src/core/lib/promise/arena_promise.h +230 -0
  1133. data/src/core/lib/promise/context.h +92 -0
  1134. data/src/core/lib/promise/detail/basic_seq.h +497 -0
  1135. data/src/core/lib/promise/detail/promise_factory.h +235 -0
  1136. data/src/core/lib/promise/detail/promise_like.h +85 -0
  1137. data/src/core/lib/promise/detail/status.h +78 -0
  1138. data/src/core/lib/promise/detail/switch.h +1455 -0
  1139. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +50 -0
  1140. data/src/core/lib/promise/for_each.h +129 -0
  1141. data/src/core/lib/promise/intra_activity_waiter.h +49 -0
  1142. data/src/core/lib/promise/latch.h +103 -0
  1143. data/src/core/lib/promise/loop.h +138 -0
  1144. data/src/core/lib/promise/map.h +87 -0
  1145. data/src/core/lib/promise/map_pipe.h +87 -0
  1146. data/src/core/lib/promise/pipe.cc +19 -0
  1147. data/src/core/lib/promise/pipe.h +505 -0
  1148. data/src/core/lib/promise/poll.h +79 -0
  1149. data/src/core/lib/promise/promise.h +96 -0
  1150. data/src/core/lib/promise/race.h +83 -0
  1151. data/src/core/lib/promise/seq.h +106 -0
  1152. data/src/core/lib/promise/sleep.cc +90 -0
  1153. data/src/core/lib/promise/sleep.h +84 -0
  1154. data/src/core/lib/promise/try_concurrently.h +341 -0
  1155. data/src/core/lib/promise/try_seq.h +174 -0
  1156. data/src/core/lib/resolver/resolver.cc +37 -0
  1157. data/src/core/lib/resolver/resolver.h +138 -0
  1158. data/src/core/lib/resolver/resolver_factory.h +77 -0
  1159. data/src/core/lib/resolver/resolver_registry.cc +149 -0
  1160. data/src/core/lib/resolver/resolver_registry.h +123 -0
  1161. data/src/core/lib/resolver/server_address.cc +181 -0
  1162. data/src/core/lib/resolver/server_address.h +145 -0
  1163. data/src/core/lib/resource_quota/api.cc +104 -0
  1164. data/src/core/lib/resource_quota/api.h +49 -0
  1165. data/src/core/lib/resource_quota/arena.cc +138 -0
  1166. data/src/core/lib/resource_quota/arena.h +252 -0
  1167. data/src/core/lib/resource_quota/memory_quota.cc +603 -0
  1168. data/src/core/lib/resource_quota/memory_quota.h +530 -0
  1169. data/src/core/lib/resource_quota/periodic_update.cc +78 -0
  1170. data/src/core/lib/resource_quota/periodic_update.h +71 -0
  1171. data/src/core/lib/resource_quota/resource_quota.cc +33 -0
  1172. data/src/core/lib/resource_quota/resource_quota.h +74 -0
  1173. data/src/core/lib/resource_quota/thread_quota.cc +45 -0
  1174. data/src/core/lib/resource_quota/thread_quota.h +61 -0
  1175. data/src/core/lib/resource_quota/trace.cc +19 -0
  1176. data/src/core/lib/resource_quota/trace.h +24 -0
  1177. data/src/core/lib/security/authorization/authorization_policy_provider.h +14 -0
  1178. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +4 -0
  1179. data/src/core/lib/security/authorization/evaluate_args.cc +53 -45
  1180. data/src/core/lib/security/authorization/evaluate_args.h +9 -5
  1181. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +64 -0
  1182. data/src/core/lib/security/authorization/grpc_authorization_engine.h +69 -0
  1183. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +122 -0
  1184. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +61 -0
  1185. data/src/core/lib/security/authorization/matchers.cc +241 -0
  1186. data/src/core/lib/security/authorization/matchers.h +218 -0
  1187. data/src/core/lib/security/authorization/rbac_policy.cc +445 -0
  1188. data/src/core/lib/security/authorization/rbac_policy.h +178 -0
  1189. data/src/core/lib/security/certificate_provider/certificate_provider_factory.h +66 -0
  1190. data/src/core/lib/security/certificate_provider/certificate_provider_registry.cc +60 -0
  1191. data/src/core/lib/security/certificate_provider/certificate_provider_registry.h +70 -0
  1192. data/src/core/lib/security/context/security_context.cc +9 -4
  1193. data/src/core/lib/security/context/security_context.h +33 -4
  1194. data/src/core/lib/security/credentials/alts/alts_credentials.cc +18 -10
  1195. data/src/core/lib/security/credentials/alts/alts_credentials.h +18 -4
  1196. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +1 -3
  1197. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -4
  1198. data/src/core/lib/security/credentials/call_creds_util.cc +97 -0
  1199. data/src/core/lib/security/credentials/call_creds_util.h +43 -0
  1200. data/src/core/lib/security/credentials/channel_creds_registry.h +103 -0
  1201. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +80 -0
  1202. data/src/core/lib/security/credentials/composite/composite_credentials.cc +32 -91
  1203. data/src/core/lib/security/credentials/composite/composite_credentials.h +42 -16
  1204. data/src/core/lib/security/credentials/credentials.cc +6 -11
  1205. data/src/core/lib/security/credentials/credentials.h +106 -99
  1206. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +249 -107
  1207. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +19 -0
  1208. data/src/core/lib/security/credentials/external/aws_request_signer.cc +13 -3
  1209. data/src/core/lib/security/credentials/external/external_account_credentials.cc +137 -103
  1210. data/src/core/lib/security/credentials/external/external_account_credentials.h +16 -9
  1211. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +29 -27
  1212. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +6 -0
  1213. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +76 -45
  1214. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +11 -0
  1215. data/src/core/lib/security/credentials/fake/fake_credentials.cc +43 -43
  1216. data/src/core/lib/security/credentials/fake/fake_credentials.h +35 -26
  1217. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +6 -8
  1218. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +118 -80
  1219. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +20 -7
  1220. data/src/core/lib/security/credentials/iam/iam_credentials.cc +32 -30
  1221. data/src/core/lib/security/credentials/iam/iam_credentials.h +25 -9
  1222. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +35 -26
  1223. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +61 -0
  1224. data/src/core/lib/security/credentials/jwt/json_token.cc +21 -12
  1225. data/src/core/lib/security/credentials/jwt/json_token.h +2 -2
  1226. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +46 -55
  1227. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +30 -12
  1228. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +96 -61
  1229. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +6 -4
  1230. data/src/core/lib/security/credentials/local/local_credentials.cc +19 -13
  1231. data/src/core/lib/security/credentials/local/local_credentials.h +19 -3
  1232. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +214 -222
  1233. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +81 -34
  1234. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +104 -156
  1235. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +80 -27
  1236. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +31 -35
  1237. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +29 -6
  1238. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +21 -29
  1239. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +13 -14
  1240. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +75 -58
  1241. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +73 -14
  1242. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +241 -0
  1243. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +168 -0
  1244. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +37 -92
  1245. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +73 -149
  1246. data/src/core/lib/security/credentials/tls/tls_credentials.cc +59 -42
  1247. data/src/core/lib/security/credentials/tls/tls_credentials.h +13 -4
  1248. data/src/core/lib/security/credentials/tls/tls_utils.cc +5 -1
  1249. data/src/core/lib/security/credentials/tls/tls_utils.h +1 -1
  1250. data/src/core/lib/security/credentials/xds/xds_credentials.cc +81 -89
  1251. data/src/core/lib/security/credentials/xds/xds_credentials.h +53 -8
  1252. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +46 -45
  1253. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +9 -6
  1254. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +58 -70
  1255. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +3 -5
  1256. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +23 -24
  1257. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +34 -27
  1258. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +5 -3
  1259. data/src/core/lib/security/security_connector/load_system_roots_supported.cc +175 -0
  1260. data/src/core/lib/security/security_connector/load_system_roots_supported.h +46 -0
  1261. data/src/core/lib/security/security_connector/local/local_security_connector.cc +52 -40
  1262. data/src/core/lib/security/security_connector/local/local_security_connector.h +7 -3
  1263. data/src/core/lib/security/security_connector/security_connector.cc +22 -32
  1264. data/src/core/lib/security/security_connector/security_connector.h +49 -31
  1265. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +39 -34
  1266. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -2
  1267. data/src/core/lib/security/security_connector/ssl_utils.cc +54 -40
  1268. data/src/core/lib/security/security_connector/ssl_utils.h +23 -24
  1269. data/src/core/lib/security/security_connector/ssl_utils_config.h +1 -1
  1270. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +391 -230
  1271. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +97 -54
  1272. data/src/core/lib/security/transport/auth_filters.h +45 -5
  1273. data/src/core/lib/security/transport/client_auth_filter.cc +122 -368
  1274. data/src/core/lib/security/transport/secure_endpoint.cc +282 -158
  1275. data/src/core/lib/security/transport/secure_endpoint.h +5 -4
  1276. data/src/core/lib/security/transport/security_handshaker.cc +123 -92
  1277. data/src/core/lib/security/transport/security_handshaker.h +7 -2
  1278. data/src/core/lib/security/transport/server_auth_filter.cc +87 -58
  1279. data/src/core/lib/security/transport/tsi_error.cc +6 -3
  1280. data/src/core/lib/security/util/json_util.cc +7 -7
  1281. data/src/core/lib/security/util/json_util.h +0 -2
  1282. data/src/core/lib/service_config/service_config.h +89 -0
  1283. data/src/core/lib/service_config/service_config_call_data.h +76 -0
  1284. data/src/core/lib/service_config/service_config_impl.cc +191 -0
  1285. data/src/core/lib/service_config/service_config_impl.h +125 -0
  1286. data/src/core/lib/service_config/service_config_parser.cc +81 -0
  1287. data/src/core/lib/service_config/service_config_parser.h +105 -0
  1288. data/src/core/lib/slice/b64.cc +2 -2
  1289. data/src/core/lib/slice/b64.h +2 -0
  1290. data/src/core/lib/slice/percent_encoding.cc +35 -97
  1291. data/src/core/lib/slice/percent_encoding.h +4 -16
  1292. data/src/core/lib/slice/slice.cc +94 -184
  1293. data/src/core/lib/slice/slice.h +402 -0
  1294. data/src/core/lib/slice/slice_buffer.cc +92 -33
  1295. data/src/core/lib/slice/slice_buffer.h +137 -0
  1296. data/src/core/lib/slice/slice_internal.h +22 -48
  1297. data/src/core/lib/slice/slice_refcount.h +32 -93
  1298. data/src/core/lib/slice/slice_string_helpers.cc +0 -16
  1299. data/src/core/lib/slice/slice_string_helpers.h +1 -8
  1300. data/src/core/lib/surface/builtins.cc +11 -6
  1301. data/src/core/lib/surface/byte_buffer.cc +9 -4
  1302. data/src/core/lib/surface/byte_buffer_reader.cc +7 -7
  1303. data/src/core/lib/surface/call.cc +2324 -1337
  1304. data/src/core/lib/surface/call.h +69 -21
  1305. data/src/core/lib/surface/call_details.cc +6 -6
  1306. data/src/core/lib/surface/call_log_batch.cc +7 -1
  1307. data/src/core/lib/surface/call_test_only.h +4 -1
  1308. data/src/core/lib/surface/call_trace.cc +113 -0
  1309. data/src/core/lib/surface/call_trace.h +30 -0
  1310. data/src/core/lib/surface/channel.cc +230 -328
  1311. data/src/core/lib/surface/channel.h +110 -74
  1312. data/src/core/lib/surface/channel_init.cc +2 -3
  1313. data/src/core/lib/surface/channel_init.h +4 -6
  1314. data/src/core/lib/surface/channel_ping.cc +9 -3
  1315. data/src/core/lib/surface/channel_stack_type.cc +4 -2
  1316. data/src/core/lib/surface/channel_stack_type.h +2 -2
  1317. data/src/core/lib/surface/completion_queue.cc +76 -94
  1318. data/src/core/lib/surface/completion_queue.h +8 -6
  1319. data/src/core/lib/surface/completion_queue_factory.cc +6 -0
  1320. data/src/core/lib/surface/completion_queue_factory.h +1 -3
  1321. data/src/core/lib/surface/event_string.cc +1 -7
  1322. data/src/core/lib/surface/event_string.h +1 -1
  1323. data/src/core/lib/surface/init.cc +87 -78
  1324. data/src/core/lib/surface/init.h +0 -10
  1325. data/src/core/lib/surface/init_internally.cc +24 -0
  1326. data/src/core/lib/surface/init_internally.h +36 -0
  1327. data/src/core/lib/surface/lame_client.cc +69 -107
  1328. data/src/core/lib/surface/lame_client.h +41 -3
  1329. data/src/core/lib/surface/metadata_array.cc +2 -0
  1330. data/src/core/lib/surface/server.cc +153 -206
  1331. data/src/core/lib/surface/server.h +64 -36
  1332. data/src/core/lib/surface/validate_metadata.cc +17 -31
  1333. data/src/core/lib/surface/validate_metadata.h +3 -0
  1334. data/src/core/lib/surface/version.cc +2 -2
  1335. data/src/core/lib/transport/bdp_estimator.cc +11 -12
  1336. data/src/core/lib/transport/bdp_estimator.h +4 -5
  1337. data/src/core/lib/transport/connectivity_state.cc +7 -6
  1338. data/src/core/lib/transport/connectivity_state.h +3 -4
  1339. data/src/core/lib/transport/error_utils.cc +45 -65
  1340. data/src/core/lib/transport/error_utils.h +10 -5
  1341. data/src/core/lib/transport/handshaker.cc +225 -0
  1342. data/src/core/lib/transport/handshaker.h +167 -0
  1343. data/src/core/lib/transport/handshaker_factory.h +74 -0
  1344. data/src/core/lib/transport/handshaker_registry.cc +61 -0
  1345. data/src/core/lib/transport/handshaker_registry.h +69 -0
  1346. data/src/core/lib/transport/http_connect_handshaker.cc +400 -0
  1347. data/src/core/lib/transport/http_connect_handshaker.h +42 -0
  1348. data/src/core/lib/transport/metadata_batch.cc +266 -69
  1349. data/src/core/lib/transport/metadata_batch.h +1108 -837
  1350. data/src/core/lib/transport/parsed_metadata.cc +35 -0
  1351. data/src/core/lib/transport/parsed_metadata.h +239 -93
  1352. data/src/core/lib/transport/pid_controller.cc +4 -4
  1353. data/src/core/lib/transport/status_conversion.cc +3 -3
  1354. data/src/core/lib/transport/status_conversion.h +3 -3
  1355. data/src/core/lib/transport/tcp_connect_handshaker.cc +246 -0
  1356. data/src/core/lib/transport/tcp_connect_handshaker.h +39 -0
  1357. data/src/core/lib/transport/timeout_encoding.cc +203 -70
  1358. data/src/core/lib/transport/timeout_encoding.h +44 -10
  1359. data/src/core/lib/transport/transport.cc +82 -58
  1360. data/src/core/lib/transport/transport.h +154 -35
  1361. data/src/core/lib/transport/transport_fwd.h +20 -0
  1362. data/src/core/lib/transport/transport_impl.h +24 -0
  1363. data/src/core/lib/transport/transport_op_string.cc +24 -66
  1364. data/src/core/lib/uri/uri_parser.cc +248 -66
  1365. data/src/core/lib/uri/uri_parser.h +39 -25
  1366. data/src/core/plugin_registry/grpc_plugin_registry.cc +56 -140
  1367. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +61 -0
  1368. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +76 -52
  1369. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
  1370. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +9 -1
  1371. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +43 -28
  1372. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +1 -1
  1373. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +4 -3
  1374. data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +1 -1
  1375. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +2 -2
  1376. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +2 -2
  1377. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +7 -7
  1378. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +7 -6
  1379. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  1380. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +14 -6
  1381. data/src/core/tsi/fake_transport_security.cc +69 -34
  1382. data/src/core/tsi/fake_transport_security.h +6 -0
  1383. data/src/core/tsi/local_transport_security.cc +24 -28
  1384. data/src/core/tsi/local_transport_security.h +1 -4
  1385. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +145 -0
  1386. data/src/core/tsi/ssl/key_logging/ssl_key_logging.h +81 -0
  1387. data/src/core/tsi/ssl/session_cache/ssl_session.h +3 -3
  1388. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +3 -1
  1389. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +13 -6
  1390. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +8 -2
  1391. data/src/core/tsi/ssl_transport_security.cc +249 -68
  1392. data/src/core/tsi/ssl_transport_security.h +47 -8
  1393. data/src/core/tsi/transport_security.cc +18 -6
  1394. data/src/core/tsi/transport_security.h +2 -1
  1395. data/src/core/tsi/transport_security_grpc.cc +3 -2
  1396. data/src/core/tsi/transport_security_grpc.h +5 -2
  1397. data/src/core/tsi/transport_security_interface.h +19 -5
  1398. data/src/ruby/ext/grpc/ext-export-truffleruby.clang +2 -0
  1399. data/src/ruby/ext/grpc/ext-export-truffleruby.gcc +7 -0
  1400. data/src/ruby/ext/grpc/ext-export.clang +1 -0
  1401. data/src/ruby/ext/grpc/ext-export.gcc +1 -0
  1402. data/src/ruby/ext/grpc/extconf.rb +61 -21
  1403. data/src/ruby/ext/grpc/rb_channel.c +5 -2
  1404. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +26 -36
  1405. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +40 -55
  1406. data/src/ruby/ext/grpc/rb_loader.c +6 -2
  1407. data/src/ruby/ext/grpc/rb_server.c +7 -4
  1408. data/src/ruby/lib/grpc/errors.rb +1 -1
  1409. data/src/ruby/lib/grpc/generic/active_call.rb +7 -1
  1410. data/src/ruby/lib/grpc/grpc.rb +1 -1
  1411. data/src/ruby/lib/grpc/version.rb +1 -1
  1412. data/src/ruby/pb/generate_proto_ruby.sh +1 -0
  1413. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +4 -0
  1414. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -1
  1415. data/src/ruby/pb/test/client.rb +769 -0
  1416. data/src/ruby/pb/test/server.rb +252 -0
  1417. data/src/ruby/pb/test/xds_client.rb +415 -0
  1418. data/src/ruby/spec/channel_spec.rb +5 -43
  1419. data/src/ruby/spec/generic/active_call_spec.rb +12 -3
  1420. data/src/ruby/spec/generic/client_stub_spec.rb +23 -23
  1421. data/src/ruby/spec/generic/server_interceptors_spec.rb +1 -1
  1422. data/src/ruby/spec/user_agent_spec.rb +1 -1
  1423. data/third_party/abseil-cpp/absl/algorithm/container.h +102 -92
  1424. data/third_party/abseil-cpp/absl/base/attributes.h +112 -52
  1425. data/third_party/abseil-cpp/absl/base/casts.h +61 -68
  1426. data/third_party/abseil-cpp/absl/base/config.h +245 -74
  1427. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +1 -26
  1428. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +12 -42
  1429. data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +67 -2
  1430. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +3 -3
  1431. data/third_party/abseil-cpp/absl/base/internal/endian.h +17 -62
  1432. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +50 -0
  1433. data/third_party/abseil-cpp/absl/base/internal/invoke.h +54 -0
  1434. data/third_party/abseil-cpp/absl/base/internal/prefetch.h +138 -0
  1435. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +29 -22
  1436. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +13 -12
  1437. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +3 -0
  1438. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +11 -1
  1439. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +2 -5
  1440. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +2 -0
  1441. data/third_party/abseil-cpp/absl/base/internal/strerror.cc +88 -0
  1442. data/third_party/abseil-cpp/absl/base/internal/strerror.h +39 -0
  1443. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +68 -0
  1444. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +2 -1
  1445. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +4 -4
  1446. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +22 -7
  1447. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +15 -6
  1448. data/third_party/abseil-cpp/absl/base/log_severity.cc +28 -0
  1449. data/third_party/abseil-cpp/absl/base/log_severity.h +51 -0
  1450. data/third_party/abseil-cpp/absl/base/optimization.h +19 -11
  1451. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  1452. data/third_party/abseil-cpp/absl/base/thread_annotations.h +2 -2
  1453. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  1454. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  1455. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -5
  1456. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +11 -4
  1457. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +510 -0
  1458. data/third_party/abseil-cpp/absl/container/inlined_vector.h +118 -99
  1459. data/third_party/abseil-cpp/absl/container/internal/common.h +6 -5
  1460. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +10 -28
  1461. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +17 -15
  1462. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +77 -113
  1463. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +62 -85
  1464. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +417 -431
  1465. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +3 -2
  1466. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +18 -8
  1467. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +724 -262
  1468. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +45 -88
  1469. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +11 -1
  1470. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +16 -11
  1471. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +7 -2
  1472. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +8 -3
  1473. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +8 -3
  1474. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +13 -5
  1475. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +110 -0
  1476. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +8 -3
  1477. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +236 -0
  1478. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +33 -10
  1479. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +8 -2
  1480. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +35 -4
  1481. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +2 -0
  1482. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +7 -0
  1483. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +60 -7
  1484. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +72 -0
  1485. data/third_party/abseil-cpp/absl/functional/any_invocable.h +313 -0
  1486. data/third_party/abseil-cpp/absl/functional/bind_front.h +10 -1
  1487. data/third_party/abseil-cpp/absl/functional/function_ref.h +6 -2
  1488. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +857 -0
  1489. data/third_party/abseil-cpp/absl/hash/hash.h +104 -8
  1490. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +15 -16
  1491. data/third_party/abseil-cpp/absl/hash/internal/hash.h +297 -51
  1492. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +123 -0
  1493. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.h +50 -0
  1494. data/third_party/abseil-cpp/absl/memory/memory.h +1 -1
  1495. data/third_party/abseil-cpp/absl/meta/type_traits.h +32 -2
  1496. data/third_party/abseil-cpp/absl/numeric/bits.h +2 -1
  1497. data/third_party/abseil-cpp/absl/numeric/int128.cc +7 -12
  1498. data/third_party/abseil-cpp/absl/numeric/int128.h +148 -75
  1499. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +19 -25
  1500. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +73 -70
  1501. data/third_party/abseil-cpp/absl/profiling/internal/exponential_biased.cc +93 -0
  1502. data/third_party/abseil-cpp/absl/profiling/internal/exponential_biased.h +130 -0
  1503. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +245 -0
  1504. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +200 -0
  1505. data/third_party/abseil-cpp/absl/random/beta_distribution.h +427 -0
  1506. data/third_party/abseil-cpp/absl/random/discrete_distribution.cc +98 -0
  1507. data/third_party/abseil-cpp/absl/random/discrete_distribution.h +247 -0
  1508. data/third_party/abseil-cpp/absl/random/distributions.h +452 -0
  1509. data/third_party/abseil-cpp/absl/random/exponential_distribution.h +165 -0
  1510. data/third_party/abseil-cpp/absl/random/gaussian_distribution.cc +104 -0
  1511. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +275 -0
  1512. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +95 -0
  1513. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +269 -0
  1514. data/third_party/abseil-cpp/absl/random/internal/fastmath.h +57 -0
  1515. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +144 -0
  1516. data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +245 -0
  1517. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +161 -0
  1518. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +308 -0
  1519. data/third_party/abseil-cpp/absl/random/internal/platform.h +171 -0
  1520. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +253 -0
  1521. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +131 -0
  1522. data/third_party/abseil-cpp/absl/random/internal/randen.cc +91 -0
  1523. data/third_party/abseil-cpp/absl/random/internal/randen.h +96 -0
  1524. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +225 -0
  1525. data/third_party/abseil-cpp/absl/random/internal/randen_detect.h +33 -0
  1526. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +264 -0
  1527. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +526 -0
  1528. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h +50 -0
  1529. data/third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc +462 -0
  1530. data/third_party/abseil-cpp/absl/random/internal/randen_slow.cc +471 -0
  1531. data/third_party/abseil-cpp/absl/random/internal/randen_slow.h +40 -0
  1532. data/third_party/abseil-cpp/absl/random/internal/randen_traits.h +88 -0
  1533. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +165 -0
  1534. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +267 -0
  1535. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +104 -0
  1536. data/third_party/abseil-cpp/absl/random/internal/traits.h +149 -0
  1537. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +244 -0
  1538. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +96 -0
  1539. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +256 -0
  1540. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +261 -0
  1541. data/third_party/abseil-cpp/absl/random/random.h +189 -0
  1542. data/third_party/abseil-cpp/absl/random/seed_gen_exception.cc +46 -0
  1543. data/third_party/abseil-cpp/absl/random/seed_gen_exception.h +55 -0
  1544. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +29 -0
  1545. data/third_party/abseil-cpp/absl/random/seed_sequences.h +111 -0
  1546. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +275 -0
  1547. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +202 -0
  1548. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +272 -0
  1549. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +22 -5
  1550. data/third_party/abseil-cpp/absl/status/status.cc +183 -19
  1551. data/third_party/abseil-cpp/absl/status/status.h +41 -27
  1552. data/third_party/abseil-cpp/absl/status/statusor.cc +34 -2
  1553. data/third_party/abseil-cpp/absl/status/statusor.h +40 -24
  1554. data/third_party/abseil-cpp/absl/strings/ascii.h +4 -4
  1555. data/third_party/abseil-cpp/absl/strings/charconv.cc +3 -3
  1556. data/third_party/abseil-cpp/absl/strings/charconv.h +3 -2
  1557. data/third_party/abseil-cpp/absl/strings/cord.cc +469 -1094
  1558. data/third_party/abseil-cpp/absl/strings/cord.h +392 -144
  1559. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +188 -0
  1560. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +44 -0
  1561. data/third_party/abseil-cpp/absl/strings/cord_buffer.cc +30 -0
  1562. data/third_party/abseil-cpp/absl/strings/cord_buffer.h +572 -0
  1563. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +1 -1
  1564. data/third_party/abseil-cpp/absl/strings/internal/cord_data_edge.h +63 -0
  1565. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +23 -29
  1566. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +208 -96
  1567. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +1228 -0
  1568. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +924 -0
  1569. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +187 -0
  1570. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +267 -0
  1571. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +69 -0
  1572. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +212 -0
  1573. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +62 -0
  1574. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.h +50 -0
  1575. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +54 -0
  1576. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +102 -0
  1577. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +60 -19
  1578. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +48 -172
  1579. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +42 -24
  1580. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +4 -0
  1581. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc +96 -0
  1582. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +85 -0
  1583. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +139 -0
  1584. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +131 -0
  1585. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +418 -0
  1586. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +298 -0
  1587. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +88 -0
  1588. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_scope.h +71 -0
  1589. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +123 -0
  1590. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +6 -5
  1591. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +1 -1
  1592. data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +48 -2
  1593. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +1 -1
  1594. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +9 -1
  1595. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +3 -4
  1596. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +39 -8
  1597. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -2
  1598. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +10 -11
  1599. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +41 -20
  1600. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +2 -1
  1601. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +62 -73
  1602. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +28 -18
  1603. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +9 -6
  1604. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +35 -35
  1605. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +10 -2
  1606. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +9 -9
  1607. data/third_party/abseil-cpp/absl/strings/numbers.cc +9 -9
  1608. data/third_party/abseil-cpp/absl/strings/numbers.h +60 -23
  1609. data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
  1610. data/third_party/abseil-cpp/absl/strings/str_cat.h +20 -13
  1611. data/third_party/abseil-cpp/absl/strings/str_format.h +1 -2
  1612. data/third_party/abseil-cpp/absl/strings/str_join.h +9 -15
  1613. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -2
  1614. data/third_party/abseil-cpp/absl/strings/string_view.cc +18 -34
  1615. data/third_party/abseil-cpp/absl/strings/string_view.h +123 -41
  1616. data/third_party/abseil-cpp/absl/strings/strip.h +8 -6
  1617. data/third_party/abseil-cpp/absl/strings/substitute.cc +2 -1
  1618. data/third_party/abseil-cpp/absl/strings/substitute.h +109 -76
  1619. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +25 -15
  1620. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +5 -3
  1621. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +9 -6
  1622. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +0 -4
  1623. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +0 -4
  1624. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -6
  1625. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -26
  1626. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +10 -4
  1627. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -40
  1628. data/third_party/abseil-cpp/absl/synchronization/mutex.h +20 -12
  1629. data/third_party/abseil-cpp/absl/synchronization/notification.h +3 -2
  1630. data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -3
  1631. data/third_party/abseil-cpp/absl/time/duration.cc +5 -4
  1632. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +11 -7
  1633. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +93 -20
  1634. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +1 -1
  1635. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +2 -1
  1636. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +83 -21
  1637. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +49 -0
  1638. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +1 -1
  1639. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -3
  1640. data/third_party/abseil-cpp/absl/time/time.h +82 -47
  1641. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +1 -1
  1642. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +2 -2
  1643. data/third_party/abseil-cpp/absl/types/internal/optional.h +8 -0
  1644. data/third_party/abseil-cpp/absl/types/internal/variant.h +3 -3
  1645. data/third_party/abseil-cpp/absl/types/optional.h +17 -14
  1646. data/third_party/abseil-cpp/absl/types/span.h +5 -4
  1647. data/third_party/boringssl-with-bazel/err_data.c +681 -677
  1648. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +19 -11
  1649. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +41 -30
  1650. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +1 -1
  1651. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +59 -47
  1652. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +24 -28
  1653. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +5 -0
  1654. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +28 -0
  1655. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +48 -272
  1656. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -0
  1657. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +8 -6
  1658. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +13 -0
  1659. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +3 -1
  1660. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +21 -0
  1661. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +2 -2
  1662. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +12 -0
  1663. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +1 -2
  1664. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +7 -7
  1665. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +2 -2
  1666. data/third_party/boringssl-with-bazel/src/crypto/mem.c +18 -0
  1667. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +29 -0
  1668. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +0 -1
  1669. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +1 -1
  1670. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  1671. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +5 -1
  1672. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +59 -23
  1673. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +2 -18
  1674. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +8 -2
  1675. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +216 -11
  1676. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -1
  1677. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
  1678. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c +1 -1
  1679. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -1
  1680. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c +1 -1
  1681. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +1 -1
  1682. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +1 -0
  1683. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +0 -1
  1684. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +21 -4
  1685. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +971 -253
  1686. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +3 -3
  1687. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +0 -1
  1688. data/third_party/boringssl-with-bazel/src/include/openssl/base64.h +8 -0
  1689. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +13 -1
  1690. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +4 -12
  1691. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +27 -41
  1692. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +12 -27
  1693. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +8 -10
  1694. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +29 -55
  1695. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +1 -1
  1696. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +12 -13
  1697. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +6 -1
  1698. data/third_party/boringssl-with-bazel/src/include/openssl/pool.h +7 -1
  1699. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +24 -28
  1700. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +29 -11
  1701. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +12 -43
  1702. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +4 -3
  1703. data/third_party/boringssl-with-bazel/src/ssl/internal.h +3 -3
  1704. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +4 -0
  1705. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +4 -0
  1706. data/third_party/cares/cares/include/ares.h +742 -0
  1707. data/third_party/cares/cares/include/ares_dns.h +112 -0
  1708. data/third_party/cares/cares/{ares_rules.h → include/ares_rules.h} +0 -0
  1709. data/third_party/cares/cares/include/ares_version.h +24 -0
  1710. data/third_party/cares/cares/src/lib/ares__close_sockets.c +61 -0
  1711. data/third_party/cares/cares/src/lib/ares__get_hostent.c +260 -0
  1712. data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +260 -0
  1713. data/third_party/cares/cares/{ares__read_line.c → src/lib/ares__read_line.c} +0 -0
  1714. data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +264 -0
  1715. data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +499 -0
  1716. data/third_party/cares/cares/{ares__timeval.c → src/lib/ares__timeval.c} +0 -0
  1717. data/third_party/cares/cares/src/lib/ares_android.c +444 -0
  1718. data/third_party/cares/cares/src/lib/ares_android.h +27 -0
  1719. data/third_party/cares/cares/{ares_cancel.c → src/lib/ares_cancel.c} +0 -0
  1720. data/third_party/cares/cares/src/lib/ares_create_query.c +197 -0
  1721. data/third_party/cares/cares/src/lib/ares_data.c +240 -0
  1722. data/third_party/cares/cares/src/lib/ares_data.h +74 -0
  1723. data/third_party/cares/cares/{ares_destroy.c → src/lib/ares_destroy.c} +0 -0
  1724. data/third_party/cares/cares/src/lib/ares_expand_name.c +300 -0
  1725. data/third_party/cares/cares/src/lib/ares_expand_string.c +67 -0
  1726. data/third_party/cares/cares/{ares_fds.c → src/lib/ares_fds.c} +0 -0
  1727. data/third_party/cares/cares/src/lib/ares_free_hostent.c +43 -0
  1728. data/third_party/cares/cares/{ares_free_string.c → src/lib/ares_free_string.c} +0 -0
  1729. data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +59 -0
  1730. data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +772 -0
  1731. data/third_party/cares/cares/src/lib/ares_getenv.c +28 -0
  1732. data/third_party/cares/cares/{ares_getenv.h → src/lib/ares_getenv.h} +0 -0
  1733. data/third_party/cares/cares/src/lib/ares_gethostbyaddr.c +287 -0
  1734. data/third_party/cares/cares/src/lib/ares_gethostbyname.c +534 -0
  1735. data/third_party/cares/cares/src/lib/ares_getnameinfo.c +447 -0
  1736. data/third_party/cares/cares/{ares_getsock.c → src/lib/ares_getsock.c} +0 -0
  1737. data/third_party/cares/cares/{ares_inet_net_pton.h → src/lib/ares_inet_net_pton.h} +0 -0
  1738. data/third_party/cares/cares/src/lib/ares_init.c +2654 -0
  1739. data/third_party/cares/cares/{ares_iphlpapi.h → src/lib/ares_iphlpapi.h} +0 -0
  1740. data/third_party/cares/cares/src/lib/ares_ipv6.h +85 -0
  1741. data/third_party/cares/cares/src/lib/ares_library_init.c +200 -0
  1742. data/third_party/cares/cares/src/lib/ares_library_init.h +43 -0
  1743. data/third_party/cares/cares/{ares_llist.c → src/lib/ares_llist.c} +0 -0
  1744. data/third_party/cares/cares/{ares_llist.h → src/lib/ares_llist.h} +0 -0
  1745. data/third_party/cares/cares/{ares_mkquery.c → src/lib/ares_mkquery.c} +0 -0
  1746. data/third_party/cares/cares/src/lib/ares_nameser.h +482 -0
  1747. data/third_party/cares/cares/{ares_nowarn.c → src/lib/ares_nowarn.c} +0 -0
  1748. data/third_party/cares/cares/{ares_nowarn.h → src/lib/ares_nowarn.h} +0 -0
  1749. data/third_party/cares/cares/{ares_options.c → src/lib/ares_options.c} +0 -0
  1750. data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +209 -0
  1751. data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +212 -0
  1752. data/third_party/cares/cares/src/lib/ares_parse_caa_reply.c +199 -0
  1753. data/third_party/cares/cares/src/lib/ares_parse_mx_reply.c +164 -0
  1754. data/third_party/cares/cares/src/lib/ares_parse_naptr_reply.c +183 -0
  1755. data/third_party/cares/cares/src/lib/ares_parse_ns_reply.c +177 -0
  1756. data/third_party/cares/cares/src/lib/ares_parse_ptr_reply.c +228 -0
  1757. data/third_party/cares/cares/src/lib/ares_parse_soa_reply.c +179 -0
  1758. data/third_party/cares/cares/src/lib/ares_parse_srv_reply.c +168 -0
  1759. data/third_party/cares/cares/src/lib/ares_parse_txt_reply.c +214 -0
  1760. data/third_party/cares/cares/{ares_platform.c → src/lib/ares_platform.c} +0 -0
  1761. data/third_party/cares/cares/{ares_platform.h → src/lib/ares_platform.h} +0 -0
  1762. data/third_party/cares/cares/src/lib/ares_private.h +423 -0
  1763. data/third_party/cares/cares/src/lib/ares_process.c +1548 -0
  1764. data/third_party/cares/cares/src/lib/ares_query.c +180 -0
  1765. data/third_party/cares/cares/src/lib/ares_search.c +321 -0
  1766. data/third_party/cares/cares/src/lib/ares_send.c +131 -0
  1767. data/third_party/cares/cares/src/lib/ares_setup.h +220 -0
  1768. data/third_party/cares/cares/{ares_strcasecmp.c → src/lib/ares_strcasecmp.c} +0 -0
  1769. data/third_party/cares/cares/{ares_strcasecmp.h → src/lib/ares_strcasecmp.h} +0 -0
  1770. data/third_party/cares/cares/{ares_strdup.c → src/lib/ares_strdup.c} +0 -0
  1771. data/third_party/cares/cares/{ares_strdup.h → src/lib/ares_strdup.h} +0 -0
  1772. data/third_party/cares/cares/{ares_strerror.c → src/lib/ares_strerror.c} +0 -0
  1773. data/third_party/cares/cares/src/lib/ares_strsplit.c +178 -0
  1774. data/third_party/cares/cares/{ares_strsplit.h → src/lib/ares_strsplit.h} +0 -0
  1775. data/third_party/cares/cares/{ares_timeout.c → src/lib/ares_timeout.c} +0 -0
  1776. data/third_party/cares/cares/{ares_version.c → src/lib/ares_version.c} +0 -0
  1777. data/third_party/cares/cares/{ares_writev.c → src/lib/ares_writev.c} +0 -0
  1778. data/third_party/cares/cares/src/lib/ares_writev.h +36 -0
  1779. data/third_party/cares/cares/{bitncmp.c → src/lib/bitncmp.c} +0 -0
  1780. data/third_party/cares/cares/{bitncmp.h → src/lib/bitncmp.h} +0 -0
  1781. data/third_party/cares/cares/src/lib/config-dos.h +115 -0
  1782. data/third_party/cares/cares/{config-win32.h → src/lib/config-win32.h} +0 -0
  1783. data/third_party/cares/cares/src/lib/inet_net_pton.c +444 -0
  1784. data/third_party/cares/cares/src/lib/inet_ntop.c +201 -0
  1785. data/third_party/cares/cares/{setup_once.h → src/lib/setup_once.h} +0 -0
  1786. data/third_party/cares/cares/{windows_port.c → src/lib/windows_port.c} +0 -0
  1787. data/third_party/upb/third_party/utf8_range/naive.c +92 -0
  1788. data/third_party/upb/third_party/utf8_range/range2-neon.c +157 -0
  1789. data/third_party/upb/third_party/utf8_range/range2-sse.c +170 -0
  1790. data/third_party/upb/third_party/utf8_range/utf8_range.h +9 -0
  1791. data/third_party/upb/upb/arena.c +277 -0
  1792. data/third_party/upb/upb/arena.h +225 -0
  1793. data/third_party/upb/upb/array.c +114 -0
  1794. data/third_party/upb/upb/array.h +83 -0
  1795. data/third_party/upb/upb/collections.h +36 -0
  1796. data/third_party/upb/upb/decode.c +832 -382
  1797. data/third_party/upb/upb/decode.h +44 -17
  1798. data/third_party/upb/upb/decode_fast.c +304 -302
  1799. data/third_party/upb/upb/decode_fast.h +18 -18
  1800. data/third_party/upb/upb/def.c +2083 -982
  1801. data/third_party/upb/upb/def.h +339 -260
  1802. data/third_party/upb/upb/def.hpp +144 -171
  1803. data/third_party/upb/upb/encode.c +287 -185
  1804. data/third_party/upb/upb/encode.h +24 -16
  1805. data/third_party/upb/upb/extension_registry.c +93 -0
  1806. data/third_party/upb/upb/extension_registry.h +84 -0
  1807. data/third_party/upb/upb/internal/decode.h +211 -0
  1808. data/third_party/upb/upb/internal/table.h +385 -0
  1809. data/third_party/upb/upb/internal/upb.h +68 -0
  1810. data/third_party/upb/upb/internal/vsnprintf_compat.h +52 -0
  1811. data/third_party/upb/upb/json_decode.c +1512 -0
  1812. data/third_party/upb/upb/json_decode.h +47 -0
  1813. data/third_party/upb/upb/json_encode.c +780 -0
  1814. data/third_party/upb/upb/json_encode.h +65 -0
  1815. data/third_party/upb/upb/map.c +108 -0
  1816. data/third_party/upb/upb/map.h +117 -0
  1817. data/third_party/upb/upb/message_value.h +66 -0
  1818. data/third_party/upb/upb/mini_table.c +1147 -0
  1819. data/third_party/upb/upb/mini_table.h +189 -0
  1820. data/third_party/upb/upb/mini_table.hpp +112 -0
  1821. data/third_party/upb/upb/msg.c +132 -161
  1822. data/third_party/upb/upb/msg.h +18 -55
  1823. data/third_party/upb/upb/msg_internal.h +404 -254
  1824. data/third_party/upb/upb/port_def.inc +10 -1
  1825. data/third_party/upb/upb/port_undef.inc +2 -0
  1826. data/third_party/upb/upb/reflection.c +203 -280
  1827. data/third_party/upb/upb/reflection.h +40 -126
  1828. data/third_party/upb/upb/reflection.hpp +6 -6
  1829. data/third_party/upb/upb/status.c +86 -0
  1830. data/third_party/upb/upb/status.h +66 -0
  1831. data/third_party/upb/upb/table.c +233 -149
  1832. data/third_party/upb/upb/table_internal.h +9 -324
  1833. data/third_party/upb/upb/text_encode.c +116 -92
  1834. data/third_party/upb/upb/text_encode.h +10 -10
  1835. data/third_party/upb/upb/upb.c +34 -273
  1836. data/third_party/upb/upb/upb.h +79 -262
  1837. data/third_party/upb/upb/upb.hpp +31 -28
  1838. data/third_party/xxhash/xxhash.h +607 -352
  1839. data/third_party/zlib/compress.c +3 -3
  1840. data/third_party/zlib/crc32.c +975 -292
  1841. data/third_party/zlib/crc32.h +9441 -436
  1842. data/third_party/zlib/deflate.c +183 -129
  1843. data/third_party/zlib/deflate.h +12 -15
  1844. data/third_party/zlib/gzguts.h +3 -2
  1845. data/third_party/zlib/gzlib.c +6 -4
  1846. data/third_party/zlib/gzread.c +8 -12
  1847. data/third_party/zlib/gzwrite.c +26 -14
  1848. data/third_party/zlib/infback.c +12 -8
  1849. data/third_party/zlib/inffast.c +14 -14
  1850. data/third_party/zlib/inflate.c +44 -10
  1851. data/third_party/zlib/inflate.h +3 -2
  1852. data/third_party/zlib/inftrees.c +3 -3
  1853. data/third_party/zlib/inftrees.h +1 -1
  1854. data/third_party/zlib/trees.c +85 -107
  1855. data/third_party/zlib/uncompr.c +2 -2
  1856. data/third_party/zlib/zconf.h +16 -3
  1857. data/third_party/zlib/zlib.h +129 -106
  1858. data/third_party/zlib/zutil.c +11 -9
  1859. data/third_party/zlib/zutil.h +13 -9
  1860. metadata +713 -295
  1861. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +0 -392
  1862. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +0 -42
  1863. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +0 -44
  1864. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +0 -83
  1865. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +0 -60
  1866. data/src/core/ext/filters/client_channel/lb_policy.cc +0 -131
  1867. data/src/core/ext/filters/client_channel/lb_policy.h +0 -425
  1868. data/src/core/ext/filters/client_channel/lb_policy_factory.h +0 -48
  1869. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +0 -185
  1870. data/src/core/ext/filters/client_channel/lb_policy_registry.h +0 -65
  1871. data/src/core/ext/filters/client_channel/proxy_mapper.h +0 -54
  1872. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +0 -89
  1873. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +0 -50
  1874. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc +0 -31
  1875. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc +0 -28
  1876. data/src/core/ext/filters/client_channel/resolver.cc +0 -87
  1877. data/src/core/ext/filters/client_channel/resolver.h +0 -136
  1878. data/src/core/ext/filters/client_channel/resolver_factory.h +0 -75
  1879. data/src/core/ext/filters/client_channel/resolver_registry.cc +0 -195
  1880. data/src/core/ext/filters/client_channel/resolver_registry.h +0 -89
  1881. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -189
  1882. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +0 -99
  1883. data/src/core/ext/filters/client_channel/server_address.cc +0 -170
  1884. data/src/core/ext/filters/client_channel/server_address.h +0 -144
  1885. data/src/core/ext/filters/client_channel/subchannel_interface.h +0 -130
  1886. data/src/core/ext/filters/client_idle/client_idle_filter.cc +0 -264
  1887. data/src/core/ext/filters/client_idle/idle_filter_state.cc +0 -96
  1888. data/src/core/ext/filters/client_idle/idle_filter_state.h +0 -66
  1889. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -181
  1890. data/src/core/ext/filters/fault_injection/service_config_parser.h +0 -85
  1891. data/src/core/ext/filters/max_age/max_age_filter.cc +0 -560
  1892. data/src/core/ext/filters/max_age/max_age_filter.h +0 -26
  1893. data/src/core/ext/service_config/service_config.cc +0 -227
  1894. data/src/core/ext/service_config/service_config.h +0 -127
  1895. data/src/core/ext/service_config/service_config_call_data.h +0 -72
  1896. data/src/core/ext/service_config/service_config_parser.cc +0 -89
  1897. data/src/core/ext/service_config/service_config_parser.h +0 -97
  1898. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +0 -119
  1899. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +0 -95
  1900. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +0 -189
  1901. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +0 -53
  1902. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +0 -83
  1903. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +0 -125
  1904. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +0 -37
  1905. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +0 -107
  1906. data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +0 -46
  1907. data/src/core/ext/transport/chttp2/transport/hpack_utils.h +0 -30
  1908. data/src/core/ext/transport/chttp2/transport/popularity_count.h +0 -60
  1909. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +0 -27
  1910. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +0 -62
  1911. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +0 -27
  1912. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +0 -62
  1913. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +0 -27
  1914. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +0 -62
  1915. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +0 -27
  1916. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +0 -62
  1917. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +0 -27
  1918. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +0 -62
  1919. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +0 -72
  1920. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.h +0 -35
  1921. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +0 -73
  1922. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.h +0 -35
  1923. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +0 -72
  1924. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.h +0 -35
  1925. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +0 -80
  1926. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.h +0 -35
  1927. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +0 -74
  1928. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.h +0 -35
  1929. data/src/core/ext/xds/certificate_provider_factory.h +0 -61
  1930. data/src/core/ext/xds/certificate_provider_registry.cc +0 -103
  1931. data/src/core/ext/xds/certificate_provider_registry.h +0 -57
  1932. data/src/core/lib/avl/avl.cc +0 -306
  1933. data/src/core/lib/channel/handshaker.cc +0 -222
  1934. data/src/core/lib/channel/handshaker.h +0 -161
  1935. data/src/core/lib/channel/handshaker_factory.h +0 -50
  1936. data/src/core/lib/channel/handshaker_registry.cc +0 -50
  1937. data/src/core/lib/channel/handshaker_registry.h +0 -71
  1938. data/src/core/lib/compression/algorithm_metadata.h +0 -62
  1939. data/src/core/lib/compression/compression_args.cc +0 -138
  1940. data/src/core/lib/compression/compression_args.h +0 -56
  1941. data/src/core/lib/compression/stream_compression.cc +0 -81
  1942. data/src/core/lib/compression/stream_compression.h +0 -117
  1943. data/src/core/lib/compression/stream_compression_gzip.cc +0 -231
  1944. data/src/core/lib/compression/stream_compression_gzip.h +0 -28
  1945. data/src/core/lib/compression/stream_compression_identity.cc +0 -91
  1946. data/src/core/lib/compression/stream_compression_identity.h +0 -29
  1947. data/src/core/lib/event_engine/endpoint_config.cc +0 -45
  1948. data/src/core/lib/event_engine/endpoint_config_internal.h +0 -42
  1949. data/src/core/lib/event_engine/event_engine.cc +0 -50
  1950. data/src/core/lib/event_engine/sockaddr.cc +0 -40
  1951. data/src/core/lib/event_engine/sockaddr.h +0 -44
  1952. data/src/core/lib/gpr/env.h +0 -40
  1953. data/src/core/lib/gpr/env_linux.cc +0 -75
  1954. data/src/core/lib/gpr/env_posix.cc +0 -46
  1955. data/src/core/lib/gpr/env_windows.cc +0 -74
  1956. data/src/core/lib/gpr/murmur_hash.cc +0 -82
  1957. data/src/core/lib/gpr/murmur_hash.h +0 -29
  1958. data/src/core/lib/gpr/string_windows.h +0 -32
  1959. data/src/core/lib/gpr/tls.h +0 -151
  1960. data/src/core/lib/gprpp/arena.cc +0 -104
  1961. data/src/core/lib/gprpp/arena.h +0 -131
  1962. data/src/core/lib/iomgr/endpoint_pair_event_engine.cc +0 -32
  1963. data/src/core/lib/iomgr/error_internal.h +0 -66
  1964. data/src/core/lib/iomgr/ev_epollex_linux.cc +0 -1654
  1965. data/src/core/lib/iomgr/ev_epollex_linux.h +0 -30
  1966. data/src/core/lib/iomgr/event_engine/closure.cc +0 -77
  1967. data/src/core/lib/iomgr/event_engine/closure.h +0 -42
  1968. data/src/core/lib/iomgr/event_engine/endpoint.cc +0 -173
  1969. data/src/core/lib/iomgr/event_engine/endpoint.h +0 -52
  1970. data/src/core/lib/iomgr/event_engine/iomgr.cc +0 -104
  1971. data/src/core/lib/iomgr/event_engine/iomgr.h +0 -42
  1972. data/src/core/lib/iomgr/event_engine/pollset.cc +0 -88
  1973. data/src/core/lib/iomgr/event_engine/pollset.h +0 -25
  1974. data/src/core/lib/iomgr/event_engine/promise.h +0 -51
  1975. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +0 -41
  1976. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +0 -35
  1977. data/src/core/lib/iomgr/event_engine/resolver.cc +0 -114
  1978. data/src/core/lib/iomgr/event_engine/tcp.cc +0 -293
  1979. data/src/core/lib/iomgr/event_engine/timer.cc +0 -62
  1980. data/src/core/lib/iomgr/executor/mpmcqueue.cc +0 -182
  1981. data/src/core/lib/iomgr/executor/mpmcqueue.h +0 -171
  1982. data/src/core/lib/iomgr/executor/threadpool.cc +0 -136
  1983. data/src/core/lib/iomgr/executor/threadpool.h +0 -150
  1984. data/src/core/lib/iomgr/iomgr_custom.cc +0 -79
  1985. data/src/core/lib/iomgr/iomgr_custom.h +0 -49
  1986. data/src/core/lib/iomgr/is_epollexclusive_available.cc +0 -119
  1987. data/src/core/lib/iomgr/is_epollexclusive_available.h +0 -36
  1988. data/src/core/lib/iomgr/pollset_custom.cc +0 -105
  1989. data/src/core/lib/iomgr/pollset_custom.h +0 -37
  1990. data/src/core/lib/iomgr/pollset_set_custom.cc +0 -47
  1991. data/src/core/lib/iomgr/pollset_set_custom.h +0 -26
  1992. data/src/core/lib/iomgr/resolve_address_custom.cc +0 -169
  1993. data/src/core/lib/iomgr/resolve_address_custom.h +0 -44
  1994. data/src/core/lib/iomgr/resource_quota.cc +0 -1106
  1995. data/src/core/lib/iomgr/resource_quota.h +0 -226
  1996. data/src/core/lib/iomgr/sys_epoll_wrapper.h +0 -30
  1997. data/src/core/lib/iomgr/tcp_client_custom.cc +0 -152
  1998. data/src/core/lib/iomgr/tcp_custom.cc +0 -377
  1999. data/src/core/lib/iomgr/tcp_custom.h +0 -86
  2000. data/src/core/lib/iomgr/tcp_server_custom.cc +0 -467
  2001. data/src/core/lib/iomgr/time_averaged_stats.cc +0 -64
  2002. data/src/core/lib/iomgr/time_averaged_stats.h +0 -72
  2003. data/src/core/lib/iomgr/timer_custom.cc +0 -96
  2004. data/src/core/lib/iomgr/timer_custom.h +0 -43
  2005. data/src/core/lib/iomgr/work_serializer.cc +0 -155
  2006. data/src/core/lib/iomgr/work_serializer.h +0 -81
  2007. data/src/core/lib/profiling/basic_timers.cc +0 -295
  2008. data/src/core/lib/profiling/stap_timers.cc +0 -50
  2009. data/src/core/lib/profiling/timers.h +0 -94
  2010. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +0 -171
  2011. data/src/core/lib/security/authorization/sdk_server_authz_filter.h +0 -67
  2012. data/src/core/lib/security/credentials/credentials_metadata.cc +0 -61
  2013. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +0 -171
  2014. data/src/core/lib/security/security_connector/load_system_roots_linux.h +0 -46
  2015. data/src/core/lib/slice/slice_api.cc +0 -39
  2016. data/src/core/lib/slice/slice_intern.cc +0 -367
  2017. data/src/core/lib/slice/slice_refcount.cc +0 -17
  2018. data/src/core/lib/slice/slice_refcount_base.h +0 -173
  2019. data/src/core/lib/slice/slice_split.cc +0 -100
  2020. data/src/core/lib/slice/slice_split.h +0 -40
  2021. data/src/core/lib/slice/slice_utils.h +0 -200
  2022. data/src/core/lib/slice/static_slice.cc +0 -529
  2023. data/src/core/lib/slice/static_slice.h +0 -331
  2024. data/src/core/lib/surface/init_secure.cc +0 -103
  2025. data/src/core/lib/transport/byte_stream.cc +0 -158
  2026. data/src/core/lib/transport/byte_stream.h +0 -166
  2027. data/src/core/lib/transport/metadata.cc +0 -714
  2028. data/src/core/lib/transport/metadata.h +0 -449
  2029. data/src/core/lib/transport/static_metadata.cc +0 -1117
  2030. data/src/core/lib/transport/static_metadata.h +0 -340
  2031. data/src/core/lib/transport/status_metadata.cc +0 -63
  2032. data/src/core/lib/transport/status_metadata.h +0 -48
  2033. data/third_party/abseil-cpp/absl/base/internal/exponential_biased.cc +0 -93
  2034. data/third_party/abseil-cpp/absl/base/internal/exponential_biased.h +0 -130
  2035. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +0 -50
  2036. data/third_party/abseil-cpp/absl/hash/internal/wyhash.cc +0 -111
  2037. data/third_party/abseil-cpp/absl/hash/internal/wyhash.h +0 -48
  2038. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +0 -93
  2039. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +0 -217
  2040. data/third_party/cares/cares/ares.h +0 -670
  2041. data/third_party/cares/cares/ares__close_sockets.c +0 -61
  2042. data/third_party/cares/cares/ares__get_hostent.c +0 -261
  2043. data/third_party/cares/cares/ares_create_query.c +0 -206
  2044. data/third_party/cares/cares/ares_data.c +0 -222
  2045. data/third_party/cares/cares/ares_data.h +0 -72
  2046. data/third_party/cares/cares/ares_dns.h +0 -103
  2047. data/third_party/cares/cares/ares_expand_name.c +0 -209
  2048. data/third_party/cares/cares/ares_expand_string.c +0 -70
  2049. data/third_party/cares/cares/ares_free_hostent.c +0 -41
  2050. data/third_party/cares/cares/ares_getenv.c +0 -30
  2051. data/third_party/cares/cares/ares_gethostbyaddr.c +0 -294
  2052. data/third_party/cares/cares/ares_gethostbyname.c +0 -529
  2053. data/third_party/cares/cares/ares_getnameinfo.c +0 -453
  2054. data/third_party/cares/cares/ares_getopt.c +0 -122
  2055. data/third_party/cares/cares/ares_getopt.h +0 -53
  2056. data/third_party/cares/cares/ares_init.c +0 -2615
  2057. data/third_party/cares/cares/ares_ipv6.h +0 -78
  2058. data/third_party/cares/cares/ares_library_init.c +0 -195
  2059. data/third_party/cares/cares/ares_library_init.h +0 -43
  2060. data/third_party/cares/cares/ares_parse_a_reply.c +0 -264
  2061. data/third_party/cares/cares/ares_parse_aaaa_reply.c +0 -264
  2062. data/third_party/cares/cares/ares_parse_mx_reply.c +0 -170
  2063. data/third_party/cares/cares/ares_parse_naptr_reply.c +0 -194
  2064. data/third_party/cares/cares/ares_parse_ns_reply.c +0 -183
  2065. data/third_party/cares/cares/ares_parse_ptr_reply.c +0 -221
  2066. data/third_party/cares/cares/ares_parse_soa_reply.c +0 -133
  2067. data/third_party/cares/cares/ares_parse_srv_reply.c +0 -179
  2068. data/third_party/cares/cares/ares_parse_txt_reply.c +0 -220
  2069. data/third_party/cares/cares/ares_private.h +0 -382
  2070. data/third_party/cares/cares/ares_process.c +0 -1473
  2071. data/third_party/cares/cares/ares_query.c +0 -186
  2072. data/third_party/cares/cares/ares_search.c +0 -323
  2073. data/third_party/cares/cares/ares_send.c +0 -137
  2074. data/third_party/cares/cares/ares_setup.h +0 -217
  2075. data/third_party/cares/cares/ares_strsplit.c +0 -174
  2076. data/third_party/cares/cares/ares_version.h +0 -24
  2077. data/third_party/cares/cares/inet_net_pton.c +0 -450
  2078. data/third_party/cares/cares/inet_ntop.c +0 -207
  2079. data/third_party/upb/upb/decode_internal.h +0 -193
  2080. data/third_party/upb/upb/upb_internal.h +0 -58
@@ -1,3716 +1,403 @@
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
 
21
19
  #include "src/core/ext/xds/xds_api.h"
22
20
 
21
+ #include <stdint.h>
22
+ #include <stdlib.h>
23
+
23
24
  #include <algorithm>
24
- #include <cctype>
25
- #include <cstdint>
26
- #include <cstdlib>
25
+ #include <set>
27
26
  #include <string>
27
+ #include <vector>
28
28
 
29
29
  #include "absl/strings/str_cat.h"
30
- #include "absl/strings/str_format.h"
31
- #include "absl/strings/str_join.h"
32
- #include "absl/strings/str_split.h"
33
- #include "envoy/admin/v3/config_dump.upb.h"
34
- #include "envoy/config/cluster/v3/circuit_breaker.upb.h"
35
- #include "envoy/config/cluster/v3/cluster.upb.h"
36
- #include "envoy/config/cluster/v3/cluster.upbdefs.h"
37
- #include "envoy/config/core/v3/address.upb.h"
30
+ #include "absl/strings/strip.h"
38
31
  #include "envoy/config/core/v3/base.upb.h"
39
- #include "envoy/config/core/v3/base.upbdefs.h"
40
- #include "envoy/config/core/v3/config_source.upb.h"
41
- #include "envoy/config/core/v3/health_check.upb.h"
42
- #include "envoy/config/core/v3/protocol.upb.h"
43
- #include "envoy/config/endpoint/v3/endpoint.upb.h"
44
- #include "envoy/config/endpoint/v3/endpoint.upbdefs.h"
45
- #include "envoy/config/endpoint/v3/endpoint_components.upb.h"
46
32
  #include "envoy/config/endpoint/v3/load_report.upb.h"
47
- #include "envoy/config/listener/v3/api_listener.upb.h"
48
- #include "envoy/config/listener/v3/listener.upb.h"
49
- #include "envoy/config/listener/v3/listener.upbdefs.h"
50
- #include "envoy/config/listener/v3/listener_components.upb.h"
51
- #include "envoy/config/route/v3/route.upb.h"
52
- #include "envoy/config/route/v3/route.upbdefs.h"
53
- #include "envoy/config/route/v3/route_components.upb.h"
54
- #include "envoy/config/route/v3/route_components.upbdefs.h"
55
- #include "envoy/extensions/clusters/aggregate/v3/cluster.upb.h"
56
- #include "envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h"
57
- #include "envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h"
58
- #include "envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h"
59
- #include "envoy/extensions/transport_sockets/tls/v3/common.upb.h"
60
- #include "envoy/extensions/transport_sockets/tls/v3/tls.upb.h"
61
- #include "envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h"
62
- #include "envoy/service/cluster/v3/cds.upb.h"
63
- #include "envoy/service/cluster/v3/cds.upbdefs.h"
64
33
  #include "envoy/service/discovery/v3/discovery.upb.h"
65
34
  #include "envoy/service/discovery/v3/discovery.upbdefs.h"
66
- #include "envoy/service/endpoint/v3/eds.upb.h"
67
- #include "envoy/service/endpoint/v3/eds.upbdefs.h"
68
- #include "envoy/service/listener/v3/lds.upb.h"
69
35
  #include "envoy/service/load_stats/v3/lrs.upb.h"
70
36
  #include "envoy/service/load_stats/v3/lrs.upbdefs.h"
71
- #include "envoy/service/route/v3/rds.upb.h"
72
- #include "envoy/service/route/v3/rds.upbdefs.h"
73
37
  #include "envoy/service/status/v3/csds.upb.h"
74
- #include "envoy/service/status/v3/csds.upbdefs.h"
75
- #include "envoy/type/matcher/v3/regex.upb.h"
76
- #include "envoy/type/matcher/v3/string.upb.h"
77
- #include "envoy/type/v3/percent.upb.h"
78
- #include "envoy/type/v3/range.upb.h"
79
38
  #include "google/protobuf/any.upb.h"
80
- #include "google/protobuf/duration.upb.h"
81
- #include "google/protobuf/struct.upb.h"
82
- #include "google/protobuf/timestamp.upb.h"
83
- #include "google/protobuf/wrappers.upb.h"
84
- #include "google/rpc/status.upb.h"
85
- #include "upb/text_encode.h"
86
- #include "upb/upb.h"
87
- #include "upb/upb.hpp"
88
- #include "xds/type/v3/typed_struct.upb.h"
89
-
90
- #include <grpc/impl/codegen/log.h>
91
- #include <grpc/support/alloc.h>
92
- #include <grpc/support/string_util.h>
93
-
94
- #include "src/core/lib/address_utils/sockaddr_utils.h"
95
- #include "src/core/lib/gpr/env.h"
96
- #include "src/core/lib/gpr/string.h"
97
- #include "src/core/lib/gprpp/host_port.h"
98
- #include "src/core/lib/iomgr/error.h"
99
- #include "src/core/lib/iomgr/sockaddr.h"
100
- #include "src/core/lib/iomgr/socket_utils.h"
101
- #include "src/core/lib/slice/slice_utils.h"
102
- #include "src/core/lib/uri/uri_parser.h"
103
-
104
- namespace grpc_core {
105
-
106
- // TODO(donnadionne): Check to see if cluster types aggregate_cluster and
107
- // logical_dns are enabled, this will be
108
- // removed once the cluster types are fully integration-tested and enabled by
109
- // default.
110
- bool XdsAggregateAndLogicalDnsClusterEnabled() {
111
- char* value = gpr_getenv(
112
- "GRPC_XDS_EXPERIMENTAL_ENABLE_AGGREGATE_AND_LOGICAL_DNS_CLUSTER");
113
- bool parsed_value;
114
- bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
115
- gpr_free(value);
116
- return parse_succeeded && parsed_value;
117
- }
118
-
119
- // TODO(yashykt): Remove once RBAC is no longer experimental
120
- bool XdsRbacEnabled() {
121
- char* value = gpr_getenv("GRPC_XDS_EXPERIMENTAL_RBAC");
122
- bool parsed_value;
123
- bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
124
- gpr_free(value);
125
- return parse_succeeded && parsed_value;
126
- }
127
-
128
- //
129
- // XdsApi::RetryPolicy
130
- //
131
-
132
- std::string XdsApi::RetryPolicy::RetryBackOff::ToString() const {
133
- std::vector<std::string> contents;
134
- contents.push_back(
135
- absl::StrCat("RetryBackOff Base: ", base_interval.ToString()));
136
- contents.push_back(
137
- absl::StrCat("RetryBackOff max: ", max_interval.ToString()));
138
- return absl::StrJoin(contents, ",");
139
- }
140
-
141
- std::string XdsApi::RetryPolicy::ToString() const {
142
- std::vector<std::string> contents;
143
- contents.push_back(absl::StrFormat("num_retries=%d", num_retries));
144
- contents.push_back(retry_back_off.ToString());
145
- return absl::StrCat("{", absl::StrJoin(contents, ","), "}");
146
- }
147
-
148
- //
149
- // XdsApi::Route::Matchers
150
- //
151
-
152
- std::string XdsApi::Route::Matchers::ToString() const {
153
- std::vector<std::string> contents;
154
- contents.push_back(
155
- absl::StrFormat("PathMatcher{%s}", path_matcher.ToString()));
156
- for (const HeaderMatcher& header_matcher : header_matchers) {
157
- contents.push_back(header_matcher.ToString());
158
- }
159
- if (fraction_per_million.has_value()) {
160
- contents.push_back(absl::StrFormat("Fraction Per Million %d",
161
- fraction_per_million.value()));
162
- }
163
- return absl::StrJoin(contents, "\n");
164
- }
165
-
166
- //
167
- // XdsApi::Route::RouteAction::HashPolicy
168
- //
169
-
170
- XdsApi::Route::RouteAction::HashPolicy::HashPolicy(const HashPolicy& other)
171
- : type(other.type),
172
- header_name(other.header_name),
173
- regex_substitution(other.regex_substitution) {
174
- if (other.regex != nullptr) {
175
- regex =
176
- absl::make_unique<RE2>(other.regex->pattern(), other.regex->options());
177
- }
178
- }
179
-
180
- XdsApi::Route::RouteAction::HashPolicy&
181
- XdsApi::Route::RouteAction::HashPolicy::operator=(const HashPolicy& other) {
182
- type = other.type;
183
- header_name = other.header_name;
184
- if (other.regex != nullptr) {
185
- regex =
186
- absl::make_unique<RE2>(other.regex->pattern(), other.regex->options());
187
- }
188
- regex_substitution = other.regex_substitution;
189
- return *this;
190
- }
191
-
192
- XdsApi::Route::RouteAction::HashPolicy::HashPolicy(HashPolicy&& other) noexcept
193
- : type(other.type),
194
- header_name(std::move(other.header_name)),
195
- regex(std::move(other.regex)),
196
- regex_substitution(std::move(other.regex_substitution)) {}
197
-
198
- XdsApi::Route::RouteAction::HashPolicy&
199
- XdsApi::Route::RouteAction::HashPolicy::operator=(HashPolicy&& other) noexcept {
200
- type = other.type;
201
- header_name = std::move(other.header_name);
202
- regex = std::move(other.regex);
203
- regex_substitution = std::move(other.regex_substitution);
204
- return *this;
205
- }
206
-
207
- bool XdsApi::Route::RouteAction::HashPolicy::HashPolicy::operator==(
208
- const HashPolicy& other) const {
209
- if (type != other.type) return false;
210
- if (type == Type::HEADER) {
211
- if (regex == nullptr) {
212
- if (other.regex != nullptr) return false;
213
- } else {
214
- if (other.regex == nullptr) return false;
215
- return header_name == other.header_name &&
216
- regex->pattern() == other.regex->pattern() &&
217
- regex_substitution == other.regex_substitution;
218
- }
219
- }
220
- return true;
221
- }
222
-
223
- std::string XdsApi::Route::RouteAction::HashPolicy::ToString() const {
224
- std::vector<std::string> contents;
225
- switch (type) {
226
- case Type::HEADER:
227
- contents.push_back("type=HEADER");
228
- break;
229
- case Type::CHANNEL_ID:
230
- contents.push_back("type=CHANNEL_ID");
231
- break;
232
- }
233
- contents.push_back(
234
- absl::StrFormat("terminal=%s", terminal ? "true" : "false"));
235
- if (type == Type::HEADER) {
236
- contents.push_back(absl::StrFormat(
237
- "Header %s:/%s/%s", header_name,
238
- (regex == nullptr) ? "" : regex->pattern(), regex_substitution));
239
- }
240
- return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
241
- }
242
-
243
- //
244
- // XdsApi::Route::RouteAction::ClusterWeight
245
- //
246
-
247
- std::string XdsApi::Route::RouteAction::ClusterWeight::ToString() const {
248
- std::vector<std::string> contents;
249
- contents.push_back(absl::StrCat("cluster=", name));
250
- contents.push_back(absl::StrCat("weight=", weight));
251
- if (!typed_per_filter_config.empty()) {
252
- std::vector<std::string> parts;
253
- for (const auto& p : typed_per_filter_config) {
254
- const std::string& key = p.first;
255
- const auto& config = p.second;
256
- parts.push_back(absl::StrCat(key, "=", config.ToString()));
257
- }
258
- contents.push_back(absl::StrCat("typed_per_filter_config={",
259
- absl::StrJoin(parts, ", "), "}"));
260
- }
261
- return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
262
- }
263
-
264
- //
265
- // XdsApi::Route::RouteAction
266
- //
267
-
268
- std::string XdsApi::Route::RouteAction::ToString() const {
269
- std::vector<std::string> contents;
270
- for (const HashPolicy& hash_policy : hash_policies) {
271
- contents.push_back(absl::StrCat("hash_policy=", hash_policy.ToString()));
272
- }
273
- if (retry_policy.has_value()) {
274
- contents.push_back(absl::StrCat("retry_policy=", retry_policy->ToString()));
275
- }
276
- if (!cluster_name.empty()) {
277
- contents.push_back(absl::StrFormat("Cluster name: %s", cluster_name));
278
- }
279
- for (const ClusterWeight& cluster_weight : weighted_clusters) {
280
- contents.push_back(cluster_weight.ToString());
281
- }
282
- if (max_stream_duration.has_value()) {
283
- contents.push_back(max_stream_duration->ToString());
284
- }
285
- return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
286
- }
287
-
288
- //
289
- // XdsApi::Route
290
- //
291
-
292
- std::string XdsApi::Route::ToString() const {
293
- std::vector<std::string> contents;
294
- contents.push_back(matchers.ToString());
295
- auto* route_action = absl::get_if<XdsApi::Route::RouteAction>(&action);
296
- if (route_action != nullptr) {
297
- contents.push_back(absl::StrCat("route=", route_action->ToString()));
298
- } else if (absl::holds_alternative<XdsApi::Route::NonForwardingAction>(
299
- action)) {
300
- contents.push_back("non_forwarding_action={}");
301
- } else {
302
- contents.push_back("unknown_action={}");
303
- }
304
- if (!typed_per_filter_config.empty()) {
305
- contents.push_back("typed_per_filter_config={");
306
- for (const auto& p : typed_per_filter_config) {
307
- const std::string& name = p.first;
308
- const auto& config = p.second;
309
- contents.push_back(absl::StrCat(" ", name, "=", config.ToString()));
310
- }
311
- contents.push_back("}");
312
- }
313
- return absl::StrJoin(contents, "\n");
314
- }
315
-
316
- //
317
- // XdsApi::RdsUpdate
318
- //
319
-
320
- std::string XdsApi::RdsUpdate::ToString() const {
321
- std::vector<std::string> vhosts;
322
- for (const VirtualHost& vhost : virtual_hosts) {
323
- vhosts.push_back(
324
- absl::StrCat("vhost={\n"
325
- " domains=[",
326
- absl::StrJoin(vhost.domains, ", "),
327
- "]\n"
328
- " routes=[\n"));
329
- for (const XdsApi::Route& route : vhost.routes) {
330
- vhosts.push_back(" {\n");
331
- vhosts.push_back(route.ToString());
332
- vhosts.push_back("\n }\n");
333
- }
334
- vhosts.push_back(" ]\n");
335
- vhosts.push_back(" typed_per_filter_config={\n");
336
- for (const auto& p : vhost.typed_per_filter_config) {
337
- const std::string& name = p.first;
338
- const auto& config = p.second;
339
- vhosts.push_back(
340
- absl::StrCat(" ", name, "=", config.ToString(), "\n"));
341
- }
342
- vhosts.push_back(" }\n");
343
- vhosts.push_back("]\n");
344
- }
345
- return absl::StrJoin(vhosts, "");
346
- }
347
-
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
- //
447
- // XdsApi::CommonTlsContext::CertificateValidationContext
448
- //
449
-
450
- std::string XdsApi::CommonTlsContext::CertificateValidationContext::ToString()
451
- const {
452
- std::vector<std::string> contents;
453
- for (const auto& match : match_subject_alt_names) {
454
- contents.push_back(match.ToString());
455
- }
456
- return absl::StrFormat("{match_subject_alt_names=[%s]}",
457
- absl::StrJoin(contents, ", "));
458
- }
459
-
460
- bool XdsApi::CommonTlsContext::CertificateValidationContext::Empty() const {
461
- return match_subject_alt_names.empty();
462
- }
463
-
464
- //
465
- // XdsApi::CommonTlsContext::CertificateProviderPluginInstance
466
- //
467
-
468
- std::string
469
- XdsApi::CommonTlsContext::CertificateProviderPluginInstance::ToString() const {
470
- absl::InlinedVector<std::string, 2> contents;
471
- if (!instance_name.empty()) {
472
- contents.push_back(absl::StrFormat("instance_name=%s", instance_name));
473
- }
474
- if (!certificate_name.empty()) {
475
- contents.push_back(
476
- absl::StrFormat("certificate_name=%s", certificate_name));
477
- }
478
- return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
479
- }
480
-
481
- bool XdsApi::CommonTlsContext::CertificateProviderPluginInstance::Empty()
482
- const {
483
- return instance_name.empty() && certificate_name.empty();
484
- }
485
-
486
- //
487
- // XdsApi::CommonTlsContext
488
- //
489
-
490
- std::string XdsApi::CommonTlsContext::ToString() const {
491
- absl::InlinedVector<std::string, 2> contents;
492
- if (!tls_certificate_provider_instance.Empty()) {
493
- contents.push_back(
494
- absl::StrFormat("tls_certificate_provider_instance=%s",
495
- tls_certificate_provider_instance.ToString()));
496
- }
497
- if (!certificate_validation_context.Empty()) {
498
- contents.push_back(
499
- absl::StrFormat("certificate_validation_context=%s",
500
- certificate_validation_context.ToString()));
501
- }
502
- return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
503
- }
504
-
505
- bool XdsApi::CommonTlsContext::Empty() const {
506
- return tls_certificate_provider_instance.Empty() &&
507
- certificate_validation_context.Empty();
508
- }
509
-
510
- //
511
- // XdsApi::DownstreamTlsContext
512
- //
513
-
514
- std::string XdsApi::DownstreamTlsContext::ToString() const {
515
- return absl::StrFormat("common_tls_context=%s, require_client_certificate=%s",
516
- common_tls_context.ToString(),
517
- require_client_certificate ? "true" : "false");
518
- }
519
-
520
- bool XdsApi::DownstreamTlsContext::Empty() const {
521
- return common_tls_context.Empty();
522
- }
523
-
524
- //
525
- // XdsApi::LdsUpdate::HttpConnectionManager
526
- //
527
-
528
- std::string XdsApi::LdsUpdate::HttpConnectionManager::ToString() const {
529
- absl::InlinedVector<std::string, 4> contents;
530
- contents.push_back(absl::StrFormat(
531
- "route_config_name=%s",
532
- !route_config_name.empty() ? route_config_name.c_str() : "<inlined>"));
533
- contents.push_back(absl::StrFormat("http_max_stream_duration=%s",
534
- http_max_stream_duration.ToString()));
535
- if (rds_update.has_value()) {
536
- contents.push_back(
537
- absl::StrFormat("rds_update=%s", rds_update->ToString()));
538
- }
539
- if (!http_filters.empty()) {
540
- std::vector<std::string> filter_strings;
541
- for (const auto& http_filter : http_filters) {
542
- filter_strings.push_back(http_filter.ToString());
543
- }
544
- contents.push_back(absl::StrCat("http_filters=[",
545
- absl::StrJoin(filter_strings, ", "), "]"));
546
- }
547
- return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
548
- }
549
-
550
- //
551
- // XdsApi::LdsUpdate::HttpFilter
552
- //
553
-
554
- std::string XdsApi::LdsUpdate::HttpConnectionManager::HttpFilter::ToString()
555
- const {
556
- return absl::StrCat("{name=", name, ", config=", config.ToString(), "}");
557
- }
558
-
559
- //
560
- // XdsApi::LdsUpdate::FilterChainData
561
- //
562
-
563
- std::string XdsApi::LdsUpdate::FilterChainData::ToString() const {
564
- return absl::StrCat(
565
- "{downstream_tls_context=", downstream_tls_context.ToString(),
566
- " http_connection_manager=", http_connection_manager.ToString(), "}");
567
- }
568
-
569
- //
570
- // XdsApi::LdsUpdate::FilterChainMap::CidrRange
571
- //
572
-
573
- std::string XdsApi::LdsUpdate::FilterChainMap::CidrRange::ToString() const {
574
- return absl::StrCat(
575
- "{address_prefix=", grpc_sockaddr_to_string(&address, false),
576
- ", prefix_len=", prefix_len, "}");
577
- }
578
-
579
- //
580
- // FilterChain
581
- //
582
-
583
- struct FilterChain {
584
- struct FilterChainMatch {
585
- uint32_t destination_port = 0;
586
- std::vector<XdsApi::LdsUpdate::FilterChainMap::CidrRange> prefix_ranges;
587
- XdsApi::LdsUpdate::FilterChainMap::ConnectionSourceType source_type =
588
- XdsApi::LdsUpdate::FilterChainMap::ConnectionSourceType::kAny;
589
- std::vector<XdsApi::LdsUpdate::FilterChainMap::CidrRange>
590
- source_prefix_ranges;
591
- std::vector<uint32_t> source_ports;
592
- std::vector<std::string> server_names;
593
- std::string transport_protocol;
594
- std::vector<std::string> application_protocols;
595
-
596
- std::string ToString() const;
597
- } filter_chain_match;
598
-
599
- std::shared_ptr<XdsApi::LdsUpdate::FilterChainData> filter_chain_data;
600
- };
601
-
602
- std::string FilterChain::FilterChainMatch::ToString() const {
603
- absl::InlinedVector<std::string, 8> contents;
604
- if (destination_port != 0) {
605
- contents.push_back(absl::StrCat("destination_port=", destination_port));
606
- }
607
- if (!prefix_ranges.empty()) {
608
- std::vector<std::string> prefix_ranges_content;
609
- for (const auto& range : prefix_ranges) {
610
- prefix_ranges_content.push_back(range.ToString());
611
- }
612
- contents.push_back(absl::StrCat(
613
- "prefix_ranges={", absl::StrJoin(prefix_ranges_content, ", "), "}"));
614
- }
615
- if (source_type == XdsApi::LdsUpdate::FilterChainMap::ConnectionSourceType::
616
- kSameIpOrLoopback) {
617
- contents.push_back("source_type=SAME_IP_OR_LOOPBACK");
618
- } else if (source_type == XdsApi::LdsUpdate::FilterChainMap::
619
- ConnectionSourceType::kExternal) {
620
- contents.push_back("source_type=EXTERNAL");
621
- }
622
- if (!source_prefix_ranges.empty()) {
623
- std::vector<std::string> source_prefix_ranges_content;
624
- for (const auto& range : source_prefix_ranges) {
625
- source_prefix_ranges_content.push_back(range.ToString());
626
- }
627
- contents.push_back(
628
- absl::StrCat("source_prefix_ranges={",
629
- absl::StrJoin(source_prefix_ranges_content, ", "), "}"));
630
- }
631
- if (!source_ports.empty()) {
632
- contents.push_back(
633
- absl::StrCat("source_ports={", absl::StrJoin(source_ports, ", "), "}"));
634
- }
635
- if (!server_names.empty()) {
636
- contents.push_back(
637
- absl::StrCat("server_names={", absl::StrJoin(server_names, ", "), "}"));
638
- }
639
- if (!transport_protocol.empty()) {
640
- contents.push_back(absl::StrCat("transport_protocol=", transport_protocol));
641
- }
642
- if (!application_protocols.empty()) {
643
- contents.push_back(absl::StrCat("application_protocols={",
644
- absl::StrJoin(application_protocols, ", "),
645
- "}"));
646
- }
647
- return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
648
- }
649
-
650
- //
651
- // XdsApi::LdsUpdate::FilterChainMap
652
- //
653
-
654
- std::string XdsApi::LdsUpdate::FilterChainMap::ToString() const {
655
- std::vector<std::string> contents;
656
- for (const auto& destination_ip : destination_ip_vector) {
657
- for (int source_type = 0; source_type < 3; ++source_type) {
658
- for (const auto& source_ip :
659
- destination_ip.source_types_array[source_type]) {
660
- for (const auto& source_port_pair : source_ip.ports_map) {
661
- FilterChain::FilterChainMatch filter_chain_match;
662
- if (destination_ip.prefix_range.has_value()) {
663
- filter_chain_match.prefix_ranges.push_back(
664
- *destination_ip.prefix_range);
665
- }
666
- filter_chain_match.source_type = static_cast<
667
- XdsApi::LdsUpdate::FilterChainMap::ConnectionSourceType>(
668
- source_type);
669
- if (source_ip.prefix_range.has_value()) {
670
- filter_chain_match.source_prefix_ranges.push_back(
671
- *source_ip.prefix_range);
672
- }
673
- if (source_port_pair.first != 0) {
674
- filter_chain_match.source_ports.push_back(source_port_pair.first);
675
- }
676
- contents.push_back(absl::StrCat(
677
- "{filter_chain_match=", filter_chain_match.ToString(),
678
- ", filter_chain=", source_port_pair.second.data->ToString(),
679
- "}"));
680
- }
681
- }
682
- }
683
- }
684
- return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
685
- }
686
-
687
- //
688
- // XdsApi::LdsUpdate
689
- //
690
-
691
- std::string XdsApi::LdsUpdate::ToString() const {
692
- absl::InlinedVector<std::string, 4> contents;
693
- if (type == ListenerType::kTcpListener) {
694
- contents.push_back(absl::StrCat("address=", address));
695
- contents.push_back(
696
- absl::StrCat("filter_chain_map=", filter_chain_map.ToString()));
697
- if (default_filter_chain.has_value()) {
698
- contents.push_back(absl::StrCat("default_filter_chain=",
699
- default_filter_chain->ToString()));
700
- }
701
- } else if (type == ListenerType::kHttpApiListener) {
702
- contents.push_back(absl::StrFormat("http_connection_manager=%s",
703
- http_connection_manager.ToString()));
704
- }
705
- return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
706
- }
707
-
708
- //
709
- // XdsApi::CdsUpdate
710
- //
711
-
712
- std::string XdsApi::CdsUpdate::ToString() const {
713
- absl::InlinedVector<std::string, 8> contents;
714
- switch (cluster_type) {
715
- case EDS:
716
- contents.push_back("cluster_type=EDS");
717
- if (!eds_service_name.empty()) {
718
- contents.push_back(
719
- absl::StrFormat("eds_service_name=%s", eds_service_name));
720
- }
721
- break;
722
- case LOGICAL_DNS:
723
- contents.push_back("cluster_type=LOGICAL_DNS");
724
- contents.push_back(absl::StrFormat("dns_hostname=%s", dns_hostname));
725
- break;
726
- case AGGREGATE:
727
- contents.push_back("cluster_type=AGGREGATE");
728
- contents.push_back(
729
- absl::StrFormat("prioritized_cluster_names=[%s]",
730
- absl::StrJoin(prioritized_cluster_names, ", ")));
731
- }
732
- if (!common_tls_context.Empty()) {
733
- contents.push_back(absl::StrFormat("common_tls_context=%s",
734
- common_tls_context.ToString()));
735
- }
736
- if (lrs_load_reporting_server_name.has_value()) {
737
- contents.push_back(absl::StrFormat("lrs_load_reporting_server_name=%s",
738
- lrs_load_reporting_server_name.value()));
739
- }
740
- contents.push_back(absl::StrCat("lb_policy=", lb_policy));
741
- if (lb_policy == "RING_HASH") {
742
- contents.push_back(absl::StrCat("min_ring_size=", min_ring_size));
743
- contents.push_back(absl::StrCat("max_ring_size=", max_ring_size));
744
- }
745
- contents.push_back(
746
- absl::StrFormat("max_concurrent_requests=%d", max_concurrent_requests));
747
- return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
748
- }
749
-
750
- //
751
- // XdsApi::EdsUpdate
752
- //
753
-
754
- std::string XdsApi::EdsUpdate::Priority::Locality::ToString() const {
755
- std::vector<std::string> endpoint_strings;
756
- for (const ServerAddress& endpoint : endpoints) {
757
- endpoint_strings.emplace_back(endpoint.ToString());
758
- }
759
- return absl::StrCat("{name=", name->AsHumanReadableString(),
760
- ", lb_weight=", lb_weight, ", endpoints=[",
761
- absl::StrJoin(endpoint_strings, ", "), "]}");
762
- }
763
-
764
- bool XdsApi::EdsUpdate::Priority::operator==(const Priority& other) const {
765
- if (localities.size() != other.localities.size()) return false;
766
- auto it1 = localities.begin();
767
- auto it2 = other.localities.begin();
768
- while (it1 != localities.end()) {
769
- if (*it1->first != *it2->first) return false;
770
- if (it1->second != it2->second) return false;
771
- ++it1;
772
- ++it2;
773
- }
774
- return true;
775
- }
776
-
777
- std::string XdsApi::EdsUpdate::Priority::ToString() const {
778
- std::vector<std::string> locality_strings;
779
- for (const auto& p : localities) {
780
- locality_strings.emplace_back(p.second.ToString());
781
- }
782
- return absl::StrCat("[", absl::StrJoin(locality_strings, ", "), "]");
783
- }
784
-
785
- bool XdsApi::EdsUpdate::DropConfig::ShouldDrop(
786
- const std::string** category_name) const {
787
- for (size_t i = 0; i < drop_category_list_.size(); ++i) {
788
- const auto& drop_category = drop_category_list_[i];
789
- // Generate a random number in [0, 1000000).
790
- const uint32_t random = static_cast<uint32_t>(rand()) % 1000000;
791
- if (random < drop_category.parts_per_million) {
792
- *category_name = &drop_category.name;
793
- return true;
794
- }
795
- }
796
- return false;
797
- }
798
-
799
- std::string XdsApi::EdsUpdate::DropConfig::ToString() const {
800
- std::vector<std::string> category_strings;
801
- for (const DropCategory& category : drop_category_list_) {
802
- category_strings.emplace_back(
803
- absl::StrCat(category.name, "=", category.parts_per_million));
804
- }
805
- return absl::StrCat("{[", absl::StrJoin(category_strings, ", "),
806
- "], drop_all=", drop_all_, "}");
807
- }
808
-
809
- std::string XdsApi::EdsUpdate::ToString() const {
810
- std::vector<std::string> priority_strings;
811
- for (size_t i = 0; i < priorities.size(); ++i) {
812
- const Priority& priority = priorities[i];
813
- priority_strings.emplace_back(
814
- absl::StrCat("priority ", i, ": ", priority.ToString()));
815
- }
816
- return absl::StrCat("priorities=[", absl::StrJoin(priority_strings, ", "),
817
- "], drop_config=", drop_config->ToString());
818
- }
819
-
820
- //
821
- // XdsApi
822
- //
823
-
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";
830
- const char* XdsApi::kEdsTypeUrl =
831
- "type.googleapis.com/envoy.config.endpoint.v3.ClusterLoadAssignment";
832
-
833
- namespace {
834
-
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";
841
-
842
- bool IsLdsInternal(absl::string_view type_url, bool* is_v2 = nullptr) {
843
- if (type_url == XdsApi::kLdsTypeUrl) return true;
844
- if (type_url == kLdsV2TypeUrl) {
845
- if (is_v2 != nullptr) *is_v2 = true;
846
- return true;
847
- }
848
- return false;
849
- }
850
-
851
- bool IsRdsInternal(absl::string_view type_url, bool* /*is_v2*/ = nullptr) {
852
- return type_url == XdsApi::kRdsTypeUrl || type_url == kRdsV2TypeUrl;
853
- }
854
-
855
- bool IsCdsInternal(absl::string_view type_url, bool* /*is_v2*/ = nullptr) {
856
- return type_url == XdsApi::kCdsTypeUrl || type_url == kCdsV2TypeUrl;
857
- }
858
-
859
- bool IsEdsInternal(absl::string_view type_url, bool* /*is_v2*/ = nullptr) {
860
- return type_url == XdsApi::kEdsTypeUrl || type_url == kEdsV2TypeUrl;
861
- }
862
-
863
- absl::StatusOr<XdsApi::ResourceName> ParseResourceNameInternal(
864
- absl::string_view name,
865
- std::function<bool(absl::string_view, bool*)> is_expected_type) {
866
- // Old-style names use the empty string for authority.
867
- // ID is prefixed with "old:" to indicate that it's an old-style name.
868
- if (!absl::StartsWith(name, "xdstp:")) {
869
- return XdsApi::ResourceName{"", absl::StrCat("old:", name)};
870
- }
871
- // New style name. Parse URI.
872
- auto uri = URI::Parse(name);
873
- if (!uri.ok()) return uri.status();
874
- // Split the resource type off of the path to get the id.
875
- std::pair<absl::string_view, absl::string_view> path_parts =
876
- absl::StrSplit(uri->path(), absl::MaxSplits('/', 1));
877
- if (!is_expected_type(path_parts.first, nullptr)) {
878
- return absl::InvalidArgumentError(
879
- "xdstp URI path must indicate valid xDS resource type");
880
- }
881
- std::vector<std::pair<absl::string_view, absl::string_view>> query_parameters(
882
- uri->query_parameter_map().begin(), uri->query_parameter_map().end());
883
- std::sort(query_parameters.begin(), query_parameters.end());
884
- return XdsApi::ResourceName{
885
- uri->authority(),
886
- absl::StrCat(
887
- "xdstp:", path_parts.second, (query_parameters.empty() ? "?" : ""),
888
- absl::StrJoin(query_parameters, "&", absl::PairFormatter("=")))};
889
- }
890
-
891
- } // namespace
892
-
893
- // If gRPC is built with -DGRPC_XDS_USER_AGENT_NAME_SUFFIX="...", that string
894
- // will be appended to the user agent name reported to the xDS server.
895
- #ifdef GRPC_XDS_USER_AGENT_NAME_SUFFIX
896
- #define GRPC_XDS_USER_AGENT_NAME_SUFFIX_STRING \
897
- " " GRPC_XDS_USER_AGENT_NAME_SUFFIX
898
- #else
899
- #define GRPC_XDS_USER_AGENT_NAME_SUFFIX_STRING ""
900
- #endif
901
-
902
- // If gRPC is built with -DGRPC_XDS_USER_AGENT_VERSION_SUFFIX="...", that string
903
- // will be appended to the user agent version reported to the xDS server.
904
- #ifdef GRPC_XDS_USER_AGENT_VERSION_SUFFIX
905
- #define GRPC_XDS_USER_AGENT_VERSION_SUFFIX_STRING \
906
- " " GRPC_XDS_USER_AGENT_VERSION_SUFFIX
907
- #else
908
- #define GRPC_XDS_USER_AGENT_VERSION_SUFFIX_STRING ""
909
- #endif
910
-
911
- XdsApi::XdsApi(XdsClient* client, TraceFlag* tracer,
912
- const XdsBootstrap::Node* node,
913
- const CertificateProviderStore::PluginDefinitionMap*
914
- certificate_provider_definition_map)
915
- : client_(client),
916
- tracer_(tracer),
917
- node_(node),
918
- certificate_provider_definition_map_(certificate_provider_definition_map),
919
- build_version_(absl::StrCat("gRPC C-core ", GPR_PLATFORM_STRING, " ",
920
- grpc_version_string(),
921
- GRPC_XDS_USER_AGENT_NAME_SUFFIX_STRING,
922
- GRPC_XDS_USER_AGENT_VERSION_SUFFIX_STRING)),
923
- user_agent_name_(absl::StrCat("gRPC C-core ", GPR_PLATFORM_STRING,
924
- GRPC_XDS_USER_AGENT_NAME_SUFFIX_STRING)),
925
- user_agent_version_(
926
- absl::StrCat("C-core ", grpc_version_string(),
927
- GRPC_XDS_USER_AGENT_NAME_SUFFIX_STRING,
928
- GRPC_XDS_USER_AGENT_VERSION_SUFFIX_STRING)) {
929
- // Populate upb symtab with xDS proto messages that we want to print
930
- // properly in logs.
931
- // Note: This won't actually work properly until upb adds support for
932
- // Any fields in textproto printing (internal b/178821188).
933
- envoy_config_listener_v3_Listener_getmsgdef(symtab_.ptr());
934
- envoy_config_route_v3_RouteConfiguration_getmsgdef(symtab_.ptr());
935
- envoy_config_cluster_v3_Cluster_getmsgdef(symtab_.ptr());
936
- envoy_extensions_clusters_aggregate_v3_ClusterConfig_getmsgdef(symtab_.ptr());
937
- envoy_config_cluster_v3_Cluster_getmsgdef(symtab_.ptr());
938
- envoy_config_endpoint_v3_ClusterLoadAssignment_getmsgdef(symtab_.ptr());
939
- envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_getmsgdef(
940
- symtab_.ptr());
941
- envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_getmsgdef(
942
- symtab_.ptr());
943
- // Load HTTP filter proto messages into the upb symtab.
944
- XdsHttpFilterRegistry::PopulateSymtab(symtab_.ptr());
945
- }
946
-
947
- bool XdsApi::IsLds(absl::string_view type_url) {
948
- return IsLdsInternal(type_url);
949
- }
950
-
951
- bool XdsApi::IsRds(absl::string_view type_url) {
952
- return IsRdsInternal(type_url);
953
- }
954
-
955
- bool XdsApi::IsCds(absl::string_view type_url) {
956
- return IsCdsInternal(type_url);
957
- }
958
-
959
- bool XdsApi::IsEds(absl::string_view type_url) {
960
- return IsEdsInternal(type_url);
961
- }
962
-
963
- absl::StatusOr<XdsApi::ResourceName> XdsApi::ParseResourceName(
964
- absl::string_view name, bool (*is_expected_type)(absl::string_view)) {
965
- return ParseResourceNameInternal(
966
- name, [is_expected_type](absl::string_view type, bool*) {
967
- return is_expected_type(type);
968
- });
969
- }
970
-
971
- std::string XdsApi::ConstructFullResourceName(absl::string_view authority,
972
- absl::string_view resource_type,
973
- absl::string_view name) {
974
- if (absl::StartsWith(name, "xdstp:")) {
975
- return absl::StrCat("xdstp://", authority, "/", resource_type,
976
- absl::StripPrefix(name, "xdstp:"));
977
- } else {
978
- return std::string(absl::StripPrefix(name, "old:"));
979
- }
980
- }
981
-
982
- namespace {
983
-
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
- // Works for both std::string and absl::string_view.
995
- template <typename T>
996
- inline upb_strview StdStringToUpbString(const T& str) {
997
- return upb_strview_make(str.data(), str.size());
998
- }
999
-
1000
- void PopulateMetadataValue(const EncodingContext& context,
1001
- google_protobuf_Value* value_pb, const Json& value);
1002
-
1003
- void PopulateListValue(const EncodingContext& context,
1004
- google_protobuf_ListValue* list_value,
1005
- const Json::Array& values) {
1006
- for (const auto& value : values) {
1007
- auto* value_pb =
1008
- google_protobuf_ListValue_add_values(list_value, context.arena);
1009
- PopulateMetadataValue(context, value_pb, value);
1010
- }
1011
- }
1012
-
1013
- void PopulateMetadata(const EncodingContext& context,
1014
- google_protobuf_Struct* metadata_pb,
1015
- const Json::Object& metadata) {
1016
- for (const auto& p : metadata) {
1017
- google_protobuf_Value* value = google_protobuf_Value_new(context.arena);
1018
- PopulateMetadataValue(context, value, p.second);
1019
- google_protobuf_Struct_fields_set(
1020
- metadata_pb, StdStringToUpbString(p.first), value, context.arena);
1021
- }
1022
- }
1023
-
1024
- void PopulateMetadataValue(const EncodingContext& context,
1025
- google_protobuf_Value* value_pb, const Json& value) {
1026
- switch (value.type()) {
1027
- case Json::Type::JSON_NULL:
1028
- google_protobuf_Value_set_null_value(value_pb, 0);
1029
- break;
1030
- case Json::Type::NUMBER:
1031
- google_protobuf_Value_set_number_value(
1032
- value_pb, strtod(value.string_value().c_str(), nullptr));
1033
- break;
1034
- case Json::Type::STRING:
1035
- google_protobuf_Value_set_string_value(
1036
- value_pb, StdStringToUpbString(value.string_value()));
1037
- break;
1038
- case Json::Type::JSON_TRUE:
1039
- google_protobuf_Value_set_bool_value(value_pb, true);
1040
- break;
1041
- case Json::Type::JSON_FALSE:
1042
- google_protobuf_Value_set_bool_value(value_pb, false);
1043
- break;
1044
- case Json::Type::OBJECT: {
1045
- google_protobuf_Struct* struct_value =
1046
- google_protobuf_Value_mutable_struct_value(value_pb, context.arena);
1047
- PopulateMetadata(context, struct_value, value.object_value());
1048
- break;
1049
- }
1050
- case Json::Type::ARRAY: {
1051
- google_protobuf_ListValue* list_value =
1052
- google_protobuf_Value_mutable_list_value(value_pb, context.arena);
1053
- PopulateListValue(context, list_value, value.array_value());
1054
- break;
1055
- }
1056
- }
1057
- }
1058
-
1059
- // Helper functions to manually do protobuf string encoding, so that we
1060
- // can populate the node build_version field that was removed in v3.
1061
- std::string EncodeVarint(uint64_t val) {
1062
- std::string data;
1063
- do {
1064
- uint8_t byte = val & 0x7fU;
1065
- val >>= 7;
1066
- if (val) byte |= 0x80U;
1067
- data += byte;
1068
- } while (val);
1069
- return data;
1070
- }
1071
- std::string EncodeTag(uint32_t field_number, uint8_t wire_type) {
1072
- return EncodeVarint((field_number << 3) | wire_type);
1073
- }
1074
- std::string EncodeStringField(uint32_t field_number, const std::string& str) {
1075
- static const uint8_t kDelimitedWireType = 2;
1076
- return EncodeTag(field_number, kDelimitedWireType) +
1077
- EncodeVarint(str.size()) + str;
1078
- }
1079
-
1080
- void PopulateBuildVersion(const EncodingContext& context,
1081
- envoy_config_core_v3_Node* node_msg,
1082
- const std::string& build_version) {
1083
- std::string encoded_build_version = EncodeStringField(5, build_version);
1084
- // TODO(roth): This should use upb_msg_addunknown(), but that API is
1085
- // broken in the current version of upb, so we're using the internal
1086
- // API for now. Change this once we upgrade to a version of upb that
1087
- // fixes this bug.
1088
- _upb_msg_addunknown(node_msg, encoded_build_version.data(),
1089
- encoded_build_version.size(), context.arena);
1090
- }
1091
-
1092
- void PopulateNode(const EncodingContext& context,
1093
- const XdsBootstrap::Node* node,
1094
- const std::string& build_version,
1095
- const std::string& user_agent_name,
1096
- const std::string& user_agent_version,
1097
- envoy_config_core_v3_Node* node_msg) {
1098
- if (node != nullptr) {
1099
- if (!node->id.empty()) {
1100
- envoy_config_core_v3_Node_set_id(node_msg,
1101
- StdStringToUpbString(node->id));
1102
- }
1103
- if (!node->cluster.empty()) {
1104
- envoy_config_core_v3_Node_set_cluster(
1105
- node_msg, StdStringToUpbString(node->cluster));
1106
- }
1107
- if (!node->metadata.object_value().empty()) {
1108
- google_protobuf_Struct* metadata =
1109
- envoy_config_core_v3_Node_mutable_metadata(node_msg, context.arena);
1110
- PopulateMetadata(context, metadata, node->metadata.object_value());
1111
- }
1112
- if (!node->locality_region.empty() || !node->locality_zone.empty() ||
1113
- !node->locality_sub_zone.empty()) {
1114
- envoy_config_core_v3_Locality* locality =
1115
- envoy_config_core_v3_Node_mutable_locality(node_msg, context.arena);
1116
- if (!node->locality_region.empty()) {
1117
- envoy_config_core_v3_Locality_set_region(
1118
- locality, StdStringToUpbString(node->locality_region));
1119
- }
1120
- if (!node->locality_zone.empty()) {
1121
- envoy_config_core_v3_Locality_set_zone(
1122
- locality, StdStringToUpbString(node->locality_zone));
1123
- }
1124
- if (!node->locality_sub_zone.empty()) {
1125
- envoy_config_core_v3_Locality_set_sub_zone(
1126
- locality, StdStringToUpbString(node->locality_sub_zone));
1127
- }
1128
- }
1129
- }
1130
- if (!context.use_v3) {
1131
- PopulateBuildVersion(context, node_msg, build_version);
1132
- }
1133
- envoy_config_core_v3_Node_set_user_agent_name(
1134
- node_msg, StdStringToUpbString(user_agent_name));
1135
- envoy_config_core_v3_Node_set_user_agent_version(
1136
- node_msg, StdStringToUpbString(user_agent_version));
1137
- envoy_config_core_v3_Node_add_client_features(
1138
- node_msg, upb_strview_makez("envoy.lb.does_not_support_overprovisioning"),
1139
- context.arena);
1140
- }
1141
-
1142
- inline absl::string_view UpbStringToAbsl(const upb_strview& str) {
1143
- return absl::string_view(str.data, str.size);
1144
- }
1145
-
1146
- inline std::string UpbStringToStdString(const upb_strview& str) {
1147
- return std::string(str.data, str.size);
1148
- }
1149
-
1150
- void MaybeLogDiscoveryRequest(
1151
- const EncodingContext& context,
1152
- const envoy_service_discovery_v3_DiscoveryRequest* request) {
1153
- if (GRPC_TRACE_FLAG_ENABLED(*context.tracer) &&
1154
- gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
1155
- const upb_msgdef* msg_type =
1156
- envoy_service_discovery_v3_DiscoveryRequest_getmsgdef(context.symtab);
1157
- char buf[10240];
1158
- upb_text_encode(request, msg_type, nullptr, 0, buf, sizeof(buf));
1159
- gpr_log(GPR_DEBUG, "[xds_client %p] constructed ADS request: %s",
1160
- context.client, buf);
1161
- }
1162
- }
1163
-
1164
- grpc_slice SerializeDiscoveryRequest(
1165
- const EncodingContext& context,
1166
- envoy_service_discovery_v3_DiscoveryRequest* request) {
1167
- size_t output_length;
1168
- char* output = envoy_service_discovery_v3_DiscoveryRequest_serialize(
1169
- request, context.arena, &output_length);
1170
- return grpc_slice_from_copied_buffer(output, output_length);
1171
- }
1172
-
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
- } // namespace
1193
-
1194
- grpc_slice XdsApi::CreateAdsRequest(
1195
- const XdsBootstrap::XdsServer& server, const std::string& type_url,
1196
- const std::map<absl::string_view /*authority*/,
1197
- std::set<absl::string_view /*name*/>>& resource_names,
1198
- const std::string& version, const std::string& nonce,
1199
- grpc_error_handle error, bool populate_node) {
1200
- upb::Arena arena;
1201
- const EncodingContext context = {client_,
1202
- tracer_,
1203
- symtab_.ptr(),
1204
- arena.ptr(),
1205
- server.ShouldUseV3(),
1206
- certificate_provider_definition_map_};
1207
- // Create a request.
1208
- envoy_service_discovery_v3_DiscoveryRequest* request =
1209
- envoy_service_discovery_v3_DiscoveryRequest_new(arena.ptr());
1210
- // Set type_url.
1211
- absl::string_view real_type_url =
1212
- TypeUrlExternalToInternal(server.ShouldUseV3(), type_url);
1213
- envoy_service_discovery_v3_DiscoveryRequest_set_type_url(
1214
- request, StdStringToUpbString(real_type_url));
1215
- // Set version_info.
1216
- if (!version.empty()) {
1217
- envoy_service_discovery_v3_DiscoveryRequest_set_version_info(
1218
- request, StdStringToUpbString(version));
1219
- }
1220
- // Set nonce.
1221
- if (!nonce.empty()) {
1222
- envoy_service_discovery_v3_DiscoveryRequest_set_response_nonce(
1223
- request, StdStringToUpbString(nonce));
1224
- }
1225
- // Set error_detail if it's a NACK.
1226
- std::string error_string_storage;
1227
- if (error != GRPC_ERROR_NONE) {
1228
- google_rpc_Status* error_detail =
1229
- envoy_service_discovery_v3_DiscoveryRequest_mutable_error_detail(
1230
- request, arena.ptr());
1231
- // Hard-code INVALID_ARGUMENT as the status code.
1232
- // TODO(roth): If at some point we decide we care about this value,
1233
- // we could attach a status code to the individual errors where we
1234
- // generate them in the parsing code, and then use that here.
1235
- google_rpc_Status_set_code(error_detail, GRPC_STATUS_INVALID_ARGUMENT);
1236
- // Error description comes from the error that was passed in.
1237
- error_string_storage = grpc_error_std_string(error);
1238
- upb_strview error_description = StdStringToUpbString(error_string_storage);
1239
- google_rpc_Status_set_message(error_detail, error_description);
1240
- GRPC_ERROR_UNREF(error);
1241
- }
1242
- // Populate node.
1243
- if (populate_node) {
1244
- envoy_config_core_v3_Node* node_msg =
1245
- envoy_service_discovery_v3_DiscoveryRequest_mutable_node(request,
1246
- arena.ptr());
1247
- PopulateNode(context, node_, build_version_, user_agent_name_,
1248
- user_agent_version_, node_msg);
1249
- }
1250
- // A vector for temporary local storage of resource name strings.
1251
- std::vector<std::string> resource_name_storage;
1252
- // Make sure the vector is sized right up-front, so that reallocations
1253
- // don't move the strings out from under the upb proto object that
1254
- // points to them.
1255
- size_t size = 0;
1256
- for (const auto& p : resource_names) {
1257
- size += p.second.size();
1258
- }
1259
- resource_name_storage.reserve(size);
1260
- // Add resource_names.
1261
- for (const auto& a : resource_names) {
1262
- absl::string_view authority = a.first;
1263
- for (const auto& p : a.second) {
1264
- absl::string_view resource_id = p;
1265
- resource_name_storage.push_back(
1266
- ConstructFullResourceName(authority, type_url, resource_id));
1267
- envoy_service_discovery_v3_DiscoveryRequest_add_resource_names(
1268
- request, StdStringToUpbString(resource_name_storage.back()),
1269
- arena.ptr());
1270
- }
1271
- }
1272
- MaybeLogDiscoveryRequest(context, request);
1273
- return SerializeDiscoveryRequest(context, request);
1274
- }
1275
-
1276
- namespace {
1277
-
1278
- void MaybeLogDiscoveryResponse(
1279
- const EncodingContext& context,
1280
- const envoy_service_discovery_v3_DiscoveryResponse* response) {
1281
- if (GRPC_TRACE_FLAG_ENABLED(*context.tracer) &&
1282
- gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
1283
- const upb_msgdef* msg_type =
1284
- envoy_service_discovery_v3_DiscoveryResponse_getmsgdef(context.symtab);
1285
- char buf[10240];
1286
- upb_text_encode(response, msg_type, nullptr, 0, buf, sizeof(buf));
1287
- gpr_log(GPR_DEBUG, "[xds_client %p] received response: %s", context.client,
1288
- buf);
1289
- }
1290
- }
1291
-
1292
- void MaybeLogListener(const EncodingContext& context,
1293
- const envoy_config_listener_v3_Listener* listener) {
1294
- if (GRPC_TRACE_FLAG_ENABLED(*context.tracer) &&
1295
- gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
1296
- const upb_msgdef* msg_type =
1297
- envoy_config_listener_v3_Listener_getmsgdef(context.symtab);
1298
- char buf[10240];
1299
- upb_text_encode(listener, msg_type, nullptr, 0, buf, sizeof(buf));
1300
- gpr_log(GPR_DEBUG, "[xds_client %p] Listener: %s", context.client, buf);
1301
- }
1302
- }
1303
-
1304
- void MaybeLogHttpConnectionManager(
1305
- const EncodingContext& context,
1306
- const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager*
1307
- http_connection_manager_config) {
1308
- if (GRPC_TRACE_FLAG_ENABLED(*context.tracer) &&
1309
- gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
1310
- const upb_msgdef* msg_type =
1311
- envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_getmsgdef(
1312
- context.symtab);
1313
- char buf[10240];
1314
- upb_text_encode(http_connection_manager_config, msg_type, nullptr, 0, buf,
1315
- sizeof(buf));
1316
- gpr_log(GPR_DEBUG, "[xds_client %p] HttpConnectionManager: %s",
1317
- context.client, buf);
1318
- }
1319
- }
1320
-
1321
- void MaybeLogRouteConfiguration(
1322
- const EncodingContext& context,
1323
- const envoy_config_route_v3_RouteConfiguration* route_config) {
1324
- if (GRPC_TRACE_FLAG_ENABLED(*context.tracer) &&
1325
- gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
1326
- const upb_msgdef* msg_type =
1327
- envoy_config_route_v3_RouteConfiguration_getmsgdef(context.symtab);
1328
- char buf[10240];
1329
- upb_text_encode(route_config, msg_type, nullptr, 0, buf, sizeof(buf));
1330
- gpr_log(GPR_DEBUG, "[xds_client %p] RouteConfiguration: %s", context.client,
1331
- buf);
1332
- }
1333
- }
1334
-
1335
- void MaybeLogCluster(const EncodingContext& context,
1336
- const envoy_config_cluster_v3_Cluster* cluster) {
1337
- if (GRPC_TRACE_FLAG_ENABLED(*context.tracer) &&
1338
- gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
1339
- const upb_msgdef* msg_type =
1340
- envoy_config_cluster_v3_Cluster_getmsgdef(context.symtab);
1341
- char buf[10240];
1342
- upb_text_encode(cluster, msg_type, nullptr, 0, buf, sizeof(buf));
1343
- gpr_log(GPR_DEBUG, "[xds_client %p] Cluster: %s", context.client, buf);
1344
- }
1345
- }
1346
-
1347
- void MaybeLogClusterLoadAssignment(
1348
- const EncodingContext& context,
1349
- const envoy_config_endpoint_v3_ClusterLoadAssignment* cla) {
1350
- if (GRPC_TRACE_FLAG_ENABLED(*context.tracer) &&
1351
- gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
1352
- const upb_msgdef* msg_type =
1353
- envoy_config_endpoint_v3_ClusterLoadAssignment_getmsgdef(
1354
- context.symtab);
1355
- char buf[10240];
1356
- upb_text_encode(cla, msg_type, nullptr, 0, buf, sizeof(buf));
1357
- gpr_log(GPR_DEBUG, "[xds_client %p] ClusterLoadAssignment: %s",
1358
- context.client, buf);
1359
- }
1360
- }
1361
-
1362
- grpc_error_handle RoutePathMatchParse(
1363
- const envoy_config_route_v3_RouteMatch* match, XdsApi::Route* route,
1364
- bool* ignore_route) {
1365
- auto* case_sensitive_ptr =
1366
- envoy_config_route_v3_RouteMatch_case_sensitive(match);
1367
- bool case_sensitive = true;
1368
- if (case_sensitive_ptr != nullptr) {
1369
- case_sensitive = google_protobuf_BoolValue_value(case_sensitive_ptr);
1370
- }
1371
- StringMatcher::Type type;
1372
- std::string match_string;
1373
- if (envoy_config_route_v3_RouteMatch_has_prefix(match)) {
1374
- absl::string_view prefix =
1375
- UpbStringToAbsl(envoy_config_route_v3_RouteMatch_prefix(match));
1376
- // Empty prefix "" is accepted.
1377
- if (!prefix.empty()) {
1378
- // Prefix "/" is accepted.
1379
- if (prefix[0] != '/') {
1380
- // Prefix which does not start with a / will never match anything, so
1381
- // ignore this route.
1382
- *ignore_route = true;
1383
- return GRPC_ERROR_NONE;
1384
- }
1385
- std::vector<absl::string_view> prefix_elements =
1386
- absl::StrSplit(prefix.substr(1), absl::MaxSplits('/', 2));
1387
- if (prefix_elements.size() > 2) {
1388
- // Prefix cannot have more than 2 slashes.
1389
- *ignore_route = true;
1390
- return GRPC_ERROR_NONE;
1391
- } else if (prefix_elements.size() == 2 && prefix_elements[0].empty()) {
1392
- // Prefix contains empty string between the 2 slashes
1393
- *ignore_route = true;
1394
- return GRPC_ERROR_NONE;
1395
- }
1396
- }
1397
- type = StringMatcher::Type::kPrefix;
1398
- match_string = std::string(prefix);
1399
- } else if (envoy_config_route_v3_RouteMatch_has_path(match)) {
1400
- absl::string_view path =
1401
- UpbStringToAbsl(envoy_config_route_v3_RouteMatch_path(match));
1402
- if (path.empty()) {
1403
- // Path that is empty will never match anything, so ignore this route.
1404
- *ignore_route = true;
1405
- return GRPC_ERROR_NONE;
1406
- }
1407
- if (path[0] != '/') {
1408
- // Path which does not start with a / will never match anything, so
1409
- // ignore this route.
1410
- *ignore_route = true;
1411
- return GRPC_ERROR_NONE;
1412
- }
1413
- std::vector<absl::string_view> path_elements =
1414
- absl::StrSplit(path.substr(1), absl::MaxSplits('/', 2));
1415
- if (path_elements.size() != 2) {
1416
- // Path not in the required format of /service/method will never match
1417
- // anything, so ignore this route.
1418
- *ignore_route = true;
1419
- return GRPC_ERROR_NONE;
1420
- } else if (path_elements[0].empty()) {
1421
- // Path contains empty service name will never match anything, so ignore
1422
- // this route.
1423
- *ignore_route = true;
1424
- return GRPC_ERROR_NONE;
1425
- } else if (path_elements[1].empty()) {
1426
- // Path contains empty method name will never match anything, so ignore
1427
- // this route.
1428
- *ignore_route = true;
1429
- return GRPC_ERROR_NONE;
1430
- }
1431
- type = StringMatcher::Type::kExact;
1432
- match_string = std::string(path);
1433
- } else if (envoy_config_route_v3_RouteMatch_has_safe_regex(match)) {
1434
- const envoy_type_matcher_v3_RegexMatcher* regex_matcher =
1435
- envoy_config_route_v3_RouteMatch_safe_regex(match);
1436
- GPR_ASSERT(regex_matcher != nullptr);
1437
- type = StringMatcher::Type::kSafeRegex;
1438
- match_string = UpbStringToStdString(
1439
- envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher));
1440
- } else {
1441
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1442
- "Invalid route path specifier specified.");
1443
- }
1444
- absl::StatusOr<StringMatcher> string_matcher =
1445
- StringMatcher::Create(type, match_string, case_sensitive);
1446
- if (!string_matcher.ok()) {
1447
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
1448
- absl::StrCat("path matcher: ", string_matcher.status().message()));
1449
- }
1450
- route->matchers.path_matcher = std::move(string_matcher.value());
1451
- return GRPC_ERROR_NONE;
1452
- }
1453
-
1454
- grpc_error_handle RouteHeaderMatchersParse(
1455
- const envoy_config_route_v3_RouteMatch* match, XdsApi::Route* route) {
1456
- size_t size;
1457
- const envoy_config_route_v3_HeaderMatcher* const* headers =
1458
- envoy_config_route_v3_RouteMatch_headers(match, &size);
1459
- for (size_t i = 0; i < size; ++i) {
1460
- const envoy_config_route_v3_HeaderMatcher* header = headers[i];
1461
- const std::string name =
1462
- UpbStringToStdString(envoy_config_route_v3_HeaderMatcher_name(header));
1463
- HeaderMatcher::Type type;
1464
- std::string match_string;
1465
- int64_t range_start = 0;
1466
- int64_t range_end = 0;
1467
- bool present_match = false;
1468
- if (envoy_config_route_v3_HeaderMatcher_has_exact_match(header)) {
1469
- type = HeaderMatcher::Type::kExact;
1470
- match_string = UpbStringToStdString(
1471
- envoy_config_route_v3_HeaderMatcher_exact_match(header));
1472
- } else if (envoy_config_route_v3_HeaderMatcher_has_safe_regex_match(
1473
- header)) {
1474
- const envoy_type_matcher_v3_RegexMatcher* regex_matcher =
1475
- envoy_config_route_v3_HeaderMatcher_safe_regex_match(header);
1476
- GPR_ASSERT(regex_matcher != nullptr);
1477
- type = HeaderMatcher::Type::kSafeRegex;
1478
- match_string = UpbStringToStdString(
1479
- envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher));
1480
- } else if (envoy_config_route_v3_HeaderMatcher_has_range_match(header)) {
1481
- type = HeaderMatcher::Type::kRange;
1482
- const envoy_type_v3_Int64Range* range_matcher =
1483
- envoy_config_route_v3_HeaderMatcher_range_match(header);
1484
- range_start = envoy_type_v3_Int64Range_start(range_matcher);
1485
- range_end = envoy_type_v3_Int64Range_end(range_matcher);
1486
- } else if (envoy_config_route_v3_HeaderMatcher_has_present_match(header)) {
1487
- type = HeaderMatcher::Type::kPresent;
1488
- present_match = envoy_config_route_v3_HeaderMatcher_present_match(header);
1489
- } else if (envoy_config_route_v3_HeaderMatcher_has_prefix_match(header)) {
1490
- type = HeaderMatcher::Type::kPrefix;
1491
- match_string = UpbStringToStdString(
1492
- envoy_config_route_v3_HeaderMatcher_prefix_match(header));
1493
- } else if (envoy_config_route_v3_HeaderMatcher_has_suffix_match(header)) {
1494
- type = HeaderMatcher::Type::kSuffix;
1495
- match_string = UpbStringToStdString(
1496
- envoy_config_route_v3_HeaderMatcher_suffix_match(header));
1497
- } else if (envoy_config_route_v3_HeaderMatcher_has_contains_match(header)) {
1498
- type = HeaderMatcher::Type::kContains;
1499
- match_string = UpbStringToStdString(
1500
- envoy_config_route_v3_HeaderMatcher_contains_match(header));
1501
- } else {
1502
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1503
- "Invalid route header matcher specified.");
1504
- }
1505
- bool invert_match =
1506
- envoy_config_route_v3_HeaderMatcher_invert_match(header);
1507
- absl::StatusOr<HeaderMatcher> header_matcher =
1508
- HeaderMatcher::Create(name, type, match_string, range_start, range_end,
1509
- present_match, invert_match);
1510
- if (!header_matcher.ok()) {
1511
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
1512
- absl::StrCat("header matcher: ", header_matcher.status().message()));
1513
- }
1514
- route->matchers.header_matchers.emplace_back(
1515
- std::move(header_matcher.value()));
1516
- }
1517
- return GRPC_ERROR_NONE;
1518
- }
1519
-
1520
- grpc_error_handle RouteRuntimeFractionParse(
1521
- const envoy_config_route_v3_RouteMatch* match, XdsApi::Route* route) {
1522
- const envoy_config_core_v3_RuntimeFractionalPercent* runtime_fraction =
1523
- envoy_config_route_v3_RouteMatch_runtime_fraction(match);
1524
- if (runtime_fraction != nullptr) {
1525
- const envoy_type_v3_FractionalPercent* fraction =
1526
- envoy_config_core_v3_RuntimeFractionalPercent_default_value(
1527
- runtime_fraction);
1528
- if (fraction != nullptr) {
1529
- uint32_t numerator = envoy_type_v3_FractionalPercent_numerator(fraction);
1530
- const auto denominator =
1531
- static_cast<envoy_type_v3_FractionalPercent_DenominatorType>(
1532
- envoy_type_v3_FractionalPercent_denominator(fraction));
1533
- // Normalize to million.
1534
- switch (denominator) {
1535
- case envoy_type_v3_FractionalPercent_HUNDRED:
1536
- numerator *= 10000;
1537
- break;
1538
- case envoy_type_v3_FractionalPercent_TEN_THOUSAND:
1539
- numerator *= 100;
1540
- break;
1541
- case envoy_type_v3_FractionalPercent_MILLION:
1542
- break;
1543
- default:
1544
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1545
- "Unknown denominator type");
1546
- }
1547
- route->matchers.fraction_per_million = numerator;
1548
- }
1549
- }
1550
- return GRPC_ERROR_NONE;
1551
- }
1552
-
1553
- grpc_error_handle ExtractHttpFilterTypeName(const EncodingContext& context,
1554
- const google_protobuf_Any* any,
1555
- absl::string_view* filter_type) {
1556
- *filter_type = UpbStringToAbsl(google_protobuf_Any_type_url(any));
1557
- if (*filter_type == "type.googleapis.com/xds.type.v3.TypedStruct" ||
1558
- *filter_type == "type.googleapis.com/udpa.type.v1.TypedStruct") {
1559
- upb_strview any_value = google_protobuf_Any_value(any);
1560
- const auto* typed_struct = xds_type_v3_TypedStruct_parse(
1561
- any_value.data, any_value.size, context.arena);
1562
- if (typed_struct == nullptr) {
1563
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1564
- "could not parse TypedStruct from filter config");
1565
- }
1566
- *filter_type =
1567
- UpbStringToAbsl(xds_type_v3_TypedStruct_type_url(typed_struct));
1568
- }
1569
- *filter_type = absl::StripPrefix(*filter_type, "type.googleapis.com/");
1570
- return GRPC_ERROR_NONE;
1571
- }
1572
-
1573
- template <typename ParentType, typename EntryType>
1574
- grpc_error_handle ParseTypedPerFilterConfig(
1575
- const EncodingContext& context, const ParentType* parent,
1576
- const EntryType* (*entry_func)(const ParentType*, size_t*),
1577
- upb_strview (*key_func)(const EntryType*),
1578
- const google_protobuf_Any* (*value_func)(const EntryType*),
1579
- XdsApi::TypedPerFilterConfig* typed_per_filter_config) {
1580
- size_t filter_it = UPB_MAP_BEGIN;
1581
- while (true) {
1582
- const auto* filter_entry = entry_func(parent, &filter_it);
1583
- if (filter_entry == nullptr) break;
1584
- absl::string_view key = UpbStringToAbsl(key_func(filter_entry));
1585
- if (key.empty()) {
1586
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("empty filter name in map");
1587
- }
1588
- const google_protobuf_Any* any = value_func(filter_entry);
1589
- GPR_ASSERT(any != nullptr);
1590
- absl::string_view filter_type =
1591
- UpbStringToAbsl(google_protobuf_Any_type_url(any));
1592
- if (filter_type.empty()) {
1593
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
1594
- absl::StrCat("no filter config specified for filter name ", key));
1595
- }
1596
- bool is_optional = false;
1597
- if (filter_type ==
1598
- "type.googleapis.com/envoy.config.route.v3.FilterConfig") {
1599
- upb_strview any_value = google_protobuf_Any_value(any);
1600
- const auto* filter_config = envoy_config_route_v3_FilterConfig_parse(
1601
- any_value.data, any_value.size, context.arena);
1602
- if (filter_config == nullptr) {
1603
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
1604
- absl::StrCat("could not parse FilterConfig wrapper for ", key));
1605
- }
1606
- is_optional =
1607
- envoy_config_route_v3_FilterConfig_is_optional(filter_config);
1608
- any = envoy_config_route_v3_FilterConfig_config(filter_config);
1609
- if (any == nullptr) {
1610
- if (is_optional) continue;
1611
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
1612
- absl::StrCat("no filter config specified for filter name ", key));
1613
- }
1614
- }
1615
- grpc_error_handle error =
1616
- ExtractHttpFilterTypeName(context, any, &filter_type);
1617
- if (error != GRPC_ERROR_NONE) return error;
1618
- const XdsHttpFilterImpl* filter_impl =
1619
- XdsHttpFilterRegistry::GetFilterForType(filter_type);
1620
- if (filter_impl == nullptr) {
1621
- if (is_optional) continue;
1622
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
1623
- absl::StrCat("no filter registered for config type ", filter_type));
1624
- }
1625
- absl::StatusOr<XdsHttpFilterImpl::FilterConfig> filter_config =
1626
- filter_impl->GenerateFilterConfigOverride(
1627
- google_protobuf_Any_value(any), context.arena);
1628
- if (!filter_config.ok()) {
1629
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
1630
- "filter config for type ", filter_type,
1631
- " failed to parse: ", filter_config.status().ToString()));
1632
- }
1633
- (*typed_per_filter_config)[std::string(key)] = std::move(*filter_config);
1634
- }
1635
- return GRPC_ERROR_NONE;
1636
- }
1637
-
1638
- XdsApi::Duration DurationParse(const google_protobuf_Duration* proto_duration) {
1639
- XdsApi::Duration duration;
1640
- duration.seconds = google_protobuf_Duration_seconds(proto_duration);
1641
- duration.nanos = google_protobuf_Duration_nanos(proto_duration);
1642
- return duration;
1643
- }
1644
-
1645
- grpc_error_handle RetryPolicyParse(
1646
- const EncodingContext& context,
1647
- const envoy_config_route_v3_RetryPolicy* retry_policy,
1648
- absl::optional<XdsApi::RetryPolicy>* retry) {
1649
- std::vector<grpc_error_handle> errors;
1650
- XdsApi::RetryPolicy retry_to_return;
1651
- auto retry_on = UpbStringToStdString(
1652
- envoy_config_route_v3_RetryPolicy_retry_on(retry_policy));
1653
- std::vector<absl::string_view> codes = absl::StrSplit(retry_on, ',');
1654
- for (const auto& code : codes) {
1655
- if (code == "cancelled") {
1656
- retry_to_return.retry_on.Add(GRPC_STATUS_CANCELLED);
1657
- } else if (code == "deadline-exceeded") {
1658
- retry_to_return.retry_on.Add(GRPC_STATUS_DEADLINE_EXCEEDED);
1659
- } else if (code == "internal") {
1660
- retry_to_return.retry_on.Add(GRPC_STATUS_INTERNAL);
1661
- } else if (code == "resource-exhausted") {
1662
- retry_to_return.retry_on.Add(GRPC_STATUS_RESOURCE_EXHAUSTED);
1663
- } else if (code == "unavailable") {
1664
- retry_to_return.retry_on.Add(GRPC_STATUS_UNAVAILABLE);
1665
- } else {
1666
- if (GRPC_TRACE_FLAG_ENABLED(*context.tracer)) {
1667
- gpr_log(GPR_INFO, "Unsupported retry_on policy %s.",
1668
- std::string(code).c_str());
1669
- }
1670
- }
1671
- }
1672
- const google_protobuf_UInt32Value* num_retries =
1673
- envoy_config_route_v3_RetryPolicy_num_retries(retry_policy);
1674
- if (num_retries != nullptr) {
1675
- uint32_t num_retries_value = google_protobuf_UInt32Value_value(num_retries);
1676
- if (num_retries_value == 0) {
1677
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1678
- "RouteAction RetryPolicy num_retries set to invalid value 0."));
1679
- } else {
1680
- retry_to_return.num_retries = num_retries_value;
1681
- }
1682
- } else {
1683
- retry_to_return.num_retries = 1;
1684
- }
1685
- const envoy_config_route_v3_RetryPolicy_RetryBackOff* backoff =
1686
- envoy_config_route_v3_RetryPolicy_retry_back_off(retry_policy);
1687
- if (backoff != nullptr) {
1688
- const google_protobuf_Duration* base_interval =
1689
- envoy_config_route_v3_RetryPolicy_RetryBackOff_base_interval(backoff);
1690
- if (base_interval == nullptr) {
1691
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1692
- "RouteAction RetryPolicy RetryBackoff missing base interval."));
1693
- } else {
1694
- retry_to_return.retry_back_off.base_interval =
1695
- DurationParse(base_interval);
1696
- }
1697
- const google_protobuf_Duration* max_interval =
1698
- envoy_config_route_v3_RetryPolicy_RetryBackOff_max_interval(backoff);
1699
- XdsApi::Duration max;
1700
- if (max_interval != nullptr) {
1701
- max = DurationParse(max_interval);
1702
- } else {
1703
- // if max interval is not set, it is 10x the base, if the value in nanos
1704
- // can yield another second, adjust the value in seconds accordingly.
1705
- max.seconds = retry_to_return.retry_back_off.base_interval.seconds * 10;
1706
- max.nanos = retry_to_return.retry_back_off.base_interval.nanos * 10;
1707
- if (max.nanos > 1000000000) {
1708
- max.seconds += max.nanos / 1000000000;
1709
- max.nanos = max.nanos % 1000000000;
1710
- }
1711
- }
1712
- retry_to_return.retry_back_off.max_interval = max;
1713
- } else {
1714
- retry_to_return.retry_back_off.base_interval.seconds = 0;
1715
- retry_to_return.retry_back_off.base_interval.nanos = 25000000;
1716
- retry_to_return.retry_back_off.max_interval.seconds = 0;
1717
- retry_to_return.retry_back_off.max_interval.nanos = 250000000;
1718
- }
1719
- if (errors.empty()) {
1720
- *retry = retry_to_return;
1721
- return GRPC_ERROR_NONE;
1722
- } else {
1723
- return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing retry policy",
1724
- &errors);
1725
- }
1726
- }
1727
-
1728
- grpc_error_handle RouteActionParse(const EncodingContext& context,
1729
- const envoy_config_route_v3_Route* route_msg,
1730
- XdsApi::Route::RouteAction* route,
1731
- bool* ignore_route) {
1732
- const envoy_config_route_v3_RouteAction* route_action =
1733
- envoy_config_route_v3_Route_route(route_msg);
1734
- // Get the cluster or weighted_clusters in the RouteAction.
1735
- if (envoy_config_route_v3_RouteAction_has_cluster(route_action)) {
1736
- route->cluster_name = UpbStringToStdString(
1737
- envoy_config_route_v3_RouteAction_cluster(route_action));
1738
- if (route->cluster_name.empty()) {
1739
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1740
- "RouteAction cluster contains empty cluster name.");
1741
- }
1742
- } else if (envoy_config_route_v3_RouteAction_has_weighted_clusters(
1743
- route_action)) {
1744
- const envoy_config_route_v3_WeightedCluster* weighted_cluster =
1745
- envoy_config_route_v3_RouteAction_weighted_clusters(route_action);
1746
- uint32_t total_weight = 100;
1747
- const google_protobuf_UInt32Value* weight =
1748
- envoy_config_route_v3_WeightedCluster_total_weight(weighted_cluster);
1749
- if (weight != nullptr) {
1750
- total_weight = google_protobuf_UInt32Value_value(weight);
1751
- }
1752
- size_t clusters_size;
1753
- const envoy_config_route_v3_WeightedCluster_ClusterWeight* const* clusters =
1754
- envoy_config_route_v3_WeightedCluster_clusters(weighted_cluster,
1755
- &clusters_size);
1756
- uint32_t sum_of_weights = 0;
1757
- for (size_t j = 0; j < clusters_size; ++j) {
1758
- const envoy_config_route_v3_WeightedCluster_ClusterWeight*
1759
- cluster_weight = clusters[j];
1760
- XdsApi::Route::RouteAction::ClusterWeight cluster;
1761
- cluster.name = UpbStringToStdString(
1762
- envoy_config_route_v3_WeightedCluster_ClusterWeight_name(
1763
- cluster_weight));
1764
- if (cluster.name.empty()) {
1765
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1766
- "RouteAction weighted_cluster cluster contains empty cluster "
1767
- "name.");
1768
- }
1769
- const google_protobuf_UInt32Value* weight =
1770
- envoy_config_route_v3_WeightedCluster_ClusterWeight_weight(
1771
- cluster_weight);
1772
- if (weight == nullptr) {
1773
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1774
- "RouteAction weighted_cluster cluster missing weight");
1775
- }
1776
- cluster.weight = google_protobuf_UInt32Value_value(weight);
1777
- if (cluster.weight == 0) continue;
1778
- sum_of_weights += cluster.weight;
1779
- if (context.use_v3) {
1780
- grpc_error_handle error = ParseTypedPerFilterConfig<
1781
- envoy_config_route_v3_WeightedCluster_ClusterWeight,
1782
- envoy_config_route_v3_WeightedCluster_ClusterWeight_TypedPerFilterConfigEntry>(
1783
- context, cluster_weight,
1784
- envoy_config_route_v3_WeightedCluster_ClusterWeight_typed_per_filter_config_next,
1785
- envoy_config_route_v3_WeightedCluster_ClusterWeight_TypedPerFilterConfigEntry_key,
1786
- envoy_config_route_v3_WeightedCluster_ClusterWeight_TypedPerFilterConfigEntry_value,
1787
- &cluster.typed_per_filter_config);
1788
- if (error != GRPC_ERROR_NONE) return error;
1789
- }
1790
- route->weighted_clusters.emplace_back(std::move(cluster));
1791
- }
1792
- if (total_weight != sum_of_weights) {
1793
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1794
- "RouteAction weighted_cluster has incorrect total weight");
1795
- }
1796
- if (route->weighted_clusters.empty()) {
1797
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1798
- "RouteAction weighted_cluster has no valid clusters specified.");
1799
- }
1800
- } else {
1801
- // No cluster or weighted_clusters found in RouteAction, ignore this route.
1802
- *ignore_route = true;
1803
- }
1804
- if (!*ignore_route) {
1805
- const envoy_config_route_v3_RouteAction_MaxStreamDuration*
1806
- max_stream_duration =
1807
- envoy_config_route_v3_RouteAction_max_stream_duration(route_action);
1808
- if (max_stream_duration != nullptr) {
1809
- const google_protobuf_Duration* duration =
1810
- envoy_config_route_v3_RouteAction_MaxStreamDuration_grpc_timeout_header_max(
1811
- max_stream_duration);
1812
- if (duration == nullptr) {
1813
- duration =
1814
- envoy_config_route_v3_RouteAction_MaxStreamDuration_max_stream_duration(
1815
- max_stream_duration);
1816
- }
1817
- if (duration != nullptr) {
1818
- route->max_stream_duration = DurationParse(duration);
1819
- }
1820
- }
1821
- }
1822
- // Get HashPolicy from RouteAction
1823
- size_t size = 0;
1824
- const envoy_config_route_v3_RouteAction_HashPolicy* const* hash_policies =
1825
- envoy_config_route_v3_RouteAction_hash_policy(route_action, &size);
1826
- for (size_t i = 0; i < size; ++i) {
1827
- const envoy_config_route_v3_RouteAction_HashPolicy* hash_policy =
1828
- hash_policies[i];
1829
- XdsApi::Route::RouteAction::HashPolicy policy;
1830
- policy.terminal =
1831
- envoy_config_route_v3_RouteAction_HashPolicy_terminal(hash_policy);
1832
- const envoy_config_route_v3_RouteAction_HashPolicy_Header* header;
1833
- const envoy_config_route_v3_RouteAction_HashPolicy_FilterState*
1834
- filter_state;
1835
- if ((header = envoy_config_route_v3_RouteAction_HashPolicy_header(
1836
- hash_policy)) != nullptr) {
1837
- policy.type = XdsApi::Route::RouteAction::HashPolicy::Type::HEADER;
1838
- policy.header_name = UpbStringToStdString(
1839
- envoy_config_route_v3_RouteAction_HashPolicy_Header_header_name(
1840
- header));
1841
- const struct envoy_type_matcher_v3_RegexMatchAndSubstitute*
1842
- regex_rewrite =
1843
- envoy_config_route_v3_RouteAction_HashPolicy_Header_regex_rewrite(
1844
- header);
1845
- if (regex_rewrite != nullptr) {
1846
- const envoy_type_matcher_v3_RegexMatcher* regex_matcher =
1847
- envoy_type_matcher_v3_RegexMatchAndSubstitute_pattern(
1848
- regex_rewrite);
1849
- if (regex_matcher == nullptr) {
1850
- gpr_log(
1851
- GPR_DEBUG,
1852
- "RouteAction HashPolicy contains policy specifier Header with "
1853
- "RegexMatchAndSubstitution but RegexMatcher pattern is "
1854
- "missing");
1855
- continue;
1856
- }
1857
- RE2::Options options;
1858
- policy.regex = absl::make_unique<RE2>(
1859
- UpbStringToStdString(
1860
- envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher)),
1861
- options);
1862
- if (!policy.regex->ok()) {
1863
- gpr_log(
1864
- GPR_DEBUG,
1865
- "RouteAction HashPolicy contains policy specifier Header with "
1866
- "RegexMatchAndSubstitution but RegexMatcher pattern does not "
1867
- "compile");
1868
- continue;
1869
- }
1870
- policy.regex_substitution = UpbStringToStdString(
1871
- envoy_type_matcher_v3_RegexMatchAndSubstitute_substitution(
1872
- regex_rewrite));
1873
- }
1874
- } else if ((filter_state =
1875
- envoy_config_route_v3_RouteAction_HashPolicy_filter_state(
1876
- hash_policy)) != nullptr) {
1877
- std::string key = UpbStringToStdString(
1878
- envoy_config_route_v3_RouteAction_HashPolicy_FilterState_key(
1879
- filter_state));
1880
- if (key == "io.grpc.channel_id") {
1881
- policy.type = XdsApi::Route::RouteAction::HashPolicy::Type::CHANNEL_ID;
1882
- } else {
1883
- gpr_log(GPR_DEBUG,
1884
- "RouteAction HashPolicy contains policy specifier "
1885
- "FilterState but "
1886
- "key is not io.grpc.channel_id.");
1887
- continue;
1888
- }
1889
- } else {
1890
- gpr_log(GPR_DEBUG,
1891
- "RouteAction HashPolicy contains unsupported policy specifier.");
1892
- continue;
1893
- }
1894
- route->hash_policies.emplace_back(std::move(policy));
1895
- }
1896
- // Get retry policy
1897
- const envoy_config_route_v3_RetryPolicy* retry_policy =
1898
- envoy_config_route_v3_RouteAction_retry_policy(route_action);
1899
- if (retry_policy != nullptr) {
1900
- absl::optional<XdsApi::RetryPolicy> retry;
1901
- grpc_error_handle error = RetryPolicyParse(context, retry_policy, &retry);
1902
- if (error != GRPC_ERROR_NONE) return error;
1903
- route->retry_policy = retry;
1904
- }
1905
- return GRPC_ERROR_NONE;
1906
- }
1907
-
1908
- grpc_error_handle RouteConfigParse(
1909
- const EncodingContext& context,
1910
- const envoy_config_route_v3_RouteConfiguration* route_config,
1911
- bool /*is_v2*/, XdsApi::RdsUpdate* rds_update) {
1912
- MaybeLogRouteConfiguration(context, route_config);
1913
- // Get the virtual hosts.
1914
- size_t num_virtual_hosts;
1915
- const envoy_config_route_v3_VirtualHost* const* virtual_hosts =
1916
- envoy_config_route_v3_RouteConfiguration_virtual_hosts(
1917
- route_config, &num_virtual_hosts);
1918
- for (size_t i = 0; i < num_virtual_hosts; ++i) {
1919
- rds_update->virtual_hosts.emplace_back();
1920
- XdsApi::RdsUpdate::VirtualHost& vhost = rds_update->virtual_hosts.back();
1921
- // Parse domains.
1922
- size_t domain_size;
1923
- upb_strview const* domains = envoy_config_route_v3_VirtualHost_domains(
1924
- virtual_hosts[i], &domain_size);
1925
- for (size_t j = 0; j < domain_size; ++j) {
1926
- std::string domain_pattern = UpbStringToStdString(domains[j]);
1927
- const MatchType match_type = DomainPatternMatchType(domain_pattern);
1928
- if (match_type == INVALID_MATCH) {
1929
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
1930
- absl::StrCat("Invalid domain pattern \"", domain_pattern, "\"."));
1931
- }
1932
- vhost.domains.emplace_back(std::move(domain_pattern));
1933
- }
1934
- if (vhost.domains.empty()) {
1935
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("VirtualHost has no domains");
1936
- }
1937
- // Parse typed_per_filter_config.
1938
- if (context.use_v3) {
1939
- grpc_error_handle error = ParseTypedPerFilterConfig<
1940
- envoy_config_route_v3_VirtualHost,
1941
- envoy_config_route_v3_VirtualHost_TypedPerFilterConfigEntry>(
1942
- context, virtual_hosts[i],
1943
- envoy_config_route_v3_VirtualHost_typed_per_filter_config_next,
1944
- envoy_config_route_v3_VirtualHost_TypedPerFilterConfigEntry_key,
1945
- envoy_config_route_v3_VirtualHost_TypedPerFilterConfigEntry_value,
1946
- &vhost.typed_per_filter_config);
1947
- if (error != GRPC_ERROR_NONE) return error;
1948
- }
1949
- // Parse retry policy.
1950
- absl::optional<XdsApi::RetryPolicy> virtual_host_retry_policy;
1951
- const envoy_config_route_v3_RetryPolicy* retry_policy =
1952
- envoy_config_route_v3_VirtualHost_retry_policy(virtual_hosts[i]);
1953
- if (retry_policy != nullptr) {
1954
- grpc_error_handle error =
1955
- RetryPolicyParse(context, retry_policy, &virtual_host_retry_policy);
1956
- if (error != GRPC_ERROR_NONE) return error;
1957
- }
1958
- // Parse routes.
1959
- size_t num_routes;
1960
- const envoy_config_route_v3_Route* const* routes =
1961
- envoy_config_route_v3_VirtualHost_routes(virtual_hosts[i], &num_routes);
1962
- if (num_routes < 1) {
1963
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1964
- "No route found in the virtual host.");
1965
- }
1966
- // Loop over the whole list of routes
1967
- for (size_t j = 0; j < num_routes; ++j) {
1968
- const envoy_config_route_v3_RouteMatch* match =
1969
- envoy_config_route_v3_Route_match(routes[j]);
1970
- if (match == nullptr) {
1971
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Match can't be null.");
1972
- }
1973
- size_t query_parameters_size;
1974
- static_cast<void>(envoy_config_route_v3_RouteMatch_query_parameters(
1975
- match, &query_parameters_size));
1976
- if (query_parameters_size > 0) {
1977
- continue;
1978
- }
1979
- XdsApi::Route route;
1980
- bool ignore_route = false;
1981
- grpc_error_handle error =
1982
- RoutePathMatchParse(match, &route, &ignore_route);
1983
- if (error != GRPC_ERROR_NONE) return error;
1984
- if (ignore_route) continue;
1985
- error = RouteHeaderMatchersParse(match, &route);
1986
- if (error != GRPC_ERROR_NONE) return error;
1987
- error = RouteRuntimeFractionParse(match, &route);
1988
- if (error != GRPC_ERROR_NONE) return error;
1989
- if (envoy_config_route_v3_Route_has_route(routes[j])) {
1990
- route.action.emplace<XdsApi::Route::RouteAction>();
1991
- auto& route_action =
1992
- absl::get<XdsApi::Route::RouteAction>(route.action);
1993
- error =
1994
- RouteActionParse(context, routes[j], &route_action, &ignore_route);
1995
- if (error != GRPC_ERROR_NONE) return error;
1996
- if (ignore_route) continue;
1997
- if (route_action.retry_policy == absl::nullopt &&
1998
- retry_policy != nullptr) {
1999
- route_action.retry_policy = virtual_host_retry_policy;
2000
- }
2001
- } else if (envoy_config_route_v3_Route_has_non_forwarding_action(
2002
- routes[j])) {
2003
- route.action.emplace<XdsApi::Route::NonForwardingAction>();
2004
- }
2005
- if (context.use_v3) {
2006
- grpc_error_handle error = ParseTypedPerFilterConfig<
2007
- envoy_config_route_v3_Route,
2008
- envoy_config_route_v3_Route_TypedPerFilterConfigEntry>(
2009
- context, routes[j],
2010
- envoy_config_route_v3_Route_typed_per_filter_config_next,
2011
- envoy_config_route_v3_Route_TypedPerFilterConfigEntry_key,
2012
- envoy_config_route_v3_Route_TypedPerFilterConfigEntry_value,
2013
- &route.typed_per_filter_config);
2014
- if (error != GRPC_ERROR_NONE) return error;
2015
- }
2016
- vhost.routes.emplace_back(std::move(route));
2017
- }
2018
- if (vhost.routes.empty()) {
2019
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("No valid routes specified.");
2020
- }
2021
- }
2022
- return GRPC_ERROR_NONE;
2023
- }
2024
-
2025
- // CertificateProviderInstance is deprecated but we are still supporting it for
2026
- // backward compatibility reasons. Note that we still parse the data into the
2027
- // same CertificateProviderPluginInstance struct since the fields are the same.
2028
- // TODO(yashykt): Remove this once we stop supporting the old way of fetching
2029
- // certificate provider instances.
2030
- grpc_error_handle CertificateProviderInstanceParse(
2031
- const EncodingContext& context,
2032
- const envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CertificateProviderInstance*
2033
- certificate_provider_instance_proto,
2034
- XdsApi::CommonTlsContext::CertificateProviderPluginInstance*
2035
- certificate_provider_plugin_instance) {
2036
- *certificate_provider_plugin_instance = {
2037
- UpbStringToStdString(
2038
- envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CertificateProviderInstance_instance_name(
2039
- certificate_provider_instance_proto)),
2040
- UpbStringToStdString(
2041
- envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CertificateProviderInstance_certificate_name(
2042
- certificate_provider_instance_proto))};
2043
- if (context.certificate_provider_definition_map->find(
2044
- certificate_provider_plugin_instance->instance_name) ==
2045
- context.certificate_provider_definition_map->end()) {
2046
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
2047
- absl::StrCat("Unrecognized certificate provider instance name: ",
2048
- certificate_provider_plugin_instance->instance_name));
2049
- }
2050
- return GRPC_ERROR_NONE;
2051
- }
2052
-
2053
- grpc_error_handle CertificateProviderPluginInstanceParse(
2054
- const EncodingContext& context,
2055
- const envoy_extensions_transport_sockets_tls_v3_CertificateProviderPluginInstance*
2056
- certificate_provider_plugin_instance_proto,
2057
- XdsApi::CommonTlsContext::CertificateProviderPluginInstance*
2058
- certificate_provider_plugin_instance) {
2059
- *certificate_provider_plugin_instance = {
2060
- UpbStringToStdString(
2061
- envoy_extensions_transport_sockets_tls_v3_CertificateProviderPluginInstance_instance_name(
2062
- certificate_provider_plugin_instance_proto)),
2063
- UpbStringToStdString(
2064
- envoy_extensions_transport_sockets_tls_v3_CertificateProviderPluginInstance_certificate_name(
2065
- certificate_provider_plugin_instance_proto))};
2066
- if (context.certificate_provider_definition_map->find(
2067
- certificate_provider_plugin_instance->instance_name) ==
2068
- context.certificate_provider_definition_map->end()) {
2069
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
2070
- absl::StrCat("Unrecognized certificate provider instance name: ",
2071
- certificate_provider_plugin_instance->instance_name));
2072
- }
2073
- return GRPC_ERROR_NONE;
2074
- }
2075
-
2076
- grpc_error_handle CertificateValidationContextParse(
2077
- const EncodingContext& context,
2078
- const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext*
2079
- certificate_validation_context_proto,
2080
- XdsApi::CommonTlsContext::CertificateValidationContext*
2081
- certificate_validation_context) {
2082
- std::vector<grpc_error_handle> errors;
2083
- size_t len = 0;
2084
- auto* subject_alt_names_matchers =
2085
- envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_match_subject_alt_names(
2086
- certificate_validation_context_proto, &len);
2087
- for (size_t i = 0; i < len; ++i) {
2088
- StringMatcher::Type type;
2089
- std::string matcher;
2090
- if (envoy_type_matcher_v3_StringMatcher_has_exact(
2091
- subject_alt_names_matchers[i])) {
2092
- type = StringMatcher::Type::kExact;
2093
- matcher = UpbStringToStdString(envoy_type_matcher_v3_StringMatcher_exact(
2094
- subject_alt_names_matchers[i]));
2095
- } else if (envoy_type_matcher_v3_StringMatcher_has_prefix(
2096
- subject_alt_names_matchers[i])) {
2097
- type = StringMatcher::Type::kPrefix;
2098
- matcher = UpbStringToStdString(envoy_type_matcher_v3_StringMatcher_prefix(
2099
- subject_alt_names_matchers[i]));
2100
- } else if (envoy_type_matcher_v3_StringMatcher_has_suffix(
2101
- subject_alt_names_matchers[i])) {
2102
- type = StringMatcher::Type::kSuffix;
2103
- matcher = UpbStringToStdString(envoy_type_matcher_v3_StringMatcher_suffix(
2104
- subject_alt_names_matchers[i]));
2105
- } else if (envoy_type_matcher_v3_StringMatcher_has_contains(
2106
- subject_alt_names_matchers[i])) {
2107
- type = StringMatcher::Type::kContains;
2108
- matcher =
2109
- UpbStringToStdString(envoy_type_matcher_v3_StringMatcher_contains(
2110
- subject_alt_names_matchers[i]));
2111
- } else if (envoy_type_matcher_v3_StringMatcher_has_safe_regex(
2112
- subject_alt_names_matchers[i])) {
2113
- type = StringMatcher::Type::kSafeRegex;
2114
- auto* regex_matcher = envoy_type_matcher_v3_StringMatcher_safe_regex(
2115
- subject_alt_names_matchers[i]);
2116
- matcher = UpbStringToStdString(
2117
- envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher));
2118
- } else {
2119
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2120
- "Invalid StringMatcher specified"));
2121
- continue;
2122
- }
2123
- bool ignore_case = envoy_type_matcher_v3_StringMatcher_ignore_case(
2124
- subject_alt_names_matchers[i]);
2125
- absl::StatusOr<StringMatcher> string_matcher =
2126
- StringMatcher::Create(type, matcher,
2127
- /*case_sensitive=*/!ignore_case);
2128
- if (!string_matcher.ok()) {
2129
- errors.push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING(
2130
- absl::StrCat("string matcher: ", string_matcher.status().message())));
2131
- continue;
2132
- }
2133
- if (type == StringMatcher::Type::kSafeRegex && ignore_case) {
2134
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2135
- "StringMatcher: ignore_case has no effect for SAFE_REGEX."));
2136
- continue;
2137
- }
2138
- certificate_validation_context->match_subject_alt_names.push_back(
2139
- std::move(string_matcher.value()));
2140
- }
2141
- auto* ca_certificate_provider_instance =
2142
- envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_ca_certificate_provider_instance(
2143
- certificate_validation_context_proto);
2144
- if (ca_certificate_provider_instance != nullptr) {
2145
- grpc_error_handle error = CertificateProviderPluginInstanceParse(
2146
- context, ca_certificate_provider_instance,
2147
- &certificate_validation_context->ca_certificate_provider_instance);
2148
- if (error != GRPC_ERROR_NONE) errors.push_back(error);
2149
- }
2150
- if (envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_verify_certificate_spki(
2151
- certificate_validation_context_proto, nullptr) != nullptr) {
2152
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2153
- "CertificateValidationContext: verify_certificate_spki "
2154
- "unsupported"));
2155
- }
2156
- if (envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_verify_certificate_hash(
2157
- certificate_validation_context_proto, nullptr) != nullptr) {
2158
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2159
- "CertificateValidationContext: verify_certificate_hash "
2160
- "unsupported"));
2161
- }
2162
- auto* require_signed_certificate_timestamp =
2163
- envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_require_signed_certificate_timestamp(
2164
- certificate_validation_context_proto);
2165
- if (require_signed_certificate_timestamp != nullptr &&
2166
- google_protobuf_BoolValue_value(require_signed_certificate_timestamp)) {
2167
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2168
- "CertificateValidationContext: "
2169
- "require_signed_certificate_timestamp unsupported"));
2170
- }
2171
- if (envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_has_crl(
2172
- certificate_validation_context_proto)) {
2173
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2174
- "CertificateValidationContext: crl unsupported"));
2175
- }
2176
- if (envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_has_custom_validator_config(
2177
- certificate_validation_context_proto)) {
2178
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2179
- "CertificateValidationContext: custom_validator_config "
2180
- "unsupported"));
2181
- }
2182
- return GRPC_ERROR_CREATE_FROM_VECTOR(
2183
- "Error parsing CertificateValidationContext", &errors);
2184
- }
2185
-
2186
- grpc_error_handle CommonTlsContextParse(
2187
- const EncodingContext& context,
2188
- const envoy_extensions_transport_sockets_tls_v3_CommonTlsContext*
2189
- common_tls_context_proto,
2190
- XdsApi::CommonTlsContext* common_tls_context) {
2191
- std::vector<grpc_error_handle> errors;
2192
- // The validation context is derived from the oneof in
2193
- // 'validation_context_type'. 'validation_context_sds_secret_config' is not
2194
- // supported.
2195
- auto* combined_validation_context =
2196
- envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_combined_validation_context(
2197
- common_tls_context_proto);
2198
- if (combined_validation_context != nullptr) {
2199
- auto* default_validation_context =
2200
- envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CombinedCertificateValidationContext_default_validation_context(
2201
- combined_validation_context);
2202
- if (default_validation_context != nullptr) {
2203
- grpc_error_handle error = CertificateValidationContextParse(
2204
- context, default_validation_context,
2205
- &common_tls_context->certificate_validation_context);
2206
- if (error != GRPC_ERROR_NONE) errors.push_back(error);
2207
- }
2208
- // If after parsing default_validation_context,
2209
- // common_tls_context->certificate_validation_context.ca_certificate_provider_instance
2210
- // is empty, fall back onto
2211
- // 'validation_context_certificate_provider_instance' inside
2212
- // 'combined_validation_context'. Note that this way of fetching root
2213
- // certificates is deprecated and will be removed in the future.
2214
- // TODO(yashykt): Remove this once it's no longer needed.
2215
- auto* validation_context_certificate_provider_instance =
2216
- envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CombinedCertificateValidationContext_validation_context_certificate_provider_instance(
2217
- combined_validation_context);
2218
- if (common_tls_context->certificate_validation_context
2219
- .ca_certificate_provider_instance.Empty() &&
2220
- validation_context_certificate_provider_instance != nullptr) {
2221
- grpc_error_handle error = CertificateProviderInstanceParse(
2222
- context, validation_context_certificate_provider_instance,
2223
- &common_tls_context->certificate_validation_context
2224
- .ca_certificate_provider_instance);
2225
- if (error != GRPC_ERROR_NONE) errors.push_back(error);
2226
- }
2227
- } else {
2228
- auto* validation_context =
2229
- envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_validation_context(
2230
- common_tls_context_proto);
2231
- if (validation_context != nullptr) {
2232
- grpc_error_handle error = CertificateValidationContextParse(
2233
- context, validation_context,
2234
- &common_tls_context->certificate_validation_context);
2235
- if (error != GRPC_ERROR_NONE) errors.push_back(error);
2236
- } else if (
2237
- envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_has_validation_context_sds_secret_config(
2238
- common_tls_context_proto)) {
2239
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2240
- "validation_context_sds_secret_config unsupported"));
2241
- }
2242
- }
2243
- auto* tls_certificate_provider_instance =
2244
- envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_tls_certificate_provider_instance(
2245
- common_tls_context_proto);
2246
- if (tls_certificate_provider_instance != nullptr) {
2247
- grpc_error_handle error = CertificateProviderPluginInstanceParse(
2248
- context, tls_certificate_provider_instance,
2249
- &common_tls_context->tls_certificate_provider_instance);
2250
- if (error != GRPC_ERROR_NONE) errors.push_back(error);
2251
- } else {
2252
- // Fall back onto 'tls_certificate_certificate_provider_instance'. Note that
2253
- // this way of fetching identity certificates is deprecated and will be
2254
- // removed in the future.
2255
- // TODO(yashykt): Remove this once it's no longer needed.
2256
- auto* tls_certificate_certificate_provider_instance =
2257
- envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_tls_certificate_certificate_provider_instance(
2258
- common_tls_context_proto);
2259
- if (tls_certificate_certificate_provider_instance != nullptr) {
2260
- grpc_error_handle error = CertificateProviderInstanceParse(
2261
- context, tls_certificate_certificate_provider_instance,
2262
- &common_tls_context->tls_certificate_provider_instance);
2263
- if (error != GRPC_ERROR_NONE) errors.push_back(error);
2264
- } else {
2265
- if (envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_has_tls_certificates(
2266
- common_tls_context_proto)) {
2267
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2268
- "tls_certificates unsupported"));
2269
- }
2270
- if (envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_has_tls_certificate_sds_secret_configs(
2271
- common_tls_context_proto)) {
2272
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2273
- "tls_certificate_sds_secret_configs unsupported"));
2274
- }
2275
- }
2276
- }
2277
- if (envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_has_tls_params(
2278
- common_tls_context_proto)) {
2279
- errors.push_back(
2280
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("tls_params unsupported"));
2281
- }
2282
- if (envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_has_custom_handshaker(
2283
- common_tls_context_proto)) {
2284
- errors.push_back(
2285
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("custom_handshaker unsupported"));
2286
- }
2287
- return GRPC_ERROR_CREATE_FROM_VECTOR("Error parsing CommonTlsContext",
2288
- &errors);
2289
- }
2290
-
2291
- grpc_error_handle HttpConnectionManagerParse(
2292
- bool is_client, const EncodingContext& context,
2293
- const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager*
2294
- http_connection_manager_proto,
2295
- bool is_v2,
2296
- XdsApi::LdsUpdate::HttpConnectionManager* http_connection_manager) {
2297
- MaybeLogHttpConnectionManager(context, http_connection_manager_proto);
2298
- // Obtain max_stream_duration from Http Protocol Options.
2299
- const envoy_config_core_v3_HttpProtocolOptions* options =
2300
- envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_common_http_protocol_options(
2301
- http_connection_manager_proto);
2302
- if (options != nullptr) {
2303
- const google_protobuf_Duration* duration =
2304
- envoy_config_core_v3_HttpProtocolOptions_max_stream_duration(options);
2305
- if (duration != nullptr) {
2306
- http_connection_manager->http_max_stream_duration =
2307
- DurationParse(duration);
2308
- }
2309
- }
2310
- // Parse filters.
2311
- if (!is_v2) {
2312
- size_t num_filters = 0;
2313
- const auto* http_filters =
2314
- envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_http_filters(
2315
- http_connection_manager_proto, &num_filters);
2316
- std::set<absl::string_view> names_seen;
2317
- for (size_t i = 0; i < num_filters; ++i) {
2318
- const auto* http_filter = http_filters[i];
2319
- absl::string_view name = UpbStringToAbsl(
2320
- envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter_name(
2321
- http_filter));
2322
- if (name.empty()) {
2323
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
2324
- absl::StrCat("empty filter name at index ", i));
2325
- }
2326
- if (names_seen.find(name) != names_seen.end()) {
2327
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
2328
- absl::StrCat("duplicate HTTP filter name: ", name));
2329
- }
2330
- names_seen.insert(name);
2331
- const bool is_optional =
2332
- envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter_is_optional(
2333
- http_filter);
2334
- const google_protobuf_Any* any =
2335
- envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter_typed_config(
2336
- http_filter);
2337
- if (any == nullptr) {
2338
- if (is_optional) continue;
2339
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
2340
- absl::StrCat("no filter config specified for filter name ", name));
2341
- }
2342
- absl::string_view filter_type;
2343
- grpc_error_handle error =
2344
- ExtractHttpFilterTypeName(context, any, &filter_type);
2345
- if (error != GRPC_ERROR_NONE) return error;
2346
- const XdsHttpFilterImpl* filter_impl =
2347
- XdsHttpFilterRegistry::GetFilterForType(filter_type);
2348
- if (filter_impl == nullptr) {
2349
- if (is_optional) continue;
2350
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
2351
- absl::StrCat("no filter registered for config type ", filter_type));
2352
- }
2353
- if ((is_client && !filter_impl->IsSupportedOnClients()) ||
2354
- (!is_client && !filter_impl->IsSupportedOnServers())) {
2355
- if (is_optional) continue;
2356
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
2357
- absl::StrFormat("Filter %s is not supported on %s", filter_type,
2358
- is_client ? "clients" : "servers"));
2359
- }
2360
- absl::StatusOr<XdsHttpFilterImpl::FilterConfig> filter_config =
2361
- filter_impl->GenerateFilterConfig(google_protobuf_Any_value(any),
2362
- context.arena);
2363
- if (!filter_config.ok()) {
2364
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
2365
- "filter config for type ", filter_type,
2366
- " failed to parse: ", filter_config.status().ToString()));
2367
- }
2368
- http_connection_manager->http_filters.emplace_back(
2369
- XdsApi::LdsUpdate::HttpConnectionManager::HttpFilter{
2370
- std::string(name), std::move(*filter_config)});
2371
- }
2372
- if (http_connection_manager->http_filters.empty()) {
2373
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2374
- "Expected at least one HTTP filter");
2375
- }
2376
- // Make sure that the last filter is terminal and non-last filters are
2377
- // non-terminal. Note that this check is being performed in a separate loop
2378
- // to take care of the case where there are two terminal filters in the list
2379
- // out of which only one gets added in the final list.
2380
- for (const auto& http_filter : http_connection_manager->http_filters) {
2381
- const XdsHttpFilterImpl* filter_impl =
2382
- XdsHttpFilterRegistry::GetFilterForType(
2383
- http_filter.config.config_proto_type_name);
2384
- if (&http_filter != &http_connection_manager->http_filters.back()) {
2385
- // Filters before the last filter must not be terminal.
2386
- if (filter_impl->IsTerminalFilter()) {
2387
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
2388
- absl::StrCat("terminal filter for config type ",
2389
- http_filter.config.config_proto_type_name,
2390
- " must be the last filter in the chain"));
2391
- }
2392
- } else {
2393
- // The last filter must be terminal.
2394
- if (!filter_impl->IsTerminalFilter()) {
2395
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
2396
- absl::StrCat("non-terminal filter for config type ",
2397
- http_filter.config.config_proto_type_name,
2398
- " is the last filter in the chain"));
2399
- }
2400
- }
2401
- }
2402
- } else {
2403
- // If using a v2 config, we just hard-code a list containing only the
2404
- // router filter without actually looking at the config. This ensures
2405
- // that the right thing happens in the xds resolver without having
2406
- // to expose whether the resource we received was v2 or v3.
2407
- http_connection_manager->http_filters.emplace_back(
2408
- XdsApi::LdsUpdate::HttpConnectionManager::HttpFilter{
2409
- "router", {kXdsHttpRouterFilterConfigName, Json()}});
2410
- }
2411
- // Guarding parsing of RouteConfig on the server side with the environmental
2412
- // variable since that's the first feature on the server side that will be
2413
- // using this.
2414
- if (is_client || XdsRbacEnabled()) {
2415
- // Found inlined route_config. Parse it to find the cluster_name.
2416
- if (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_route_config(
2417
- http_connection_manager_proto)) {
2418
- const envoy_config_route_v3_RouteConfiguration* route_config =
2419
- envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_config(
2420
- http_connection_manager_proto);
2421
- XdsApi::RdsUpdate rds_update;
2422
- grpc_error_handle error =
2423
- RouteConfigParse(context, route_config, is_v2, &rds_update);
2424
- if (error != GRPC_ERROR_NONE) return error;
2425
- http_connection_manager->rds_update = std::move(rds_update);
2426
- return GRPC_ERROR_NONE;
2427
- }
2428
- // Validate that RDS must be used to get the route_config dynamically.
2429
- const envoy_extensions_filters_network_http_connection_manager_v3_Rds* rds =
2430
- envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_rds(
2431
- http_connection_manager_proto);
2432
- if (rds == nullptr) {
2433
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2434
- "HttpConnectionManager neither has inlined route_config nor RDS.");
2435
- }
2436
- // Check that the ConfigSource specifies ADS.
2437
- const envoy_config_core_v3_ConfigSource* config_source =
2438
- envoy_extensions_filters_network_http_connection_manager_v3_Rds_config_source(
2439
- rds);
2440
- if (config_source == nullptr) {
2441
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2442
- "HttpConnectionManager missing config_source for RDS.");
2443
- }
2444
- if (!envoy_config_core_v3_ConfigSource_has_ads(config_source)) {
2445
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2446
- "HttpConnectionManager ConfigSource for RDS does not specify ADS.");
2447
- }
2448
- // Get the route_config_name.
2449
- http_connection_manager->route_config_name = UpbStringToStdString(
2450
- envoy_extensions_filters_network_http_connection_manager_v3_Rds_route_config_name(
2451
- rds));
2452
- }
2453
- return GRPC_ERROR_NONE;
2454
- }
2455
-
2456
- grpc_error_handle LdsResourceParseClient(
2457
- const EncodingContext& context,
2458
- const envoy_config_listener_v3_ApiListener* api_listener, bool is_v2,
2459
- XdsApi::LdsUpdate* lds_update) {
2460
- lds_update->type = XdsApi::LdsUpdate::ListenerType::kHttpApiListener;
2461
- const upb_strview encoded_api_listener = google_protobuf_Any_value(
2462
- envoy_config_listener_v3_ApiListener_api_listener(api_listener));
2463
- const auto* http_connection_manager =
2464
- envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_parse(
2465
- encoded_api_listener.data, encoded_api_listener.size, context.arena);
2466
- if (http_connection_manager == nullptr) {
2467
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2468
- "Could not parse HttpConnectionManager config from ApiListener");
2469
- }
2470
- return HttpConnectionManagerParse(true /* is_client */, context,
2471
- http_connection_manager, is_v2,
2472
- &lds_update->http_connection_manager);
2473
- }
2474
-
2475
- grpc_error_handle DownstreamTlsContextParse(
2476
- const EncodingContext& context,
2477
- const envoy_config_core_v3_TransportSocket* transport_socket,
2478
- XdsApi::DownstreamTlsContext* downstream_tls_context) {
2479
- absl::string_view name = UpbStringToAbsl(
2480
- envoy_config_core_v3_TransportSocket_name(transport_socket));
2481
- if (name != "envoy.transport_sockets.tls") {
2482
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
2483
- absl::StrCat("Unrecognized transport socket: ", name));
2484
- }
2485
- auto* typed_config =
2486
- envoy_config_core_v3_TransportSocket_typed_config(transport_socket);
2487
- std::vector<grpc_error_handle> errors;
2488
- if (typed_config != nullptr) {
2489
- const upb_strview encoded_downstream_tls_context =
2490
- google_protobuf_Any_value(typed_config);
2491
- auto* downstream_tls_context_proto =
2492
- envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_parse(
2493
- encoded_downstream_tls_context.data,
2494
- encoded_downstream_tls_context.size, context.arena);
2495
- if (downstream_tls_context_proto == nullptr) {
2496
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2497
- "Can't decode downstream tls context.");
2498
- }
2499
- auto* common_tls_context =
2500
- envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_common_tls_context(
2501
- downstream_tls_context_proto);
2502
- if (common_tls_context != nullptr) {
2503
- grpc_error_handle error =
2504
- CommonTlsContextParse(context, common_tls_context,
2505
- &downstream_tls_context->common_tls_context);
2506
- if (error != GRPC_ERROR_NONE) errors.push_back(error);
2507
- }
2508
- auto* require_client_certificate =
2509
- envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_require_client_certificate(
2510
- downstream_tls_context_proto);
2511
- if (require_client_certificate != nullptr) {
2512
- downstream_tls_context->require_client_certificate =
2513
- google_protobuf_BoolValue_value(require_client_certificate);
2514
- }
2515
- auto* require_sni =
2516
- envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_require_sni(
2517
- downstream_tls_context_proto);
2518
- if (require_sni != nullptr &&
2519
- google_protobuf_BoolValue_value(require_sni)) {
2520
- errors.push_back(
2521
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("require_sni: unsupported"));
2522
- }
2523
- if (envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_ocsp_staple_policy(
2524
- downstream_tls_context_proto) !=
2525
- envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_LENIENT_STAPLING) {
2526
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2527
- "ocsp_staple_policy: Only LENIENT_STAPLING supported"));
2528
- }
2529
- }
2530
- if (downstream_tls_context->common_tls_context
2531
- .tls_certificate_provider_instance.instance_name.empty()) {
2532
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2533
- "TLS configuration provided but no "
2534
- "tls_certificate_provider_instance found."));
2535
- }
2536
- if (downstream_tls_context->require_client_certificate &&
2537
- downstream_tls_context->common_tls_context.certificate_validation_context
2538
- .ca_certificate_provider_instance.instance_name.empty()) {
2539
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2540
- "TLS configuration requires client certificates but no certificate "
2541
- "provider instance specified for validation."));
2542
- }
2543
- if (!downstream_tls_context->common_tls_context.certificate_validation_context
2544
- .match_subject_alt_names.empty()) {
2545
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2546
- "match_subject_alt_names not supported on servers"));
2547
- }
2548
- return GRPC_ERROR_CREATE_FROM_VECTOR("Error parsing DownstreamTlsContext",
2549
- &errors);
2550
- }
2551
-
2552
- grpc_error_handle CidrRangeParse(
2553
- const envoy_config_core_v3_CidrRange* cidr_range_proto,
2554
- XdsApi::LdsUpdate::FilterChainMap::CidrRange* cidr_range) {
2555
- std::string address_prefix = UpbStringToStdString(
2556
- envoy_config_core_v3_CidrRange_address_prefix(cidr_range_proto));
2557
- grpc_error_handle error =
2558
- grpc_string_to_sockaddr(&cidr_range->address, address_prefix.c_str(), 0);
2559
- if (error != GRPC_ERROR_NONE) return error;
2560
- cidr_range->prefix_len = 0;
2561
- auto* prefix_len_proto =
2562
- envoy_config_core_v3_CidrRange_prefix_len(cidr_range_proto);
2563
- if (prefix_len_proto != nullptr) {
2564
- cidr_range->prefix_len = std::min(
2565
- google_protobuf_UInt32Value_value(prefix_len_proto),
2566
- (reinterpret_cast<const grpc_sockaddr*>(cidr_range->address.addr))
2567
- ->sa_family == GRPC_AF_INET
2568
- ? uint32_t(32)
2569
- : uint32_t(128));
2570
- }
2571
- // Normalize the network address by masking it with prefix_len
2572
- grpc_sockaddr_mask_bits(&cidr_range->address, cidr_range->prefix_len);
2573
- return GRPC_ERROR_NONE;
2574
- }
2575
-
2576
- grpc_error_handle FilterChainMatchParse(
2577
- const envoy_config_listener_v3_FilterChainMatch* filter_chain_match_proto,
2578
- FilterChain::FilterChainMatch* filter_chain_match) {
2579
- auto* destination_port =
2580
- envoy_config_listener_v3_FilterChainMatch_destination_port(
2581
- filter_chain_match_proto);
2582
- if (destination_port != nullptr) {
2583
- filter_chain_match->destination_port =
2584
- google_protobuf_UInt32Value_value(destination_port);
2585
- }
2586
- size_t size = 0;
2587
- auto* prefix_ranges = envoy_config_listener_v3_FilterChainMatch_prefix_ranges(
2588
- filter_chain_match_proto, &size);
2589
- filter_chain_match->prefix_ranges.reserve(size);
2590
- for (size_t i = 0; i < size; i++) {
2591
- XdsApi::LdsUpdate::FilterChainMap::CidrRange cidr_range;
2592
- grpc_error_handle error = CidrRangeParse(prefix_ranges[i], &cidr_range);
2593
- if (error != GRPC_ERROR_NONE) return error;
2594
- filter_chain_match->prefix_ranges.push_back(cidr_range);
2595
- }
2596
- filter_chain_match->source_type =
2597
- static_cast<XdsApi::LdsUpdate::FilterChainMap::ConnectionSourceType>(
2598
- envoy_config_listener_v3_FilterChainMatch_source_type(
2599
- filter_chain_match_proto));
2600
- auto* source_prefix_ranges =
2601
- envoy_config_listener_v3_FilterChainMatch_source_prefix_ranges(
2602
- filter_chain_match_proto, &size);
2603
- filter_chain_match->source_prefix_ranges.reserve(size);
2604
- for (size_t i = 0; i < size; i++) {
2605
- XdsApi::LdsUpdate::FilterChainMap::CidrRange cidr_range;
2606
- grpc_error_handle error =
2607
- CidrRangeParse(source_prefix_ranges[i], &cidr_range);
2608
- if (error != GRPC_ERROR_NONE) return error;
2609
- filter_chain_match->source_prefix_ranges.push_back(cidr_range);
2610
- }
2611
- auto* source_ports = envoy_config_listener_v3_FilterChainMatch_source_ports(
2612
- filter_chain_match_proto, &size);
2613
- filter_chain_match->source_ports.reserve(size);
2614
- for (size_t i = 0; i < size; i++) {
2615
- filter_chain_match->source_ports.push_back(source_ports[i]);
2616
- }
2617
- auto* server_names = envoy_config_listener_v3_FilterChainMatch_server_names(
2618
- filter_chain_match_proto, &size);
2619
- for (size_t i = 0; i < size; i++) {
2620
- filter_chain_match->server_names.push_back(
2621
- UpbStringToStdString(server_names[i]));
2622
- }
2623
- filter_chain_match->transport_protocol = UpbStringToStdString(
2624
- envoy_config_listener_v3_FilterChainMatch_transport_protocol(
2625
- filter_chain_match_proto));
2626
- auto* application_protocols =
2627
- envoy_config_listener_v3_FilterChainMatch_application_protocols(
2628
- filter_chain_match_proto, &size);
2629
- for (size_t i = 0; i < size; i++) {
2630
- filter_chain_match->application_protocols.push_back(
2631
- UpbStringToStdString(application_protocols[i]));
2632
- }
2633
- return GRPC_ERROR_NONE;
2634
- }
2635
-
2636
- grpc_error_handle FilterChainParse(
2637
- const EncodingContext& context,
2638
- const envoy_config_listener_v3_FilterChain* filter_chain_proto, bool is_v2,
2639
- FilterChain* filter_chain) {
2640
- std::vector<grpc_error_handle> errors;
2641
- auto* filter_chain_match =
2642
- envoy_config_listener_v3_FilterChain_filter_chain_match(
2643
- filter_chain_proto);
2644
- if (filter_chain_match != nullptr) {
2645
- grpc_error_handle error = FilterChainMatchParse(
2646
- filter_chain_match, &filter_chain->filter_chain_match);
2647
- if (error != GRPC_ERROR_NONE) errors.push_back(error);
2648
- }
2649
- filter_chain->filter_chain_data =
2650
- std::make_shared<XdsApi::LdsUpdate::FilterChainData>();
2651
- // Parse the filters list. Currently we only support HttpConnectionManager.
2652
- size_t size = 0;
2653
- auto* filters =
2654
- envoy_config_listener_v3_FilterChain_filters(filter_chain_proto, &size);
2655
- if (size != 1) {
2656
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2657
- "FilterChain should have exactly one filter: HttpConnectionManager; no "
2658
- "other filter is supported at the moment"));
2659
- } else {
2660
- auto* typed_config =
2661
- envoy_config_listener_v3_Filter_typed_config(filters[0]);
2662
- if (typed_config == nullptr) {
2663
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2664
- "No typed_config found in filter."));
2665
- } else {
2666
- absl::string_view type_url =
2667
- UpbStringToAbsl(google_protobuf_Any_type_url(typed_config));
2668
- if (type_url !=
2669
- "type.googleapis.com/"
2670
- "envoy.extensions.filters.network.http_connection_manager.v3."
2671
- "HttpConnectionManager") {
2672
- errors.push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING(
2673
- absl::StrCat("Unsupported filter type ", type_url)));
2674
- } else {
2675
- const upb_strview encoded_http_connection_manager =
2676
- google_protobuf_Any_value(typed_config);
2677
- const auto* http_connection_manager =
2678
- envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_parse(
2679
- encoded_http_connection_manager.data,
2680
- encoded_http_connection_manager.size, context.arena);
2681
- if (http_connection_manager == nullptr) {
2682
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2683
- "Could not parse HttpConnectionManager config from filter "
2684
- "typed_config"));
2685
- } else {
2686
- grpc_error_handle error = HttpConnectionManagerParse(
2687
- false /* is_client */, context, http_connection_manager, is_v2,
2688
- &filter_chain->filter_chain_data->http_connection_manager);
2689
- if (error != GRPC_ERROR_NONE) errors.push_back(error);
2690
- }
2691
- }
2692
- }
2693
- }
2694
- auto* transport_socket =
2695
- envoy_config_listener_v3_FilterChain_transport_socket(filter_chain_proto);
2696
- if (transport_socket != nullptr) {
2697
- grpc_error_handle error = DownstreamTlsContextParse(
2698
- context, transport_socket,
2699
- &filter_chain->filter_chain_data->downstream_tls_context);
2700
- if (error != GRPC_ERROR_NONE) errors.push_back(error);
2701
- }
2702
- return GRPC_ERROR_CREATE_FROM_VECTOR("Error parsing FilterChain", &errors);
2703
- }
2704
-
2705
- grpc_error_handle AddressParse(
2706
- const envoy_config_core_v3_Address* address_proto, std::string* address) {
2707
- const auto* socket_address =
2708
- envoy_config_core_v3_Address_socket_address(address_proto);
2709
- if (socket_address == nullptr) {
2710
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2711
- "Address does not have socket_address");
2712
- }
2713
- if (envoy_config_core_v3_SocketAddress_protocol(socket_address) !=
2714
- envoy_config_core_v3_SocketAddress_TCP) {
2715
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2716
- "SocketAddress protocol is not TCP");
2717
- }
2718
- uint32_t port = envoy_config_core_v3_SocketAddress_port_value(socket_address);
2719
- if (port > 65535) {
2720
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Invalid port");
2721
- }
2722
- *address = JoinHostPort(
2723
- UpbStringToAbsl(
2724
- envoy_config_core_v3_SocketAddress_address(socket_address)),
2725
- port);
2726
- return GRPC_ERROR_NONE;
2727
- }
2728
-
2729
- // An intermediate map for filter chains that we create to validate the list of
2730
- // filter chains received from the control plane and to finally create
2731
- // XdsApi::LdsUpdate::FilterChainMap
2732
- struct InternalFilterChainMap {
2733
- using SourceIpMap =
2734
- std::map<std::string, XdsApi::LdsUpdate::FilterChainMap::SourceIp>;
2735
- using ConnectionSourceTypesArray = std::array<SourceIpMap, 3>;
2736
- struct DestinationIp {
2737
- absl::optional<XdsApi::LdsUpdate::FilterChainMap::CidrRange> prefix_range;
2738
- bool transport_protocol_raw_buffer_provided = false;
2739
- ConnectionSourceTypesArray source_types_array;
2740
- };
2741
- using DestinationIpMap = std::map<std::string, DestinationIp>;
2742
- DestinationIpMap destination_ip_map;
2743
- };
39
+ #include "google/protobuf/duration.upb.h"
40
+ #include "google/protobuf/struct.upb.h"
41
+ #include "google/protobuf/timestamp.upb.h"
42
+ #include "google/rpc/status.upb.h"
43
+ #include "upb/def.h"
44
+ #include "upb/text_encode.h"
45
+ #include "upb/upb.h"
46
+ #include "upb/upb.hpp"
2744
47
 
2745
- grpc_error_handle AddFilterChainDataForSourcePort(
2746
- const FilterChain& filter_chain,
2747
- XdsApi::LdsUpdate::FilterChainMap::SourcePortsMap* ports_map,
2748
- uint32_t port) {
2749
- auto insert_result = ports_map->emplace(
2750
- port, XdsApi::LdsUpdate::FilterChainMap::FilterChainDataSharedPtr{
2751
- filter_chain.filter_chain_data});
2752
- if (!insert_result.second) {
2753
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
2754
- "Duplicate matching rules detected when adding filter chain: ",
2755
- filter_chain.filter_chain_match.ToString()));
2756
- }
2757
- return GRPC_ERROR_NONE;
2758
- }
48
+ #include <grpc/grpc.h>
49
+ #include <grpc/impl/codegen/gpr_types.h>
50
+ #include <grpc/status.h>
51
+ #include <grpc/support/log.h>
2759
52
 
2760
- grpc_error_handle AddFilterChainDataForSourcePorts(
2761
- const FilterChain& filter_chain,
2762
- XdsApi::LdsUpdate::FilterChainMap::SourcePortsMap* ports_map) {
2763
- if (filter_chain.filter_chain_match.source_ports.empty()) {
2764
- return AddFilterChainDataForSourcePort(filter_chain, ports_map, 0);
2765
- } else {
2766
- for (uint32_t port : filter_chain.filter_chain_match.source_ports) {
2767
- grpc_error_handle error =
2768
- AddFilterChainDataForSourcePort(filter_chain, ports_map, port);
2769
- if (error != GRPC_ERROR_NONE) return error;
2770
- }
2771
- }
2772
- return GRPC_ERROR_NONE;
2773
- }
53
+ #include "src/core/ext/xds/upb_utils.h"
54
+ #include "src/core/ext/xds/xds_client.h"
55
+ #include "src/core/lib/json/json.h"
2774
56
 
2775
- grpc_error_handle AddFilterChainDataForSourceIpRange(
2776
- const FilterChain& filter_chain,
2777
- InternalFilterChainMap::SourceIpMap* source_ip_map) {
2778
- if (filter_chain.filter_chain_match.source_prefix_ranges.empty()) {
2779
- auto insert_result = source_ip_map->emplace(
2780
- "", XdsApi::LdsUpdate::FilterChainMap::SourceIp());
2781
- return AddFilterChainDataForSourcePorts(
2782
- filter_chain, &insert_result.first->second.ports_map);
2783
- } else {
2784
- for (const auto& prefix_range :
2785
- filter_chain.filter_chain_match.source_prefix_ranges) {
2786
- auto insert_result = source_ip_map->emplace(
2787
- absl::StrCat(grpc_sockaddr_to_string(&prefix_range.address, false),
2788
- "/", prefix_range.prefix_len),
2789
- XdsApi::LdsUpdate::FilterChainMap::SourceIp());
2790
- if (insert_result.second) {
2791
- insert_result.first->second.prefix_range.emplace(prefix_range);
2792
- }
2793
- grpc_error_handle error = AddFilterChainDataForSourcePorts(
2794
- filter_chain, &insert_result.first->second.ports_map);
2795
- if (error != GRPC_ERROR_NONE) return error;
2796
- }
2797
- }
2798
- return GRPC_ERROR_NONE;
2799
- }
57
+ // IWYU pragma: no_include "upb/msg_internal.h"
2800
58
 
2801
- grpc_error_handle AddFilterChainDataForSourceType(
2802
- const FilterChain& filter_chain,
2803
- InternalFilterChainMap::DestinationIp* destination_ip) {
2804
- GPR_ASSERT(static_cast<unsigned int>(
2805
- filter_chain.filter_chain_match.source_type) < 3);
2806
- return AddFilterChainDataForSourceIpRange(
2807
- filter_chain, &destination_ip->source_types_array[static_cast<int>(
2808
- filter_chain.filter_chain_match.source_type)]);
2809
- }
59
+ namespace grpc_core {
2810
60
 
2811
- grpc_error_handle AddFilterChainDataForApplicationProtocols(
2812
- const FilterChain& filter_chain,
2813
- InternalFilterChainMap::DestinationIp* destination_ip) {
2814
- // Only allow filter chains that do not mention application protocols
2815
- if (!filter_chain.filter_chain_match.application_protocols.empty()) {
2816
- return GRPC_ERROR_NONE;
2817
- }
2818
- return AddFilterChainDataForSourceType(filter_chain, destination_ip);
2819
- }
61
+ // If gRPC is built with -DGRPC_XDS_USER_AGENT_NAME_SUFFIX="...", that string
62
+ // will be appended to the user agent name reported to the xDS server.
63
+ #ifdef GRPC_XDS_USER_AGENT_NAME_SUFFIX
64
+ #define GRPC_XDS_USER_AGENT_NAME_SUFFIX_STRING \
65
+ " " GRPC_XDS_USER_AGENT_NAME_SUFFIX
66
+ #else
67
+ #define GRPC_XDS_USER_AGENT_NAME_SUFFIX_STRING ""
68
+ #endif
2820
69
 
2821
- grpc_error_handle AddFilterChainDataForTransportProtocol(
2822
- const FilterChain& filter_chain,
2823
- InternalFilterChainMap::DestinationIp* destination_ip) {
2824
- const std::string& transport_protocol =
2825
- filter_chain.filter_chain_match.transport_protocol;
2826
- // Only allow filter chains with no transport protocol or "raw_buffer"
2827
- if (!transport_protocol.empty() && transport_protocol != "raw_buffer") {
2828
- return GRPC_ERROR_NONE;
2829
- }
2830
- // If for this configuration, we've already seen filter chains that mention
2831
- // the transport protocol as "raw_buffer", we will never match filter chains
2832
- // that do not mention it.
2833
- if (destination_ip->transport_protocol_raw_buffer_provided &&
2834
- transport_protocol.empty()) {
2835
- return GRPC_ERROR_NONE;
2836
- }
2837
- if (!transport_protocol.empty() &&
2838
- !destination_ip->transport_protocol_raw_buffer_provided) {
2839
- destination_ip->transport_protocol_raw_buffer_provided = true;
2840
- // Clear out the previous entries if any since those entries did not mention
2841
- // "raw_buffer"
2842
- destination_ip->source_types_array =
2843
- InternalFilterChainMap::ConnectionSourceTypesArray();
2844
- }
2845
- return AddFilterChainDataForApplicationProtocols(filter_chain,
2846
- destination_ip);
2847
- }
70
+ // If gRPC is built with -DGRPC_XDS_USER_AGENT_VERSION_SUFFIX="...", that string
71
+ // will be appended to the user agent version reported to the xDS server.
72
+ #ifdef GRPC_XDS_USER_AGENT_VERSION_SUFFIX
73
+ #define GRPC_XDS_USER_AGENT_VERSION_SUFFIX_STRING \
74
+ " " GRPC_XDS_USER_AGENT_VERSION_SUFFIX
75
+ #else
76
+ #define GRPC_XDS_USER_AGENT_VERSION_SUFFIX_STRING ""
77
+ #endif
2848
78
 
2849
- grpc_error_handle AddFilterChainDataForServerNames(
2850
- const FilterChain& filter_chain,
2851
- InternalFilterChainMap::DestinationIp* destination_ip) {
2852
- // Don't continue adding filter chains with server names mentioned
2853
- if (!filter_chain.filter_chain_match.server_names.empty()) {
2854
- return GRPC_ERROR_NONE;
2855
- }
2856
- return AddFilterChainDataForTransportProtocol(filter_chain, destination_ip);
2857
- }
79
+ XdsApi::XdsApi(XdsClient* client, TraceFlag* tracer,
80
+ const XdsBootstrap::Node* node, upb::SymbolTable* symtab)
81
+ : client_(client),
82
+ tracer_(tracer),
83
+ node_(node),
84
+ symtab_(symtab),
85
+ user_agent_name_(absl::StrCat("gRPC C-core ", GPR_PLATFORM_STRING,
86
+ GRPC_XDS_USER_AGENT_NAME_SUFFIX_STRING)),
87
+ user_agent_version_(
88
+ absl::StrCat("C-core ", grpc_version_string(),
89
+ GRPC_XDS_USER_AGENT_NAME_SUFFIX_STRING,
90
+ GRPC_XDS_USER_AGENT_VERSION_SUFFIX_STRING)) {}
2858
91
 
2859
- grpc_error_handle AddFilterChainDataForDestinationIpRange(
2860
- const FilterChain& filter_chain,
2861
- InternalFilterChainMap::DestinationIpMap* destination_ip_map) {
2862
- if (filter_chain.filter_chain_match.prefix_ranges.empty()) {
2863
- auto insert_result = destination_ip_map->emplace(
2864
- "", InternalFilterChainMap::DestinationIp());
2865
- return AddFilterChainDataForServerNames(filter_chain,
2866
- &insert_result.first->second);
2867
- } else {
2868
- for (const auto& prefix_range :
2869
- filter_chain.filter_chain_match.prefix_ranges) {
2870
- auto insert_result = destination_ip_map->emplace(
2871
- absl::StrCat(grpc_sockaddr_to_string(&prefix_range.address, false),
2872
- "/", prefix_range.prefix_len),
2873
- InternalFilterChainMap::DestinationIp());
2874
- if (insert_result.second) {
2875
- insert_result.first->second.prefix_range.emplace(prefix_range);
2876
- }
2877
- grpc_error_handle error = AddFilterChainDataForServerNames(
2878
- filter_chain, &insert_result.first->second);
2879
- if (error != GRPC_ERROR_NONE) return error;
2880
- }
2881
- }
2882
- return GRPC_ERROR_NONE;
2883
- }
92
+ namespace {
2884
93
 
2885
- XdsApi::LdsUpdate::FilterChainMap BuildFromInternalFilterChainMap(
2886
- InternalFilterChainMap* internal_filter_chain_map) {
2887
- XdsApi::LdsUpdate::FilterChainMap filter_chain_map;
2888
- for (auto& destination_ip_pair :
2889
- internal_filter_chain_map->destination_ip_map) {
2890
- XdsApi::LdsUpdate::FilterChainMap::DestinationIp destination_ip;
2891
- destination_ip.prefix_range = destination_ip_pair.second.prefix_range;
2892
- for (int i = 0; i < 3; i++) {
2893
- auto& source_ip_map = destination_ip_pair.second.source_types_array[i];
2894
- for (auto& source_ip_pair : source_ip_map) {
2895
- destination_ip.source_types_array[i].push_back(
2896
- std::move(source_ip_pair.second));
2897
- }
2898
- }
2899
- filter_chain_map.destination_ip_vector.push_back(std::move(destination_ip));
2900
- }
2901
- return filter_chain_map;
2902
- }
94
+ struct XdsApiContext {
95
+ XdsClient* client;
96
+ TraceFlag* tracer;
97
+ upb_DefPool* symtab;
98
+ upb_Arena* arena;
99
+ };
2903
100
 
2904
- grpc_error_handle BuildFilterChainMap(
2905
- const std::vector<FilterChain>& filter_chains,
2906
- XdsApi::LdsUpdate::FilterChainMap* filter_chain_map) {
2907
- InternalFilterChainMap internal_filter_chain_map;
2908
- for (const auto& filter_chain : filter_chains) {
2909
- // Discard filter chain entries that specify destination port
2910
- if (filter_chain.filter_chain_match.destination_port != 0) continue;
2911
- grpc_error_handle error = AddFilterChainDataForDestinationIpRange(
2912
- filter_chain, &internal_filter_chain_map.destination_ip_map);
2913
- if (error != GRPC_ERROR_NONE) return error;
2914
- }
2915
- *filter_chain_map =
2916
- BuildFromInternalFilterChainMap(&internal_filter_chain_map);
2917
- return GRPC_ERROR_NONE;
2918
- }
101
+ void PopulateMetadataValue(const XdsApiContext& context,
102
+ google_protobuf_Value* value_pb, const Json& value);
2919
103
 
2920
- grpc_error_handle LdsResourceParseServer(
2921
- const EncodingContext& context,
2922
- const envoy_config_listener_v3_Listener* listener, bool is_v2,
2923
- XdsApi::LdsUpdate* lds_update) {
2924
- lds_update->type = XdsApi::LdsUpdate::ListenerType::kTcpListener;
2925
- grpc_error_handle error =
2926
- AddressParse(envoy_config_listener_v3_Listener_address(listener),
2927
- &lds_update->address);
2928
- if (error != GRPC_ERROR_NONE) return error;
2929
- const auto* use_original_dst =
2930
- envoy_config_listener_v3_Listener_use_original_dst(listener);
2931
- if (use_original_dst != nullptr) {
2932
- if (google_protobuf_BoolValue_value(use_original_dst)) {
2933
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2934
- "Field \'use_original_dst\' is not supported.");
2935
- }
2936
- }
2937
- size_t size = 0;
2938
- auto* filter_chains =
2939
- envoy_config_listener_v3_Listener_filter_chains(listener, &size);
2940
- std::vector<FilterChain> parsed_filter_chains;
2941
- parsed_filter_chains.reserve(size);
2942
- for (size_t i = 0; i < size; i++) {
2943
- FilterChain filter_chain;
2944
- error = FilterChainParse(context, filter_chains[i], is_v2, &filter_chain);
2945
- if (error != GRPC_ERROR_NONE) return error;
2946
- parsed_filter_chains.push_back(std::move(filter_chain));
2947
- }
2948
- error =
2949
- BuildFilterChainMap(parsed_filter_chains, &lds_update->filter_chain_map);
2950
- if (error != GRPC_ERROR_NONE) return error;
2951
- auto* default_filter_chain =
2952
- envoy_config_listener_v3_Listener_default_filter_chain(listener);
2953
- if (default_filter_chain != nullptr) {
2954
- FilterChain filter_chain;
2955
- error =
2956
- FilterChainParse(context, default_filter_chain, is_v2, &filter_chain);
2957
- if (error != GRPC_ERROR_NONE) return error;
2958
- if (filter_chain.filter_chain_data != nullptr) {
2959
- lds_update->default_filter_chain =
2960
- std::move(*filter_chain.filter_chain_data);
2961
- }
2962
- }
2963
- if (size == 0 && default_filter_chain == nullptr) {
2964
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("No filter chain provided.");
104
+ void PopulateListValue(const XdsApiContext& context,
105
+ google_protobuf_ListValue* list_value,
106
+ const Json::Array& values) {
107
+ for (const auto& value : values) {
108
+ auto* value_pb =
109
+ google_protobuf_ListValue_add_values(list_value, context.arena);
110
+ PopulateMetadataValue(context, value_pb, value);
2965
111
  }
2966
- return GRPC_ERROR_NONE;
2967
112
  }
2968
113
 
2969
- grpc_error_handle LdsResourceParse(
2970
- const EncodingContext& context,
2971
- const envoy_config_listener_v3_Listener* listener, bool is_v2,
2972
- XdsApi::LdsUpdate* lds_update) {
2973
- // Check whether it's a client or server listener.
2974
- const envoy_config_listener_v3_ApiListener* api_listener =
2975
- envoy_config_listener_v3_Listener_api_listener(listener);
2976
- const envoy_config_core_v3_Address* address =
2977
- envoy_config_listener_v3_Listener_address(listener);
2978
- if (api_listener != nullptr && address != nullptr) {
2979
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2980
- "Listener has both address and ApiListener");
2981
- }
2982
- if (api_listener == nullptr && address == nullptr) {
2983
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2984
- "Listener has neither address nor ApiListener");
2985
- }
2986
- // Validate Listener fields.
2987
- grpc_error_handle error = GRPC_ERROR_NONE;
2988
- if (api_listener != nullptr) {
2989
- error = LdsResourceParseClient(context, api_listener, is_v2, lds_update);
2990
- } else {
2991
- error = LdsResourceParseServer(context, listener, is_v2, lds_update);
114
+ void PopulateMetadata(const XdsApiContext& context,
115
+ google_protobuf_Struct* metadata_pb,
116
+ const Json::Object& metadata) {
117
+ for (const auto& p : metadata) {
118
+ google_protobuf_Value* value = google_protobuf_Value_new(context.arena);
119
+ PopulateMetadataValue(context, value, p.second);
120
+ google_protobuf_Struct_fields_set(
121
+ metadata_pb, StdStringToUpbString(p.first), value, context.arena);
2992
122
  }
2993
- return error;
2994
123
  }
2995
124
 
2996
- grpc_error_handle UpstreamTlsContextParse(
2997
- const EncodingContext& context,
2998
- const envoy_config_core_v3_TransportSocket* transport_socket,
2999
- XdsApi::CommonTlsContext* common_tls_context) {
3000
- // Record Upstream tls context
3001
- absl::string_view name = UpbStringToAbsl(
3002
- envoy_config_core_v3_TransportSocket_name(transport_socket));
3003
- if (name != "envoy.transport_sockets.tls") {
3004
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
3005
- absl::StrCat("Unrecognized transport socket: ", name));
3006
- }
3007
- auto* typed_config =
3008
- envoy_config_core_v3_TransportSocket_typed_config(transport_socket);
3009
- if (typed_config != nullptr) {
3010
- const upb_strview encoded_upstream_tls_context =
3011
- google_protobuf_Any_value(typed_config);
3012
- auto* upstream_tls_context =
3013
- envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_parse(
3014
- encoded_upstream_tls_context.data,
3015
- encoded_upstream_tls_context.size, context.arena);
3016
- if (upstream_tls_context == nullptr) {
3017
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
3018
- "Can't decode upstream tls context.");
125
+ void PopulateMetadataValue(const XdsApiContext& context,
126
+ google_protobuf_Value* value_pb, const Json& value) {
127
+ switch (value.type()) {
128
+ case Json::Type::JSON_NULL:
129
+ google_protobuf_Value_set_null_value(value_pb, 0);
130
+ break;
131
+ case Json::Type::NUMBER:
132
+ google_protobuf_Value_set_number_value(
133
+ value_pb, strtod(value.string_value().c_str(), nullptr));
134
+ break;
135
+ case Json::Type::STRING:
136
+ google_protobuf_Value_set_string_value(
137
+ value_pb, StdStringToUpbString(value.string_value()));
138
+ break;
139
+ case Json::Type::JSON_TRUE:
140
+ google_protobuf_Value_set_bool_value(value_pb, true);
141
+ break;
142
+ case Json::Type::JSON_FALSE:
143
+ google_protobuf_Value_set_bool_value(value_pb, false);
144
+ break;
145
+ case Json::Type::OBJECT: {
146
+ google_protobuf_Struct* struct_value =
147
+ google_protobuf_Value_mutable_struct_value(value_pb, context.arena);
148
+ PopulateMetadata(context, struct_value, value.object_value());
149
+ break;
3019
150
  }
3020
- auto* common_tls_context_proto =
3021
- envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_common_tls_context(
3022
- upstream_tls_context);
3023
- if (common_tls_context_proto != nullptr) {
3024
- grpc_error_handle error = CommonTlsContextParse(
3025
- context, common_tls_context_proto, common_tls_context);
3026
- if (error != GRPC_ERROR_NONE) {
3027
- return grpc_error_add_child(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
3028
- "Error parsing UpstreamTlsContext"),
3029
- error);
3030
- }
151
+ case Json::Type::ARRAY: {
152
+ google_protobuf_ListValue* list_value =
153
+ google_protobuf_Value_mutable_list_value(value_pb, context.arena);
154
+ PopulateListValue(context, list_value, value.array_value());
155
+ break;
3031
156
  }
3032
157
  }
3033
- if (common_tls_context->certificate_validation_context
3034
- .ca_certificate_provider_instance.instance_name.empty()) {
3035
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
3036
- "UpstreamTlsContext: TLS configuration provided but no "
3037
- "ca_certificate_provider_instance found.");
3038
- }
3039
- return GRPC_ERROR_NONE;
3040
- }
3041
-
3042
- grpc_error_handle CdsLogicalDnsParse(
3043
- const envoy_config_cluster_v3_Cluster* cluster,
3044
- XdsApi::CdsUpdate* cds_update) {
3045
- const auto* load_assignment =
3046
- envoy_config_cluster_v3_Cluster_load_assignment(cluster);
3047
- if (load_assignment == nullptr) {
3048
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
3049
- "load_assignment not present for LOGICAL_DNS cluster");
3050
- }
3051
- size_t num_localities;
3052
- const auto* const* localities =
3053
- envoy_config_endpoint_v3_ClusterLoadAssignment_endpoints(load_assignment,
3054
- &num_localities);
3055
- if (num_localities != 1) {
3056
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
3057
- absl::StrCat("load_assignment for LOGICAL_DNS cluster must have "
3058
- "exactly one locality, found ",
3059
- num_localities));
3060
- }
3061
- size_t num_endpoints;
3062
- const auto* const* endpoints =
3063
- envoy_config_endpoint_v3_LocalityLbEndpoints_lb_endpoints(localities[0],
3064
- &num_endpoints);
3065
- if (num_endpoints != 1) {
3066
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
3067
- absl::StrCat("locality for LOGICAL_DNS cluster must have "
3068
- "exactly one endpoint, found ",
3069
- num_endpoints));
3070
- }
3071
- const auto* endpoint =
3072
- envoy_config_endpoint_v3_LbEndpoint_endpoint(endpoints[0]);
3073
- if (endpoint == nullptr) {
3074
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
3075
- "LbEndpoint endpoint field not set");
3076
- }
3077
- const auto* address = envoy_config_endpoint_v3_Endpoint_address(endpoint);
3078
- if (address == nullptr) {
3079
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
3080
- "Endpoint address field not set");
3081
- }
3082
- const auto* socket_address =
3083
- envoy_config_core_v3_Address_socket_address(address);
3084
- if (socket_address == nullptr) {
3085
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
3086
- "Address socket_address field not set");
3087
- }
3088
- if (envoy_config_core_v3_SocketAddress_resolver_name(socket_address).size !=
3089
- 0) {
3090
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
3091
- "LOGICAL_DNS clusters must NOT have a custom resolver name set");
3092
- }
3093
- absl::string_view address_str = UpbStringToAbsl(
3094
- envoy_config_core_v3_SocketAddress_address(socket_address));
3095
- if (address_str.empty()) {
3096
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
3097
- "SocketAddress address field not set");
3098
- }
3099
- if (!envoy_config_core_v3_SocketAddress_has_port_value(socket_address)) {
3100
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
3101
- "SocketAddress port_value field not set");
3102
- }
3103
- cds_update->dns_hostname = JoinHostPort(
3104
- address_str,
3105
- envoy_config_core_v3_SocketAddress_port_value(socket_address));
3106
- return GRPC_ERROR_NONE;
3107
158
  }
3108
159
 
3109
- grpc_error_handle CdsResourceParse(
3110
- const EncodingContext& context,
3111
- const envoy_config_cluster_v3_Cluster* cluster, bool /*is_v2*/,
3112
- XdsApi::CdsUpdate* cds_update) {
3113
- std::vector<grpc_error_handle> errors;
3114
- // Check the cluster_discovery_type.
3115
- if (!envoy_config_cluster_v3_Cluster_has_type(cluster) &&
3116
- !envoy_config_cluster_v3_Cluster_has_cluster_type(cluster)) {
3117
- errors.push_back(
3118
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("DiscoveryType not found."));
3119
- } else if (envoy_config_cluster_v3_Cluster_type(cluster) ==
3120
- envoy_config_cluster_v3_Cluster_EDS) {
3121
- cds_update->cluster_type = XdsApi::CdsUpdate::ClusterType::EDS;
3122
- // Check the EDS config source.
3123
- const envoy_config_cluster_v3_Cluster_EdsClusterConfig* eds_cluster_config =
3124
- envoy_config_cluster_v3_Cluster_eds_cluster_config(cluster);
3125
- const envoy_config_core_v3_ConfigSource* eds_config =
3126
- envoy_config_cluster_v3_Cluster_EdsClusterConfig_eds_config(
3127
- eds_cluster_config);
3128
- if (!envoy_config_core_v3_ConfigSource_has_ads(eds_config)) {
3129
- errors.push_back(
3130
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("EDS ConfigSource is not ADS."));
160
+ void PopulateNode(const XdsApiContext& context, const XdsBootstrap::Node* node,
161
+ const std::string& user_agent_name,
162
+ const std::string& user_agent_version,
163
+ envoy_config_core_v3_Node* node_msg) {
164
+ if (node != nullptr) {
165
+ if (!node->id().empty()) {
166
+ envoy_config_core_v3_Node_set_id(node_msg,
167
+ StdStringToUpbString(node->id()));
3131
168
  }
3132
- // Record EDS service_name (if any).
3133
- upb_strview service_name =
3134
- envoy_config_cluster_v3_Cluster_EdsClusterConfig_service_name(
3135
- eds_cluster_config);
3136
- if (service_name.size != 0) {
3137
- cds_update->eds_service_name = UpbStringToStdString(service_name);
169
+ if (!node->cluster().empty()) {
170
+ envoy_config_core_v3_Node_set_cluster(
171
+ node_msg, StdStringToUpbString(node->cluster()));
3138
172
  }
3139
- } else if (!XdsAggregateAndLogicalDnsClusterEnabled()) {
3140
- errors.push_back(
3141
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("DiscoveryType is not valid."));
3142
- } else if (envoy_config_cluster_v3_Cluster_type(cluster) ==
3143
- envoy_config_cluster_v3_Cluster_LOGICAL_DNS) {
3144
- cds_update->cluster_type = XdsApi::CdsUpdate::ClusterType::LOGICAL_DNS;
3145
- grpc_error_handle error = CdsLogicalDnsParse(cluster, cds_update);
3146
- if (error != GRPC_ERROR_NONE) errors.push_back(error);
3147
- } else {
3148
- if (!envoy_config_cluster_v3_Cluster_has_cluster_type(cluster)) {
3149
- errors.push_back(
3150
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("DiscoveryType is not valid."));
3151
- } else {
3152
- const envoy_config_cluster_v3_Cluster_CustomClusterType*
3153
- custom_cluster_type =
3154
- envoy_config_cluster_v3_Cluster_cluster_type(cluster);
3155
- upb_strview type_name =
3156
- envoy_config_cluster_v3_Cluster_CustomClusterType_name(
3157
- custom_cluster_type);
3158
- if (UpbStringToAbsl(type_name) != "envoy.clusters.aggregate") {
3159
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
3160
- "DiscoveryType is not valid."));
3161
- } else {
3162
- cds_update->cluster_type = XdsApi::CdsUpdate::ClusterType::AGGREGATE;
3163
- // Retrieve aggregate clusters.
3164
- const google_protobuf_Any* typed_config =
3165
- envoy_config_cluster_v3_Cluster_CustomClusterType_typed_config(
3166
- custom_cluster_type);
3167
- const upb_strview aggregate_cluster_config_upb_strview =
3168
- google_protobuf_Any_value(typed_config);
3169
- const envoy_extensions_clusters_aggregate_v3_ClusterConfig*
3170
- aggregate_cluster_config =
3171
- envoy_extensions_clusters_aggregate_v3_ClusterConfig_parse(
3172
- aggregate_cluster_config_upb_strview.data,
3173
- aggregate_cluster_config_upb_strview.size, context.arena);
3174
- if (aggregate_cluster_config == nullptr) {
3175
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
3176
- "Can't parse aggregate cluster."));
3177
- } else {
3178
- size_t size;
3179
- const upb_strview* clusters =
3180
- envoy_extensions_clusters_aggregate_v3_ClusterConfig_clusters(
3181
- aggregate_cluster_config, &size);
3182
- for (size_t i = 0; i < size; ++i) {
3183
- const upb_strview cluster = clusters[i];
3184
- cds_update->prioritized_cluster_names.emplace_back(
3185
- UpbStringToStdString(cluster));
3186
- }
3187
- }
3188
- }
173
+ if (!node->metadata().empty()) {
174
+ google_protobuf_Struct* metadata =
175
+ envoy_config_core_v3_Node_mutable_metadata(node_msg, context.arena);
176
+ PopulateMetadata(context, metadata, node->metadata());
3189
177
  }
3190
- }
3191
- // Check the LB policy.
3192
- if (envoy_config_cluster_v3_Cluster_lb_policy(cluster) ==
3193
- envoy_config_cluster_v3_Cluster_ROUND_ROBIN) {
3194
- cds_update->lb_policy = "ROUND_ROBIN";
3195
- } else if (envoy_config_cluster_v3_Cluster_lb_policy(cluster) ==
3196
- envoy_config_cluster_v3_Cluster_RING_HASH) {
3197
- cds_update->lb_policy = "RING_HASH";
3198
- // Record ring hash lb config
3199
- auto* ring_hash_config =
3200
- envoy_config_cluster_v3_Cluster_ring_hash_lb_config(cluster);
3201
- if (ring_hash_config != nullptr) {
3202
- const google_protobuf_UInt64Value* max_ring_size =
3203
- envoy_config_cluster_v3_Cluster_RingHashLbConfig_maximum_ring_size(
3204
- ring_hash_config);
3205
- if (max_ring_size != nullptr) {
3206
- cds_update->max_ring_size =
3207
- google_protobuf_UInt64Value_value(max_ring_size);
3208
- if (cds_update->max_ring_size > 8388608 ||
3209
- cds_update->max_ring_size == 0) {
3210
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
3211
- "max_ring_size is not in the range of 1 to 8388608."));
3212
- }
3213
- }
3214
- const google_protobuf_UInt64Value* min_ring_size =
3215
- envoy_config_cluster_v3_Cluster_RingHashLbConfig_minimum_ring_size(
3216
- ring_hash_config);
3217
- if (min_ring_size != nullptr) {
3218
- cds_update->min_ring_size =
3219
- google_protobuf_UInt64Value_value(min_ring_size);
3220
- if (cds_update->min_ring_size > 8388608 ||
3221
- cds_update->min_ring_size == 0) {
3222
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
3223
- "min_ring_size is not in the range of 1 to 8388608."));
3224
- }
3225
- if (cds_update->min_ring_size > cds_update->max_ring_size) {
3226
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
3227
- "min_ring_size cannot be greater than max_ring_size."));
3228
- }
178
+ if (!node->locality_region().empty() || !node->locality_zone().empty() ||
179
+ !node->locality_sub_zone().empty()) {
180
+ envoy_config_core_v3_Locality* locality =
181
+ envoy_config_core_v3_Node_mutable_locality(node_msg, context.arena);
182
+ if (!node->locality_region().empty()) {
183
+ envoy_config_core_v3_Locality_set_region(
184
+ locality, StdStringToUpbString(node->locality_region()));
3229
185
  }
3230
- if (envoy_config_cluster_v3_Cluster_RingHashLbConfig_hash_function(
3231
- ring_hash_config) !=
3232
- envoy_config_cluster_v3_Cluster_RingHashLbConfig_XX_HASH) {
3233
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
3234
- "ring hash lb config has invalid hash function."));
186
+ if (!node->locality_zone().empty()) {
187
+ envoy_config_core_v3_Locality_set_zone(
188
+ locality, StdStringToUpbString(node->locality_zone()));
3235
189
  }
3236
- }
3237
- } else {
3238
- errors.push_back(
3239
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("LB policy is not supported."));
3240
- }
3241
- auto* transport_socket =
3242
- envoy_config_cluster_v3_Cluster_transport_socket(cluster);
3243
- if (transport_socket != nullptr) {
3244
- grpc_error_handle error = UpstreamTlsContextParse(
3245
- context, transport_socket, &cds_update->common_tls_context);
3246
- if (error != GRPC_ERROR_NONE) {
3247
- errors.push_back(
3248
- grpc_error_add_child(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
3249
- "Error parsing security configuration"),
3250
- error));
3251
- }
3252
- }
3253
- // Record LRS server name (if any).
3254
- const envoy_config_core_v3_ConfigSource* lrs_server =
3255
- envoy_config_cluster_v3_Cluster_lrs_server(cluster);
3256
- if (lrs_server != nullptr) {
3257
- if (!envoy_config_core_v3_ConfigSource_has_self(lrs_server)) {
3258
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
3259
- ": LRS ConfigSource is not self."));
3260
- }
3261
- cds_update->lrs_load_reporting_server_name.emplace("");
3262
- }
3263
- // The Cluster resource encodes the circuit breaking parameters in a list of
3264
- // Thresholds messages, where each message specifies the parameters for a
3265
- // particular RoutingPriority. we will look only at the first entry in the
3266
- // list for priority DEFAULT and default to 1024 if not found.
3267
- if (envoy_config_cluster_v3_Cluster_has_circuit_breakers(cluster)) {
3268
- const envoy_config_cluster_v3_CircuitBreakers* circuit_breakers =
3269
- envoy_config_cluster_v3_Cluster_circuit_breakers(cluster);
3270
- size_t num_thresholds;
3271
- const envoy_config_cluster_v3_CircuitBreakers_Thresholds* const*
3272
- thresholds = envoy_config_cluster_v3_CircuitBreakers_thresholds(
3273
- circuit_breakers, &num_thresholds);
3274
- for (size_t i = 0; i < num_thresholds; ++i) {
3275
- const auto* threshold = thresholds[i];
3276
- if (envoy_config_cluster_v3_CircuitBreakers_Thresholds_priority(
3277
- threshold) == envoy_config_core_v3_DEFAULT) {
3278
- const google_protobuf_UInt32Value* max_requests =
3279
- envoy_config_cluster_v3_CircuitBreakers_Thresholds_max_requests(
3280
- threshold);
3281
- if (max_requests != nullptr) {
3282
- cds_update->max_concurrent_requests =
3283
- google_protobuf_UInt32Value_value(max_requests);
3284
- }
3285
- break;
190
+ if (!node->locality_sub_zone().empty()) {
191
+ envoy_config_core_v3_Locality_set_sub_zone(
192
+ locality, StdStringToUpbString(node->locality_sub_zone()));
3286
193
  }
3287
194
  }
3288
195
  }
3289
- return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing CDS resource", &errors);
196
+ envoy_config_core_v3_Node_set_user_agent_name(
197
+ node_msg, StdStringToUpbString(user_agent_name));
198
+ envoy_config_core_v3_Node_set_user_agent_version(
199
+ node_msg, StdStringToUpbString(user_agent_version));
200
+ envoy_config_core_v3_Node_add_client_features(
201
+ node_msg,
202
+ upb_StringView_FromString("envoy.lb.does_not_support_overprovisioning"),
203
+ context.arena);
3290
204
  }
3291
205
 
3292
- grpc_error_handle ServerAddressParseAndAppend(
3293
- const envoy_config_endpoint_v3_LbEndpoint* lb_endpoint,
3294
- ServerAddressList* list) {
3295
- // If health_status is not HEALTHY or UNKNOWN, skip this endpoint.
3296
- const int32_t health_status =
3297
- envoy_config_endpoint_v3_LbEndpoint_health_status(lb_endpoint);
3298
- if (health_status != envoy_config_core_v3_UNKNOWN &&
3299
- health_status != envoy_config_core_v3_HEALTHY) {
3300
- return GRPC_ERROR_NONE;
3301
- }
3302
- // Find the ip:port.
3303
- const envoy_config_endpoint_v3_Endpoint* endpoint =
3304
- envoy_config_endpoint_v3_LbEndpoint_endpoint(lb_endpoint);
3305
- const envoy_config_core_v3_Address* address =
3306
- envoy_config_endpoint_v3_Endpoint_address(endpoint);
3307
- const envoy_config_core_v3_SocketAddress* socket_address =
3308
- envoy_config_core_v3_Address_socket_address(address);
3309
- std::string address_str = UpbStringToStdString(
3310
- envoy_config_core_v3_SocketAddress_address(socket_address));
3311
- uint32_t port = envoy_config_core_v3_SocketAddress_port_value(socket_address);
3312
- if (GPR_UNLIKELY(port >> 16) != 0) {
3313
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Invalid port.");
3314
- }
3315
- // Find load_balancing_weight for the endpoint.
3316
- const google_protobuf_UInt32Value* load_balancing_weight =
3317
- envoy_config_endpoint_v3_LbEndpoint_load_balancing_weight(lb_endpoint);
3318
- const int32_t weight =
3319
- load_balancing_weight != nullptr
3320
- ? google_protobuf_UInt32Value_value(load_balancing_weight)
3321
- : 500;
3322
- if (weight == 0) {
3323
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
3324
- "Invalid endpoint weight of 0.");
206
+ void MaybeLogDiscoveryRequest(
207
+ const XdsApiContext& context,
208
+ const envoy_service_discovery_v3_DiscoveryRequest* request) {
209
+ if (GRPC_TRACE_FLAG_ENABLED(*context.tracer) &&
210
+ gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
211
+ const upb_MessageDef* msg_type =
212
+ envoy_service_discovery_v3_DiscoveryRequest_getmsgdef(context.symtab);
213
+ char buf[10240];
214
+ upb_TextEncode(request, msg_type, nullptr, 0, buf, sizeof(buf));
215
+ gpr_log(GPR_DEBUG, "[xds_client %p] constructed ADS request: %s",
216
+ context.client, buf);
3325
217
  }
3326
- // Populate grpc_resolved_address.
3327
- grpc_resolved_address addr;
3328
- grpc_error_handle error =
3329
- grpc_string_to_sockaddr(&addr, address_str.c_str(), port);
3330
- if (error != GRPC_ERROR_NONE) return error;
3331
- // Append the address to the list.
3332
- std::map<const char*, std::unique_ptr<ServerAddress::AttributeInterface>>
3333
- attributes;
3334
- attributes[ServerAddressWeightAttribute::kServerAddressWeightAttributeKey] =
3335
- absl::make_unique<ServerAddressWeightAttribute>(weight);
3336
- list->emplace_back(addr, nullptr, std::move(attributes));
3337
- return GRPC_ERROR_NONE;
3338
218
  }
3339
219
 
3340
- grpc_error_handle LocalityParse(
3341
- const envoy_config_endpoint_v3_LocalityLbEndpoints* locality_lb_endpoints,
3342
- XdsApi::EdsUpdate::Priority::Locality* output_locality, size_t* priority) {
3343
- // Parse LB weight.
3344
- const google_protobuf_UInt32Value* lb_weight =
3345
- envoy_config_endpoint_v3_LocalityLbEndpoints_load_balancing_weight(
3346
- locality_lb_endpoints);
3347
- // If LB weight is not specified, it means this locality is assigned no load.
3348
- // TODO(juanlishen): When we support CDS to configure the inter-locality
3349
- // policy, we should change the LB weight handling.
3350
- output_locality->lb_weight =
3351
- lb_weight != nullptr ? google_protobuf_UInt32Value_value(lb_weight) : 0;
3352
- if (output_locality->lb_weight == 0) return GRPC_ERROR_NONE;
3353
- // Parse locality name.
3354
- const envoy_config_core_v3_Locality* locality =
3355
- envoy_config_endpoint_v3_LocalityLbEndpoints_locality(
3356
- locality_lb_endpoints);
3357
- if (locality == nullptr) {
3358
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Empty locality.");
3359
- }
3360
- std::string region =
3361
- UpbStringToStdString(envoy_config_core_v3_Locality_region(locality));
3362
- std::string zone =
3363
- UpbStringToStdString(envoy_config_core_v3_Locality_region(locality));
3364
- std::string sub_zone =
3365
- UpbStringToStdString(envoy_config_core_v3_Locality_sub_zone(locality));
3366
- output_locality->name = MakeRefCounted<XdsLocalityName>(
3367
- std::move(region), std::move(zone), std::move(sub_zone));
3368
- // Parse the addresses.
3369
- size_t size;
3370
- const envoy_config_endpoint_v3_LbEndpoint* const* lb_endpoints =
3371
- envoy_config_endpoint_v3_LocalityLbEndpoints_lb_endpoints(
3372
- locality_lb_endpoints, &size);
3373
- for (size_t i = 0; i < size; ++i) {
3374
- grpc_error_handle error = ServerAddressParseAndAppend(
3375
- lb_endpoints[i], &output_locality->endpoints);
3376
- if (error != GRPC_ERROR_NONE) return error;
3377
- }
3378
- // Parse the priority.
3379
- *priority = envoy_config_endpoint_v3_LocalityLbEndpoints_priority(
3380
- locality_lb_endpoints);
3381
- return GRPC_ERROR_NONE;
220
+ std::string SerializeDiscoveryRequest(
221
+ const XdsApiContext& context,
222
+ envoy_service_discovery_v3_DiscoveryRequest* request) {
223
+ size_t output_length;
224
+ char* output = envoy_service_discovery_v3_DiscoveryRequest_serialize(
225
+ request, context.arena, &output_length);
226
+ return std::string(output, output_length);
3382
227
  }
3383
228
 
3384
- grpc_error_handle DropParseAndAppend(
3385
- const envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_DropOverload*
3386
- drop_overload,
3387
- XdsApi::EdsUpdate::DropConfig* drop_config) {
3388
- // Get the category.
3389
- std::string category = UpbStringToStdString(
3390
- envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_DropOverload_category(
3391
- drop_overload));
3392
- if (category.empty()) {
3393
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Empty drop category name");
3394
- }
3395
- // Get the drop rate (per million).
3396
- const envoy_type_v3_FractionalPercent* drop_percentage =
3397
- envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_DropOverload_drop_percentage(
3398
- drop_overload);
3399
- uint32_t numerator =
3400
- envoy_type_v3_FractionalPercent_numerator(drop_percentage);
3401
- const auto denominator =
3402
- static_cast<envoy_type_v3_FractionalPercent_DenominatorType>(
3403
- envoy_type_v3_FractionalPercent_denominator(drop_percentage));
3404
- // Normalize to million.
3405
- switch (denominator) {
3406
- case envoy_type_v3_FractionalPercent_HUNDRED:
3407
- numerator *= 10000;
3408
- break;
3409
- case envoy_type_v3_FractionalPercent_TEN_THOUSAND:
3410
- numerator *= 100;
3411
- break;
3412
- case envoy_type_v3_FractionalPercent_MILLION:
3413
- break;
3414
- default:
3415
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Unknown denominator type");
3416
- }
3417
- // Cap numerator to 1000000.
3418
- numerator = std::min(numerator, 1000000u);
3419
- drop_config->AddCategory(std::move(category), numerator);
3420
- return GRPC_ERROR_NONE;
3421
- }
229
+ } // namespace
3422
230
 
3423
- grpc_error_handle EdsResourceParse(
3424
- const EncodingContext& /*context*/,
3425
- const envoy_config_endpoint_v3_ClusterLoadAssignment*
3426
- cluster_load_assignment,
3427
- bool /*is_v2*/, XdsApi::EdsUpdate* eds_update) {
3428
- std::vector<grpc_error_handle> errors;
3429
- // Get the endpoints.
3430
- size_t locality_size;
3431
- const envoy_config_endpoint_v3_LocalityLbEndpoints* const* endpoints =
3432
- envoy_config_endpoint_v3_ClusterLoadAssignment_endpoints(
3433
- cluster_load_assignment, &locality_size);
3434
- for (size_t j = 0; j < locality_size; ++j) {
3435
- size_t priority;
3436
- XdsApi::EdsUpdate::Priority::Locality locality;
3437
- grpc_error_handle error = LocalityParse(endpoints[j], &locality, &priority);
3438
- if (error != GRPC_ERROR_NONE) {
3439
- errors.push_back(error);
3440
- continue;
3441
- }
3442
- // Filter out locality with weight 0.
3443
- if (locality.lb_weight == 0) continue;
3444
- // Make sure prorities is big enough. Note that they might not
3445
- // arrive in priority order.
3446
- while (eds_update->priorities.size() < priority + 1) {
3447
- eds_update->priorities.emplace_back();
3448
- }
3449
- eds_update->priorities[priority].localities.emplace(locality.name.get(),
3450
- std::move(locality));
231
+ std::string XdsApi::CreateAdsRequest(
232
+ absl::string_view type_url, absl::string_view version,
233
+ absl::string_view nonce, const std::vector<std::string>& resource_names,
234
+ absl::Status status, bool populate_node) {
235
+ upb::Arena arena;
236
+ const XdsApiContext context = {client_, tracer_, symtab_->ptr(), arena.ptr()};
237
+ // Create a request.
238
+ envoy_service_discovery_v3_DiscoveryRequest* request =
239
+ envoy_service_discovery_v3_DiscoveryRequest_new(arena.ptr());
240
+ // Set type_url.
241
+ std::string type_url_str = absl::StrCat("type.googleapis.com/", type_url);
242
+ envoy_service_discovery_v3_DiscoveryRequest_set_type_url(
243
+ request, StdStringToUpbString(type_url_str));
244
+ // Set version_info.
245
+ if (!version.empty()) {
246
+ envoy_service_discovery_v3_DiscoveryRequest_set_version_info(
247
+ request, StdStringToUpbString(version));
3451
248
  }
3452
- for (const auto& priority : eds_update->priorities) {
3453
- if (priority.localities.empty()) {
3454
- errors.push_back(
3455
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("sparse priority list"));
3456
- }
249
+ // Set nonce.
250
+ if (!nonce.empty()) {
251
+ envoy_service_discovery_v3_DiscoveryRequest_set_response_nonce(
252
+ request, StdStringToUpbString(nonce));
3457
253
  }
3458
- // Get the drop config.
3459
- eds_update->drop_config = MakeRefCounted<XdsApi::EdsUpdate::DropConfig>();
3460
- const envoy_config_endpoint_v3_ClusterLoadAssignment_Policy* policy =
3461
- envoy_config_endpoint_v3_ClusterLoadAssignment_policy(
3462
- cluster_load_assignment);
3463
- if (policy != nullptr) {
3464
- size_t drop_size;
3465
- const envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_DropOverload* const*
3466
- drop_overload =
3467
- envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_drop_overloads(
3468
- policy, &drop_size);
3469
- for (size_t j = 0; j < drop_size; ++j) {
3470
- grpc_error_handle error =
3471
- DropParseAndAppend(drop_overload[j], eds_update->drop_config.get());
3472
- if (error != GRPC_ERROR_NONE) {
3473
- errors.push_back(
3474
- grpc_error_add_child(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
3475
- "drop config validation error"),
3476
- error));
3477
- }
3478
- }
254
+ // Set error_detail if it's a NACK.
255
+ std::string error_string_storage;
256
+ if (!status.ok()) {
257
+ google_rpc_Status* error_detail =
258
+ envoy_service_discovery_v3_DiscoveryRequest_mutable_error_detail(
259
+ request, arena.ptr());
260
+ // Hard-code INVALID_ARGUMENT as the status code.
261
+ // TODO(roth): If at some point we decide we care about this value,
262
+ // we could attach a status code to the individual errors where we
263
+ // generate them in the parsing code, and then use that here.
264
+ google_rpc_Status_set_code(error_detail, GRPC_STATUS_INVALID_ARGUMENT);
265
+ // Error description comes from the status that was passed in.
266
+ error_string_storage = std::string(status.message());
267
+ upb_StringView error_description =
268
+ StdStringToUpbString(error_string_storage);
269
+ google_rpc_Status_set_message(error_detail, error_description);
3479
270
  }
3480
- return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing EDS resource", &errors);
3481
- }
3482
-
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);
3519
- 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;
3524
- }
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;
3535
- }
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;
3540
- }
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;
3547
- }
3548
- // Validate resource.
3549
- decltype(UpdateMap::mapped_type::resource) update;
3550
- grpc_error_handle error =
3551
- resource_parse_function(context, resource, is_v2, &update);
3552
- 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);
3558
- } 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);
3564
- }
271
+ // Populate node.
272
+ if (populate_node) {
273
+ envoy_config_core_v3_Node* node_msg =
274
+ envoy_service_discovery_v3_DiscoveryRequest_mutable_node(request,
275
+ arena.ptr());
276
+ PopulateNode(context, node_, user_agent_name_, user_agent_version_,
277
+ node_msg);
278
+ envoy_config_core_v3_Node_add_client_features(
279
+ node_msg, upb_StringView_FromString("xds.config.resource-in-sotw"),
280
+ context.arena);
3565
281
  }
3566
- return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing ADS response", &errors);
3567
- }
3568
-
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;
282
+ // Add resource_names.
283
+ for (const std::string& resource_name : resource_names) {
284
+ envoy_service_discovery_v3_DiscoveryRequest_add_resource_names(
285
+ request, StdStringToUpbString(resource_name), arena.ptr());
3578
286
  }
3579
- return std::string(type_url);
3580
- }
3581
-
3582
- upb_strview LdsResourceName(
3583
- const envoy_config_listener_v3_Listener* lds_resource) {
3584
- return envoy_config_listener_v3_Listener_name(lds_resource);
3585
- }
3586
-
3587
- upb_strview RdsResourceName(
3588
- const envoy_config_route_v3_RouteConfiguration* rds_resource) {
3589
- return envoy_config_route_v3_RouteConfiguration_name(rds_resource);
287
+ MaybeLogDiscoveryRequest(context, request);
288
+ return SerializeDiscoveryRequest(context, request);
3590
289
  }
3591
290
 
3592
- upb_strview CdsResourceName(
3593
- const envoy_config_cluster_v3_Cluster* cds_resource) {
3594
- return envoy_config_cluster_v3_Cluster_name(cds_resource);
3595
- }
291
+ namespace {
3596
292
 
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);
293
+ void MaybeLogDiscoveryResponse(
294
+ const XdsApiContext& context,
295
+ const envoy_service_discovery_v3_DiscoveryResponse* response) {
296
+ if (GRPC_TRACE_FLAG_ENABLED(*context.tracer) &&
297
+ gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
298
+ const upb_MessageDef* msg_type =
299
+ envoy_service_discovery_v3_DiscoveryResponse_getmsgdef(context.symtab);
300
+ char buf[10240];
301
+ upb_TextEncode(response, msg_type, nullptr, 0, buf, sizeof(buf));
302
+ gpr_log(GPR_DEBUG, "[xds_client %p] received response: %s", context.client,
303
+ buf);
304
+ }
3601
305
  }
3602
306
 
3603
307
  } // namespace
3604
308
 
3605
- XdsApi::AdsParseResult XdsApi::ParseAdsResponse(
3606
- const XdsBootstrap::XdsServer& server, const grpc_slice& encoded_response,
3607
- const std::map<absl::string_view /*authority*/,
3608
- std::set<absl::string_view /*name*/>>&
3609
- subscribed_listener_names,
3610
- const std::map<absl::string_view /*authority*/,
3611
- std::set<absl::string_view /*name*/>>&
3612
- subscribed_route_config_names,
3613
- const std::map<absl::string_view /*authority*/,
3614
- std::set<absl::string_view /*name*/>>&
3615
- subscribed_cluster_names,
3616
- const std::map<absl::string_view /*authority*/,
3617
- std::set<absl::string_view /*name*/>>&
3618
- subscribed_eds_service_names) {
3619
- AdsParseResult result;
309
+ absl::Status XdsApi::ParseAdsResponse(absl::string_view encoded_response,
310
+ AdsResponseParserInterface* parser) {
3620
311
  upb::Arena arena;
3621
- const EncodingContext context = {client_,
3622
- tracer_,
3623
- symtab_.ptr(),
3624
- arena.ptr(),
3625
- server.ShouldUseV3(),
3626
- certificate_provider_definition_map_};
312
+ const XdsApiContext context = {client_, tracer_, symtab_->ptr(), arena.ptr()};
3627
313
  // Decode the response.
3628
314
  const envoy_service_discovery_v3_DiscoveryResponse* response =
3629
315
  envoy_service_discovery_v3_DiscoveryResponse_parse(
3630
- reinterpret_cast<const char*>(GRPC_SLICE_START_PTR(encoded_response)),
3631
- GRPC_SLICE_LENGTH(encoded_response), arena.ptr());
3632
- // If decoding fails, output an empty type_url and return.
316
+ encoded_response.data(), encoded_response.size(), arena.ptr());
317
+ // If decoding fails, report a fatal error and return.
3633
318
  if (response == nullptr) {
3634
- result.parse_error =
3635
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Can't decode DiscoveryResponse.");
3636
- return result;
319
+ return absl::InvalidArgumentError("Can't decode DiscoveryResponse.");
3637
320
  }
3638
321
  MaybeLogDiscoveryResponse(context, response);
3639
- // 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)));
3642
- result.version = UpbStringToStdString(
322
+ // Report the type_url, version, nonce, and number of resources to the parser.
323
+ AdsResponseParserInterface::AdsResponseFields fields;
324
+ fields.type_url = std::string(absl::StripPrefix(
325
+ UpbStringToAbsl(
326
+ envoy_service_discovery_v3_DiscoveryResponse_type_url(response)),
327
+ "type.googleapis.com/"));
328
+ fields.version = UpbStringToStdString(
3643
329
  envoy_service_discovery_v3_DiscoveryResponse_version_info(response));
3644
- result.nonce = UpbStringToStdString(
330
+ fields.nonce = UpbStringToStdString(
3645
331
  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);
332
+ size_t num_resources;
333
+ const google_protobuf_Any* const* resources =
334
+ envoy_service_discovery_v3_DiscoveryResponse_resources(response,
335
+ &num_resources);
336
+ fields.num_resources = num_resources;
337
+ absl::Status status = parser->ProcessAdsResponseFields(std::move(fields));
338
+ if (!status.ok()) return status;
339
+ // Process each resource.
340
+ for (size_t i = 0; i < num_resources; ++i) {
341
+ absl::string_view type_url = absl::StripPrefix(
342
+ UpbStringToAbsl(google_protobuf_Any_type_url(resources[i])),
343
+ "type.googleapis.com/");
344
+ absl::string_view serialized_resource =
345
+ UpbStringToAbsl(google_protobuf_Any_value(resources[i]));
346
+ // Unwrap Resource messages, if so wrapped.
347
+ absl::string_view resource_name;
348
+ if (type_url == "envoy.service.discovery.v3.Resource") {
349
+ const auto* resource_wrapper = envoy_service_discovery_v3_Resource_parse(
350
+ serialized_resource.data(), serialized_resource.size(), arena.ptr());
351
+ if (resource_wrapper == nullptr) {
352
+ parser->ResourceWrapperParsingFailed(i);
353
+ continue;
354
+ }
355
+ const auto* resource =
356
+ envoy_service_discovery_v3_Resource_resource(resource_wrapper);
357
+ type_url = absl::StripPrefix(
358
+ UpbStringToAbsl(google_protobuf_Any_type_url(resource)),
359
+ "type.googleapis.com/");
360
+ serialized_resource =
361
+ UpbStringToAbsl(google_protobuf_Any_value(resource));
362
+ resource_name = UpbStringToAbsl(
363
+ envoy_service_discovery_v3_Resource_name(resource_wrapper));
364
+ }
365
+ parser->ParseResource(context.arena, i, type_url, resource_name,
366
+ serialized_resource);
3674
367
  }
3675
- return result;
368
+ return absl::OkStatus();
3676
369
  }
3677
370
 
3678
371
  namespace {
3679
372
 
3680
373
  void MaybeLogLrsRequest(
3681
- const EncodingContext& context,
374
+ const XdsApiContext& context,
3682
375
  const envoy_service_load_stats_v3_LoadStatsRequest* request) {
3683
376
  if (GRPC_TRACE_FLAG_ENABLED(*context.tracer) &&
3684
377
  gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
3685
- const upb_msgdef* msg_type =
378
+ const upb_MessageDef* msg_type =
3686
379
  envoy_service_load_stats_v3_LoadStatsRequest_getmsgdef(context.symtab);
3687
380
  char buf[10240];
3688
- upb_text_encode(request, msg_type, nullptr, 0, buf, sizeof(buf));
381
+ upb_TextEncode(request, msg_type, nullptr, 0, buf, sizeof(buf));
3689
382
  gpr_log(GPR_DEBUG, "[xds_client %p] constructed LRS request: %s",
3690
383
  context.client, buf);
3691
384
  }
3692
385
  }
3693
386
 
3694
- grpc_slice SerializeLrsRequest(
3695
- const EncodingContext& context,
387
+ std::string SerializeLrsRequest(
388
+ const XdsApiContext& context,
3696
389
  const envoy_service_load_stats_v3_LoadStatsRequest* request) {
3697
390
  size_t output_length;
3698
391
  char* output = envoy_service_load_stats_v3_LoadStatsRequest_serialize(
3699
392
  request, context.arena, &output_length);
3700
- return grpc_slice_from_copied_buffer(output, output_length);
393
+ return std::string(output, output_length);
3701
394
  }
3702
395
 
3703
396
  } // namespace
3704
397
 
3705
- grpc_slice XdsApi::CreateLrsInitialRequest(
3706
- const XdsBootstrap::XdsServer& server) {
398
+ std::string XdsApi::CreateLrsInitialRequest() {
3707
399
  upb::Arena arena;
3708
- const EncodingContext context = {client_,
3709
- tracer_,
3710
- symtab_.ptr(),
3711
- arena.ptr(),
3712
- server.ShouldUseV3(),
3713
- certificate_provider_definition_map_};
400
+ const XdsApiContext context = {client_, tracer_, symtab_->ptr(), arena.ptr()};
3714
401
  // Create a request.
3715
402
  envoy_service_load_stats_v3_LoadStatsRequest* request =
3716
403
  envoy_service_load_stats_v3_LoadStatsRequest_new(arena.ptr());
@@ -3718,10 +405,10 @@ grpc_slice XdsApi::CreateLrsInitialRequest(
3718
405
  envoy_config_core_v3_Node* node_msg =
3719
406
  envoy_service_load_stats_v3_LoadStatsRequest_mutable_node(request,
3720
407
  arena.ptr());
3721
- PopulateNode(context, node_, build_version_, user_agent_name_,
3722
- user_agent_version_, node_msg);
408
+ PopulateNode(context, node_, user_agent_name_, user_agent_version_, node_msg);
3723
409
  envoy_config_core_v3_Node_add_client_features(
3724
- node_msg, upb_strview_makez("envoy.lrs.supports_send_all_clusters"),
410
+ node_msg,
411
+ upb_StringView_FromString("envoy.lrs.supports_send_all_clusters"),
3725
412
  arena.ptr());
3726
413
  MaybeLogLrsRequest(context, request);
3727
414
  return SerializeLrsRequest(context, request);
@@ -3730,7 +417,7 @@ grpc_slice XdsApi::CreateLrsInitialRequest(
3730
417
  namespace {
3731
418
 
3732
419
  void LocalityStatsPopulate(
3733
- const EncodingContext& context,
420
+ const XdsApiContext& context,
3734
421
  envoy_config_endpoint_v3_UpstreamLocalityStats* output,
3735
422
  const XdsLocalityName& locality_name,
3736
423
  const XdsClusterLocalityStats::Snapshot& snapshot) {
@@ -3777,12 +464,10 @@ void LocalityStatsPopulate(
3777
464
 
3778
465
  } // namespace
3779
466
 
3780
- grpc_slice XdsApi::CreateLrsRequest(
467
+ std::string XdsApi::CreateLrsRequest(
3781
468
  ClusterLoadReportMap cluster_load_report_map) {
3782
469
  upb::Arena arena;
3783
- const EncodingContext context = {
3784
- client_, tracer_, symtab_.ptr(),
3785
- arena.ptr(), false, certificate_provider_definition_map_};
470
+ const XdsApiContext context = {client_, tracer_, symtab_->ptr(), arena.ptr()};
3786
471
  // Create a request.
3787
472
  envoy_service_load_stats_v3_LoadStatsRequest* request =
3788
473
  envoy_service_load_stats_v3_LoadStatsRequest_new(arena.ptr());
@@ -3830,8 +515,7 @@ grpc_slice XdsApi::CreateLrsRequest(
3830
515
  envoy_config_endpoint_v3_ClusterStats_set_total_dropped_requests(
3831
516
  cluster_stats, total_dropped_requests);
3832
517
  // Set real load report interval.
3833
- gpr_timespec timespec =
3834
- grpc_millis_to_timespec(load_report.load_report_interval, GPR_TIMESPAN);
518
+ gpr_timespec timespec = load_report.load_report_interval.as_timespec();
3835
519
  google_protobuf_Duration* load_report_interval =
3836
520
  envoy_config_endpoint_v3_ClusterStats_mutable_load_report_interval(
3837
521
  cluster_stats, arena.ptr());
@@ -3842,19 +526,18 @@ grpc_slice XdsApi::CreateLrsRequest(
3842
526
  return SerializeLrsRequest(context, request);
3843
527
  }
3844
528
 
3845
- grpc_error_handle XdsApi::ParseLrsResponse(
3846
- const grpc_slice& encoded_response, bool* send_all_clusters,
3847
- std::set<std::string>* cluster_names,
3848
- grpc_millis* load_reporting_interval) {
529
+ absl::Status XdsApi::ParseLrsResponse(absl::string_view encoded_response,
530
+ bool* send_all_clusters,
531
+ std::set<std::string>* cluster_names,
532
+ Duration* load_reporting_interval) {
3849
533
  upb::Arena arena;
3850
534
  // Decode the response.
3851
535
  const envoy_service_load_stats_v3_LoadStatsResponse* decoded_response =
3852
536
  envoy_service_load_stats_v3_LoadStatsResponse_parse(
3853
- reinterpret_cast<const char*>(GRPC_SLICE_START_PTR(encoded_response)),
3854
- GRPC_SLICE_LENGTH(encoded_response), arena.ptr());
537
+ encoded_response.data(), encoded_response.size(), arena.ptr());
3855
538
  // Parse the response.
3856
539
  if (decoded_response == nullptr) {
3857
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Can't decode response.");
540
+ return absl::UnavailableError("Can't decode response.");
3858
541
  }
3859
542
  // Check send_all_clusters.
3860
543
  if (envoy_service_load_stats_v3_LoadStatsResponse_send_all_clusters(
@@ -3863,7 +546,7 @@ grpc_error_handle XdsApi::ParseLrsResponse(
3863
546
  } else {
3864
547
  // Store the cluster names.
3865
548
  size_t size;
3866
- const upb_strview* clusters =
549
+ const upb_StringView* clusters =
3867
550
  envoy_service_load_stats_v3_LoadStatsResponse_clusters(decoded_response,
3868
551
  &size);
3869
552
  for (size_t i = 0; i < size; ++i) {
@@ -3874,21 +557,19 @@ grpc_error_handle XdsApi::ParseLrsResponse(
3874
557
  const google_protobuf_Duration* load_reporting_interval_duration =
3875
558
  envoy_service_load_stats_v3_LoadStatsResponse_load_reporting_interval(
3876
559
  decoded_response);
3877
- gpr_timespec timespec{
560
+ *load_reporting_interval = Duration::FromSecondsAndNanoseconds(
3878
561
  google_protobuf_Duration_seconds(load_reporting_interval_duration),
3879
- google_protobuf_Duration_nanos(load_reporting_interval_duration),
3880
- GPR_TIMESPAN};
3881
- *load_reporting_interval = gpr_time_to_millis(timespec);
3882
- return GRPC_ERROR_NONE;
562
+ google_protobuf_Duration_nanos(load_reporting_interval_duration));
563
+ return absl::OkStatus();
3883
564
  }
3884
565
 
3885
566
  namespace {
3886
567
 
3887
- google_protobuf_Timestamp* GrpcMillisToTimestamp(const EncodingContext& context,
3888
- grpc_millis value) {
568
+ google_protobuf_Timestamp* EncodeTimestamp(const XdsApiContext& context,
569
+ Timestamp value) {
3889
570
  google_protobuf_Timestamp* timestamp =
3890
571
  google_protobuf_Timestamp_new(context.arena);
3891
- gpr_timespec timespec = grpc_millis_to_timespec(value, GPR_CLOCK_REALTIME);
572
+ gpr_timespec timespec = value.as_timespec(GPR_CLOCK_REALTIME);
3892
573
  google_protobuf_Timestamp_set_seconds(timestamp, timespec.tv_sec);
3893
574
  google_protobuf_Timestamp_set_nanos(timestamp, timespec.tv_nsec);
3894
575
  return timestamp;
@@ -3904,15 +585,15 @@ std::string XdsApi::AssembleClientConfig(
3904
585
  // Fill-in the node information
3905
586
  auto* node = envoy_service_status_v3_ClientConfig_mutable_node(client_config,
3906
587
  arena.ptr());
3907
- const EncodingContext context = {
3908
- client_, tracer_, symtab_.ptr(),
3909
- arena.ptr(), true, certificate_provider_definition_map_};
3910
- PopulateNode(context, node_, build_version_, user_agent_name_,
3911
- user_agent_version_, node);
588
+ const XdsApiContext context = {client_, tracer_, symtab_->ptr(), arena.ptr()};
589
+ PopulateNode(context, node_, user_agent_name_, user_agent_version_, node);
3912
590
  // Dump each resource.
591
+ std::vector<std::string> type_url_storage;
3913
592
  for (const auto& p : resource_type_metadata_map) {
3914
593
  absl::string_view type_url = p.first;
3915
594
  const ResourceMetadataMap& resource_metadata_map = p.second;
595
+ type_url_storage.emplace_back(
596
+ absl::StrCat("type.googleapis.com/", type_url));
3916
597
  for (const auto& q : resource_metadata_map) {
3917
598
  absl::string_view resource_name = q.first;
3918
599
  const ResourceMetadata& metadata = *q.second;
@@ -3920,7 +601,7 @@ std::string XdsApi::AssembleClientConfig(
3920
601
  envoy_service_status_v3_ClientConfig_add_generic_xds_configs(
3921
602
  client_config, context.arena);
3922
603
  envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_type_url(
3923
- entry, StdStringToUpbString(type_url));
604
+ entry, StdStringToUpbString(type_url_storage.back()));
3924
605
  envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_name(
3925
606
  entry, StdStringToUpbString(resource_name));
3926
607
  envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_client_status(
@@ -3929,12 +610,12 @@ std::string XdsApi::AssembleClientConfig(
3929
610
  envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_version_info(
3930
611
  entry, StdStringToUpbString(metadata.version));
3931
612
  envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_last_updated(
3932
- entry, GrpcMillisToTimestamp(context, metadata.update_time));
613
+ entry, EncodeTimestamp(context, metadata.update_time));
3933
614
  auto* any_field =
3934
615
  envoy_service_status_v3_ClientConfig_GenericXdsConfig_mutable_xds_config(
3935
616
  entry, context.arena);
3936
- google_protobuf_Any_set_type_url(any_field,
3937
- StdStringToUpbString(type_url));
617
+ google_protobuf_Any_set_type_url(
618
+ any_field, StdStringToUpbString(type_url_storage.back()));
3938
619
  google_protobuf_Any_set_value(
3939
620
  any_field, StdStringToUpbString(metadata.serialized_proto));
3940
621
  }
@@ -3949,7 +630,7 @@ std::string XdsApi::AssembleClientConfig(
3949
630
  StdStringToUpbString(metadata.failed_version));
3950
631
  envoy_admin_v3_UpdateFailureState_set_last_update_attempt(
3951
632
  update_failure_state,
3952
- GrpcMillisToTimestamp(context, metadata.failed_update_time));
633
+ EncodeTimestamp(context, metadata.failed_update_time));
3953
634
  envoy_service_status_v3_ClientConfig_GenericXdsConfig_set_error_state(
3954
635
  entry, update_failure_state);
3955
636
  }