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
@@ -35,7 +35,6 @@
35
35
  #include "src/core/lib/iomgr/parse_address.h"
36
36
  #include "src/core/lib/iomgr/resolve_address.h"
37
37
  #include "src/core/lib/iomgr/unix_sockets_posix.h"
38
- #include "src/core/lib/iomgr/work_serializer.h"
39
38
  #include "src/core/lib/slice/slice_internal.h"
40
39
  #include "src/core/lib/slice/slice_string_helpers.h"
41
40
 
@@ -53,13 +52,14 @@ class SockaddrResolver : public Resolver {
53
52
  void ShutdownLocked() override {}
54
53
 
55
54
  private:
55
+ std::unique_ptr<ResultHandler> result_handler_;
56
56
  ServerAddressList addresses_;
57
57
  const grpc_channel_args* channel_args_ = nullptr;
58
58
  };
59
59
 
60
60
  SockaddrResolver::SockaddrResolver(ServerAddressList addresses,
61
61
  ResolverArgs args)
62
- : Resolver(std::move(args.work_serializer), std::move(args.result_handler)),
62
+ : result_handler_(std::move(args.result_handler)),
63
63
  addresses_(std::move(addresses)),
64
64
  channel_args_(grpc_channel_args_copy(args.args)) {}
65
65
 
@@ -73,7 +73,7 @@ void SockaddrResolver::StartLocked() {
73
73
  // TODO(roth): Use std::move() once channel args is converted to C++.
74
74
  result.args = channel_args_;
75
75
  channel_args_ = nullptr;
76
- result_handler()->ReturnResult(std::move(result));
76
+ result_handler_->ReturnResult(std::move(result));
77
77
  }
78
78
 
79
79
  //
@@ -150,7 +150,7 @@ class UnixResolverFactory : public ResolverFactory {
150
150
  return CreateSockaddrResolver(std::move(args), grpc_parse_unix);
151
151
  }
152
152
 
153
- std::string GetDefaultAuthority(const URI& uri) const override {
153
+ std::string GetDefaultAuthority(const URI& /*uri*/) const override {
154
154
  return "localhost";
155
155
  }
156
156
 
@@ -22,13 +22,18 @@
22
22
  #include "absl/strings/str_join.h"
23
23
  #include "absl/strings/str_split.h"
24
24
  #include "re2/re2.h"
25
+ #define XXH_INLINE_ALL
26
+ #include "xxhash.h"
25
27
 
26
28
  #include "src/core/ext/filters/client_channel/config_selector.h"
29
+ #include "src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h"
27
30
  #include "src/core/ext/filters/client_channel/resolver_registry.h"
28
31
  #include "src/core/ext/xds/xds_client.h"
32
+ #include "src/core/ext/xds/xds_http_filters.h"
29
33
  #include "src/core/lib/channel/channel_args.h"
30
34
  #include "src/core/lib/iomgr/closure.h"
31
35
  #include "src/core/lib/iomgr/exec_ctx.h"
36
+ #include "src/core/lib/surface/lame_client.h"
32
37
  #include "src/core/lib/transport/timeout_encoding.h"
33
38
 
34
39
  namespace grpc_core {
@@ -46,8 +51,8 @@ namespace {
46
51
  class XdsResolver : public Resolver {
47
52
  public:
48
53
  explicit XdsResolver(ResolverArgs args)
49
- : Resolver(std::move(args.work_serializer),
50
- std::move(args.result_handler)),
54
+ : work_serializer_(std::move(args.work_serializer)),
55
+ result_handler_(std::move(args.result_handler)),
51
56
  server_name_(absl::StripPrefix(args.uri.path(), "/")),
52
57
  args_(grpc_channel_args_copy(args.args)),
53
58
  interested_parties_(args.pollset_set) {
@@ -135,9 +140,7 @@ class XdsResolver : public Resolver {
135
140
 
136
141
  class XdsConfigSelector : public ConfigSelector {
137
142
  public:
138
- XdsConfigSelector(RefCountedPtr<XdsResolver> resolver,
139
- const std::vector<XdsApi::Route>& routes,
140
- grpc_error* error);
143
+ XdsConfigSelector(RefCountedPtr<XdsResolver> resolver, grpc_error** error);
141
144
  ~XdsConfigSelector() override;
142
145
 
143
146
  const char* name() const override { return "XdsConfigSelector"; }
@@ -151,26 +154,41 @@ class XdsResolver : public Resolver {
151
154
 
152
155
  CallConfig GetCallConfig(GetCallConfigArgs args) override;
153
156
 
157
+ std::vector<const grpc_channel_filter*> GetFilters() override {
158
+ return filters_;
159
+ }
160
+
161
+ grpc_channel_args* ModifyChannelArgs(grpc_channel_args* args) override;
162
+
154
163
  private:
155
164
  struct Route {
165
+ struct ClusterWeightState {
166
+ uint32_t range_end;
167
+ absl::string_view cluster;
168
+ RefCountedPtr<ServiceConfig> method_config;
169
+
170
+ bool operator==(const ClusterWeightState& other) const;
171
+ };
172
+
156
173
  XdsApi::Route route;
157
- absl::InlinedVector<std::pair<uint32_t, absl::string_view>, 2>
158
- weighted_cluster_state;
159
174
  RefCountedPtr<ServiceConfig> method_config;
160
- bool operator==(const Route& other) const {
161
- return route == other.route &&
162
- weighted_cluster_state == other.weighted_cluster_state;
163
- }
175
+ absl::InlinedVector<ClusterWeightState, 2> weighted_cluster_state;
176
+
177
+ bool operator==(const Route& other) const;
164
178
  };
165
179
  using RouteTable = std::vector<Route>;
166
180
 
167
181
  void MaybeAddCluster(const std::string& name);
168
- grpc_error* CreateMethodConfig(RefCountedPtr<ServiceConfig>* method_config,
169
- const XdsApi::Route& route);
182
+ grpc_error* CreateMethodConfig(
183
+ const XdsApi::Route& route,
184
+ const XdsApi::Route::ClusterWeight* cluster_weight,
185
+ RefCountedPtr<ServiceConfig>* method_config);
170
186
 
171
187
  RefCountedPtr<XdsResolver> resolver_;
172
188
  RouteTable route_table_;
173
189
  std::map<absl::string_view, RefCountedPtr<ClusterState>> clusters_;
190
+ std::vector<const grpc_channel_filter*> filters_;
191
+ grpc_error* filter_error_ = GRPC_ERROR_NONE;
174
192
  };
175
193
 
176
194
  void OnListenerUpdate(XdsApi::LdsUpdate listener);
@@ -182,16 +200,25 @@ class XdsResolver : public Resolver {
182
200
  void GenerateResult();
183
201
  void MaybeRemoveUnusedClusters();
184
202
 
203
+ std::shared_ptr<WorkSerializer> work_serializer_;
204
+ std::unique_ptr<ResultHandler> result_handler_;
185
205
  std::string server_name_;
186
206
  const grpc_channel_args* args_;
187
207
  grpc_pollset_set* interested_parties_;
208
+
188
209
  RefCountedPtr<XdsClient> xds_client_;
210
+
189
211
  XdsClient::ListenerWatcherInterface* listener_watcher_ = nullptr;
212
+ // This will not contain the RouteConfiguration, even if it comes with the
213
+ // LDS response; instead, the relevant VirtualHost from the
214
+ // RouteConfiguration will be saved in current_virtual_host_.
215
+ XdsApi::LdsUpdate current_listener_;
216
+
190
217
  std::string route_config_name_;
191
218
  XdsClient::RouteConfigWatcherInterface* route_config_watcher_ = nullptr;
219
+ XdsApi::RdsUpdate::VirtualHost current_virtual_host_;
220
+
192
221
  ClusterState::ClusterStateMap cluster_state_map_;
193
- std::vector<XdsApi::Route> current_update_;
194
- XdsApi::Duration http_max_stream_duration_;
195
222
  };
196
223
 
197
224
  //
@@ -210,7 +237,7 @@ XdsResolver::Notifier::Notifier(RefCountedPtr<XdsResolver> resolver,
210
237
  XdsResolver::Notifier::Notifier(RefCountedPtr<XdsResolver> resolver,
211
238
  XdsApi::RdsUpdate update)
212
239
  : resolver_(std::move(resolver)), type_(kRdsUpdate) {
213
- update_.rds_update = std::move(update);
240
+ update_.http_connection_manager.rds_update = std::move(update);
214
241
  GRPC_CLOSURE_INIT(&closure_, &RunInExecCtx, this, nullptr);
215
242
  ExecCtx::Run(DEBUG_LOCATION, &closure_, GRPC_ERROR_NONE);
216
243
  }
@@ -231,7 +258,7 @@ XdsResolver::Notifier::Notifier(RefCountedPtr<XdsResolver> resolver)
231
258
  void XdsResolver::Notifier::RunInExecCtx(void* arg, grpc_error* error) {
232
259
  Notifier* self = static_cast<Notifier*>(arg);
233
260
  GRPC_ERROR_REF(error);
234
- self->resolver_->work_serializer()->Run(
261
+ self->resolver_->work_serializer_->Run(
235
262
  [self, error]() { self->RunInWorkSerializer(error); }, DEBUG_LOCATION);
236
263
  }
237
264
 
@@ -246,7 +273,8 @@ void XdsResolver::Notifier::RunInWorkSerializer(grpc_error* error) {
246
273
  resolver_->OnListenerUpdate(std::move(update_));
247
274
  break;
248
275
  case kRdsUpdate:
249
- resolver_->OnRouteConfigUpdate(std::move(*update_.rds_update));
276
+ resolver_->OnRouteConfigUpdate(
277
+ std::move(*update_.http_connection_manager.rds_update));
250
278
  break;
251
279
  case kError:
252
280
  resolver_->OnError(error);
@@ -258,13 +286,35 @@ void XdsResolver::Notifier::RunInWorkSerializer(grpc_error* error) {
258
286
  delete this;
259
287
  }
260
288
 
289
+ //
290
+ // XdsResolver::XdsConfigSelector::Route
291
+ //
292
+
293
+ bool MethodConfigsEqual(const ServiceConfig* sc1, const ServiceConfig* sc2) {
294
+ if (sc1 == nullptr) return sc2 == nullptr;
295
+ if (sc2 == nullptr) return false;
296
+ return sc1->json_string() == sc2->json_string();
297
+ }
298
+
299
+ bool XdsResolver::XdsConfigSelector::Route::ClusterWeightState::operator==(
300
+ const ClusterWeightState& other) const {
301
+ return range_end == other.range_end && cluster == other.cluster &&
302
+ MethodConfigsEqual(method_config.get(), other.method_config.get());
303
+ }
304
+
305
+ bool XdsResolver::XdsConfigSelector::Route::operator==(
306
+ const Route& other) const {
307
+ return route == other.route &&
308
+ weighted_cluster_state == other.weighted_cluster_state &&
309
+ MethodConfigsEqual(method_config.get(), other.method_config.get());
310
+ }
311
+
261
312
  //
262
313
  // XdsResolver::XdsConfigSelector
263
314
  //
264
315
 
265
316
  XdsResolver::XdsConfigSelector::XdsConfigSelector(
266
- RefCountedPtr<XdsResolver> resolver,
267
- const std::vector<XdsApi::Route>& routes, grpc_error* error)
317
+ RefCountedPtr<XdsResolver> resolver, grpc_error** error)
268
318
  : resolver_(std::move(resolver)) {
269
319
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
270
320
  gpr_log(GPR_INFO, "[xds_resolver %p] creating XdsConfigSelector %p",
@@ -279,8 +329,8 @@ XdsResolver::XdsConfigSelector::XdsConfigSelector(
279
329
  // weighted_cluster_state field points to the memory in the route field, so
280
330
  // moving the entry in a reallocation will cause the string_view to point to
281
331
  // invalid data.
282
- route_table_.reserve(routes.size());
283
- for (auto& route : routes) {
332
+ route_table_.reserve(resolver_->current_virtual_host_.routes.size());
333
+ for (auto& route : resolver_->current_virtual_host_.routes) {
284
334
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
285
335
  gpr_log(GPR_INFO, "[xds_resolver %p] XdsConfigSelector %p: route: %s",
286
336
  resolver_.get(), this, route.ToString().c_str());
@@ -292,27 +342,95 @@ XdsResolver::XdsConfigSelector::XdsConfigSelector(
292
342
  // one.
293
343
  if (!route.max_stream_duration.has_value()) {
294
344
  route_entry.route.max_stream_duration =
295
- resolver_->http_max_stream_duration_;
345
+ resolver_->current_listener_.http_connection_manager
346
+ .http_max_stream_duration;
296
347
  }
297
- error = CreateMethodConfig(&route_entry.method_config, route_entry.route);
298
348
  if (route.weighted_clusters.empty()) {
349
+ *error = CreateMethodConfig(route_entry.route, nullptr,
350
+ &route_entry.method_config);
299
351
  MaybeAddCluster(route.cluster_name);
300
352
  } else {
301
353
  uint32_t end = 0;
302
354
  for (const auto& weighted_cluster : route_entry.route.weighted_clusters) {
303
- MaybeAddCluster(weighted_cluster.name);
355
+ Route::ClusterWeightState cluster_weight_state;
356
+ *error = CreateMethodConfig(route_entry.route, &weighted_cluster,
357
+ &cluster_weight_state.method_config);
358
+ if (*error != GRPC_ERROR_NONE) return;
304
359
  end += weighted_cluster.weight;
305
- route_entry.weighted_cluster_state.emplace_back(end,
306
- weighted_cluster.name);
360
+ cluster_weight_state.range_end = end;
361
+ cluster_weight_state.cluster = weighted_cluster.name;
362
+ route_entry.weighted_cluster_state.push_back(
363
+ std::move(cluster_weight_state));
364
+ MaybeAddCluster(weighted_cluster.name);
307
365
  }
308
366
  }
309
367
  }
368
+ // Populate filter list.
369
+ bool found_router = false;
370
+ for (const auto& http_filter :
371
+ resolver_->current_listener_.http_connection_manager.http_filters) {
372
+ // Stop at the router filter. It's a no-op for us, and we ignore
373
+ // anything that may come after it, for compatibility with Envoy.
374
+ if (http_filter.config.config_proto_type_name ==
375
+ kXdsHttpRouterFilterConfigName) {
376
+ found_router = true;
377
+ break;
378
+ }
379
+ // Find filter. This is guaranteed to succeed, because it's checked
380
+ // at config validation time in the XdsApi code.
381
+ const XdsHttpFilterImpl* filter_impl =
382
+ XdsHttpFilterRegistry::GetFilterForType(
383
+ http_filter.config.config_proto_type_name);
384
+ GPR_ASSERT(filter_impl != nullptr);
385
+ // Add C-core filter to list.
386
+ filters_.push_back(filter_impl->channel_filter());
387
+ }
388
+ // For compatibility with Envoy, if the router filter is not
389
+ // configured, we fail all RPCs.
390
+ if (!found_router) {
391
+ filter_error_ =
392
+ grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
393
+ "no xDS HTTP router filter configured"),
394
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
395
+ filters_.push_back(&grpc_lame_filter);
396
+ }
397
+ }
398
+
399
+ XdsResolver::XdsConfigSelector::~XdsConfigSelector() {
400
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
401
+ gpr_log(GPR_INFO, "[xds_resolver %p] destroying XdsConfigSelector %p",
402
+ resolver_.get(), this);
403
+ }
404
+ clusters_.clear();
405
+ resolver_->MaybeRemoveUnusedClusters();
406
+ GRPC_ERROR_UNREF(filter_error_);
407
+ }
408
+
409
+ const XdsHttpFilterImpl::FilterConfig* FindFilterConfigOverride(
410
+ const std::string& instance_name,
411
+ const XdsApi::RdsUpdate::VirtualHost& vhost, const XdsApi::Route& route,
412
+ const XdsApi::Route::ClusterWeight* cluster_weight) {
413
+ // Check ClusterWeight, if any.
414
+ if (cluster_weight != nullptr) {
415
+ auto it = cluster_weight->typed_per_filter_config.find(instance_name);
416
+ if (it != cluster_weight->typed_per_filter_config.end()) return &it->second;
417
+ }
418
+ // Check Route.
419
+ auto it = route.typed_per_filter_config.find(instance_name);
420
+ if (it != route.typed_per_filter_config.end()) return &it->second;
421
+ // Check VirtualHost.
422
+ it = vhost.typed_per_filter_config.find(instance_name);
423
+ if (it != vhost.typed_per_filter_config.end()) return &it->second;
424
+ // Not found.
425
+ return nullptr;
310
426
  }
311
427
 
312
428
  grpc_error* XdsResolver::XdsConfigSelector::CreateMethodConfig(
313
- RefCountedPtr<ServiceConfig>* method_config, const XdsApi::Route& route) {
314
- grpc_error* error = GRPC_ERROR_NONE;
429
+ const XdsApi::Route& route,
430
+ const XdsApi::Route::ClusterWeight* cluster_weight,
431
+ RefCountedPtr<ServiceConfig>* method_config) {
315
432
  std::vector<std::string> fields;
433
+ // Set timeout.
316
434
  if (route.max_stream_duration.has_value() &&
317
435
  (route.max_stream_duration->seconds != 0 ||
318
436
  route.max_stream_duration->nanos != 0)) {
@@ -320,6 +438,51 @@ grpc_error* XdsResolver::XdsConfigSelector::CreateMethodConfig(
320
438
  route.max_stream_duration->seconds,
321
439
  route.max_stream_duration->nanos));
322
440
  }
441
+ // Handle xDS HTTP filters.
442
+ std::map<std::string, std::vector<std::string>> per_filter_configs;
443
+ grpc_channel_args* args = grpc_channel_args_copy(resolver_->args_);
444
+ for (const auto& http_filter :
445
+ resolver_->current_listener_.http_connection_manager.http_filters) {
446
+ // Stop at the router filter. It's a no-op for us, and we ignore
447
+ // anything that may come after it, for compatibility with Envoy.
448
+ if (http_filter.config.config_proto_type_name ==
449
+ kXdsHttpRouterFilterConfigName) {
450
+ break;
451
+ }
452
+ // Find filter. This is guaranteed to succeed, because it's checked
453
+ // at config validation time in the XdsApi code.
454
+ const XdsHttpFilterImpl* filter_impl =
455
+ XdsHttpFilterRegistry::GetFilterForType(
456
+ http_filter.config.config_proto_type_name);
457
+ GPR_ASSERT(filter_impl != nullptr);
458
+ // Allow filter to add channel args that may affect service config
459
+ // parsing.
460
+ args = filter_impl->ModifyChannelArgs(args);
461
+ // Find config override, if any.
462
+ const XdsHttpFilterImpl::FilterConfig* config_override =
463
+ FindFilterConfigOverride(http_filter.name,
464
+ resolver_->current_virtual_host_, route,
465
+ cluster_weight);
466
+ // Generate service config for filter.
467
+ auto method_config_field =
468
+ filter_impl->GenerateServiceConfig(http_filter.config, config_override);
469
+ if (!method_config_field.ok()) {
470
+ return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
471
+ absl::StrCat("failed to generate method config for HTTP filter ",
472
+ http_filter.name, ": ",
473
+ method_config_field.status().ToString())
474
+ .c_str());
475
+ }
476
+ per_filter_configs[method_config_field->service_config_field_name]
477
+ .push_back(method_config_field->element);
478
+ }
479
+ for (const auto& p : per_filter_configs) {
480
+ fields.emplace_back(absl::StrCat(" \"", p.first, "\": [\n",
481
+ absl::StrJoin(p.second, ",\n"),
482
+ "\n ]"));
483
+ }
484
+ // Construct service config.
485
+ grpc_error* error = GRPC_ERROR_NONE;
323
486
  if (!fields.empty()) {
324
487
  std::string json = absl::StrCat(
325
488
  "{\n"
@@ -331,19 +494,20 @@ grpc_error* XdsResolver::XdsConfigSelector::CreateMethodConfig(
331
494
  absl::StrJoin(fields, ",\n"),
332
495
  "\n } ]\n"
333
496
  "}");
334
- *method_config =
335
- ServiceConfig::Create(resolver_->args_, json.c_str(), &error);
497
+ *method_config = ServiceConfig::Create(args, json.c_str(), &error);
336
498
  }
499
+ grpc_channel_args_destroy(args);
337
500
  return error;
338
501
  }
339
502
 
340
- XdsResolver::XdsConfigSelector::~XdsConfigSelector() {
341
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
342
- gpr_log(GPR_INFO, "[xds_resolver %p] destroying XdsConfigSelector %p",
343
- resolver_.get(), this);
344
- }
345
- clusters_.clear();
346
- resolver_->MaybeRemoveUnusedClusters();
503
+ grpc_channel_args* XdsResolver::XdsConfigSelector::ModifyChannelArgs(
504
+ grpc_channel_args* args) {
505
+ if (filter_error_ == GRPC_ERROR_NONE) return args;
506
+ grpc_arg error_arg = MakeLameClientErrorArg(filter_error_);
507
+ grpc_channel_args* new_args =
508
+ grpc_channel_args_copy_and_add(args, &error_arg, 1);
509
+ grpc_channel_args_destroy(args);
510
+ return new_args;
347
511
  }
348
512
 
349
513
  void XdsResolver::XdsConfigSelector::MaybeAddCluster(const std::string& name) {
@@ -359,108 +523,50 @@ void XdsResolver::XdsConfigSelector::MaybeAddCluster(const std::string& name) {
359
523
  }
360
524
  }
361
525
 
362
- bool PathMatch(const absl::string_view& path,
363
- const XdsApi::Route::Matchers::PathMatcher& path_matcher) {
364
- switch (path_matcher.type) {
365
- case XdsApi::Route::Matchers::PathMatcher::PathMatcherType::PREFIX:
366
- return path_matcher.case_sensitive
367
- ? absl::StartsWith(path, path_matcher.string_matcher)
368
- : absl::StartsWithIgnoreCase(path,
369
- path_matcher.string_matcher);
370
- case XdsApi::Route::Matchers::PathMatcher::PathMatcherType::PATH:
371
- return path_matcher.case_sensitive
372
- ? path == path_matcher.string_matcher
373
- : absl::EqualsIgnoreCase(path, path_matcher.string_matcher);
374
- case XdsApi::Route::Matchers::PathMatcher::PathMatcherType::REGEX:
375
- // Note: Case-sensitive option will already have been set appropriately
376
- // in path_matcher.regex_matcher when it was constructed, so no
377
- // need to check it here.
378
- return RE2::FullMatch(path.data(), *path_matcher.regex_matcher);
379
- default:
380
- return false;
381
- }
382
- }
383
-
384
- absl::optional<absl::string_view> GetMetadataValue(
385
- const std::string& target_key, grpc_metadata_batch* initial_metadata,
526
+ absl::optional<absl::string_view> GetHeaderValue(
527
+ grpc_metadata_batch* initial_metadata, absl::string_view header_name,
386
528
  std::string* concatenated_value) {
387
- // Find all values for the specified key.
388
- GPR_DEBUG_ASSERT(initial_metadata != nullptr);
389
- absl::InlinedVector<absl::string_view, 1> values;
390
- for (grpc_linked_mdelem* md = initial_metadata->list.head; md != nullptr;
391
- md = md->next) {
392
- absl::string_view key = StringViewFromSlice(GRPC_MDKEY(md->md));
393
- absl::string_view value = StringViewFromSlice(GRPC_MDVALUE(md->md));
394
- if (target_key == key) values.push_back(value);
395
- }
396
- // If none found, no match.
397
- if (values.empty()) return absl::nullopt;
398
- // If exactly one found, return it as-is.
399
- if (values.size() == 1) return values.front();
400
- // If more than one found, concatenate the values, using
401
- // *concatenated_values as a temporary holding place for the
402
- // concatenated string.
403
- *concatenated_value = absl::StrJoin(values, ",");
404
- return *concatenated_value;
405
- }
406
-
407
- bool HeaderMatchHelper(
408
- const XdsApi::Route::Matchers::HeaderMatcher& header_matcher,
409
- grpc_metadata_batch* initial_metadata) {
410
- std::string concatenated_value;
411
- absl::optional<absl::string_view> value;
412
529
  // Note: If we ever allow binary headers here, we still need to
413
530
  // special-case ignore "grpc-tags-bin" and "grpc-trace-bin", since
414
531
  // they are not visible to the LB policy in grpc-go.
415
- if (absl::EndsWith(header_matcher.name, "-bin") ||
416
- header_matcher.name == "grpc-previous-rpc-attempts") {
417
- value = absl::nullopt;
418
- } else if (header_matcher.name == "content-type") {
419
- value = "application/grpc";
420
- } else {
421
- value = GetMetadataValue(header_matcher.name, initial_metadata,
422
- &concatenated_value);
532
+ if (absl::EndsWith(header_name, "-bin")) {
533
+ return absl::nullopt;
534
+ } else if (header_name == "content-type") {
535
+ return "application/grpc";
423
536
  }
424
- if (!value.has_value()) {
425
- if (header_matcher.type ==
426
- XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::PRESENT) {
427
- return !header_matcher.present_match;
428
- } else {
429
- // For all other header matcher types, we need the header value to
430
- // exist to consider matches.
537
+ return grpc_metadata_batch_get_value(initial_metadata, header_name,
538
+ concatenated_value);
539
+ }
540
+
541
+ bool HeadersMatch(const std::vector<HeaderMatcher>& header_matchers,
542
+ grpc_metadata_batch* initial_metadata) {
543
+ for (const auto& header_matcher : header_matchers) {
544
+ std::string concatenated_value;
545
+ if (!header_matcher.Match(GetHeaderValue(
546
+ initial_metadata, header_matcher.name(), &concatenated_value))) {
431
547
  return false;
432
548
  }
433
549
  }
434
- switch (header_matcher.type) {
435
- case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::EXACT:
436
- return value.value() == header_matcher.string_matcher;
437
- case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::REGEX:
438
- return RE2::FullMatch(value.value().data(), *header_matcher.regex_match);
439
- case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::RANGE:
440
- int64_t int_value;
441
- if (!absl::SimpleAtoi(value.value(), &int_value)) {
442
- return false;
443
- }
444
- return int_value >= header_matcher.range_start &&
445
- int_value < header_matcher.range_end;
446
- case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::PREFIX:
447
- return absl::StartsWith(value.value(), header_matcher.string_matcher);
448
- case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::SUFFIX:
449
- return absl::EndsWith(value.value(), header_matcher.string_matcher);
450
- default:
451
- return false;
452
- }
550
+ return true;
453
551
  }
454
552
 
455
- bool HeadersMatch(
456
- const std::vector<XdsApi::Route::Matchers::HeaderMatcher>& header_matchers,
553
+ absl::optional<uint64_t> HeaderHashHelper(
554
+ const XdsApi::Route::HashPolicy& policy,
457
555
  grpc_metadata_batch* initial_metadata) {
458
- for (const auto& header_matcher : header_matchers) {
459
- bool match = HeaderMatchHelper(header_matcher, initial_metadata);
460
- if (header_matcher.invert_match) match = !match;
461
- if (!match) return false;
556
+ GPR_ASSERT(policy.type == XdsApi::Route::HashPolicy::HEADER);
557
+ std::string value_buffer;
558
+ absl::optional<absl::string_view> header_value =
559
+ GetHeaderValue(initial_metadata, policy.header_name, &value_buffer);
560
+ if (policy.regex != nullptr) {
561
+ // If GetHeaderValue() did not already store the value in
562
+ // value_buffer, copy it there now, so we can modify it.
563
+ if (header_value->data() != value_buffer.data()) {
564
+ value_buffer = std::string(*header_value);
565
+ }
566
+ RE2::GlobalReplace(&value_buffer, *policy.regex, policy.regex_substitution);
567
+ header_value = value_buffer;
462
568
  }
463
- return true;
569
+ return XXH64(header_value->data(), header_value->size(), 0);
464
570
  }
465
571
 
466
572
  bool UnderFraction(const uint32_t fraction_per_million) {
@@ -473,8 +579,8 @@ ConfigSelector::CallConfig XdsResolver::XdsConfigSelector::GetCallConfig(
473
579
  GetCallConfigArgs args) {
474
580
  for (const auto& entry : route_table_) {
475
581
  // Path matching.
476
- if (!PathMatch(StringViewFromSlice(*args.path),
477
- entry.route.matchers.path_matcher)) {
582
+ if (!entry.route.matchers.path_matcher.Match(
583
+ StringViewFromSlice(*args.path))) {
478
584
  continue;
479
585
  }
480
586
  // Header Matching.
@@ -489,13 +595,15 @@ ConfigSelector::CallConfig XdsResolver::XdsConfigSelector::GetCallConfig(
489
595
  }
490
596
  // Found a route match
491
597
  absl::string_view cluster_name;
598
+ RefCountedPtr<ServiceConfig> method_config;
492
599
  if (entry.route.weighted_clusters.empty()) {
493
600
  cluster_name = entry.route.cluster_name;
601
+ method_config = entry.method_config;
494
602
  } else {
495
603
  const uint32_t key =
496
604
  rand() %
497
605
  entry.weighted_cluster_state[entry.weighted_cluster_state.size() - 1]
498
- .first;
606
+ .range_end;
499
607
  // Find the index in weighted clusters corresponding to key.
500
608
  size_t mid = 0;
501
609
  size_t start_index = 0;
@@ -503,9 +611,9 @@ ConfigSelector::CallConfig XdsResolver::XdsConfigSelector::GetCallConfig(
503
611
  size_t index = 0;
504
612
  while (end_index > start_index) {
505
613
  mid = (start_index + end_index) / 2;
506
- if (entry.weighted_cluster_state[mid].first > key) {
614
+ if (entry.weighted_cluster_state[mid].range_end > key) {
507
615
  end_index = mid;
508
- } else if (entry.weighted_cluster_state[mid].first < key) {
616
+ } else if (entry.weighted_cluster_state[mid].range_end < key) {
509
617
  start_index = mid + 1;
510
618
  } else {
511
619
  index = mid + 1;
@@ -513,21 +621,56 @@ ConfigSelector::CallConfig XdsResolver::XdsConfigSelector::GetCallConfig(
513
621
  }
514
622
  }
515
623
  if (index == 0) index = start_index;
516
- GPR_ASSERT(entry.weighted_cluster_state[index].first > key);
517
- cluster_name = entry.weighted_cluster_state[index].second;
624
+ GPR_ASSERT(entry.weighted_cluster_state[index].range_end > key);
625
+ cluster_name = entry.weighted_cluster_state[index].cluster;
626
+ method_config = entry.weighted_cluster_state[index].method_config;
518
627
  }
519
628
  auto it = clusters_.find(cluster_name);
520
629
  GPR_ASSERT(it != clusters_.end());
521
630
  XdsResolver* resolver =
522
631
  static_cast<XdsResolver*>(resolver_->Ref().release());
523
632
  ClusterState* cluster_state = it->second->Ref().release();
633
+ // Generate a hash
634
+ absl::optional<uint64_t> hash;
635
+ for (const auto& hash_policy : entry.route.hash_policies) {
636
+ absl::optional<uint64_t> new_hash;
637
+ switch (hash_policy.type) {
638
+ case XdsApi::Route::HashPolicy::HEADER:
639
+ new_hash = HeaderHashHelper(hash_policy, args.initial_metadata);
640
+ break;
641
+ case XdsApi::Route::HashPolicy::CHANNEL_ID:
642
+ new_hash =
643
+ static_cast<uint64_t>(reinterpret_cast<uintptr_t>(resolver));
644
+ break;
645
+ default:
646
+ GPR_ASSERT(0);
647
+ }
648
+ if (new_hash.has_value()) {
649
+ // Rotating the old value prevents duplicate hash rules from cancelling
650
+ // each other out and preserves all of the entropy
651
+ const uint64_t old_value =
652
+ hash.has_value() ? ((hash.value() << 1) | (hash.value() >> 63)) : 0;
653
+ hash = old_value ^ new_hash.value();
654
+ }
655
+ // If the policy is a terminal policy and a hash has been generated,
656
+ // ignore the rest of the hash policies.
657
+ if (hash_policy.terminal && hash.has_value()) {
658
+ break;
659
+ }
660
+ }
661
+ if (!hash.has_value()) {
662
+ // If there is no hash, we just choose a random value as a default.
663
+ hash = rand();
664
+ }
524
665
  CallConfig call_config;
525
- if (entry.method_config != nullptr) {
526
- call_config.service_config = entry.method_config;
666
+ if (method_config != nullptr) {
527
667
  call_config.method_configs =
528
- entry.method_config->GetMethodParsedConfigVector(grpc_empty_slice());
668
+ method_config->GetMethodParsedConfigVector(grpc_empty_slice());
669
+ call_config.service_config = std::move(method_config);
529
670
  }
530
671
  call_config.call_attributes[kXdsClusterAttribute] = it->first;
672
+ call_config.call_attributes[kRequestRingHashAttribute] =
673
+ absl::StrFormat("%" PRIu64, hash.value());
531
674
  call_config.on_call_committed = [resolver, cluster_state]() {
532
675
  cluster_state->Unref();
533
676
  ExecCtx::Run(
@@ -543,7 +686,7 @@ ConfigSelector::CallConfig XdsResolver::XdsConfigSelector::GetCallConfig(
543
686
  GRPC_CLOSURE_CREATE(
544
687
  [](void* arg, grpc_error* /*error*/) {
545
688
  auto* resolver = static_cast<XdsResolver*>(arg);
546
- resolver->work_serializer()->Run(
689
+ resolver->work_serializer_->Run(
547
690
  [resolver]() {
548
691
  resolver->MaybeRemoveUnusedClusters();
549
692
  resolver->Unref();
@@ -570,7 +713,7 @@ void XdsResolver::StartLocked() {
570
713
  "Failed to create xds client -- channel will remain in "
571
714
  "TRANSIENT_FAILURE: %s",
572
715
  grpc_error_string(error));
573
- result_handler()->ReturnError(error);
716
+ result_handler_->ReturnError(error);
574
717
  return;
575
718
  }
576
719
  grpc_pollset_set_add_pollset_set(xds_client_->interested_parties(),
@@ -615,24 +758,34 @@ void XdsResolver::OnListenerUpdate(XdsApi::LdsUpdate listener) {
615
758
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) {
616
759
  gpr_log(GPR_INFO, "[xds_resolver %p] received updated listener data", this);
617
760
  }
618
- if (listener.route_config_name != route_config_name_) {
761
+ if (listener.http_connection_manager.route_config_name !=
762
+ route_config_name_) {
619
763
  if (route_config_watcher_ != nullptr) {
620
764
  xds_client_->CancelRouteConfigDataWatch(
621
765
  route_config_name_, route_config_watcher_,
622
- /*delay_unsubscription=*/!listener.route_config_name.empty());
766
+ /*delay_unsubscription=*/
767
+ !listener.http_connection_manager.route_config_name.empty());
623
768
  route_config_watcher_ = nullptr;
624
769
  }
625
- route_config_name_ = std::move(listener.route_config_name);
770
+ route_config_name_ =
771
+ std::move(listener.http_connection_manager.route_config_name);
626
772
  if (!route_config_name_.empty()) {
773
+ current_virtual_host_.routes.clear();
627
774
  auto watcher = absl::make_unique<RouteConfigWatcher>(Ref());
628
775
  route_config_watcher_ = watcher.get();
629
776
  xds_client_->WatchRouteConfigData(route_config_name_, std::move(watcher));
630
777
  }
631
778
  }
632
- http_max_stream_duration_ = listener.http_max_stream_duration;
779
+ current_listener_ = std::move(listener);
633
780
  if (route_config_name_.empty()) {
634
- GPR_ASSERT(listener.rds_update.has_value());
635
- OnRouteConfigUpdate(std::move(*listener.rds_update));
781
+ GPR_ASSERT(
782
+ current_listener_.http_connection_manager.rds_update.has_value());
783
+ OnRouteConfigUpdate(
784
+ std::move(*current_listener_.http_connection_manager.rds_update));
785
+ } else {
786
+ // HCM may contain newer filter config. We need to propagate the update as
787
+ // config selector to the channel
788
+ GenerateResult();
636
789
  }
637
790
  }
638
791
 
@@ -650,8 +803,8 @@ void XdsResolver::OnRouteConfigUpdate(XdsApi::RdsUpdate rds_update) {
650
803
  .c_str()));
651
804
  return;
652
805
  }
653
- // Save the list of routes in the resolver.
654
- current_update_ = std::move(vhost->routes);
806
+ // Save the virtual host in the resolver.
807
+ current_virtual_host_ = std::move(*vhost);
655
808
  // Send a new result to the channel.
656
809
  GenerateResult();
657
810
  }
@@ -662,7 +815,7 @@ void XdsResolver::OnError(grpc_error* error) {
662
815
  Result result;
663
816
  result.args = grpc_channel_args_copy(args_);
664
817
  result.service_config_error = error;
665
- result_handler()->ReturnResult(std::move(result));
818
+ result_handler_->ReturnResult(std::move(result));
666
819
  }
667
820
 
668
821
  void XdsResolver::OnResourceDoesNotExist() {
@@ -670,13 +823,13 @@ void XdsResolver::OnResourceDoesNotExist() {
670
823
  "[xds_resolver %p] LDS/RDS resource does not exist -- clearing "
671
824
  "update and returning empty service config",
672
825
  this);
673
- current_update_.clear();
826
+ current_virtual_host_.routes.clear();
674
827
  Result result;
675
828
  result.service_config =
676
829
  ServiceConfig::Create(args_, "{}", &result.service_config_error);
677
830
  GPR_ASSERT(result.service_config != nullptr);
678
831
  result.args = grpc_channel_args_copy(args_);
679
- result_handler()->ReturnResult(std::move(result));
832
+ result_handler_->ReturnResult(std::move(result));
680
833
  }
681
834
 
682
835
  grpc_error* XdsResolver::CreateServiceConfig(
@@ -712,12 +865,11 @@ grpc_error* XdsResolver::CreateServiceConfig(
712
865
  }
713
866
 
714
867
  void XdsResolver::GenerateResult() {
715
- if (current_update_.empty()) return;
868
+ if (current_virtual_host_.routes.empty()) return;
716
869
  // First create XdsConfigSelector, which may add new entries to the cluster
717
870
  // state map, and then CreateServiceConfig for LB policies.
718
871
  grpc_error* error = GRPC_ERROR_NONE;
719
- auto config_selector =
720
- MakeRefCounted<XdsConfigSelector>(Ref(), current_update_, error);
872
+ auto config_selector = MakeRefCounted<XdsConfigSelector>(Ref(), &error);
721
873
  if (error != GRPC_ERROR_NONE) {
722
874
  OnError(error);
723
875
  return;
@@ -734,7 +886,7 @@ void XdsResolver::GenerateResult() {
734
886
  }
735
887
  grpc_arg new_arg = config_selector->MakeChannelArg();
736
888
  result.args = grpc_channel_args_copy_and_add(args_, &new_arg, 1);
737
- result_handler()->ReturnResult(std::move(result));
889
+ result_handler_->ReturnResult(std::move(result));
738
890
  }
739
891
 
740
892
  void XdsResolver::MaybeRemoveUnusedClusters() {