grpc 1.35.0.pre1 → 1.37.1

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

Potentially problematic release.


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

Files changed (507) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +121 -89
  3. data/include/grpc/grpc.h +15 -1
  4. data/include/grpc/grpc_security.h +16 -11
  5. data/include/grpc/impl/codegen/port_platform.h +2 -0
  6. data/src/core/ext/filters/client_channel/client_channel.cc +359 -331
  7. data/src/core/ext/filters/client_channel/client_channel.h +0 -2
  8. data/src/core/ext/filters/client_channel/client_channel_factory.h +2 -1
  9. data/src/core/ext/filters/client_channel/config_selector.h +9 -1
  10. data/src/core/ext/filters/client_channel/dynamic_filters.cc +9 -4
  11. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -142
  12. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +15 -10
  13. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +2 -2
  14. data/src/core/ext/filters/client_channel/lb_policy.cc +3 -0
  15. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +3 -5
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -2
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -2
  18. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +1 -1
  19. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +8 -6
  20. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +23 -0
  21. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +27 -0
  22. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +289 -170
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +5 -0
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +8 -25
  25. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +1 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +232 -110
  27. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +27 -67
  28. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +10 -9
  29. data/src/core/ext/filters/client_channel/resolver.cc +5 -5
  30. data/src/core/ext/filters/client_channel/resolver.h +1 -12
  31. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +36 -45
  32. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  33. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -1
  34. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +34 -50
  35. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +16 -14
  36. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +18 -15
  37. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +377 -0
  38. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -4
  39. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +307 -155
  40. data/src/core/ext/filters/client_channel/server_address.cc +9 -0
  41. data/src/core/ext/filters/client_channel/server_address.h +31 -0
  42. data/src/core/ext/filters/client_channel/subchannel.cc +69 -146
  43. data/src/core/ext/filters/client_channel/subchannel.h +63 -95
  44. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +16 -2
  45. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +10 -8
  46. data/src/core/ext/filters/client_idle/client_idle_filter.cc +1 -1
  47. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +500 -0
  48. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +39 -0
  49. data/src/core/ext/filters/fault_injection/service_config_parser.cc +189 -0
  50. data/src/core/ext/filters/fault_injection/service_config_parser.h +85 -0
  51. data/src/core/ext/filters/max_age/max_age_filter.cc +35 -32
  52. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +1 -1
  53. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
  54. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +3 -2
  55. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +1 -1
  56. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +3 -2
  57. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +490 -178
  58. data/src/core/ext/transport/chttp2/server/chttp2_server.h +11 -2
  59. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +11 -1
  60. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +1 -1
  61. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +62 -18
  62. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +39 -7
  63. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +12 -1
  64. data/src/core/ext/transport/chttp2/transport/frame_data.cc +5 -1
  65. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +1 -1
  66. data/src/core/ext/transport/chttp2/transport/internal.h +1 -0
  67. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +406 -0
  68. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +1459 -0
  69. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +0 -1
  70. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +350 -0
  71. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +1348 -0
  72. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +11 -16
  73. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +42 -59
  74. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +3 -2
  75. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +15 -0
  76. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +25 -1
  77. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +75 -0
  78. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +2 -2
  79. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +9 -9
  80. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +7 -7
  81. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +28 -13
  82. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +6 -0
  83. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +25 -0
  84. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +0 -1
  85. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +11 -5
  86. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +41 -7
  87. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +0 -1
  88. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +23 -21
  89. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +122 -77
  90. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +13 -9
  91. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +37 -5
  92. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +0 -1
  93. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +144 -0
  94. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +488 -0
  95. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +141 -0
  96. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +452 -0
  97. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +11 -9
  98. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +44 -27
  99. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +57 -16
  100. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +150 -0
  101. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +0 -1
  102. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +29 -0
  103. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +67 -0
  104. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +79 -0
  105. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +268 -0
  106. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +78 -0
  107. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +281 -0
  108. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +41 -0
  109. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +113 -0
  110. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +19 -21
  111. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +64 -51
  112. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +0 -1
  113. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +16 -13
  114. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +50 -18
  115. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +4 -7
  116. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +0 -17
  117. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +0 -1
  118. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +30 -23
  119. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +85 -73
  120. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +0 -3
  121. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +0 -3
  122. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +0 -1
  123. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +0 -2
  124. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +93 -0
  125. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +323 -0
  126. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +36 -0
  127. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +90 -0
  128. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +0 -1
  129. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +46 -0
  130. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +124 -0
  131. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +21 -4
  132. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +29 -0
  133. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.c +33 -0
  134. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +77 -0
  135. data/src/core/ext/upb-generated/{udpa/core/v1 → xds/core/v3}/authority.upb.c +5 -5
  136. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +60 -0
  137. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +52 -0
  138. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +143 -0
  139. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +42 -0
  140. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +84 -0
  141. data/src/core/ext/upb-generated/{udpa/core/v1 → xds/core/v3}/resource.upb.c +9 -9
  142. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +94 -0
  143. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +54 -0
  144. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +166 -0
  145. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +36 -0
  146. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +85 -0
  147. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +354 -0
  148. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +140 -0
  149. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +168 -171
  150. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +383 -0
  151. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +115 -0
  152. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +405 -420
  153. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +2 -2
  154. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +12 -9
  155. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +177 -171
  156. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +10 -0
  157. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +88 -88
  158. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +153 -153
  159. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +10 -7
  160. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +5 -0
  161. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +4 -7
  162. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +33 -20
  163. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +56 -59
  164. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +116 -111
  165. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +129 -121
  166. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +21 -24
  167. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +141 -0
  168. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h +70 -0
  169. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +141 -0
  170. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +70 -0
  171. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +17 -13
  172. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +753 -724
  173. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +10 -0
  174. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +22 -25
  175. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +51 -0
  176. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +35 -0
  177. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +102 -0
  178. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h +55 -0
  179. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +120 -0
  180. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h +45 -0
  181. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +76 -0
  182. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +35 -0
  183. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +371 -377
  184. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +12 -16
  185. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +112 -108
  186. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +45 -53
  187. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +177 -180
  188. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +92 -102
  189. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +5 -0
  190. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +32 -42
  191. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +30 -40
  192. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +4 -7
  193. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +38 -44
  194. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +130 -0
  195. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +50 -0
  196. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +56 -0
  197. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h +35 -0
  198. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +30 -33
  199. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +63 -0
  200. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.h +40 -0
  201. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +8 -7
  202. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +9 -9
  203. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +9 -8
  204. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +8 -8
  205. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +8 -8
  206. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +9 -8
  207. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +8 -8
  208. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +44 -0
  209. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +35 -0
  210. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +14 -11
  211. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +42 -0
  212. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h +35 -0
  213. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +62 -0
  214. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h +40 -0
  215. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +45 -0
  216. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h +40 -0
  217. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +49 -0
  218. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h +35 -0
  219. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +67 -0
  220. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h +40 -0
  221. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +50 -0
  222. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h +35 -0
  223. data/src/core/ext/xds/xds_api.cc +2149 -666
  224. data/src/core/ext/xds/xds_api.h +321 -119
  225. data/src/core/ext/xds/xds_bootstrap.cc +80 -45
  226. data/src/core/ext/xds/xds_bootstrap.h +17 -5
  227. data/src/core/ext/xds/xds_certificate_provider.cc +180 -74
  228. data/src/core/ext/xds/xds_certificate_provider.h +83 -44
  229. data/src/core/ext/xds/xds_client.cc +181 -34
  230. data/src/core/ext/xds/xds_client.h +29 -0
  231. data/src/core/ext/xds/xds_client_stats.cc +2 -1
  232. data/src/core/ext/xds/xds_client_stats.h +2 -2
  233. data/src/core/ext/xds/xds_http_fault_filter.cc +226 -0
  234. data/src/core/ext/xds/xds_http_fault_filter.h +63 -0
  235. data/src/core/ext/xds/xds_http_filters.cc +114 -0
  236. data/src/core/ext/xds/xds_http_filters.h +130 -0
  237. data/src/core/ext/xds/xds_server_config_fetcher.cc +425 -24
  238. data/src/core/lib/channel/channel_stack.cc +12 -0
  239. data/src/core/lib/channel/channel_stack.h +7 -0
  240. data/src/core/lib/channel/channelz.cc +92 -4
  241. data/src/core/lib/channel/channelz.h +30 -1
  242. data/src/core/lib/channel/channelz_registry.cc +14 -0
  243. data/src/core/lib/channel/handshaker.cc +2 -44
  244. data/src/core/lib/channel/handshaker.h +1 -18
  245. data/src/core/lib/channel/status_util.cc +12 -2
  246. data/src/core/lib/channel/status_util.h +5 -0
  247. data/src/core/lib/gpr/log.cc +6 -1
  248. data/src/core/lib/gpr/sync_abseil.cc +3 -6
  249. data/src/core/lib/gpr/sync_windows.cc +2 -2
  250. data/src/core/lib/gprpp/atomic.h +3 -3
  251. data/src/core/lib/gprpp/dual_ref_counted.h +3 -3
  252. data/src/core/lib/gprpp/mpscq.cc +2 -2
  253. data/src/core/lib/gprpp/ref_counted.h +1 -1
  254. data/src/core/lib/gprpp/ref_counted_ptr.h +2 -0
  255. data/src/core/lib/gprpp/sync.h +129 -40
  256. data/src/core/lib/gprpp/thd.h +1 -1
  257. data/src/core/lib/gprpp/time_util.cc +77 -0
  258. data/src/core/lib/gprpp/time_util.h +42 -0
  259. data/src/core/lib/http/httpcli_security_connector.cc +2 -2
  260. data/src/core/lib/iomgr/buffer_list.h +1 -1
  261. data/src/core/lib/iomgr/cfstream_handle.cc +2 -2
  262. data/src/core/lib/iomgr/error.h +1 -1
  263. data/src/core/lib/iomgr/ev_apple.cc +11 -8
  264. data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -3
  265. data/src/core/lib/iomgr/ev_epollex_linux.cc +4 -4
  266. data/src/core/lib/iomgr/ev_posix.cc +3 -3
  267. data/src/core/lib/iomgr/exec_ctx.cc +6 -2
  268. data/src/core/lib/iomgr/iomgr_posix.cc +0 -1
  269. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +0 -1
  270. data/src/core/lib/iomgr/resource_quota.cc +1 -1
  271. data/src/core/lib/iomgr/sockaddr_utils.cc +121 -1
  272. data/src/core/lib/iomgr/sockaddr_utils.h +25 -0
  273. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -0
  274. data/src/core/lib/iomgr/tcp_client_posix.cc +1 -1
  275. data/src/core/lib/iomgr/tcp_posix.cc +5 -8
  276. data/src/core/lib/iomgr/tcp_uv.cc +2 -2
  277. data/src/core/lib/iomgr/timer_generic.cc +2 -2
  278. data/src/core/lib/iomgr/timer_manager.cc +1 -1
  279. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +1 -1
  280. data/src/core/lib/matchers/matchers.cc +339 -0
  281. data/src/core/lib/matchers/matchers.h +160 -0
  282. data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -1
  283. data/src/core/lib/security/credentials/alts/alts_credentials.h +1 -1
  284. data/src/core/lib/security/credentials/credentials.h +2 -1
  285. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +1 -1
  286. data/src/core/lib/security/credentials/external/external_account_credentials.cc +2 -2
  287. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +1 -1
  288. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +1 -1
  289. data/src/core/lib/security/credentials/fake/fake_credentials.cc +1 -1
  290. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +7 -6
  291. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +2 -2
  292. data/src/core/lib/security/credentials/jwt/json_token.cc +0 -3
  293. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +0 -3
  294. data/src/core/lib/security/credentials/local/local_credentials.cc +2 -1
  295. data/src/core/lib/security/credentials/local/local_credentials.h +1 -1
  296. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +2 -1
  297. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +1 -1
  298. data/src/core/lib/security/credentials/tls/tls_credentials.cc +2 -1
  299. data/src/core/lib/security/credentials/tls/tls_credentials.h +1 -1
  300. data/src/core/lib/security/credentials/xds/xds_credentials.cc +128 -59
  301. data/src/core/lib/security/credentials/xds/xds_credentials.h +3 -3
  302. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +5 -5
  303. data/src/core/lib/security/security_connector/ssl_utils.cc +9 -4
  304. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +32 -14
  305. data/src/core/lib/security/transport/security_handshaker.cc +33 -5
  306. data/src/core/lib/security/transport/server_auth_filter.cc +7 -0
  307. data/src/core/lib/slice/slice_intern.cc +5 -6
  308. data/src/core/lib/surface/channel.h +3 -3
  309. data/src/core/lib/surface/completion_queue.cc +1 -1
  310. data/src/core/lib/surface/init.cc +13 -15
  311. data/src/core/lib/surface/lame_client.cc +38 -19
  312. data/src/core/lib/surface/lame_client.h +4 -3
  313. data/src/core/lib/surface/server.cc +43 -36
  314. data/src/core/lib/surface/server.h +76 -14
  315. data/src/core/lib/surface/version.cc +2 -2
  316. data/src/core/lib/transport/metadata.cc +6 -2
  317. data/src/core/lib/transport/metadata_batch.cc +27 -0
  318. data/src/core/lib/transport/metadata_batch.h +14 -0
  319. data/src/core/plugin_registry/grpc_plugin_registry.cc +12 -0
  320. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +18 -24
  321. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +16 -21
  322. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +1 -1
  323. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -3
  324. data/src/core/tsi/fake_transport_security.cc +11 -2
  325. data/src/core/tsi/ssl/session_cache/ssl_session.h +0 -3
  326. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +0 -2
  327. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +2 -4
  328. data/src/core/tsi/ssl_transport_security.cc +0 -3
  329. data/src/core/tsi/ssl_transport_security.h +0 -3
  330. data/src/ruby/ext/grpc/extconf.rb +9 -1
  331. data/src/ruby/ext/grpc/rb_channel.c +10 -1
  332. data/src/ruby/ext/grpc/rb_channel_credentials.c +11 -1
  333. data/src/ruby/ext/grpc/rb_channel_credentials.h +4 -0
  334. data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
  335. data/src/ruby/ext/grpc/rb_enable_cpp.cc +1 -1
  336. data/src/ruby/ext/grpc/rb_grpc.c +4 -0
  337. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  338. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -1
  339. data/src/ruby/ext/grpc/rb_server.c +13 -1
  340. data/src/ruby/ext/grpc/rb_server_credentials.c +19 -3
  341. data/src/ruby/ext/grpc/rb_server_credentials.h +4 -0
  342. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +215 -0
  343. data/src/ruby/ext/grpc/rb_xds_channel_credentials.h +35 -0
  344. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +169 -0
  345. data/src/ruby/ext/grpc/rb_xds_server_credentials.h +35 -0
  346. data/src/ruby/lib/grpc/generic/client_stub.rb +4 -2
  347. data/src/ruby/lib/grpc/version.rb +1 -1
  348. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +7 -0
  349. data/src/ruby/spec/call_spec.rb +1 -1
  350. data/src/ruby/spec/channel_credentials_spec.rb +32 -0
  351. data/src/ruby/spec/channel_spec.rb +17 -6
  352. data/src/ruby/spec/client_auth_spec.rb +27 -1
  353. data/src/ruby/spec/errors_spec.rb +1 -1
  354. data/src/ruby/spec/generic/active_call_spec.rb +2 -2
  355. data/src/ruby/spec/generic/client_stub_spec.rb +4 -4
  356. data/src/ruby/spec/generic/rpc_server_spec.rb +1 -1
  357. data/src/ruby/spec/server_credentials_spec.rb +25 -0
  358. data/src/ruby/spec/server_spec.rb +22 -0
  359. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +1 -0
  360. data/third_party/boringssl-with-bazel/err_data.c +715 -713
  361. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +3 -3
  362. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +2 -2
  363. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +5 -5
  364. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +3 -10
  365. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c +3 -3
  366. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +4 -2
  367. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +2 -2
  368. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +15 -14
  369. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +30 -0
  370. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +28 -79
  371. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +39 -85
  372. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +5 -16
  373. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +10 -61
  374. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +0 -2
  375. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +2 -2
  376. data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +4 -0
  377. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +158 -0
  378. data/third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c +3 -10
  379. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +8 -9
  380. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +60 -45
  381. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c +6 -81
  382. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +87 -0
  383. data/third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-win.c +41 -0
  384. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +11 -2
  385. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm.c +3 -3
  386. data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/dh_asn1.c +0 -0
  387. data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/params.c +179 -0
  388. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +25 -0
  389. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c +2 -17
  390. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +3 -1
  391. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c +13 -20
  392. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +2 -3
  393. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +9 -1
  394. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +21 -13
  395. data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/check.c +0 -0
  396. data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/dh.c +136 -213
  397. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +12 -0
  398. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +9 -1
  399. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +28 -0
  400. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +135 -43
  401. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +0 -7
  402. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +51 -32
  403. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +147 -0
  404. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +18 -29
  405. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +13 -4
  406. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +10 -7
  407. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c +13 -11
  408. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c +4 -0
  409. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c +34 -0
  410. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +4 -0
  411. data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +7 -13
  412. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +5 -1
  413. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +1 -29
  414. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +10 -7
  415. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c +1 -1
  416. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +8 -8
  417. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +1 -1
  418. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +29 -23
  419. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +22 -17
  420. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +1 -2
  421. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c +2 -2
  422. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +39 -4
  423. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +2 -2
  424. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +3 -3
  425. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +11 -10
  426. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -3
  427. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +25 -25
  428. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -2
  429. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +2 -1
  430. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +40 -20
  431. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c +3 -4
  432. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +25 -36
  433. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +1 -1
  434. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +6 -6
  435. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +6 -6
  436. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +3 -3
  437. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +652 -545
  438. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +0 -167
  439. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +10 -5
  440. data/third_party/boringssl-with-bazel/src/include/openssl/blake2.h +62 -0
  441. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +22 -7
  442. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +19 -0
  443. data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +22 -32
  444. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +56 -26
  445. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +1 -0
  446. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +15 -0
  447. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +12 -2
  448. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +3 -0
  449. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +2 -1
  450. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +67 -33
  451. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +27 -8
  452. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +287 -99
  453. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +139 -36
  454. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +4 -3
  455. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +11 -20
  456. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +10 -5
  457. data/third_party/boringssl-with-bazel/src/ssl/internal.h +37 -16
  458. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +0 -1
  459. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +7 -8
  460. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +20 -14
  461. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +7 -8
  462. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +2 -2
  463. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +5 -7
  464. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +362 -50
  465. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +2 -2
  466. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +48 -15
  467. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +66 -24
  468. data/third_party/xxhash/xxhash.h +5443 -0
  469. metadata +140 -84
  470. data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.h +0 -60
  471. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c +0 -52
  472. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h +0 -143
  473. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c +0 -42
  474. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h +0 -84
  475. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.h +0 -94
  476. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c +0 -54
  477. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h +0 -173
  478. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c +0 -36
  479. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h +0 -92
  480. data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c +0 -42
  481. data/src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h +0 -35
  482. data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c +0 -62
  483. data/src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h +0 -40
  484. data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c +0 -45
  485. data/src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h +0 -40
  486. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c +0 -49
  487. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h +0 -35
  488. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c +0 -68
  489. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h +0 -40
  490. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c +0 -51
  491. data/src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h +0 -35
  492. data/src/core/lib/iomgr/iomgr_posix.h +0 -26
  493. data/src/core/lib/security/authorization/authorization_engine.cc +0 -177
  494. data/src/core/lib/security/authorization/authorization_engine.h +0 -84
  495. data/src/core/lib/security/authorization/evaluate_args.cc +0 -148
  496. data/src/core/lib/security/authorization/evaluate_args.h +0 -59
  497. data/src/core/lib/security/authorization/mock_cel/activation.h +0 -57
  498. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +0 -44
  499. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +0 -69
  500. data/src/core/lib/security/authorization/mock_cel/cel_value.h +0 -97
  501. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +0 -67
  502. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +0 -57
  503. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +0 -504
  504. data/third_party/upb/upb/json_decode.c +0 -1443
  505. data/third_party/upb/upb/json_decode.h +0 -23
  506. data/third_party/upb/upb/json_encode.c +0 -713
  507. data/third_party/upb/upb/json_encode.h +0 -36
@@ -77,6 +77,8 @@ class NativeDnsResolver : public Resolver {
77
77
  std::string name_to_resolve_;
78
78
  /// channel args
79
79
  grpc_channel_args* channel_args_ = nullptr;
80
+ std::shared_ptr<WorkSerializer> work_serializer_;
81
+ std::unique_ptr<ResultHandler> result_handler_;
80
82
  /// pollset_set to drive the name resolution process
81
83
  grpc_pollset_set* interested_parties_ = nullptr;
82
84
  /// are we shutting down?
@@ -99,7 +101,14 @@ class NativeDnsResolver : public Resolver {
99
101
  };
100
102
 
101
103
  NativeDnsResolver::NativeDnsResolver(ResolverArgs args)
102
- : Resolver(std::move(args.work_serializer), std::move(args.result_handler)),
104
+ : name_to_resolve_(absl::StripPrefix(args.uri.path(), "/")),
105
+ channel_args_(grpc_channel_args_copy(args.args)),
106
+ work_serializer_(std::move(args.work_serializer)),
107
+ result_handler_(std::move(args.result_handler)),
108
+ interested_parties_(grpc_pollset_set_create()),
109
+ min_time_between_resolutions_(grpc_channel_args_find_integer(
110
+ channel_args_, GRPC_ARG_DNS_MIN_TIME_BETWEEN_RESOLUTIONS_MS,
111
+ {1000 * 30, 0, INT_MAX})),
103
112
  backoff_(
104
113
  BackOff::Options()
105
114
  .set_initial_backoff(GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS *
@@ -107,13 +116,6 @@ NativeDnsResolver::NativeDnsResolver(ResolverArgs args)
107
116
  .set_multiplier(GRPC_DNS_RECONNECT_BACKOFF_MULTIPLIER)
108
117
  .set_jitter(GRPC_DNS_RECONNECT_JITTER)
109
118
  .set_max_backoff(GRPC_DNS_RECONNECT_MAX_BACKOFF_SECONDS * 1000)) {
110
- name_to_resolve_ = std::string(absl::StripPrefix(args.uri.path(), "/"));
111
- channel_args_ = grpc_channel_args_copy(args.args);
112
- const grpc_arg* arg = grpc_channel_args_find(
113
- args.args, GRPC_ARG_DNS_MIN_TIME_BETWEEN_RESOLUTIONS_MS);
114
- min_time_between_resolutions_ =
115
- grpc_channel_arg_get_integer(arg, {1000 * 30, 0, INT_MAX});
116
- interested_parties_ = grpc_pollset_set_create();
117
119
  if (args.pollset_set != nullptr) {
118
120
  grpc_pollset_set_add_pollset_set(interested_parties_, args.pollset_set);
119
121
  }
@@ -149,8 +151,8 @@ void NativeDnsResolver::ShutdownLocked() {
149
151
  void NativeDnsResolver::OnNextResolution(void* arg, grpc_error* error) {
150
152
  NativeDnsResolver* r = static_cast<NativeDnsResolver*>(arg);
151
153
  GRPC_ERROR_REF(error); // ref owned by lambda
152
- r->work_serializer()->Run([r, error]() { r->OnNextResolutionLocked(error); },
153
- DEBUG_LOCATION);
154
+ r->work_serializer_->Run([r, error]() { r->OnNextResolutionLocked(error); },
155
+ DEBUG_LOCATION);
154
156
  }
155
157
 
156
158
  void NativeDnsResolver::OnNextResolutionLocked(grpc_error* error) {
@@ -165,8 +167,8 @@ void NativeDnsResolver::OnNextResolutionLocked(grpc_error* error) {
165
167
  void NativeDnsResolver::OnResolved(void* arg, grpc_error* error) {
166
168
  NativeDnsResolver* r = static_cast<NativeDnsResolver*>(arg);
167
169
  GRPC_ERROR_REF(error); // owned by lambda
168
- r->work_serializer()->Run([r, error]() { r->OnResolvedLocked(error); },
169
- DEBUG_LOCATION);
170
+ r->work_serializer_->Run([r, error]() { r->OnResolvedLocked(error); },
171
+ DEBUG_LOCATION);
170
172
  }
171
173
 
172
174
  void NativeDnsResolver::OnResolvedLocked(grpc_error* error) {
@@ -186,7 +188,7 @@ void NativeDnsResolver::OnResolvedLocked(grpc_error* error) {
186
188
  }
187
189
  grpc_resolved_addresses_destroy(addresses_);
188
190
  result.args = grpc_channel_args_copy(channel_args_);
189
- result_handler()->ReturnResult(std::move(result));
191
+ result_handler_->ReturnResult(std::move(result));
190
192
  // Reset backoff state so that we start from the beginning when the
191
193
  // next request gets triggered.
192
194
  backoff_.Reset();
@@ -196,7 +198,7 @@ void NativeDnsResolver::OnResolvedLocked(grpc_error* error) {
196
198
  // Return transient error.
197
199
  std::string error_message =
198
200
  absl::StrCat("DNS resolution failed for service: ", name_to_resolve_);
199
- result_handler()->ReturnError(grpc_error_set_int(
201
+ result_handler_->ReturnError(grpc_error_set_int(
200
202
  GRPC_ERROR_CREATE_REFERENCING_FROM_COPIED_STRING(error_message.c_str(),
201
203
  &error, 1),
202
204
  GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE));
@@ -69,6 +69,8 @@ class FakeResolver : public Resolver {
69
69
 
70
70
  // passed-in parameters
71
71
  grpc_channel_args* channel_args_ = nullptr;
72
+ std::shared_ptr<WorkSerializer> work_serializer_;
73
+ std::unique_ptr<ResultHandler> result_handler_;
72
74
  RefCountedPtr<FakeResolverResponseGenerator> response_generator_;
73
75
  // If has_next_result_ is true, next_result_ is the next resolution result
74
76
  // to be returned.
@@ -89,7 +91,8 @@ class FakeResolver : public Resolver {
89
91
  };
90
92
 
91
93
  FakeResolver::FakeResolver(ResolverArgs args)
92
- : Resolver(std::move(args.work_serializer), std::move(args.result_handler)),
94
+ : work_serializer_(std::move(args.work_serializer)),
95
+ result_handler_(std::move(args.result_handler)),
93
96
  response_generator_(
94
97
  FakeResolverResponseGenerator::GetFromArgs(args.args)) {
95
98
  // Channels sharing the same subchannels may have different resolver response
@@ -121,8 +124,8 @@ void FakeResolver::RequestReresolutionLocked() {
121
124
  if (!reresolution_closure_pending_) {
122
125
  reresolution_closure_pending_ = true;
123
126
  Ref().release(); // ref held by closure
124
- work_serializer()->Run([this]() { ReturnReresolutionResult(); },
125
- DEBUG_LOCATION);
127
+ work_serializer_->Run([this]() { ReturnReresolutionResult(); },
128
+ DEBUG_LOCATION);
126
129
  }
127
130
  }
128
131
  }
@@ -140,7 +143,7 @@ void FakeResolver::MaybeSendResultLocked() {
140
143
  if (return_failure_) {
141
144
  // TODO(roth): Change resolver result generator to be able to inject
142
145
  // the error to be returned.
143
- result_handler()->ReturnError(grpc_error_set_int(
146
+ result_handler_->ReturnError(grpc_error_set_int(
144
147
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Resolver transient failure"),
145
148
  GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE));
146
149
  return_failure_ = false;
@@ -155,7 +158,7 @@ void FakeResolver::MaybeSendResultLocked() {
155
158
  // name, only the one in next_results_ will be kept since next_results_ is
156
159
  // before channel_args_.
157
160
  result.args = grpc_channel_args_union(next_result_.args, channel_args_);
158
- result_handler()->ReturnResult(std::move(result));
161
+ result_handler_->ReturnResult(std::move(result));
159
162
  has_next_result_ = false;
160
163
  }
161
164
  }
@@ -236,8 +239,8 @@ void FakeResolverResponseGenerator::SetResponse(Resolver::Result result) {
236
239
  }
237
240
  FakeResolverResponseSetter* arg =
238
241
  new FakeResolverResponseSetter(resolver, std::move(result));
239
- resolver->work_serializer()->Run([arg]() { arg->SetResponseLocked(); },
240
- DEBUG_LOCATION);
242
+ resolver->work_serializer_->Run([arg]() { arg->SetResponseLocked(); },
243
+ DEBUG_LOCATION);
241
244
  }
242
245
 
243
246
  void FakeResolverResponseGenerator::SetReresolutionResponse(
@@ -250,7 +253,7 @@ void FakeResolverResponseGenerator::SetReresolutionResponse(
250
253
  }
251
254
  FakeResolverResponseSetter* arg = new FakeResolverResponseSetter(
252
255
  resolver, std::move(result), true /* has_result */);
253
- resolver->work_serializer()->Run(
256
+ resolver->work_serializer_->Run(
254
257
  [arg]() { arg->SetReresolutionResponseLocked(); }, DEBUG_LOCATION);
255
258
  }
256
259
 
@@ -263,7 +266,7 @@ void FakeResolverResponseGenerator::UnsetReresolutionResponse() {
263
266
  }
264
267
  FakeResolverResponseSetter* arg =
265
268
  new FakeResolverResponseSetter(resolver, Resolver::Result());
266
- resolver->work_serializer()->Run(
269
+ resolver->work_serializer_->Run(
267
270
  [arg]() { arg->SetReresolutionResponseLocked(); }, DEBUG_LOCATION);
268
271
  }
269
272
 
@@ -276,8 +279,8 @@ void FakeResolverResponseGenerator::SetFailure() {
276
279
  }
277
280
  FakeResolverResponseSetter* arg =
278
281
  new FakeResolverResponseSetter(resolver, Resolver::Result());
279
- resolver->work_serializer()->Run([arg]() { arg->SetFailureLocked(); },
280
- DEBUG_LOCATION);
282
+ resolver->work_serializer_->Run([arg]() { arg->SetFailureLocked(); },
283
+ DEBUG_LOCATION);
281
284
  }
282
285
 
283
286
  void FakeResolverResponseGenerator::SetFailureOnReresolution() {
@@ -290,8 +293,8 @@ void FakeResolverResponseGenerator::SetFailureOnReresolution() {
290
293
  FakeResolverResponseSetter* arg = new FakeResolverResponseSetter(
291
294
  resolver, Resolver::Result(), false /* has_result */,
292
295
  false /* immediate */);
293
- resolver->work_serializer()->Run([arg]() { arg->SetFailureLocked(); },
294
- DEBUG_LOCATION);
296
+ resolver->work_serializer_->Run([arg]() { arg->SetFailureLocked(); },
297
+ DEBUG_LOCATION);
295
298
  }
296
299
 
297
300
  void FakeResolverResponseGenerator::SetFakeResolver(
@@ -302,8 +305,8 @@ void FakeResolverResponseGenerator::SetFakeResolver(
302
305
  if (has_result_) {
303
306
  FakeResolverResponseSetter* arg =
304
307
  new FakeResolverResponseSetter(resolver_, std::move(result_));
305
- resolver_->work_serializer()->Run([arg]() { arg->SetResponseLocked(); },
306
- DEBUG_LOCATION);
308
+ resolver_->work_serializer_->Run([arg]() { arg->SetResponseLocked(); },
309
+ DEBUG_LOCATION);
307
310
  has_result_ = false;
308
311
  }
309
312
  }
@@ -0,0 +1,377 @@
1
+ //
2
+ // Copyright 2021 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
16
+
17
+ #include <grpc/support/port_platform.h>
18
+
19
+ #include "src/core/ext/filters/client_channel/resolver_registry.h"
20
+ #include "src/core/ext/xds/xds_client.h"
21
+ #include "src/core/lib/gpr/env.h"
22
+ #include "src/core/lib/gpr/string.h"
23
+ #include "src/core/lib/http/httpcli.h"
24
+ #include "src/core/lib/iomgr/polling_entity.h"
25
+ #include "src/core/lib/security/credentials/alts/check_gcp_environment.h"
26
+
27
+ namespace grpc_core {
28
+
29
+ namespace {
30
+
31
+ class GoogleCloud2ProdResolver : public Resolver {
32
+ public:
33
+ explicit GoogleCloud2ProdResolver(ResolverArgs args);
34
+
35
+ void StartLocked() override;
36
+ void RequestReresolutionLocked() override;
37
+ void ResetBackoffLocked() override;
38
+ void ShutdownLocked() override;
39
+
40
+ private:
41
+ // Represents an HTTP request to the metadata server.
42
+ class MetadataQuery : public InternallyRefCounted<MetadataQuery> {
43
+ public:
44
+ MetadataQuery(RefCountedPtr<GoogleCloud2ProdResolver> resolver,
45
+ const char* path, grpc_polling_entity* pollent);
46
+ ~MetadataQuery() override;
47
+
48
+ void Orphan() override;
49
+
50
+ private:
51
+ static void OnHttpRequestDone(void* arg, grpc_error* error);
52
+
53
+ // Calls OnDone() if not already called. Releases a ref.
54
+ void MaybeCallOnDone(grpc_error* error);
55
+
56
+ // If error is not GRPC_ERROR_NONE, then it's not safe to look at response.
57
+ virtual void OnDone(GoogleCloud2ProdResolver* resolver,
58
+ const grpc_http_response* response,
59
+ grpc_error* error) = 0;
60
+
61
+ RefCountedPtr<GoogleCloud2ProdResolver> resolver_;
62
+ grpc_httpcli_context context_;
63
+ grpc_httpcli_response response_;
64
+ grpc_closure on_done_;
65
+ Atomic<bool> on_done_called_{false};
66
+ };
67
+
68
+ // A metadata server query to get the zone.
69
+ class ZoneQuery : public MetadataQuery {
70
+ public:
71
+ ZoneQuery(RefCountedPtr<GoogleCloud2ProdResolver> resolver,
72
+ grpc_polling_entity* pollent);
73
+
74
+ private:
75
+ void OnDone(GoogleCloud2ProdResolver* resolver,
76
+ const grpc_http_response* response, grpc_error* error) override;
77
+ };
78
+
79
+ // A metadata server query to get the IPv6 address.
80
+ class IPv6Query : public MetadataQuery {
81
+ public:
82
+ IPv6Query(RefCountedPtr<GoogleCloud2ProdResolver> resolver,
83
+ grpc_polling_entity* pollent);
84
+
85
+ private:
86
+ void OnDone(GoogleCloud2ProdResolver* resolver,
87
+ const grpc_http_response* response, grpc_error* error) override;
88
+ };
89
+
90
+ void ZoneQueryDone(std::string zone);
91
+ void IPv6QueryDone(bool ipv6_supported);
92
+ void StartXdsResolver();
93
+
94
+ std::shared_ptr<WorkSerializer> work_serializer_;
95
+ grpc_polling_entity pollent_;
96
+ bool using_dns_ = false;
97
+ OrphanablePtr<Resolver> child_resolver_;
98
+
99
+ OrphanablePtr<ZoneQuery> zone_query_;
100
+ absl::optional<std::string> zone_;
101
+
102
+ OrphanablePtr<IPv6Query> ipv6_query_;
103
+ absl::optional<bool> supports_ipv6_;
104
+ };
105
+
106
+ //
107
+ // GoogleCloud2ProdResolver::MetadataQuery
108
+ //
109
+
110
+ GoogleCloud2ProdResolver::MetadataQuery::MetadataQuery(
111
+ RefCountedPtr<GoogleCloud2ProdResolver> resolver, const char* path,
112
+ grpc_polling_entity* pollent)
113
+ : resolver_(std::move(resolver)) {
114
+ grpc_httpcli_context_init(&context_);
115
+ // Start HTTP request.
116
+ GRPC_CLOSURE_INIT(&on_done_, OnHttpRequestDone, this, nullptr);
117
+ Ref().release(); // Ref held by callback.
118
+ grpc_httpcli_request request;
119
+ memset(&request, 0, sizeof(grpc_httpcli_request));
120
+ grpc_http_header header = {const_cast<char*>("Metadata-Flavor"),
121
+ const_cast<char*>("Google")};
122
+ request.host = const_cast<char*>("metadata.google.internal");
123
+ request.http.path = const_cast<char*>(path);
124
+ request.http.hdr_count = 1;
125
+ request.http.hdrs = &header;
126
+ grpc_resource_quota* resource_quota =
127
+ grpc_resource_quota_create("c2p_resolver");
128
+ grpc_httpcli_get(&context_, pollent, resource_quota, &request,
129
+ ExecCtx::Get()->Now() + 10000, // 10s timeout
130
+ &on_done_, &response_);
131
+ grpc_resource_quota_unref_internal(resource_quota);
132
+ }
133
+
134
+ GoogleCloud2ProdResolver::MetadataQuery::~MetadataQuery() {
135
+ grpc_httpcli_context_destroy(&context_);
136
+ grpc_http_response_destroy(&response_);
137
+ }
138
+
139
+ void GoogleCloud2ProdResolver::MetadataQuery::Orphan() {
140
+ // TODO(roth): Once the HTTP client library supports cancellation,
141
+ // use that here.
142
+ MaybeCallOnDone(GRPC_ERROR_CANCELLED);
143
+ }
144
+
145
+ void GoogleCloud2ProdResolver::MetadataQuery::OnHttpRequestDone(
146
+ void* arg, grpc_error* error) {
147
+ auto* self = static_cast<MetadataQuery*>(arg);
148
+ self->MaybeCallOnDone(GRPC_ERROR_REF(error));
149
+ }
150
+
151
+ void GoogleCloud2ProdResolver::MetadataQuery::MaybeCallOnDone(
152
+ grpc_error* error) {
153
+ bool expected = false;
154
+ if (!on_done_called_.CompareExchangeStrong(
155
+ &expected, true, MemoryOrder::RELAXED, MemoryOrder::RELAXED)) {
156
+ // We've already called OnDone(), so just clean up.
157
+ GRPC_ERROR_UNREF(error);
158
+ Unref();
159
+ return;
160
+ }
161
+ // Hop back into WorkSerializer to call OnDone().
162
+ // Note: We implicitly pass our ref to the callback here.
163
+ resolver_->work_serializer_->Run(
164
+ [this, error]() {
165
+ OnDone(resolver_.get(), &response_, error);
166
+ Unref();
167
+ },
168
+ DEBUG_LOCATION);
169
+ }
170
+
171
+ //
172
+ // GoogleCloud2ProdResolver::ZoneQuery
173
+ //
174
+
175
+ GoogleCloud2ProdResolver::ZoneQuery::ZoneQuery(
176
+ RefCountedPtr<GoogleCloud2ProdResolver> resolver,
177
+ grpc_polling_entity* pollent)
178
+ : MetadataQuery(std::move(resolver), "/computeMetadata/v1/instance/zone",
179
+ pollent) {}
180
+
181
+ void GoogleCloud2ProdResolver::ZoneQuery::OnDone(
182
+ GoogleCloud2ProdResolver* resolver, const grpc_http_response* response,
183
+ grpc_error* error) {
184
+ if (error != GRPC_ERROR_NONE) {
185
+ gpr_log(GPR_ERROR, "error fetching zone from metadata server: %s",
186
+ grpc_error_string(error));
187
+ }
188
+ std::string zone;
189
+ if (error == GRPC_ERROR_NONE && response->status == 200) {
190
+ absl::string_view body(response->body, response->body_length);
191
+ size_t i = body.find_last_of('/');
192
+ if (i == body.npos) {
193
+ gpr_log(GPR_ERROR, "could not parse zone from metadata server: %s",
194
+ std::string(body).c_str());
195
+ } else {
196
+ zone = std::string(body.substr(i));
197
+ }
198
+ }
199
+ resolver->ZoneQueryDone(std::move(zone));
200
+ GRPC_ERROR_UNREF(error);
201
+ }
202
+
203
+ //
204
+ // GoogleCloud2ProdResolver::IPv6Query
205
+ //
206
+
207
+ GoogleCloud2ProdResolver::IPv6Query::IPv6Query(
208
+ RefCountedPtr<GoogleCloud2ProdResolver> resolver,
209
+ grpc_polling_entity* pollent)
210
+ : MetadataQuery(std::move(resolver),
211
+ "/computeMetadata/v1/instance/network-interfaces/0/ipv6s",
212
+ pollent) {}
213
+
214
+ void GoogleCloud2ProdResolver::IPv6Query::OnDone(
215
+ GoogleCloud2ProdResolver* resolver, const grpc_http_response* response,
216
+ grpc_error* error) {
217
+ if (error != GRPC_ERROR_NONE) {
218
+ gpr_log(GPR_ERROR, "error fetching IPv6 address from metadata server: %s",
219
+ grpc_error_string(error));
220
+ }
221
+ resolver->IPv6QueryDone(error == GRPC_ERROR_NONE && response->status == 200);
222
+ GRPC_ERROR_UNREF(error);
223
+ }
224
+
225
+ //
226
+ // GoogleCloud2ProdResolver
227
+ //
228
+
229
+ GoogleCloud2ProdResolver::GoogleCloud2ProdResolver(ResolverArgs args)
230
+ : work_serializer_(std::move(args.work_serializer)),
231
+ pollent_(grpc_polling_entity_create_from_pollset_set(args.pollset_set)) {
232
+ absl::string_view name_to_resolve = absl::StripPrefix(args.uri.path(), "/");
233
+ // If we're not running on GCP, we can't use DirectPath, so delegate
234
+ // to the DNS resolver.
235
+ if (!grpc_alts_is_running_on_gcp() ||
236
+ // If the client is already using xDS, we can't use it here, because
237
+ // they may be talking to a completely different xDS server than we
238
+ // want to.
239
+ // TODO(roth): When we implement xDS federation, remove this constraint.
240
+ UniquePtr<char>(gpr_getenv("GRPC_XDS_BOOTSTRAP")) != nullptr ||
241
+ UniquePtr<char>(gpr_getenv("GRPC_XDS_BOOTSTRAP_CONFIG")) != nullptr) {
242
+ using_dns_ = true;
243
+ child_resolver_ = ResolverRegistry::CreateResolver(
244
+ absl::StrCat("dns:", name_to_resolve).c_str(), args.args,
245
+ args.pollset_set, work_serializer_, std::move(args.result_handler));
246
+ GPR_ASSERT(child_resolver_ != nullptr);
247
+ return;
248
+ }
249
+ // Create xds resolver.
250
+ child_resolver_ = ResolverRegistry::CreateResolver(
251
+ absl::StrCat("xds:", name_to_resolve).c_str(), args.args,
252
+ args.pollset_set, work_serializer_, std::move(args.result_handler));
253
+ GPR_ASSERT(child_resolver_ != nullptr);
254
+ }
255
+
256
+ void GoogleCloud2ProdResolver::StartLocked() {
257
+ if (using_dns_) {
258
+ child_resolver_->StartLocked();
259
+ return;
260
+ }
261
+ // Using xDS. Start metadata server queries.
262
+ zone_query_ = MakeOrphanable<ZoneQuery>(Ref(), &pollent_);
263
+ ipv6_query_ = MakeOrphanable<IPv6Query>(Ref(), &pollent_);
264
+ }
265
+
266
+ void GoogleCloud2ProdResolver::RequestReresolutionLocked() {
267
+ if (child_resolver_ != nullptr) {
268
+ child_resolver_->RequestReresolutionLocked();
269
+ }
270
+ }
271
+
272
+ void GoogleCloud2ProdResolver::ResetBackoffLocked() {
273
+ if (child_resolver_ != nullptr) {
274
+ child_resolver_->ResetBackoffLocked();
275
+ }
276
+ }
277
+
278
+ void GoogleCloud2ProdResolver::ShutdownLocked() {
279
+ zone_query_.reset();
280
+ ipv6_query_.reset();
281
+ child_resolver_.reset();
282
+ }
283
+
284
+ void GoogleCloud2ProdResolver::ZoneQueryDone(std::string zone) {
285
+ zone_query_.reset();
286
+ zone_ = std::move(zone);
287
+ if (supports_ipv6_.has_value()) StartXdsResolver();
288
+ }
289
+
290
+ void GoogleCloud2ProdResolver::IPv6QueryDone(bool ipv6_supported) {
291
+ ipv6_query_.reset();
292
+ supports_ipv6_ = ipv6_supported;
293
+ if (zone_.has_value()) StartXdsResolver();
294
+ }
295
+
296
+ void GoogleCloud2ProdResolver::StartXdsResolver() {
297
+ // Construct bootstrap JSON.
298
+ Json::Object node = {
299
+ {"id", "C2P"},
300
+ };
301
+ if (!zone_->empty()) {
302
+ node["locality"] = Json::Object{
303
+ {"zone", *zone_},
304
+ };
305
+ };
306
+ if (*supports_ipv6_) {
307
+ node["metadata"] = Json::Object{
308
+ {"TRAFFICDIRECTOR_DIRECTPATH_C2P_IPV6_CAPABLE", true},
309
+ };
310
+ }
311
+ // Allow the TD server uri to be overridden for testing purposes.
312
+ UniquePtr<char> override_server(
313
+ gpr_getenv("GRPC_TEST_ONLY_GOOGLE_C2P_RESOLVER_TRAFFIC_DIRECTOR_URI"));
314
+ const char* server_uri =
315
+ override_server != nullptr && strlen(override_server.get()) > 0
316
+ ? override_server.get()
317
+ : "directpath-trafficdirector.googleapis.com";
318
+ Json bootstrap = Json::Object{
319
+ {"xds_servers",
320
+ Json::Array{
321
+ Json::Object{
322
+ {"server_uri", server_uri},
323
+ {"channel_creds",
324
+ Json::Array{
325
+ Json::Object{
326
+ {"type", "google_default"},
327
+ },
328
+ }},
329
+ {"server_features", Json::Array{"xds_v3"}},
330
+ },
331
+ }},
332
+ {"node", std::move(node)},
333
+ };
334
+ // Inject bootstrap JSON as fallback config.
335
+ internal::SetXdsFallbackBootstrapConfig(bootstrap.Dump().c_str());
336
+ // Now start xDS resolver.
337
+ child_resolver_->StartLocked();
338
+ }
339
+
340
+ //
341
+ // Factory
342
+ //
343
+
344
+ class GoogleCloud2ProdResolverFactory : public ResolverFactory {
345
+ public:
346
+ bool IsValidUri(const URI& uri) const override {
347
+ if (GPR_UNLIKELY(!uri.authority().empty())) {
348
+ gpr_log(GPR_ERROR, "google-c2p URI scheme does not support authorities");
349
+ return false;
350
+ }
351
+ return true;
352
+ }
353
+
354
+ OrphanablePtr<Resolver> CreateResolver(ResolverArgs args) const override {
355
+ if (!IsValidUri(args.uri)) return nullptr;
356
+ return MakeOrphanable<GoogleCloud2ProdResolver>(std::move(args));
357
+ }
358
+
359
+ const char* scheme() const override { return "google-c2p"; }
360
+ };
361
+
362
+ } // namespace
363
+
364
+ void GoogleCloud2ProdResolverInit() {
365
+ // TODO(roth): Remove env var protection once this code is proven stable.
366
+ UniquePtr<char> value(gpr_getenv("GRPC_EXPERIMENTAL_GOOGLE_C2P_RESOLVER"));
367
+ bool parsed_value;
368
+ bool parse_succeeded = gpr_parse_bool_value(value.get(), &parsed_value);
369
+ if (parse_succeeded && parsed_value) {
370
+ ResolverRegistry::Builder::RegisterResolverFactory(
371
+ absl::make_unique<GoogleCloud2ProdResolverFactory>());
372
+ }
373
+ }
374
+
375
+ void GoogleCloud2ProdResolverShutdown() {}
376
+
377
+ } // namespace grpc_core