grpc 1.30.1 → 1.32.0.pre1

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 (676) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +723 -15910
  3. data/include/grpc/grpc_security.h +31 -14
  4. data/include/grpc/grpc_security_constants.h +3 -0
  5. data/include/grpc/impl/codegen/README.md +22 -0
  6. data/include/grpc/impl/codegen/grpc_types.h +7 -5
  7. data/include/grpc/impl/codegen/port_platform.h +6 -33
  8. data/src/core/ext/filters/client_channel/backend_metric.cc +12 -9
  9. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -2
  10. data/src/core/ext/filters/client_channel/client_channel.cc +470 -285
  11. data/src/core/ext/filters/client_channel/client_channel.h +1 -1
  12. data/src/core/ext/filters/client_channel/client_channel_channelz.h +0 -3
  13. data/src/core/ext/filters/client_channel/config_selector.cc +62 -0
  14. data/src/core/ext/filters/client_channel/config_selector.h +93 -0
  15. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -2
  16. data/src/core/ext/filters/client_channel/health/health_check_client.cc +8 -1
  17. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +8 -8
  18. data/src/core/ext/filters/client_channel/http_proxy.cc +6 -4
  19. data/src/core/ext/filters/client_channel/lb_policy.h +4 -0
  20. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +6 -4
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +59 -36
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -13
  23. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +0 -3
  24. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -37
  25. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +19 -13
  26. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +29 -10
  27. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +5 -4
  28. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +4 -6
  29. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +23 -13
  30. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +18 -12
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +22 -14
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +18 -9
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +385 -78
  34. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -5
  35. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +5 -2
  36. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +6 -5
  37. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +8 -6
  38. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +9 -7
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +7 -5
  40. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +36 -51
  41. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
  42. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  43. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -2
  44. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -1
  45. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -1
  46. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +383 -31
  47. data/src/core/ext/filters/client_channel/resolver_registry.cc +13 -14
  48. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +6 -7
  49. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +0 -1
  50. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +38 -32
  51. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +39 -20
  52. data/src/core/ext/filters/client_channel/server_address.cc +40 -7
  53. data/src/core/ext/filters/client_channel/server_address.h +42 -4
  54. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +142 -0
  55. data/src/core/ext/filters/client_channel/subchannel.cc +65 -24
  56. data/src/core/ext/filters/client_channel/subchannel.h +16 -4
  57. data/src/core/ext/filters/http/client/http_client_filter.cc +5 -5
  58. data/src/core/ext/filters/http/http_filters_plugin.cc +2 -1
  59. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +74 -33
  60. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +3 -1
  61. data/src/core/ext/filters/max_age/max_age_filter.cc +2 -1
  62. data/src/core/ext/filters/message_size/message_size_filter.cc +56 -80
  63. data/src/core/ext/filters/message_size/message_size_filter.h +6 -0
  64. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +87 -31
  65. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +18 -1
  66. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +10 -35
  67. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +378 -348
  68. data/src/core/ext/transport/chttp2/server/chttp2_server.h +7 -2
  69. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +3 -3
  70. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +10 -16
  71. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +9 -9
  72. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +256 -279
  73. data/src/core/ext/transport/chttp2/transport/flow_control.cc +23 -28
  74. data/src/core/ext/transport/chttp2/transport/flow_control.h +14 -16
  75. data/src/core/ext/transport/chttp2/transport/frame_data.cc +9 -12
  76. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +4 -6
  77. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -6
  78. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +12 -13
  79. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +8 -9
  80. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +9 -12
  81. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +25 -29
  82. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +13 -17
  83. data/src/core/ext/transport/chttp2/transport/internal.h +18 -1
  84. data/src/core/ext/transport/chttp2/transport/parsing.cc +34 -71
  85. data/src/core/ext/transport/chttp2/transport/writing.cc +15 -19
  86. data/src/core/ext/transport/inproc/inproc_transport.cc +47 -27
  87. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +0 -1
  88. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +3 -4
  89. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +224 -0
  90. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +700 -0
  91. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +74 -0
  92. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +226 -0
  93. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +380 -0
  94. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +1378 -0
  95. data/src/core/ext/upb-generated/envoy/{api/v2/cluster → config/cluster/v3}/filter.upb.c +8 -8
  96. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +69 -0
  97. data/src/core/ext/upb-generated/envoy/{api/v2/cluster → config/cluster/v3}/outlier_detection.upb.c +8 -8
  98. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +323 -0
  99. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +112 -0
  100. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +334 -0
  101. data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/backoff.upb.c +8 -8
  102. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +79 -0
  103. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +309 -0
  104. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +869 -0
  105. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +96 -0
  106. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +328 -0
  107. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +34 -0
  108. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +71 -0
  109. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +195 -0
  110. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +634 -0
  111. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +170 -0
  112. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +684 -0
  113. data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/http_uri.upb.c +8 -8
  114. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +80 -0
  115. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +152 -0
  116. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +536 -0
  117. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +28 -0
  118. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +58 -0
  119. data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/socket_option.upb.c +6 -6
  120. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +88 -0
  121. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +91 -0
  122. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +220 -0
  123. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +91 -0
  124. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +273 -0
  125. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +112 -0
  126. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +332 -0
  127. data/src/core/ext/upb-generated/envoy/config/listener/{v2 → v3}/api_listener.upb.c +8 -8
  128. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +65 -0
  129. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +108 -0
  130. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +401 -0
  131. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +138 -0
  132. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +490 -0
  133. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +41 -0
  134. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +94 -0
  135. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +174 -0
  136. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +599 -0
  137. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +63 -0
  138. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +204 -0
  139. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +773 -0
  140. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2855 -0
  141. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +59 -0
  142. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +135 -0
  143. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +50 -0
  144. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +108 -0
  145. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +312 -0
  146. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +1125 -0
  147. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +20 -0
  148. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +34 -0
  149. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +111 -0
  150. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +401 -0
  151. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +72 -0
  152. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +198 -0
  153. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +105 -0
  154. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +388 -0
  155. data/src/core/ext/upb-generated/envoy/{api/v2 → service/cluster/v3}/cds.upb.c +5 -6
  156. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +49 -0
  157. data/src/core/ext/upb-generated/envoy/service/discovery/{v2 → v3}/ads.upb.c +5 -4
  158. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +49 -0
  159. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +129 -0
  160. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +386 -0
  161. data/src/core/ext/upb-generated/envoy/{api/v2 → service/endpoint/v3}/eds.upb.c +5 -6
  162. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +49 -0
  163. data/src/core/ext/upb-generated/envoy/{api/v2 → service/listener/v3}/lds.upb.c +5 -6
  164. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +49 -0
  165. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +55 -0
  166. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +136 -0
  167. data/src/core/ext/upb-generated/envoy/{api/v2 → service/route/v3}/rds.upb.c +5 -6
  168. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +49 -0
  169. data/src/core/ext/upb-generated/envoy/{api/v2 → service/route/v3}/srds.upb.c +5 -6
  170. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +49 -0
  171. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +47 -0
  172. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +114 -0
  173. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +35 -0
  174. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +77 -0
  175. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +34 -0
  176. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +71 -0
  177. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +64 -0
  178. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +145 -0
  179. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +53 -0
  180. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +127 -0
  181. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +63 -0
  182. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +188 -0
  183. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +88 -0
  184. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +258 -0
  185. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +90 -0
  186. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +250 -0
  187. data/src/core/ext/upb-generated/envoy/type/{http.upb.c → v3/http.upb.c} +2 -2
  188. data/src/core/ext/upb-generated/envoy/type/{http.upb.h → v3/http.upb.h} +8 -9
  189. data/src/core/ext/upb-generated/envoy/type/{percent.upb.c → v3/percent.upb.c} +9 -8
  190. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +86 -0
  191. data/src/core/ext/upb-generated/envoy/type/{range.upb.c → v3/range.upb.c} +12 -11
  192. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +111 -0
  193. data/src/core/ext/upb-generated/envoy/type/{semantic_version.upb.c → v3/semantic_version.upb.c} +6 -5
  194. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +61 -0
  195. data/src/core/ext/upb-generated/gogoproto/gogo.upb.h +0 -1
  196. data/src/core/ext/upb-generated/google/api/annotations.upb.h +0 -1
  197. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +234 -0
  198. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +759 -0
  199. data/src/core/ext/upb-generated/google/api/http.upb.h +29 -28
  200. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +5 -6
  201. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +39 -39
  202. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +412 -386
  203. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +5 -6
  204. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +1 -2
  205. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +1 -1
  206. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +34 -55
  207. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +5 -6
  208. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +27 -28
  209. data/src/core/ext/upb-generated/google/rpc/status.upb.h +8 -8
  210. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +1 -1
  211. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +32 -45
  212. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +4 -4
  213. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +157 -178
  214. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +14 -13
  215. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +6 -7
  216. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +59 -56
  217. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +11 -12
  218. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +0 -1
  219. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +5 -6
  220. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +27 -0
  221. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +53 -0
  222. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +6 -6
  223. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +41 -68
  224. data/src/core/ext/upb-generated/validate/validate.upb.c +11 -11
  225. data/src/core/ext/upb-generated/validate/validate.upb.h +537 -536
  226. data/src/core/ext/xds/xds_api.cc +2388 -0
  227. data/src/core/ext/{filters/client_channel/xds → xds}/xds_api.h +120 -40
  228. data/src/core/ext/{filters/client_channel/xds → xds}/xds_bootstrap.cc +56 -25
  229. data/src/core/ext/{filters/client_channel/xds → xds}/xds_bootstrap.h +8 -3
  230. data/src/core/ext/{filters/client_channel/xds → xds}/xds_channel.h +4 -4
  231. data/src/core/ext/{filters/client_channel/xds → xds}/xds_channel_args.h +3 -3
  232. data/src/core/ext/{filters/client_channel/xds → xds}/xds_channel_secure.cc +2 -5
  233. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client.cc +94 -347
  234. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client.h +12 -45
  235. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client_stats.cc +2 -2
  236. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client_stats.h +13 -13
  237. data/src/core/lib/channel/channel_trace.cc +2 -6
  238. data/src/core/lib/channel/channelz.cc +19 -30
  239. data/src/core/lib/channel/channelz.h +1 -1
  240. data/src/core/lib/channel/channelz_registry.cc +3 -1
  241. data/src/core/lib/gpr/log_linux.cc +6 -8
  242. data/src/core/lib/gpr/log_posix.cc +6 -8
  243. data/src/core/lib/gpr/string.cc +10 -9
  244. data/src/core/lib/gpr/string.h +4 -2
  245. data/src/core/lib/gpr/sync_posix.cc +2 -8
  246. data/src/core/lib/gprpp/global_config_env.cc +8 -6
  247. data/src/core/lib/http/httpcli.cc +13 -10
  248. data/src/core/lib/http/httpcli_security_connector.cc +5 -5
  249. data/src/core/lib/iomgr/cfstream_handle.cc +1 -0
  250. data/src/core/lib/iomgr/endpoint.cc +5 -1
  251. data/src/core/lib/iomgr/endpoint.h +7 -3
  252. data/src/core/lib/iomgr/endpoint_cfstream.cc +32 -11
  253. data/src/core/lib/iomgr/endpoint_pair_posix.cc +10 -10
  254. data/src/core/lib/iomgr/error_cfstream.cc +9 -8
  255. data/src/core/lib/iomgr/ev_epoll1_linux.cc +5 -6
  256. data/src/core/lib/iomgr/ev_epollex_linux.cc +15 -21
  257. data/src/core/lib/iomgr/ev_poll_posix.cc +6 -5
  258. data/src/core/lib/iomgr/is_epollexclusive_available.cc +14 -0
  259. data/src/core/{ext/filters/client_channel → lib/iomgr}/parse_address.cc +1 -1
  260. data/src/core/{ext/filters/client_channel → lib/iomgr}/parse_address.h +3 -3
  261. data/src/core/lib/iomgr/port.h +1 -21
  262. data/src/core/lib/iomgr/resolve_address_custom.cc +13 -18
  263. data/src/core/lib/iomgr/resolve_address_windows.cc +8 -8
  264. data/src/core/lib/iomgr/resource_quota.cc +34 -31
  265. data/src/core/lib/iomgr/sockaddr_utils.cc +9 -6
  266. data/src/core/lib/iomgr/sockaddr_utils.h +3 -2
  267. data/src/core/lib/iomgr/socket_utils_common_posix.cc +95 -55
  268. data/src/core/lib/iomgr/socket_windows.cc +4 -5
  269. data/src/core/lib/iomgr/tcp_client_cfstream.cc +9 -11
  270. data/src/core/lib/iomgr/tcp_client_custom.cc +6 -9
  271. data/src/core/lib/iomgr/tcp_client_posix.cc +27 -36
  272. data/src/core/lib/iomgr/tcp_client_windows.cc +9 -9
  273. data/src/core/lib/iomgr/tcp_custom.cc +33 -17
  274. data/src/core/lib/iomgr/tcp_custom.h +1 -1
  275. data/src/core/lib/iomgr/tcp_posix.cc +31 -13
  276. data/src/core/lib/iomgr/tcp_server.cc +3 -4
  277. data/src/core/lib/iomgr/tcp_server.h +7 -5
  278. data/src/core/lib/iomgr/tcp_server_custom.cc +6 -14
  279. data/src/core/lib/iomgr/tcp_server_posix.cc +34 -41
  280. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -4
  281. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -7
  282. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +4 -9
  283. data/src/core/lib/iomgr/tcp_server_windows.cc +16 -16
  284. data/src/core/lib/iomgr/tcp_windows.cc +26 -10
  285. data/src/core/lib/iomgr/timer_generic.cc +13 -12
  286. data/src/core/lib/iomgr/udp_server.cc +24 -23
  287. data/src/core/lib/iomgr/udp_server.h +5 -2
  288. data/src/core/lib/iomgr/unix_sockets_posix.cc +9 -14
  289. data/src/core/lib/iomgr/unix_sockets_posix.h +3 -1
  290. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +5 -2
  291. data/src/core/lib/json/json_reader.cc +20 -21
  292. data/src/core/lib/security/authorization/authorization_engine.cc +177 -0
  293. data/src/core/lib/security/authorization/authorization_engine.h +84 -0
  294. data/src/core/lib/security/authorization/evaluate_args.cc +153 -0
  295. data/src/core/lib/security/authorization/evaluate_args.h +59 -0
  296. data/src/core/lib/security/authorization/mock_cel/activation.h +57 -0
  297. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +42 -0
  298. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +68 -0
  299. data/src/core/lib/security/authorization/mock_cel/cel_value.h +93 -0
  300. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +67 -0
  301. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +56 -0
  302. data/src/core/lib/security/authorization/mock_cel/statusor.h +50 -0
  303. data/src/core/lib/security/credentials/credentials.h +5 -3
  304. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +8 -6
  305. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +64 -43
  306. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +7 -4
  307. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +19 -28
  308. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -6
  309. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -0
  310. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +10 -0
  311. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +10 -0
  312. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +11 -12
  313. data/src/core/lib/security/security_connector/security_connector.cc +2 -0
  314. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  315. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +18 -11
  316. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +5 -0
  317. data/src/core/lib/security/security_connector/ssl_utils.cc +44 -23
  318. data/src/core/lib/security/security_connector/ssl_utils.h +6 -2
  319. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +27 -24
  320. data/src/core/lib/security/transport/client_auth_filter.cc +10 -9
  321. data/src/core/lib/security/transport/secure_endpoint.cc +7 -1
  322. data/src/core/lib/security/util/json_util.cc +12 -13
  323. data/src/core/lib/slice/slice.cc +38 -1
  324. data/src/core/lib/slice/slice_internal.h +1 -0
  325. data/src/core/lib/surface/call.cc +52 -53
  326. data/src/core/lib/surface/call.h +2 -1
  327. data/src/core/lib/surface/channel.cc +28 -20
  328. data/src/core/lib/surface/channel.h +12 -2
  329. data/src/core/lib/surface/completion_queue.cc +0 -5
  330. data/src/core/lib/surface/init.cc +1 -1
  331. data/src/core/lib/surface/server.cc +1102 -1347
  332. data/src/core/lib/surface/server.h +369 -71
  333. data/src/core/lib/surface/version.cc +2 -2
  334. data/src/core/lib/transport/authority_override.cc +38 -0
  335. data/src/core/lib/transport/authority_override.h +32 -0
  336. data/src/core/lib/transport/connectivity_state.cc +18 -13
  337. data/src/core/lib/transport/connectivity_state.h +18 -6
  338. data/src/core/lib/transport/error_utils.cc +13 -0
  339. data/src/core/lib/transport/error_utils.h +6 -0
  340. data/src/core/lib/transport/static_metadata.cc +295 -276
  341. data/src/core/lib/transport/static_metadata.h +80 -73
  342. data/src/core/lib/transport/transport.h +13 -0
  343. data/src/core/lib/uri/uri_parser.cc +30 -35
  344. data/src/core/lib/uri/uri_parser.h +3 -1
  345. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -0
  346. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +23 -13
  347. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +24 -0
  348. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +2 -0
  349. data/src/core/tsi/ssl_transport_security.cc +102 -11
  350. data/src/core/tsi/ssl_transport_security.h +14 -2
  351. data/src/core/tsi/transport_security_interface.h +5 -0
  352. data/src/ruby/bin/math_services_pb.rb +4 -4
  353. data/src/ruby/ext/grpc/extconf.rb +5 -2
  354. data/src/ruby/ext/grpc/rb_call.c +3 -2
  355. data/src/ruby/ext/grpc/rb_call.h +4 -0
  356. data/src/ruby/ext/grpc/rb_call_credentials.c +54 -10
  357. data/src/ruby/ext/grpc/rb_channel_credentials.c +9 -0
  358. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -2
  359. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -4
  360. data/src/ruby/lib/grpc/generic/client_stub.rb +1 -1
  361. data/src/ruby/lib/grpc/generic/interceptors.rb +1 -1
  362. data/src/ruby/lib/grpc/version.rb +1 -1
  363. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +2 -2
  364. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +5 -0
  365. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +28 -12
  366. data/src/ruby/spec/channel_credentials_spec.rb +10 -0
  367. data/src/ruby/spec/generic/active_call_spec.rb +19 -8
  368. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_import2.proto +23 -0
  369. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +2 -0
  370. data/src/ruby/spec/pb/codegen/grpc/testing/same_package_service_name.proto +27 -0
  371. data/src/ruby/spec/pb/codegen/grpc/testing/same_ruby_package_service_name.proto +29 -0
  372. data/src/ruby/spec/pb/codegen/package_option_spec.rb +25 -1
  373. data/src/ruby/spec/user_agent_spec.rb +74 -0
  374. data/third_party/abseil-cpp/absl/algorithm/container.h +1727 -0
  375. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +161 -0
  376. data/third_party/abseil-cpp/absl/base/internal/exponential_biased.cc +93 -0
  377. data/third_party/abseil-cpp/absl/base/internal/exponential_biased.h +130 -0
  378. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +620 -0
  379. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +126 -0
  380. data/third_party/abseil-cpp/absl/container/fixed_array.h +515 -0
  381. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +503 -0
  382. data/third_party/abseil-cpp/absl/container/internal/common.h +202 -0
  383. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +440 -0
  384. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +146 -0
  385. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +191 -0
  386. data/third_party/abseil-cpp/absl/container/internal/hashtable_debug_hooks.h +85 -0
  387. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +269 -0
  388. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +297 -0
  389. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +30 -0
  390. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +49 -0
  391. data/third_party/abseil-cpp/absl/container/internal/layout.h +741 -0
  392. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +48 -0
  393. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +1882 -0
  394. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +138 -0
  395. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.h +32 -0
  396. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +1895 -0
  397. data/third_party/abseil-cpp/absl/debugging/internal/demangle.h +71 -0
  398. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +382 -0
  399. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +134 -0
  400. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +192 -0
  401. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +125 -0
  402. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +70 -0
  403. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +99 -0
  404. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +248 -0
  405. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +24 -0
  406. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +85 -0
  407. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +346 -0
  408. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +128 -0
  409. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +194 -0
  410. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.h +158 -0
  411. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +140 -0
  412. data/third_party/abseil-cpp/absl/debugging/stacktrace.h +231 -0
  413. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +25 -0
  414. data/third_party/abseil-cpp/absl/debugging/symbolize.h +99 -0
  415. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +1480 -0
  416. data/third_party/abseil-cpp/absl/debugging/symbolize_unimplemented.inc +40 -0
  417. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +81 -0
  418. data/third_party/abseil-cpp/absl/functional/function_ref.h +139 -0
  419. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +106 -0
  420. data/third_party/abseil-cpp/absl/hash/hash.h +324 -0
  421. data/third_party/abseil-cpp/absl/hash/internal/city.cc +346 -0
  422. data/third_party/abseil-cpp/absl/hash/internal/city.h +96 -0
  423. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +55 -0
  424. data/third_party/abseil-cpp/absl/hash/internal/hash.h +988 -0
  425. data/third_party/abseil-cpp/absl/status/status.cc +447 -0
  426. data/third_party/abseil-cpp/absl/status/status.h +428 -0
  427. data/third_party/abseil-cpp/absl/status/status_payload_printer.cc +43 -0
  428. data/third_party/abseil-cpp/absl/status/status_payload_printer.h +51 -0
  429. data/third_party/abseil-cpp/absl/strings/cord.cc +2019 -0
  430. data/third_party/abseil-cpp/absl/strings/cord.h +1121 -0
  431. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +151 -0
  432. data/third_party/abseil-cpp/absl/synchronization/barrier.cc +52 -0
  433. data/third_party/abseil-cpp/absl/synchronization/barrier.h +79 -0
  434. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +57 -0
  435. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +99 -0
  436. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +140 -0
  437. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +60 -0
  438. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +697 -0
  439. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.h +141 -0
  440. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +155 -0
  441. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +261 -0
  442. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +106 -0
  443. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +115 -0
  444. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +484 -0
  445. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +159 -0
  446. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +2728 -0
  447. data/third_party/abseil-cpp/absl/synchronization/mutex.h +1056 -0
  448. data/third_party/abseil-cpp/absl/synchronization/notification.cc +78 -0
  449. data/third_party/abseil-cpp/absl/synchronization/notification.h +123 -0
  450. data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +64 -0
  451. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +82 -0
  452. data/third_party/abseil-cpp/absl/types/internal/variant.h +1646 -0
  453. data/third_party/abseil-cpp/absl/types/variant.h +861 -0
  454. data/third_party/boringssl-with-bazel/err_data.c +266 -254
  455. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +3 -3
  456. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +3 -3
  457. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +1 -1
  458. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +3 -3
  459. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +2 -2
  460. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +1 -1
  461. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -1
  462. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +1 -1
  463. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +1 -1
  464. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +1 -1
  465. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c +1 -1
  466. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +1 -0
  467. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +12 -52
  468. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +0 -22
  469. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +159 -0
  470. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c +17 -1
  471. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +11 -1
  472. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +2 -1
  473. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +13 -11
  474. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c +24 -23
  475. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +20 -16
  476. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +2 -2
  477. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/util.c +3 -3
  478. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +62 -0
  479. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +456 -0
  480. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +192 -0
  481. data/third_party/boringssl-with-bazel/src/crypto/mem.c +29 -15
  482. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +7 -0
  483. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +36 -5
  484. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +0 -29
  485. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +116 -363
  486. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +7 -45
  487. data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +4 -4
  488. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +8 -0
  489. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +4 -4
  490. data/third_party/boringssl-with-bazel/src/crypto/x509/x509.c +0 -67
  491. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +13 -6
  492. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +10 -0
  493. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +41 -0
  494. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +4 -1
  495. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +28 -9
  496. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +25 -0
  497. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +35 -13
  498. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +0 -154
  499. data/third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c +20 -0
  500. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +28 -6
  501. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +5 -0
  502. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +74 -35
  503. data/third_party/boringssl-with-bazel/src/include/openssl/aes.h +16 -4
  504. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +52 -0
  505. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +22 -22
  506. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +2 -2
  507. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +69 -0
  508. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +72 -23
  509. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +2 -3
  510. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +1 -10
  511. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +800 -715
  512. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +3 -3
  513. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +9 -2
  514. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +2 -2
  515. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +9 -0
  516. data/third_party/boringssl-with-bazel/src/ssl/internal.h +21 -14
  517. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +7 -7
  518. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +3 -6
  519. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +38 -0
  520. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +4 -24
  521. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +5 -5
  522. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +45 -24
  523. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +34 -9
  524. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +31 -21
  525. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +17 -9
  526. data/third_party/boringssl-with-bazel/src/ssl/tls_record.cc +5 -3
  527. data/third_party/re2/re2/bitmap256.h +117 -0
  528. data/third_party/re2/re2/bitstate.cc +385 -0
  529. data/third_party/re2/re2/compile.cc +1279 -0
  530. data/third_party/re2/re2/dfa.cc +2130 -0
  531. data/third_party/re2/re2/filtered_re2.cc +121 -0
  532. data/third_party/re2/re2/filtered_re2.h +109 -0
  533. data/third_party/re2/re2/mimics_pcre.cc +197 -0
  534. data/third_party/re2/re2/nfa.cc +713 -0
  535. data/third_party/re2/re2/onepass.cc +623 -0
  536. data/third_party/re2/re2/parse.cc +2464 -0
  537. data/third_party/re2/re2/perl_groups.cc +119 -0
  538. data/third_party/re2/re2/pod_array.h +55 -0
  539. data/third_party/re2/re2/prefilter.cc +710 -0
  540. data/third_party/re2/re2/prefilter.h +108 -0
  541. data/third_party/re2/re2/prefilter_tree.cc +407 -0
  542. data/third_party/re2/re2/prefilter_tree.h +139 -0
  543. data/third_party/re2/re2/prog.cc +988 -0
  544. data/third_party/re2/re2/prog.h +436 -0
  545. data/third_party/re2/re2/re2.cc +1362 -0
  546. data/third_party/re2/re2/re2.h +1002 -0
  547. data/third_party/re2/re2/regexp.cc +980 -0
  548. data/third_party/re2/re2/regexp.h +659 -0
  549. data/third_party/re2/re2/set.cc +154 -0
  550. data/third_party/re2/re2/set.h +80 -0
  551. data/third_party/re2/re2/simplify.cc +657 -0
  552. data/third_party/re2/re2/sparse_array.h +392 -0
  553. data/third_party/re2/re2/sparse_set.h +264 -0
  554. data/third_party/re2/re2/stringpiece.cc +65 -0
  555. data/third_party/re2/re2/stringpiece.h +210 -0
  556. data/third_party/re2/re2/tostring.cc +351 -0
  557. data/third_party/re2/re2/unicode_casefold.cc +582 -0
  558. data/third_party/re2/re2/unicode_casefold.h +78 -0
  559. data/third_party/re2/re2/unicode_groups.cc +6269 -0
  560. data/third_party/re2/re2/unicode_groups.h +67 -0
  561. data/third_party/re2/re2/walker-inl.h +246 -0
  562. data/third_party/re2/util/benchmark.h +156 -0
  563. data/third_party/re2/util/flags.h +26 -0
  564. data/third_party/re2/util/logging.h +109 -0
  565. data/third_party/re2/util/malloc_counter.h +19 -0
  566. data/third_party/re2/util/mix.h +41 -0
  567. data/third_party/re2/util/mutex.h +148 -0
  568. data/third_party/re2/util/pcre.cc +1025 -0
  569. data/third_party/re2/util/pcre.h +681 -0
  570. data/third_party/re2/util/rune.cc +260 -0
  571. data/third_party/re2/util/strutil.cc +149 -0
  572. data/third_party/re2/util/strutil.h +21 -0
  573. data/third_party/re2/util/test.h +50 -0
  574. data/third_party/re2/util/utf.h +44 -0
  575. data/third_party/re2/util/util.h +42 -0
  576. data/third_party/upb/upb/decode.c +517 -505
  577. data/third_party/upb/upb/encode.c +165 -123
  578. data/third_party/upb/upb/msg.c +130 -64
  579. data/third_party/upb/upb/msg.h +418 -14
  580. data/third_party/upb/upb/port_def.inc +35 -6
  581. data/third_party/upb/upb/port_undef.inc +8 -1
  582. data/third_party/upb/upb/table.c +53 -86
  583. data/third_party/upb/upb/table.int.h +11 -52
  584. data/third_party/upb/upb/upb.c +151 -125
  585. data/third_party/upb/upb/upb.h +91 -147
  586. data/third_party/upb/upb/upb.hpp +88 -0
  587. metadata +310 -148
  588. data/src/core/ext/filters/client_channel/xds/xds_api.cc +0 -1906
  589. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +0 -21
  590. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +0 -35
  591. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c +0 -114
  592. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +0 -418
  593. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c +0 -72
  594. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +0 -197
  595. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c +0 -105
  596. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +0 -378
  597. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +0 -53
  598. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +0 -403
  599. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +0 -1447
  600. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +0 -74
  601. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +0 -218
  602. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h +0 -69
  603. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h +0 -305
  604. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +0 -112
  605. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +0 -328
  606. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +0 -78
  607. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +0 -313
  608. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +0 -897
  609. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +0 -96
  610. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +0 -322
  611. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c +0 -34
  612. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +0 -72
  613. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +0 -197
  614. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +0 -642
  615. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +0 -172
  616. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +0 -673
  617. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h +0 -80
  618. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +0 -152
  619. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +0 -518
  620. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +0 -89
  621. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +0 -129
  622. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h +0 -392
  623. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +0 -53
  624. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +0 -92
  625. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +0 -240
  626. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +0 -18
  627. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +0 -33
  628. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +0 -91
  629. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +0 -266
  630. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +0 -112
  631. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h +0 -324
  632. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +0 -53
  633. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +0 -109
  634. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +0 -399
  635. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +0 -18
  636. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h +0 -33
  637. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +0 -145
  638. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +0 -527
  639. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +0 -43
  640. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h +0 -112
  641. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +0 -53
  642. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +0 -63
  643. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +0 -199
  644. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +0 -18
  645. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h +0 -33
  646. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +0 -815
  647. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +0 -3032
  648. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +0 -59
  649. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +0 -134
  650. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +0 -53
  651. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +0 -228
  652. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +0 -725
  653. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +0 -316
  654. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +0 -1132
  655. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +0 -65
  656. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c +0 -51
  657. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +0 -125
  658. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h +0 -50
  659. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +0 -54
  660. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +0 -134
  661. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +0 -63
  662. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +0 -144
  663. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +0 -53
  664. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +0 -133
  665. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +0 -88
  666. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +0 -258
  667. data/src/core/ext/upb-generated/envoy/type/percent.upb.h +0 -87
  668. data/src/core/ext/upb-generated/envoy/type/range.upb.h +0 -112
  669. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +0 -62
  670. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +0 -89
  671. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +0 -249
  672. data/src/core/lib/security/transport/target_authority_table.cc +0 -75
  673. data/src/core/lib/security/transport/target_authority_table.h +0 -40
  674. data/src/core/lib/slice/slice_hash_table.h +0 -199
  675. data/src/core/lib/slice/slice_weak_hash_table.h +0 -102
  676. data/third_party/upb/upb/generated_util.h +0 -105
@@ -24,11 +24,12 @@
24
24
  #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
25
25
  #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
26
26
  #include "src/core/ext/filters/client_channel/service_config.h"
27
- #include "src/core/ext/filters/client_channel/xds/xds_client.h"
27
+ #include "src/core/ext/xds/xds_client.h"
28
28
  #include "src/core/lib/channel/channel_args.h"
29
29
  #include "src/core/lib/gprpp/memory.h"
30
30
  #include "src/core/lib/gprpp/orphanable.h"
31
31
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
32
+ #include "src/core/lib/transport/error_utils.h"
32
33
 
33
34
  namespace grpc_core {
34
35
 
@@ -79,7 +80,7 @@ class CdsLb : public LoadBalancingPolicy {
79
80
  explicit Helper(RefCountedPtr<CdsLb> parent) : parent_(std::move(parent)) {}
80
81
  RefCountedPtr<SubchannelInterface> CreateSubchannel(
81
82
  const grpc_channel_args& args) override;
82
- void UpdateState(grpc_connectivity_state state,
83
+ void UpdateState(grpc_connectivity_state state, const absl::Status& status,
83
84
  std::unique_ptr<SubchannelPicker> picker) override;
84
85
  void RequestReresolution() override;
85
86
  void AddTraceEvent(TraceSeverity severity,
@@ -209,7 +210,7 @@ void CdsLb::ClusterWatcher::OnError(grpc_error* error) {
209
210
  // we keep running with the data we had previously.
210
211
  if (parent_->child_policy_ == nullptr) {
211
212
  parent_->channel_control_helper()->UpdateState(
212
- GRPC_CHANNEL_TRANSIENT_FAILURE,
213
+ GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(error),
213
214
  absl::make_unique<TransientFailurePicker>(error));
214
215
  } else {
215
216
  GRPC_ERROR_UNREF(error);
@@ -221,13 +222,15 @@ void CdsLb::ClusterWatcher::OnResourceDoesNotExist() {
221
222
  "[cdslb %p] CDS resource for %s does not exist -- reporting "
222
223
  "TRANSIENT_FAILURE",
223
224
  parent_.get(), parent_->config_->cluster().c_str());
225
+ grpc_error* error = grpc_error_set_int(
226
+ GRPC_ERROR_CREATE_FROM_COPIED_STRING(
227
+ absl::StrCat("CDS resource \"", parent_->config_->cluster(),
228
+ "\" does not exist")
229
+ .c_str()),
230
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
224
231
  parent_->channel_control_helper()->UpdateState(
225
- GRPC_CHANNEL_TRANSIENT_FAILURE,
226
- absl::make_unique<TransientFailurePicker>(
227
- GRPC_ERROR_CREATE_FROM_COPIED_STRING(
228
- absl::StrCat("CDS resource \"", parent_->config_->cluster(),
229
- "\" does not exist")
230
- .c_str())));
232
+ GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(error),
233
+ absl::make_unique<TransientFailurePicker>(error));
231
234
  parent_->MaybeDestroyChildPolicyLocked();
232
235
  }
233
236
 
@@ -242,13 +245,16 @@ RefCountedPtr<SubchannelInterface> CdsLb::Helper::CreateSubchannel(
242
245
  }
243
246
 
244
247
  void CdsLb::Helper::UpdateState(grpc_connectivity_state state,
248
+ const absl::Status& status,
245
249
  std::unique_ptr<SubchannelPicker> picker) {
246
250
  if (parent_->shutting_down_ || parent_->child_policy_ == nullptr) return;
247
251
  if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
248
- gpr_log(GPR_INFO, "[cdslb %p] state updated by child: %s", this,
249
- ConnectivityStateName(state));
252
+ gpr_log(GPR_INFO,
253
+ "[cdslb %p] state updated by child: %s message_state: (%s)", this,
254
+ ConnectivityStateName(state), status.ToString().c_str());
250
255
  }
251
- parent_->channel_control_helper()->UpdateState(state, std::move(picker));
256
+ parent_->channel_control_helper()->UpdateState(state, status,
257
+ std::move(picker));
252
258
  }
253
259
 
254
260
  void CdsLb::Helper::RequestReresolution() {
@@ -32,14 +32,15 @@
32
32
  #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
33
33
  #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
34
34
  #include "src/core/ext/filters/client_channel/server_address.h"
35
- #include "src/core/ext/filters/client_channel/xds/xds_channel_args.h"
36
- #include "src/core/ext/filters/client_channel/xds/xds_client.h"
37
- #include "src/core/ext/filters/client_channel/xds/xds_client_stats.h"
35
+ #include "src/core/ext/xds/xds_channel_args.h"
36
+ #include "src/core/ext/xds/xds_client.h"
37
+ #include "src/core/ext/xds/xds_client_stats.h"
38
38
  #include "src/core/lib/channel/channel_args.h"
39
39
  #include "src/core/lib/gprpp/orphanable.h"
40
40
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
41
41
  #include "src/core/lib/iomgr/timer.h"
42
42
  #include "src/core/lib/iomgr/work_serializer.h"
43
+ #include "src/core/lib/transport/error_utils.h"
43
44
  #include "src/core/lib/uri/uri_parser.h"
44
45
 
45
46
  #define GRPC_EDS_DEFAULT_FALLBACK_TIMEOUT 10000
@@ -133,7 +134,7 @@ class EdsLb : public LoadBalancingPolicy {
133
134
 
134
135
  RefCountedPtr<SubchannelInterface> CreateSubchannel(
135
136
  const grpc_channel_args& args) override;
136
- void UpdateState(grpc_connectivity_state state,
137
+ void UpdateState(grpc_connectivity_state state, const absl::Status& status,
137
138
  std::unique_ptr<SubchannelPicker> picker) override;
138
139
  // This is a no-op, because we get the addresses from the xds
139
140
  // client, which is a watch-based API.
@@ -214,6 +215,7 @@ class EdsLb : public LoadBalancingPolicy {
214
215
 
215
216
  // The latest state and picker returned from the child policy.
216
217
  grpc_connectivity_state child_state_;
218
+ absl::Status child_status_;
217
219
  RefCountedPtr<ChildPickerWrapper> child_picker_;
218
220
  };
219
221
 
@@ -265,16 +267,21 @@ RefCountedPtr<SubchannelInterface> EdsLb::Helper::CreateSubchannel(
265
267
  }
266
268
 
267
269
  void EdsLb::Helper::UpdateState(grpc_connectivity_state state,
270
+ const absl::Status& status,
268
271
  std::unique_ptr<SubchannelPicker> picker) {
269
272
  if (eds_policy_->shutting_down_ || eds_policy_->child_policy_ == nullptr) {
270
273
  return;
271
274
  }
272
275
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) {
273
- gpr_log(GPR_INFO, "[edslb %p] child policy updated state=%s picker=%p",
274
- eds_policy_.get(), ConnectivityStateName(state), picker.get());
276
+ gpr_log(GPR_INFO,
277
+ "[edslb %p] child policy updated state=%s (%s) "
278
+ "picker=%p",
279
+ eds_policy_.get(), ConnectivityStateName(state),
280
+ status.ToString().c_str(), picker.get());
275
281
  }
276
282
  // Save the state and picker.
277
283
  eds_policy_->child_state_ = state;
284
+ eds_policy_->child_status_ = status;
278
285
  eds_policy_->child_picker_ =
279
286
  MakeRefCounted<ChildPickerWrapper>(std::move(picker));
280
287
  // Wrap the picker in a DropPicker and pass it up.
@@ -339,7 +346,7 @@ class EdsLb::EndpointWatcher : public XdsClient::EndpointWatcherInterface {
339
346
  // we keep running with the data we had previously.
340
347
  if (eds_policy_->child_policy_ == nullptr) {
341
348
  eds_policy_->channel_control_helper()->UpdateState(
342
- GRPC_CHANNEL_TRANSIENT_FAILURE,
349
+ GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(error),
343
350
  absl::make_unique<TransientFailurePicker>(error));
344
351
  } else {
345
352
  GRPC_ERROR_UNREF(error);
@@ -351,11 +358,12 @@ class EdsLb::EndpointWatcher : public XdsClient::EndpointWatcherInterface {
351
358
  GPR_ERROR,
352
359
  "[edslb %p] EDS resource does not exist -- reporting TRANSIENT_FAILURE",
353
360
  eds_policy_.get());
361
+ grpc_error* error = grpc_error_set_int(
362
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("EDS resource does not exist"),
363
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
354
364
  eds_policy_->channel_control_helper()->UpdateState(
355
- GRPC_CHANNEL_TRANSIENT_FAILURE,
356
- absl::make_unique<TransientFailurePicker>(
357
- GRPC_ERROR_CREATE_FROM_STATIC_STRING(
358
- "EDS resource does not exist")));
365
+ GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(error),
366
+ absl::make_unique<TransientFailurePicker>(error));
359
367
  eds_policy_->MaybeDestroyChildPolicyLocked();
360
368
  }
361
369
 
@@ -688,7 +696,7 @@ EdsLb::CreateChildPolicyConfigLocked() {
688
696
  error),
689
697
  GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL);
690
698
  channel_control_helper()->UpdateState(
691
- GRPC_CHANNEL_TRANSIENT_FAILURE,
699
+ GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_to_absl_status(error),
692
700
  absl::make_unique<TransientFailurePicker>(error));
693
701
  return nullptr;
694
702
  }
@@ -769,13 +777,13 @@ void EdsLb::MaybeUpdateDropPickerLocked() {
769
777
  // If we're dropping all calls, report READY, regardless of what (or
770
778
  // whether) the child has reported.
771
779
  if (drop_config_ != nullptr && drop_config_->drop_all()) {
772
- channel_control_helper()->UpdateState(GRPC_CHANNEL_READY,
780
+ channel_control_helper()->UpdateState(GRPC_CHANNEL_READY, absl::Status(),
773
781
  absl::make_unique<DropPicker>(this));
774
782
  return;
775
783
  }
776
784
  // Update only if we have a child picker.
777
785
  if (child_picker_ != nullptr) {
778
- channel_control_helper()->UpdateState(child_state_,
786
+ channel_control_helper()->UpdateState(child_state_, child_status_,
779
787
  absl::make_unique<DropPicker>(this));
780
788
  }
781
789
  }
@@ -22,8 +22,8 @@
22
22
  #include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h"
23
23
  #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
24
24
  #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
25
- #include "src/core/ext/filters/client_channel/xds/xds_client.h"
26
- #include "src/core/ext/filters/client_channel/xds/xds_client_stats.h"
25
+ #include "src/core/ext/xds/xds_client.h"
26
+ #include "src/core/ext/xds/xds_client_stats.h"
27
27
  #include "src/core/lib/channel/channel_args.h"
28
28
  #include "src/core/lib/gprpp/orphanable.h"
29
29
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
@@ -120,7 +120,7 @@ class LrsLb : public LoadBalancingPolicy {
120
120
 
121
121
  RefCountedPtr<SubchannelInterface> CreateSubchannel(
122
122
  const grpc_channel_args& args) override;
123
- void UpdateState(grpc_connectivity_state state,
123
+ void UpdateState(grpc_connectivity_state state, const absl::Status& status,
124
124
  std::unique_ptr<SubchannelPicker> picker) override;
125
125
  void RequestReresolution() override;
126
126
  void AddTraceEvent(TraceSeverity severity,
@@ -157,6 +157,7 @@ class LrsLb : public LoadBalancingPolicy {
157
157
 
158
158
  // Latest state and picker reported by the child policy.
159
159
  grpc_connectivity_state state_ = GRPC_CHANNEL_IDLE;
160
+ absl::Status status_;
160
161
  RefCountedPtr<RefCountedPicker> picker_;
161
162
  };
162
163
 
@@ -266,10 +267,14 @@ void LrsLb::MaybeUpdatePickerLocked() {
266
267
  auto lrs_picker =
267
268
  absl::make_unique<LoadReportingPicker>(picker_, locality_stats_);
268
269
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_lrs_trace)) {
269
- gpr_log(GPR_INFO, "[lrs_lb %p] updating connectivity: state=%s picker=%p",
270
- this, ConnectivityStateName(state_), lrs_picker.get());
270
+ gpr_log(
271
+ GPR_INFO,
272
+ "[lrs_lb %p] updating connectivity: state=%s status=(%s) picker=%p",
273
+ this, ConnectivityStateName(state_), status_.ToString().c_str(),
274
+ lrs_picker.get());
271
275
  }
272
- channel_control_helper()->UpdateState(state_, std::move(lrs_picker));
276
+ channel_control_helper()->UpdateState(state_, status_,
277
+ std::move(lrs_picker));
273
278
  }
274
279
  }
275
280
 
@@ -325,15 +330,19 @@ RefCountedPtr<SubchannelInterface> LrsLb::Helper::CreateSubchannel(
325
330
  }
326
331
 
327
332
  void LrsLb::Helper::UpdateState(grpc_connectivity_state state,
333
+ const absl::Status& status,
328
334
  std::unique_ptr<SubchannelPicker> picker) {
329
335
  if (lrs_policy_->shutting_down_) return;
330
336
  if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_lrs_trace)) {
331
- gpr_log(GPR_INFO,
332
- "[lrs_lb %p] child connectivity state update: state=%s picker=%p",
333
- lrs_policy_.get(), ConnectivityStateName(state), picker.get());
337
+ gpr_log(
338
+ GPR_INFO,
339
+ "[lrs_lb %p] child connectivity state update: state=%s (%s) picker=%p",
340
+ lrs_policy_.get(), ConnectivityStateName(state),
341
+ status.ToString().c_str(), picker.get());
334
342
  }
335
343
  // Save the state and picker.
336
344
  lrs_policy_->state_ = state;
345
+ lrs_policy_->status_ = status;
337
346
  lrs_policy_->picker_ = MakeRefCounted<RefCountedPicker>(std::move(picker));
338
347
  // Wrap the picker and return it to the channel.
339
348
  lrs_policy_->MaybeUpdatePickerLocked();
@@ -20,9 +20,14 @@
20
20
  #include <limits.h>
21
21
  #include <string.h>
22
22
 
23
+ #include "absl/container/inlined_vector.h"
24
+ #include "absl/strings/match.h"
25
+ #include "absl/strings/numbers.h"
23
26
  #include "absl/strings/str_cat.h"
27
+ #include "absl/strings/str_join.h"
24
28
  #include "absl/strings/str_split.h"
25
29
  #include "absl/strings/string_view.h"
30
+ #include "re2/re2.h"
26
31
 
27
32
  #include <grpc/grpc.h>
28
33
 
@@ -30,12 +35,14 @@
30
35
  #include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h"
31
36
  #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
32
37
  #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
38
+ #include "src/core/ext/xds/xds_api.h"
33
39
  #include "src/core/lib/channel/channel_args.h"
34
40
  #include "src/core/lib/gpr/string.h"
35
41
  #include "src/core/lib/gprpp/orphanable.h"
36
42
  #include "src/core/lib/gprpp/ref_counted_ptr.h"
37
43
  #include "src/core/lib/iomgr/timer.h"
38
44
  #include "src/core/lib/iomgr/work_serializer.h"
45
+ #include "src/core/lib/transport/error_utils.h"
39
46
 
40
47
  #define GRPC_XDS_ROUTING_CHILD_RETENTION_INTERVAL_MS (15 * 60 * 1000)
41
48
 
@@ -50,12 +57,8 @@ constexpr char kXdsRouting[] = "xds_routing_experimental";
50
57
  // Config for xds_routing LB policy.
51
58
  class XdsRoutingLbConfig : public LoadBalancingPolicy::Config {
52
59
  public:
53
- struct Matcher {
54
- std::string service;
55
- std::string method;
56
- };
57
60
  struct Route {
58
- Matcher matcher;
61
+ XdsApi::Route::Matchers matchers;
59
62
  std::string action;
60
63
  };
61
64
  using RouteTable = std::vector<Route>;
@@ -109,20 +112,24 @@ class XdsRoutingLb : public LoadBalancingPolicy {
109
112
  class RoutePicker : public SubchannelPicker {
110
113
  public:
111
114
  struct Route {
112
- XdsRoutingLbConfig::Matcher matcher;
115
+ const XdsApi::Route::Matchers* matchers;
113
116
  RefCountedPtr<ChildPickerWrapper> picker;
114
117
  };
115
118
 
116
119
  // Maintains an ordered xds route table as provided by RDS response.
117
120
  using RouteTable = std::vector<Route>;
118
121
 
119
- explicit RoutePicker(RouteTable route_table)
120
- : route_table_(std::move(route_table)) {}
122
+ RoutePicker(RouteTable route_table,
123
+ RefCountedPtr<XdsRoutingLbConfig> config)
124
+ : route_table_(std::move(route_table)), config_(std::move(config)) {}
121
125
 
122
126
  PickResult Pick(PickArgs args) override;
123
127
 
124
128
  private:
125
129
  RouteTable route_table_;
130
+ // Take a reference to config so that we can use
131
+ // XdsApi::Route::Matchers from it.
132
+ RefCountedPtr<XdsRoutingLbConfig> config_;
126
133
  };
127
134
 
128
135
  // Each XdsRoutingChild holds a ref to its parent XdsRoutingLb.
@@ -159,6 +166,7 @@ class XdsRoutingLb : public LoadBalancingPolicy {
159
166
  RefCountedPtr<SubchannelInterface> CreateSubchannel(
160
167
  const grpc_channel_args& args) override;
161
168
  void UpdateState(grpc_connectivity_state state,
169
+ const absl::Status& status,
162
170
  std::unique_ptr<SubchannelPicker> picker) override;
163
171
  void RequestReresolution() override;
164
172
  void AddTraceEvent(TraceSeverity severity,
@@ -179,7 +187,7 @@ class XdsRoutingLb : public LoadBalancingPolicy {
179
187
  RefCountedPtr<XdsRoutingLb> xds_routing_policy_;
180
188
 
181
189
  // Points to the corresponding key in XdsRoutingLb::actions_.
182
- const std::string& name_;
190
+ const std::string name_;
183
191
 
184
192
  OrphanablePtr<LoadBalancingPolicy> child_policy_;
185
193
 
@@ -214,26 +222,121 @@ class XdsRoutingLb : public LoadBalancingPolicy {
214
222
  // XdsRoutingLb::RoutePicker
215
223
  //
216
224
 
217
- XdsRoutingLb::PickResult XdsRoutingLb::RoutePicker::Pick(PickArgs args) {
218
- absl::string_view path;
219
- // TODO(roth): Using const auto& here trigger a warning in a macos or windows
220
- // build:
221
- //*(args.initial_metadata) is returning values not references.
222
- for (const auto p : *(args.initial_metadata)) {
223
- if (p.first == ":path") {
224
- path = p.second;
225
- break;
225
+ bool PathMatch(const absl::string_view& path,
226
+ const XdsApi::Route::Matchers::PathMatcher& path_matcher) {
227
+ switch (path_matcher.type) {
228
+ case XdsApi::Route::Matchers::PathMatcher::PathMatcherType::PREFIX:
229
+ return absl::StartsWith(path, path_matcher.string_matcher);
230
+ case XdsApi::Route::Matchers::PathMatcher::PathMatcherType::PATH:
231
+ return path == path_matcher.string_matcher;
232
+ case XdsApi::Route::Matchers::PathMatcher::PathMatcherType::REGEX:
233
+ return RE2::FullMatch(path.data(), *path_matcher.regex_matcher);
234
+ default:
235
+ return false;
236
+ }
237
+ }
238
+
239
+ absl::optional<absl::string_view> GetMetadataValue(
240
+ const std::string& key,
241
+ LoadBalancingPolicy::MetadataInterface* initial_metadata,
242
+ std::string* concatenated_value) {
243
+ // Find all values for the specified key.
244
+ GPR_DEBUG_ASSERT(initial_metadata != nullptr);
245
+ absl::InlinedVector<absl::string_view, 1> values;
246
+ for (const auto p : *initial_metadata) {
247
+ if (p.first == key) values.push_back(p.second);
248
+ }
249
+ // If none found, no match.
250
+ if (values.empty()) return absl::nullopt;
251
+ // If exactly one found, return it as-is.
252
+ if (values.size() == 1) return values.front();
253
+ // If more than one found, concatenate the values, using
254
+ // *concatenated_values as a temporary holding place for the
255
+ // concatenated string.
256
+ *concatenated_value = absl::StrJoin(values, ",");
257
+ return *concatenated_value;
258
+ }
259
+
260
+ bool HeaderMatchHelper(
261
+ const XdsApi::Route::Matchers::HeaderMatcher& header_matcher,
262
+ LoadBalancingPolicy::MetadataInterface* initial_metadata) {
263
+ std::string concatenated_value;
264
+ absl::optional<absl::string_view> value;
265
+ // Note: If we ever allow binary headers here, we still need to
266
+ // special-case ignore "grpc-tags-bin" and "grpc-trace-bin", since
267
+ // they are not visible to the LB policy in grpc-go.
268
+ if (absl::EndsWith(header_matcher.name, "-bin") ||
269
+ header_matcher.name == "grpc-previous-rpc-attempts") {
270
+ value = absl::nullopt;
271
+ } else if (header_matcher.name == "content-type") {
272
+ value = "application/grpc";
273
+ } else {
274
+ value = GetMetadataValue(header_matcher.name, initial_metadata,
275
+ &concatenated_value);
276
+ }
277
+ if (!value.has_value()) {
278
+ if (header_matcher.type ==
279
+ XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::PRESENT) {
280
+ return !header_matcher.present_match;
281
+ } else {
282
+ // For all other header matcher types, we need the header value to
283
+ // exist to consider matches.
284
+ return false;
226
285
  }
227
286
  }
228
- std::vector<absl::string_view> path_elements =
229
- absl::StrSplit(path.substr(1), '/');
287
+ switch (header_matcher.type) {
288
+ case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::EXACT:
289
+ return value.value() == header_matcher.string_matcher;
290
+ case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::REGEX:
291
+ return RE2::FullMatch(value.value().data(), *header_matcher.regex_match);
292
+ case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::RANGE:
293
+ int64_t int_value;
294
+ if (!absl::SimpleAtoi(value.value(), &int_value)) {
295
+ return false;
296
+ }
297
+ return int_value >= header_matcher.range_start &&
298
+ int_value < header_matcher.range_end;
299
+ case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::PREFIX:
300
+ return absl::StartsWith(value.value(), header_matcher.string_matcher);
301
+ case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::SUFFIX:
302
+ return absl::EndsWith(value.value(), header_matcher.string_matcher);
303
+ default:
304
+ return false;
305
+ }
306
+ }
307
+
308
+ bool HeadersMatch(
309
+ const std::vector<XdsApi::Route::Matchers::HeaderMatcher>& header_matchers,
310
+ LoadBalancingPolicy::MetadataInterface* initial_metadata) {
311
+ for (const auto& header_matcher : header_matchers) {
312
+ bool match = HeaderMatchHelper(header_matcher, initial_metadata);
313
+ if (header_matcher.invert_match) match = !match;
314
+ if (!match) return false;
315
+ }
316
+ return true;
317
+ }
318
+
319
+ bool UnderFraction(const uint32_t fraction_per_million) {
320
+ // Generate a random number in [0, 1000000).
321
+ const uint32_t random_number = rand() % 1000000;
322
+ return random_number < fraction_per_million;
323
+ }
324
+
325
+ XdsRoutingLb::PickResult XdsRoutingLb::RoutePicker::Pick(PickArgs args) {
230
326
  for (const Route& route : route_table_) {
231
- if ((path_elements[0] == route.matcher.service &&
232
- (path_elements[1] == route.matcher.method ||
233
- route.matcher.method.empty())) ||
234
- (route.matcher.service.empty() && route.matcher.method.empty())) {
235
- return route.picker->Pick(args);
327
+ // Path matching.
328
+ if (!PathMatch(args.path, route.matchers->path_matcher)) continue;
329
+ // Header Matching.
330
+ if (!HeadersMatch(route.matchers->header_matchers, args.initial_metadata)) {
331
+ continue;
332
+ }
333
+ // Match fraction check
334
+ if (route.matchers->fraction_per_million.has_value() &&
335
+ !UnderFraction(route.matchers->fraction_per_million.value())) {
336
+ continue;
236
337
  }
338
+ // Found a match
339
+ return route.picker->Pick(args);
237
340
  }
238
341
  PickResult result;
239
342
  result.type = PickResult::PICK_FAILED;
@@ -294,9 +397,10 @@ void XdsRoutingLb::UpdateLocked(UpdateArgs args) {
294
397
  const RefCountedPtr<LoadBalancingPolicy::Config>& config = p.second;
295
398
  auto it = actions_.find(name);
296
399
  if (it == actions_.end()) {
297
- it = actions_.emplace(std::make_pair(name, nullptr)).first;
298
- it->second = MakeOrphanable<XdsRoutingChild>(
299
- Ref(DEBUG_LOCATION, "XdsRoutingChild"), it->first);
400
+ it = actions_
401
+ .emplace(name, MakeOrphanable<XdsRoutingChild>(
402
+ Ref(DEBUG_LOCATION, "XdsRoutingChild"), name))
403
+ .first;
300
404
  }
301
405
  it->second->UpdateLocked(config, args.addresses, args.args);
302
406
  }
@@ -353,12 +457,13 @@ void XdsRoutingLb::UpdateStateLocked() {
353
457
  ConnectivityStateName(connectivity_state));
354
458
  }
355
459
  std::unique_ptr<SubchannelPicker> picker;
460
+ absl::Status status;
356
461
  switch (connectivity_state) {
357
462
  case GRPC_CHANNEL_READY: {
358
463
  RoutePicker::RouteTable route_table;
359
464
  for (const auto& config_route : config_->route_table()) {
360
465
  RoutePicker::Route route;
361
- route.matcher = config_route.matcher;
466
+ route.matchers = &config_route.matchers;
362
467
  route.picker = actions_[config_route.action]->picker_wrapper();
363
468
  if (route.picker == nullptr) {
364
469
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_routing_lb_trace)) {
@@ -373,7 +478,7 @@ void XdsRoutingLb::UpdateStateLocked() {
373
478
  }
374
479
  route_table.push_back(std::move(route));
375
480
  }
376
- picker = absl::make_unique<RoutePicker>(std::move(route_table));
481
+ picker = absl::make_unique<RoutePicker>(std::move(route_table), config_);
377
482
  break;
378
483
  }
379
484
  case GRPC_CHANNEL_CONNECTING:
@@ -382,12 +487,15 @@ void XdsRoutingLb::UpdateStateLocked() {
382
487
  absl::make_unique<QueuePicker>(Ref(DEBUG_LOCATION, "QueuePicker"));
383
488
  break;
384
489
  default:
385
- picker = absl::make_unique<TransientFailurePicker>(grpc_error_set_int(
490
+ grpc_error* error = grpc_error_set_int(
386
491
  GRPC_ERROR_CREATE_FROM_STATIC_STRING(
387
492
  "TRANSIENT_FAILURE from XdsRoutingLb"),
388
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE));
493
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
494
+ status = grpc_error_to_absl_status(error);
495
+ picker = absl::make_unique<TransientFailurePicker>(error);
389
496
  }
390
- channel_control_helper()->UpdateState(connectivity_state, std::move(picker));
497
+ channel_control_helper()->UpdateState(connectivity_state, status,
498
+ std::move(picker));
391
499
  }
392
500
 
393
501
  //
@@ -543,13 +651,15 @@ XdsRoutingLb::XdsRoutingChild::Helper::CreateSubchannel(
543
651
  }
544
652
 
545
653
  void XdsRoutingLb::XdsRoutingChild::Helper::UpdateState(
546
- grpc_connectivity_state state, std::unique_ptr<SubchannelPicker> picker) {
654
+ grpc_connectivity_state state, const absl::Status& status,
655
+ std::unique_ptr<SubchannelPicker> picker) {
547
656
  if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_routing_lb_trace)) {
548
657
  gpr_log(GPR_INFO,
549
- "[xds_routing_lb %p] child %s: received update: state=%s picker=%p",
658
+ "[xds_routing_lb %p] child %s: received update: state=%s (%s) "
659
+ "picker=%p",
550
660
  xds_routing_child_->xds_routing_policy_.get(),
551
661
  xds_routing_child_->name_.c_str(), ConnectivityStateName(state),
552
- picker.get());
662
+ status.ToString().c_str(), picker.get());
553
663
  }
554
664
  if (xds_routing_child_->xds_routing_policy_->shutting_down_) return;
555
665
  // Cache the picker in the XdsRoutingChild.
@@ -683,12 +793,6 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory {
683
793
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("no valid routes configured");
684
794
  error_list.push_back(error);
685
795
  }
686
- if (!route_table.back().matcher.service.empty() ||
687
- !route_table.back().matcher.method.empty()) {
688
- grpc_error* error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
689
- "default route must not contain service or method");
690
- error_list.push_back(error);
691
- }
692
796
  if (!actions_to_be_used.empty()) {
693
797
  error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
694
798
  "some actions were not referenced by any route"));
@@ -731,62 +835,265 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory {
731
835
  return error_list;
732
836
  }
733
837
 
734
- static std::vector<grpc_error*> ParseMethodName(
735
- const Json& json, XdsRoutingLbConfig::Matcher* route_config) {
838
+ static std::vector<grpc_error*> ParseRoute(
839
+ const Json& json, const XdsRoutingLbConfig::ActionMap& action_map,
840
+ XdsRoutingLbConfig::Route* route,
841
+ std::set<std::string /*action_name*/>* actions_to_be_used) {
736
842
  std::vector<grpc_error*> error_list;
737
843
  if (json.type() != Json::Type::OBJECT) {
738
844
  error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
739
845
  "value should be of type object"));
740
846
  return error_list;
741
847
  }
742
- // Parse service
743
- auto it = json.object_value().find("service");
848
+ // Parse and ensure one and only one path matcher is set: prefix, path, or
849
+ // regex.
850
+ bool path_matcher_seen = false;
851
+ auto it = json.object_value().find("prefix");
744
852
  if (it != json.object_value().end()) {
745
853
  if (it->second.type() != Json::Type::STRING) {
746
854
  error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
747
- "field:service error: should be string"));
855
+ "field:prefix error: should be string"));
748
856
  } else {
749
- route_config->service = it->second.string_value();
857
+ path_matcher_seen = true;
858
+ route->matchers.path_matcher.type =
859
+ XdsApi::Route::Matchers::PathMatcher::PathMatcherType::PREFIX;
860
+ route->matchers.path_matcher.string_matcher = it->second.string_value();
750
861
  }
751
862
  }
752
- // Parse method
753
- it = json.object_value().find("method");
863
+ it = json.object_value().find("path");
754
864
  if (it != json.object_value().end()) {
755
- if (it->second.type() != Json::Type::STRING) {
865
+ if (path_matcher_seen) {
756
866
  error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
757
- "field:method error: should be string"));
867
+ "field:path error: other path matcher already specified"));
758
868
  } else {
759
- route_config->method = it->second.string_value();
869
+ path_matcher_seen = true;
870
+ if (it->second.type() != Json::Type::STRING) {
871
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
872
+ "field:path error: should be string"));
873
+ } else {
874
+ route->matchers.path_matcher.type =
875
+ XdsApi::Route::Matchers::PathMatcher::PathMatcherType::PATH;
876
+ route->matchers.path_matcher.string_matcher =
877
+ it->second.string_value();
878
+ }
760
879
  }
761
880
  }
762
- if (route_config->service.empty() && !route_config->method.empty()) {
763
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
764
- "service is empty when method is not"));
881
+ it = json.object_value().find("regex");
882
+ if (it != json.object_value().end()) {
883
+ if (path_matcher_seen) {
884
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
885
+ "field:regex error: other path matcher already specified"));
886
+ } else {
887
+ path_matcher_seen = true;
888
+ if (it->second.type() != Json::Type::STRING) {
889
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
890
+ "field:regex error: should be string"));
891
+ } else {
892
+ route->matchers.path_matcher.type =
893
+ XdsApi::Route::Matchers::PathMatcher::PathMatcherType::REGEX;
894
+ route->matchers.path_matcher.regex_matcher =
895
+ absl::make_unique<RE2>(it->second.string_value());
896
+ }
897
+ }
765
898
  }
766
- return error_list;
767
- }
768
-
769
- static std::vector<grpc_error*> ParseRoute(
770
- const Json& json, const XdsRoutingLbConfig::ActionMap& action_map,
771
- XdsRoutingLbConfig::Route* route,
772
- std::set<std::string /*action_name*/>* actions_to_be_used) {
773
- std::vector<grpc_error*> error_list;
774
- if (json.type() != Json::Type::OBJECT) {
899
+ if (!path_matcher_seen) {
775
900
  error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
776
- "value should be of type object"));
777
- return error_list;
901
+ "one path matcher: prefix, path, or regex is required"));
778
902
  }
779
- // Parse MethodName.
780
- auto it = json.object_value().find("methodName");
781
- if (it == json.object_value().end()) {
782
- error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
783
- "field:methodName error:required field missing"));
784
- } else {
785
- std::vector<grpc_error*> method_name_errors =
786
- ParseMethodName(it->second, &route->matcher);
787
- if (!method_name_errors.empty()) {
788
- error_list.push_back(GRPC_ERROR_CREATE_FROM_VECTOR(
789
- "field:methodName", &method_name_errors));
903
+ // Parse Header Matcher: headers.
904
+ it = json.object_value().find("headers");
905
+ if (it != json.object_value().end()) {
906
+ if (it->second.type() != Json::Type::ARRAY) {
907
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
908
+ "field:headers error: should be array"));
909
+ } else {
910
+ const Json::Array& array = it->second.array_value();
911
+ for (size_t i = 0; i < array.size(); ++i) {
912
+ const Json& header_json = array[i];
913
+ if (header_json.type() != Json::Type::OBJECT) {
914
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
915
+ "value should be of type object"));
916
+ } else {
917
+ route->matchers.header_matchers.emplace_back();
918
+ XdsApi::Route::Matchers::HeaderMatcher& header_matcher =
919
+ route->matchers.header_matchers.back();
920
+ auto header_it = header_json.object_value().find("name");
921
+ if (header_it == header_json.object_value().end()) {
922
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
923
+ "field:name error:required field missing"));
924
+ } else {
925
+ if (header_it->second.type() != Json::Type::STRING) {
926
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
927
+ "field:name error: should be string"));
928
+ } else {
929
+ header_matcher.name = header_it->second.string_value();
930
+ }
931
+ }
932
+ header_it = header_json.object_value().find("invert_match");
933
+ if (header_it != header_json.object_value().end()) {
934
+ if (header_it->second.type() == Json::Type::JSON_TRUE) {
935
+ header_matcher.invert_match = true;
936
+ } else if (header_it->second.type() == Json::Type::JSON_FALSE) {
937
+ header_matcher.invert_match = false;
938
+ } else {
939
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
940
+ "field:present_match error: should be boolean"));
941
+ }
942
+ }
943
+ // Parse and ensure one and only one header matcher is set per
944
+ // header matcher.
945
+ bool header_matcher_seen = false;
946
+ header_it = header_json.object_value().find("exact_match");
947
+ if (header_it != header_json.object_value().end()) {
948
+ header_matcher_seen = true;
949
+ if (header_it->second.type() != Json::Type::STRING) {
950
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
951
+ "field:exact_match error: should be string"));
952
+ } else {
953
+ header_matcher.type = XdsApi::Route::Matchers::HeaderMatcher::
954
+ HeaderMatcherType::EXACT;
955
+ header_matcher.string_matcher =
956
+ header_it->second.string_value();
957
+ }
958
+ }
959
+ header_it = header_json.object_value().find("regex_match");
960
+ if (header_it != header_json.object_value().end()) {
961
+ if (header_matcher_seen) {
962
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
963
+ "field:regex_match error: other header matcher already "
964
+ "specified"));
965
+ } else {
966
+ header_matcher_seen = true;
967
+ if (header_it->second.type() != Json::Type::STRING) {
968
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
969
+ "field:regex_match error: should be string"));
970
+ } else {
971
+ header_matcher.type = XdsApi::Route::Matchers::HeaderMatcher::
972
+ HeaderMatcherType::REGEX;
973
+ header_matcher.regex_match =
974
+ absl::make_unique<RE2>(header_it->second.string_value());
975
+ }
976
+ }
977
+ }
978
+ header_it = header_json.object_value().find("range_match");
979
+ if (header_it != header_json.object_value().end()) {
980
+ if (header_matcher_seen) {
981
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
982
+ "field:range_match error: other header matcher already "
983
+ "specified"));
984
+ } else {
985
+ header_matcher_seen = true;
986
+ if (header_it->second.type() != Json::Type::OBJECT) {
987
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
988
+ "field:range_match error: should be object"));
989
+ } else {
990
+ auto range_it =
991
+ header_it->second.object_value().find("start");
992
+ if (range_it != header_it->second.object_value().end()) {
993
+ if (range_it->second.type() != Json::Type::NUMBER) {
994
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
995
+ "field:start error: should be of number"));
996
+ } else {
997
+ header_matcher.range_start = gpr_parse_nonnegative_int(
998
+ range_it->second.string_value().c_str());
999
+ }
1000
+ } else {
1001
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1002
+ "field:start missing"));
1003
+ }
1004
+ range_it = header_it->second.object_value().find("end");
1005
+ if (range_it != header_it->second.object_value().end()) {
1006
+ if (range_it->second.type() != Json::Type::NUMBER) {
1007
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1008
+ "field:end error: should be of number"));
1009
+ } else {
1010
+ header_matcher.range_end = gpr_parse_nonnegative_int(
1011
+ range_it->second.string_value().c_str());
1012
+ }
1013
+ } else {
1014
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1015
+ "field:end missing"));
1016
+ }
1017
+ if (header_matcher.range_end > header_matcher.range_start) {
1018
+ header_matcher.type = XdsApi::Route::Matchers::
1019
+ HeaderMatcher::HeaderMatcherType::RANGE;
1020
+ }
1021
+ }
1022
+ }
1023
+ }
1024
+ header_it = header_json.object_value().find("present_match");
1025
+ if (header_it != header_json.object_value().end()) {
1026
+ if (header_matcher_seen) {
1027
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1028
+ "field:present_match error: other header matcher already "
1029
+ "specified"));
1030
+ } else {
1031
+ header_matcher_seen = true;
1032
+ if (header_it->second.type() == Json::Type::JSON_TRUE) {
1033
+ header_matcher.type = XdsApi::Route::Matchers::HeaderMatcher::
1034
+ HeaderMatcherType::PRESENT;
1035
+ header_matcher.present_match = true;
1036
+ } else if (header_it->second.type() == Json::Type::JSON_FALSE) {
1037
+ header_matcher.type = XdsApi::Route::Matchers::HeaderMatcher::
1038
+ HeaderMatcherType::PRESENT;
1039
+ header_matcher.present_match = false;
1040
+ } else {
1041
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1042
+ "field:present_match error: should be boolean"));
1043
+ }
1044
+ }
1045
+ }
1046
+ header_it = header_json.object_value().find("prefix_match");
1047
+ if (header_it != header_json.object_value().end()) {
1048
+ if (header_matcher_seen) {
1049
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1050
+ "field:prefix_match error: other header matcher already "
1051
+ "specified"));
1052
+ } else {
1053
+ header_matcher_seen = true;
1054
+ if (header_it->second.type() != Json::Type::STRING) {
1055
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1056
+ "field:prefix_match error: should be string"));
1057
+ } else {
1058
+ header_matcher.type = XdsApi::Route::Matchers::HeaderMatcher::
1059
+ HeaderMatcherType::PREFIX;
1060
+ header_matcher.string_matcher =
1061
+ header_it->second.string_value();
1062
+ }
1063
+ }
1064
+ }
1065
+ header_it = header_json.object_value().find("suffix_match");
1066
+ if (header_it != header_json.object_value().end()) {
1067
+ if (header_matcher_seen) {
1068
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1069
+ "field:suffix_match error: other header matcher already "
1070
+ "specified"));
1071
+ } else {
1072
+ header_matcher_seen = true;
1073
+ if (header_it->second.type() != Json::Type::STRING) {
1074
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1075
+ "field:suffix_match error: should be string"));
1076
+ } else {
1077
+ header_matcher.type = XdsApi::Route::Matchers::HeaderMatcher::
1078
+ HeaderMatcherType::SUFFIX;
1079
+ header_matcher.string_matcher =
1080
+ header_it->second.string_value();
1081
+ }
1082
+ }
1083
+ }
1084
+ }
1085
+ }
1086
+ }
1087
+ }
1088
+ // Parse Fraction numerator.
1089
+ it = json.object_value().find("match_fraction");
1090
+ if (it != json.object_value().end()) {
1091
+ if (it->second.type() != Json::Type::NUMBER) {
1092
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1093
+ "field:match_fraction error:must be of type number"));
1094
+ } else {
1095
+ route->matchers.fraction_per_million =
1096
+ gpr_parse_nonnegative_int(it->second.string_value().c_str());
790
1097
  }
791
1098
  }
792
1099
  // Parse action.