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
@@ -23,10 +23,11 @@
23
23
 
24
24
  #include "src/core/lib/channel/channel_stack.h"
25
25
 
26
- extern const grpc_channel_filter grpc_lame_filter;
27
-
28
26
  namespace grpc_core {
29
- void SetLameFilterError(grpc_channel_element* elem, grpc_error* error);
27
+ // Does NOT take ownership of error.
28
+ grpc_arg MakeLameClientErrorArg(grpc_error* error);
30
29
  } // namespace grpc_core
31
30
 
31
+ extern const grpc_channel_filter grpc_lame_filter;
32
+
32
33
  #endif /* GRPC_CORE_LIB_SURFACE_LAME_CLIENT_H */
@@ -318,7 +318,8 @@ class Server::RealRequestMatcher : public RequestMatcherInterface {
318
318
  // advance or queue up any incoming RPC for later match. Instead, MatchOrQueue
319
319
  // will call out to an allocation function passed in at the construction of the
320
320
  // object. These request matchers are designed for the C++ callback API, so they
321
- // only support 1 completion queue (passed in at the constructor).
321
+ // only support 1 completion queue (passed in at the constructor). They are also
322
+ // used for the sync API.
322
323
  class Server::AllocatingRequestMatcherBase : public RequestMatcherInterface {
323
324
  public:
324
325
  AllocatingRequestMatcherBase(Server* server, grpc_completion_queue* cq)
@@ -370,15 +371,20 @@ class Server::AllocatingRequestMatcherBatch
370
371
 
371
372
  void MatchOrQueue(size_t /*start_request_queue_index*/,
372
373
  CallData* calld) override {
373
- BatchCallAllocation call_info = allocator_();
374
- GPR_ASSERT(server()->ValidateServerRequest(
375
- cq(), static_cast<void*>(call_info.tag), nullptr, nullptr) ==
376
- GRPC_CALL_OK);
377
- RequestedCall* rc = new RequestedCall(
378
- static_cast<void*>(call_info.tag), cq(), call_info.call,
379
- call_info.initial_metadata, call_info.details);
380
- calld->SetState(CallData::CallState::ACTIVATED);
381
- calld->Publish(cq_idx(), rc);
374
+ if (server()->ShutdownRefOnRequest()) {
375
+ BatchCallAllocation call_info = allocator_();
376
+ GPR_ASSERT(server()->ValidateServerRequest(
377
+ cq(), static_cast<void*>(call_info.tag), nullptr,
378
+ nullptr) == GRPC_CALL_OK);
379
+ RequestedCall* rc = new RequestedCall(
380
+ static_cast<void*>(call_info.tag), call_info.cq, call_info.call,
381
+ call_info.initial_metadata, call_info.details);
382
+ calld->SetState(CallData::CallState::ACTIVATED);
383
+ calld->Publish(cq_idx(), rc);
384
+ } else {
385
+ calld->FailCallCreation();
386
+ }
387
+ server()->ShutdownUnrefOnRequest();
382
388
  }
383
389
 
384
390
  private:
@@ -398,17 +404,21 @@ class Server::AllocatingRequestMatcherRegistered
398
404
 
399
405
  void MatchOrQueue(size_t /*start_request_queue_index*/,
400
406
  CallData* calld) override {
401
- RegisteredCallAllocation call_info = allocator_();
402
- GPR_ASSERT(
403
- server()->ValidateServerRequest(cq(), static_cast<void*>(call_info.tag),
404
- call_info.optional_payload,
405
- registered_method_) == GRPC_CALL_OK);
406
- RequestedCall* rc = new RequestedCall(
407
- static_cast<void*>(call_info.tag), cq(), call_info.call,
408
- call_info.initial_metadata, registered_method_, call_info.deadline,
409
- call_info.optional_payload);
410
- calld->SetState(CallData::CallState::ACTIVATED);
411
- calld->Publish(cq_idx(), rc);
407
+ if (server()->ShutdownRefOnRequest()) {
408
+ RegisteredCallAllocation call_info = allocator_();
409
+ GPR_ASSERT(server()->ValidateServerRequest(
410
+ cq(), call_info.tag, call_info.optional_payload,
411
+ registered_method_) == GRPC_CALL_OK);
412
+ RequestedCall* rc =
413
+ new RequestedCall(call_info.tag, call_info.cq, call_info.call,
414
+ call_info.initial_metadata, registered_method_,
415
+ call_info.deadline, call_info.optional_payload);
416
+ calld->SetState(CallData::CallState::ACTIVATED);
417
+ calld->Publish(cq_idx(), rc);
418
+ } else {
419
+ calld->FailCallCreation();
420
+ }
421
+ server()->ShutdownUnrefOnRequest();
412
422
  }
413
423
 
414
424
  private:
@@ -513,7 +523,7 @@ grpc_resource_user* CreateDefaultResourceUser(const grpc_channel_args* args) {
513
523
  }
514
524
 
515
525
  RefCountedPtr<channelz::ServerNode> CreateChannelzNode(
516
- Server* server, const grpc_channel_args* args) {
526
+ const grpc_channel_args* args) {
517
527
  RefCountedPtr<channelz::ServerNode> channelz_node;
518
528
  if (grpc_channel_args_find_bool(args, GRPC_ARG_ENABLE_CHANNELZ,
519
529
  GRPC_ENABLE_CHANNELZ_DEFAULT)) {
@@ -534,7 +544,7 @@ RefCountedPtr<channelz::ServerNode> CreateChannelzNode(
534
544
  Server::Server(const grpc_channel_args* args)
535
545
  : channel_args_(grpc_channel_args_copy(args)),
536
546
  default_resource_user_(CreateDefaultResourceUser(args)),
537
- channelz_node_(CreateChannelzNode(this, args)) {}
547
+ channelz_node_(CreateChannelzNode(args)) {}
538
548
 
539
549
  Server::~Server() {
540
550
  grpc_channel_args_destroy(channel_args_);
@@ -711,7 +721,7 @@ void Server::FailCall(size_t cq_idx, RequestedCall* rc, grpc_error* error) {
711
721
  // Before calling MaybeFinishShutdown(), we must hold mu_global_ and not
712
722
  // hold mu_call_.
713
723
  void Server::MaybeFinishShutdown() {
714
- if (!shutdown_flag_.load(std::memory_order_acquire) || shutdown_published_) {
724
+ if (!ShutdownReady() || shutdown_published_) {
715
725
  return;
716
726
  }
717
727
  {
@@ -796,7 +806,7 @@ void Server::ShutdownAndNotify(grpc_completion_queue* cq, void* tag) {
796
806
  {
797
807
  // Wait for startup to be finished. Locks mu_global.
798
808
  MutexLock lock(&mu_global_);
799
- starting_cv_.WaitUntil(&mu_global_, [this] { return !starting_; });
809
+ WaitUntil(&starting_cv_, &mu_global_, [this] { return !starting_; });
800
810
  // Stay locked, and gather up some stuff to do.
801
811
  GPR_ASSERT(grpc_cq_begin_op(cq, tag));
802
812
  if (shutdown_published_) {
@@ -805,19 +815,18 @@ void Server::ShutdownAndNotify(grpc_completion_queue* cq, void* tag) {
805
815
  return;
806
816
  }
807
817
  shutdown_tags_.emplace_back(tag, cq);
808
- if (shutdown_flag_.load(std::memory_order_acquire)) {
818
+ if (ShutdownCalled()) {
809
819
  return;
810
820
  }
811
821
  last_shutdown_message_time_ = gpr_now(GPR_CLOCK_REALTIME);
812
822
  broadcaster.FillChannelsLocked(GetChannelsLocked());
813
- shutdown_flag_.store(true, std::memory_order_release);
814
823
  // Collect all unregistered then registered calls.
815
824
  {
816
825
  MutexLock lock(&mu_call_);
817
826
  KillPendingWorkLocked(
818
827
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown"));
819
828
  }
820
- MaybeFinishShutdown();
829
+ ShutdownUnrefOnShutdownCall();
821
830
  }
822
831
  // Shutdown listeners.
823
832
  for (auto& listener : listeners_) {
@@ -849,8 +858,7 @@ void Server::CancelAllCalls() {
849
858
  void Server::Orphan() {
850
859
  {
851
860
  MutexLock lock(&mu_global_);
852
- GPR_ASSERT(shutdown_flag_.load(std::memory_order_acquire) ||
853
- listeners_.empty());
861
+ GPR_ASSERT(ShutdownCalled() || listeners_.empty());
854
862
  GPR_ASSERT(listeners_destroyed_ == listeners_.size());
855
863
  }
856
864
  if (default_resource_user_ != nullptr) {
@@ -869,7 +877,7 @@ grpc_call_error Server::ValidateServerRequest(
869
877
  (rm->payload_handling == GRPC_SRM_PAYLOAD_NONE)))) {
870
878
  return GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH;
871
879
  }
872
- if (grpc_cq_begin_op(cq_for_notification, tag) == false) {
880
+ if (!grpc_cq_begin_op(cq_for_notification, tag)) {
873
881
  return GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN;
874
882
  }
875
883
  return GRPC_CALL_OK;
@@ -897,7 +905,7 @@ grpc_call_error Server::ValidateServerRequestAndCq(
897
905
  }
898
906
 
899
907
  grpc_call_error Server::QueueRequestedCall(size_t cq_idx, RequestedCall* rc) {
900
- if (shutdown_flag_.load(std::memory_order_acquire)) {
908
+ if (ShutdownCalled()) {
901
909
  FailCall(cq_idx, rc,
902
910
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown"));
903
911
  return GRPC_CALL_OK;
@@ -1066,7 +1074,7 @@ void Server::ChannelData::InitTransport(RefCountedPtr<Server> server,
1066
1074
  op->set_accept_stream_fn = AcceptStream;
1067
1075
  op->set_accept_stream_user_data = this;
1068
1076
  op->start_connectivity_watch = MakeOrphanable<ConnectivityWatcher>(this);
1069
- if (server_->shutdown_flag_.load(std::memory_order_acquire)) {
1077
+ if (server_->ShutdownCalled()) {
1070
1078
  op->disconnect_with_error =
1071
1079
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server shutdown");
1072
1080
  }
@@ -1282,8 +1290,7 @@ void Server::CallData::PublishNewRpc(void* arg, grpc_error* error) {
1282
1290
  auto* chand = static_cast<Server::ChannelData*>(call_elem->channel_data);
1283
1291
  RequestMatcherInterface* rm = calld->matcher_;
1284
1292
  Server* server = rm->server();
1285
- if (error != GRPC_ERROR_NONE ||
1286
- server->shutdown_flag_.load(std::memory_order_acquire)) {
1293
+ if (error != GRPC_ERROR_NONE || server->ShutdownCalled()) {
1287
1294
  calld->state_.Store(CallState::ZOMBIED, MemoryOrder::RELAXED);
1288
1295
  calld->KillZombie();
1289
1296
  return;
@@ -1307,7 +1314,7 @@ void Server::CallData::KillZombie() {
1307
1314
 
1308
1315
  void Server::CallData::StartNewRpc(grpc_call_element* elem) {
1309
1316
  auto* chand = static_cast<ChannelData*>(elem->channel_data);
1310
- if (server_->shutdown_flag_.load(std::memory_order_acquire)) {
1317
+ if (server_->ShutdownCalled()) {
1311
1318
  state_.Store(CallState::ZOMBIED, MemoryOrder::RELAXED);
1312
1319
  KillZombie();
1313
1320
  return;
@@ -22,6 +22,7 @@
22
22
  #include <list>
23
23
  #include <vector>
24
24
 
25
+ #include "absl/status/statusor.h"
25
26
  #include "absl/types/optional.h"
26
27
 
27
28
  #include <grpc/grpc.h>
@@ -31,6 +32,7 @@
31
32
  #include "src/core/lib/channel/channelz.h"
32
33
  #include "src/core/lib/debug/trace.h"
33
34
  #include "src/core/lib/gprpp/atomic.h"
35
+ #include "src/core/lib/iomgr/resolve_address.h"
34
36
  #include "src/core/lib/surface/completion_queue.h"
35
37
  #include "src/core/lib/transport/transport.h"
36
38
 
@@ -49,21 +51,23 @@ class Server : public InternallyRefCounted<Server> {
49
51
  // An object to represent the most relevant characteristics of a
50
52
  // newly-allocated call object when using an AllocatingRequestMatcherBatch.
51
53
  struct BatchCallAllocation {
52
- grpc_experimental_completion_queue_functor* tag;
54
+ void* tag;
53
55
  grpc_call** call;
54
56
  grpc_metadata_array* initial_metadata;
55
57
  grpc_call_details* details;
58
+ grpc_completion_queue* cq;
56
59
  };
57
60
 
58
61
  // An object to represent the most relevant characteristics of a
59
62
  // newly-allocated call object when using an
60
63
  // AllocatingRequestMatcherRegistered.
61
64
  struct RegisteredCallAllocation {
62
- grpc_experimental_completion_queue_functor* tag;
65
+ void* tag;
63
66
  grpc_call** call;
64
67
  grpc_metadata_array* initial_metadata;
65
68
  gpr_timespec* deadline;
66
69
  grpc_byte_buffer** optional_payload;
70
+ grpc_completion_queue* cq;
67
71
  };
68
72
 
69
73
  /// Interface for listeners.
@@ -90,7 +94,7 @@ class Server : public InternallyRefCounted<Server> {
90
94
  explicit Server(const grpc_channel_args* args);
91
95
  ~Server() override;
92
96
 
93
- void Orphan() override;
97
+ void Orphan() ABSL_LOCKS_EXCLUDED(mu_global_) override;
94
98
 
95
99
  const grpc_channel_args* channel_args() const { return channel_args_; }
96
100
  grpc_resource_user* default_resource_user() const {
@@ -112,7 +116,7 @@ class Server : public InternallyRefCounted<Server> {
112
116
  config_fetcher_ = std::move(config_fetcher);
113
117
  }
114
118
 
115
- bool HasOpenConnections();
119
+ bool HasOpenConnections() ABSL_LOCKS_EXCLUDED(mu_global_);
116
120
 
117
121
  // Adds a listener to the server. When the server starts, it will call
118
122
  // the listener's Start() method, and when it shuts down, it will orphan
@@ -120,7 +124,7 @@ class Server : public InternallyRefCounted<Server> {
120
124
  void AddListener(OrphanablePtr<ListenerInterface> listener);
121
125
 
122
126
  // Starts listening for connections.
123
- void Start();
127
+ void Start() ABSL_LOCKS_EXCLUDED(mu_global_);
124
128
 
125
129
  // Sets up a transport. Creates a channel stack and binds the transport to
126
130
  // the server. Called from the listener when a new connection is accepted.
@@ -158,9 +162,10 @@ class Server : public InternallyRefCounted<Server> {
158
162
  grpc_completion_queue* cq_bound_to_call,
159
163
  grpc_completion_queue* cq_for_notification, void* tag_new);
160
164
 
161
- void ShutdownAndNotify(grpc_completion_queue* cq, void* tag);
165
+ void ShutdownAndNotify(grpc_completion_queue* cq, void* tag)
166
+ ABSL_LOCKS_EXCLUDED(mu_global_, mu_call_);
162
167
 
163
- void CancelAllCalls();
168
+ void CancelAllCalls() ABSL_LOCKS_EXCLUDED(mu_global_);
164
169
 
165
170
  private:
166
171
  struct RequestedCall;
@@ -207,7 +212,7 @@ class Server : public InternallyRefCounted<Server> {
207
212
  static void AcceptStream(void* arg, grpc_transport* /*transport*/,
208
213
  const void* transport_server_data);
209
214
 
210
- void Destroy();
215
+ void Destroy() ABSL_EXCLUSIVE_LOCKS_REQUIRED(server_->mu_global_);
211
216
 
212
217
  static void FinishDestroy(void* arg, grpc_error* error);
213
218
 
@@ -343,9 +348,11 @@ class Server : public InternallyRefCounted<Server> {
343
348
  void FailCall(size_t cq_idx, RequestedCall* rc, grpc_error* error);
344
349
  grpc_call_error QueueRequestedCall(size_t cq_idx, RequestedCall* rc);
345
350
 
346
- void MaybeFinishShutdown();
351
+ void MaybeFinishShutdown() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_global_)
352
+ ABSL_LOCKS_EXCLUDED(mu_call_);
347
353
 
348
- void KillPendingWorkLocked(grpc_error* error);
354
+ void KillPendingWorkLocked(grpc_error* error)
355
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_call_);
349
356
 
350
357
  static grpc_call_error ValidateServerRequest(
351
358
  grpc_completion_queue* cq_for_notification, void* tag,
@@ -356,6 +363,39 @@ class Server : public InternallyRefCounted<Server> {
356
363
 
357
364
  std::vector<grpc_channel*> GetChannelsLocked() const;
358
365
 
366
+ // Take a shutdown ref for a request (increment by 2) and return if shutdown
367
+ // has already been called.
368
+ bool ShutdownRefOnRequest() {
369
+ int old_value = shutdown_refs_.FetchAdd(2, MemoryOrder::ACQ_REL);
370
+ return (old_value & 1) != 0;
371
+ }
372
+
373
+ // Decrement the shutdown ref counter by either 1 (for shutdown call) or 2
374
+ // (for in-flight request) and possibly call MaybeFinishShutdown if
375
+ // appropriate.
376
+ void ShutdownUnrefOnRequest() ABSL_LOCKS_EXCLUDED(mu_global_) {
377
+ if (shutdown_refs_.FetchSub(2, MemoryOrder::ACQ_REL) == 2) {
378
+ MutexLock lock(&mu_global_);
379
+ MaybeFinishShutdown();
380
+ }
381
+ }
382
+ void ShutdownUnrefOnShutdownCall() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_global_) {
383
+ if (shutdown_refs_.FetchSub(1, MemoryOrder::ACQ_REL) == 1) {
384
+ MaybeFinishShutdown();
385
+ }
386
+ }
387
+
388
+ bool ShutdownCalled() const {
389
+ return (shutdown_refs_.Load(MemoryOrder::ACQUIRE) & 1) == 0;
390
+ }
391
+
392
+ // Returns whether there are no more shutdown refs, which means that shutdown
393
+ // has been called and all accepted requests have been published if using an
394
+ // AllocatingRequestMatcher.
395
+ bool ShutdownReady() const {
396
+ return shutdown_refs_.Load(MemoryOrder::ACQUIRE) == 0;
397
+ }
398
+
359
399
  grpc_channel_args* const channel_args_;
360
400
  grpc_resource_user* default_resource_user_ = nullptr;
361
401
  RefCountedPtr<channelz::ServerNode> channelz_node_;
@@ -385,9 +425,15 @@ class Server : public InternallyRefCounted<Server> {
385
425
  // Request matcher for unregistered methods.
386
426
  std::unique_ptr<RequestMatcherInterface> unregistered_request_matcher_;
387
427
 
388
- std::atomic_bool shutdown_flag_{false};
389
- bool shutdown_published_ = false;
390
- std::vector<ShutdownTag> shutdown_tags_;
428
+ // The shutdown refs counter tracks whether or not shutdown has been called
429
+ // and whether there are any AllocatingRequestMatcher requests that have been
430
+ // accepted but not yet started (+2 on each one). If shutdown has been called,
431
+ // the lowest bit will be 0 (defaults to 1) and the counter will be even. The
432
+ // server should not notify on shutdown until the counter is 0 (shutdown is
433
+ // called and there are no requests that are accepted but not started).
434
+ Atomic<int> shutdown_refs_{1};
435
+ bool shutdown_published_ ABSL_GUARDED_BY(mu_global_) = false;
436
+ std::vector<ShutdownTag> shutdown_tags_ ABSL_GUARDED_BY(mu_global_);
391
437
 
392
438
  std::list<ChannelData*> channels_;
393
439
 
@@ -412,15 +458,31 @@ struct grpc_server {
412
458
  // approaches here.
413
459
  struct grpc_server_config_fetcher {
414
460
  public:
461
+ class ConnectionManager : public grpc_core::RefCounted<ConnectionManager> {
462
+ public:
463
+ // Ownership of \a args is transfered.
464
+ virtual absl::StatusOr<grpc_channel_args*> UpdateChannelArgsForConnection(
465
+ grpc_channel_args* args, grpc_endpoint* tcp) = 0;
466
+ };
467
+
415
468
  class WatcherInterface {
416
469
  public:
417
470
  virtual ~WatcherInterface() = default;
418
- virtual void UpdateConfig(grpc_channel_args* args) = 0;
471
+ // UpdateConnectionManager() is invoked by the config fetcher when a new
472
+ // config is available. Implementations should update the connection manager
473
+ // and start serving if not already serving.
474
+ virtual void UpdateConnectionManager(
475
+ grpc_core::RefCountedPtr<ConnectionManager> manager) = 0;
476
+ // Implementations should stop serving when this is called. Serving should
477
+ // only resume when UpdateConfig() is invoked.
478
+ virtual void StopServing() = 0;
419
479
  };
420
480
 
421
481
  virtual ~grpc_server_config_fetcher() = default;
422
482
 
483
+ // Ownership of \a args is transferred.
423
484
  virtual void StartWatch(std::string listening_address,
485
+ grpc_channel_args* args,
424
486
  std::unique_ptr<WatcherInterface> watcher) = 0;
425
487
  virtual void CancelWatch(WatcherInterface* watcher) = 0;
426
488
  virtual grpc_pollset_set* interested_parties() = 0;
@@ -23,6 +23,6 @@
23
23
 
24
24
  #include <grpc/grpc.h>
25
25
 
26
- const char* grpc_version_string(void) { return "14.0.0"; }
26
+ const char* grpc_version_string(void) { return "15.0.0"; }
27
27
 
28
- const char* grpc_g_stands_for(void) { return "gecko"; }
28
+ const char* grpc_g_stands_for(void) { return "gilded"; }
@@ -252,7 +252,7 @@ void grpc_mdctx_global_shutdown() {
252
252
  if (shard->count != 0) {
253
253
  gpr_log(GPR_ERROR, "WARNING: %" PRIuPTR " metadata elements were leaked",
254
254
  shard->count);
255
- for (int i = 0; i < shard->capacity; i++) {
255
+ for (size_t i = 0; i < shard->capacity; i++) {
256
256
  for (InternedMetadata* md = shard->elems[i].next; md;
257
257
  md = md->bucket_next()) {
258
258
  char* key_str = grpc_slice_to_c_string(md->key());
@@ -596,7 +596,7 @@ static void* set_user_data(UserData* ud, void (*destroy_func)(void*),
596
596
  grpc_core::ReleasableMutexLock lock(&ud->mu_user_data);
597
597
  if (ud->destroy_user_data.Load(grpc_core::MemoryOrder::RELAXED)) {
598
598
  /* user data can only be set once */
599
- lock.Unlock();
599
+ lock.Release();
600
600
  if (destroy_func != nullptr) {
601
601
  destroy_func(data);
602
602
  }
@@ -673,6 +673,10 @@ void grpc_mdelem_do_unref(grpc_mdelem gmd DEBUG_ARGS) {
673
673
 
674
674
  void grpc_mdelem_on_final_unref(grpc_mdelem_data_storage storage, void* ptr,
675
675
  uint32_t hash DEBUG_ARGS) {
676
+ #ifndef NDEBUG
677
+ (void)file;
678
+ (void)line;
679
+ #endif
676
680
  switch (storage) {
677
681
  case GRPC_MDELEM_STORAGE_EXTERNAL:
678
682
  case GRPC_MDELEM_STORAGE_STATIC:
@@ -23,6 +23,9 @@
23
23
  #include <stdbool.h>
24
24
  #include <string.h>
25
25
 
26
+ #include "absl/container/inlined_vector.h"
27
+ #include "absl/strings/str_join.h"
28
+
26
29
  #include <grpc/support/alloc.h>
27
30
  #include <grpc/support/log.h>
28
31
 
@@ -296,6 +299,30 @@ void grpc_metadata_batch_set_value(grpc_linked_mdelem* storage,
296
299
  GRPC_MDELEM_UNREF(old_mdelem);
297
300
  }
298
301
 
302
+ absl::optional<absl::string_view> grpc_metadata_batch_get_value(
303
+ grpc_metadata_batch* batch, absl::string_view target_key,
304
+ std::string* concatenated_value) {
305
+ // Find all values for the specified key.
306
+ GPR_DEBUG_ASSERT(batch != nullptr);
307
+ absl::InlinedVector<absl::string_view, 1> values;
308
+ for (grpc_linked_mdelem* md = batch->list.head; md != nullptr;
309
+ md = md->next) {
310
+ absl::string_view key = grpc_core::StringViewFromSlice(GRPC_MDKEY(md->md));
311
+ absl::string_view value =
312
+ grpc_core::StringViewFromSlice(GRPC_MDVALUE(md->md));
313
+ if (target_key == key) values.push_back(value);
314
+ }
315
+ // If none found, no match.
316
+ if (values.empty()) return absl::nullopt;
317
+ // If exactly one found, return it as-is.
318
+ if (values.size() == 1) return values.front();
319
+ // If more than one found, concatenate the values, using
320
+ // *concatenated_values as a temporary holding place for the
321
+ // concatenated string.
322
+ *concatenated_value = absl::StrJoin(values, ",");
323
+ return *concatenated_value;
324
+ }
325
+
299
326
  grpc_error* grpc_metadata_batch_substitute(grpc_metadata_batch* batch,
300
327
  grpc_linked_mdelem* storage,
301
328
  grpc_mdelem new_mdelem) {