grpc 1.50.0.pre1 → 1.52.0.pre2

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 (1009) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +206 -49
  3. data/include/grpc/byte_buffer.h +76 -1
  4. data/include/grpc/byte_buffer_reader.h +19 -1
  5. data/include/grpc/compression.h +2 -2
  6. data/include/grpc/event_engine/event_engine.h +27 -6
  7. data/include/grpc/event_engine/internal/memory_allocator_impl.h +1 -1
  8. data/include/grpc/event_engine/internal/slice_cast.h +67 -0
  9. data/include/grpc/event_engine/memory_allocator.h +1 -1
  10. data/include/grpc/event_engine/slice.h +24 -4
  11. data/include/grpc/event_engine/slice_buffer.h +31 -2
  12. data/include/grpc/fork.h +25 -1
  13. data/include/grpc/grpc.h +3 -13
  14. data/include/grpc/grpc_posix.h +1 -1
  15. data/include/grpc/impl/codegen/atm.h +3 -71
  16. data/include/grpc/impl/codegen/atm_gcc_atomic.h +3 -58
  17. data/include/grpc/impl/codegen/atm_gcc_sync.h +3 -59
  18. data/include/grpc/impl/codegen/atm_windows.h +3 -106
  19. data/include/grpc/impl/codegen/byte_buffer.h +4 -78
  20. data/include/grpc/impl/codegen/byte_buffer_reader.h +4 -19
  21. data/include/grpc/impl/codegen/compression_types.h +3 -82
  22. data/include/grpc/impl/codegen/connectivity_state.h +3 -20
  23. data/include/grpc/impl/codegen/fork.h +4 -25
  24. data/include/grpc/impl/codegen/gpr_types.h +2 -34
  25. data/include/grpc/impl/codegen/grpc_types.h +3 -791
  26. data/include/grpc/impl/codegen/log.h +3 -86
  27. data/include/grpc/impl/codegen/port_platform.h +3 -758
  28. data/include/grpc/impl/codegen/propagation_bits.h +3 -28
  29. data/include/grpc/impl/codegen/slice.h +3 -106
  30. data/include/grpc/impl/codegen/status.h +4 -131
  31. data/include/grpc/impl/codegen/sync.h +3 -42
  32. data/include/grpc/impl/codegen/sync_abseil.h +3 -12
  33. data/include/grpc/impl/codegen/sync_custom.h +3 -14
  34. data/include/grpc/impl/codegen/sync_generic.h +3 -25
  35. data/include/grpc/impl/codegen/sync_posix.h +3 -28
  36. data/include/grpc/impl/codegen/sync_windows.h +3 -16
  37. data/include/grpc/impl/compression_types.h +109 -0
  38. data/include/grpc/impl/connectivity_state.h +47 -0
  39. data/include/grpc/impl/grpc_types.h +824 -0
  40. data/include/grpc/impl/propagation_bits.h +54 -0
  41. data/include/grpc/impl/slice_type.h +112 -0
  42. data/include/grpc/load_reporting.h +1 -1
  43. data/include/grpc/module.modulemap +5 -1
  44. data/include/grpc/slice.h +1 -1
  45. data/include/grpc/status.h +131 -1
  46. data/include/grpc/support/atm.h +70 -1
  47. data/include/grpc/support/atm_gcc_atomic.h +59 -1
  48. data/include/grpc/support/atm_gcc_sync.h +58 -1
  49. data/include/grpc/support/atm_windows.h +105 -1
  50. data/include/grpc/support/log.h +87 -1
  51. data/include/grpc/support/log_windows.h +1 -1
  52. data/include/grpc/support/port_platform.h +767 -1
  53. data/include/grpc/support/string_util.h +1 -1
  54. data/include/grpc/support/sync.h +35 -2
  55. data/include/grpc/support/sync_abseil.h +11 -1
  56. data/include/grpc/support/sync_custom.h +13 -1
  57. data/include/grpc/support/sync_generic.h +24 -1
  58. data/include/grpc/support/sync_posix.h +27 -1
  59. data/include/grpc/support/sync_windows.h +15 -1
  60. data/include/grpc/support/time.h +25 -2
  61. data/src/core/ext/filters/census/grpc_context.cc +17 -18
  62. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +28 -22
  63. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +2 -1
  64. data/src/core/ext/filters/channel_idle/idle_filter_state.h +1 -1
  65. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -0
  66. data/src/core/ext/filters/client_channel/backup_poller.cc +24 -24
  67. data/src/core/ext/filters/client_channel/backup_poller.h +21 -21
  68. data/src/core/ext/filters/client_channel/channel_connectivity.cc +51 -28
  69. data/src/core/ext/filters/client_channel/client_channel.cc +157 -168
  70. data/src/core/ext/filters/client_channel/client_channel.h +10 -10
  71. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +17 -19
  72. data/src/core/ext/filters/client_channel/client_channel_channelz.h +19 -19
  73. data/src/core/ext/filters/client_channel/client_channel_factory.cc +17 -17
  74. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +18 -18
  75. data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
  76. data/src/core/ext/filters/client_channel/{resolver_result_parsing.h → client_channel_service_config.h} +26 -23
  77. data/src/core/ext/filters/client_channel/config_selector.h +16 -20
  78. data/src/core/ext/filters/client_channel/connector.h +1 -1
  79. data/src/core/ext/filters/client_channel/dynamic_filters.cc +28 -55
  80. data/src/core/ext/filters/client_channel/dynamic_filters.h +7 -8
  81. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +18 -18
  82. data/src/core/ext/filters/client_channel/health/health_check_client.cc +4 -5
  83. data/src/core/ext/filters/client_channel/http_proxy.cc +39 -40
  84. data/src/core/ext/filters/client_channel/http_proxy.h +18 -18
  85. data/src/core/ext/filters/client_channel/lb_call_state_internal.h +39 -0
  86. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +3 -4
  87. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +17 -17
  88. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +7 -2
  89. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +1 -2
  90. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +59 -130
  91. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +37 -21
  92. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +131 -154
  93. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +24 -25
  94. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -1
  95. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +2 -4
  96. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +18 -20
  97. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +18 -19
  98. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +18 -19
  99. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +18 -19
  100. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +8 -9
  101. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +1 -1
  102. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +212 -223
  103. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +2 -2
  104. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +11 -22
  105. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +73 -101
  106. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +20 -21
  107. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +1 -1
  108. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +119 -106
  109. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +12 -12
  110. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +30 -16
  111. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +60 -56
  112. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +60 -64
  113. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
  114. data/src/core/ext/filters/client_channel/lb_policy/xds/{xds.h → xds_attributes.h} +15 -17
  115. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +22 -28
  116. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +62 -94
  117. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +70 -146
  118. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +651 -0
  119. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +60 -0
  120. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +364 -0
  121. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +18 -18
  122. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +9 -10
  123. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +26 -35
  124. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +40 -41
  125. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +22 -23
  126. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +82 -82
  127. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +117 -118
  128. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +51 -52
  129. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +18 -18
  130. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +18 -18
  131. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +18 -19
  132. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +3 -5
  133. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -3
  134. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +1 -1
  135. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +34 -27
  136. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +44 -34
  137. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +8 -10
  138. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -7
  139. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +122 -119
  140. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +1 -1
  141. data/src/core/ext/filters/client_channel/retry_filter.cc +81 -103
  142. data/src/core/ext/filters/client_channel/retry_service_config.cc +193 -235
  143. data/src/core/ext/filters/client_channel/retry_service_config.h +20 -23
  144. data/src/core/ext/filters/client_channel/retry_throttle.cc +27 -29
  145. data/src/core/ext/filters/client_channel/retry_throttle.h +26 -25
  146. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +3 -3
  147. data/src/core/ext/filters/client_channel/subchannel.cc +158 -178
  148. data/src/core/ext/filters/client_channel/subchannel.h +17 -40
  149. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +18 -18
  150. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +11 -12
  151. data/src/core/ext/filters/deadline/deadline_filter.cc +34 -17
  152. data/src/core/ext/filters/deadline/deadline_filter.h +1 -1
  153. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +3 -2
  154. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +0 -4
  155. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
  156. data/src/core/ext/filters/fault_injection/{service_config_parser.h → fault_injection_service_config_parser.h} +20 -12
  157. data/src/core/ext/filters/http/client/http_client_filter.cc +36 -37
  158. data/src/core/ext/filters/http/client/http_client_filter.h +17 -17
  159. data/src/core/ext/filters/http/client_authority_filter.cc +19 -19
  160. data/src/core/ext/filters/http/client_authority_filter.h +18 -18
  161. data/src/core/ext/filters/http/http_filters_plugin.cc +35 -51
  162. data/src/core/ext/filters/http/message_compress/compression_filter.cc +315 -0
  163. data/src/core/ext/filters/http/message_compress/compression_filter.h +132 -0
  164. data/src/core/ext/filters/http/server/http_server_filter.cc +44 -43
  165. data/src/core/ext/filters/http/server/http_server_filter.h +18 -18
  166. data/src/core/ext/filters/message_size/message_size_filter.cc +92 -123
  167. data/src/core/ext/filters/message_size/message_size_filter.h +23 -16
  168. data/src/core/ext/filters/rbac/rbac_filter.cc +12 -12
  169. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +728 -530
  170. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +4 -3
  171. data/src/core/ext/filters/server_config_selector/server_config_selector.h +6 -8
  172. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +7 -9
  173. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +229 -0
  174. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +66 -0
  175. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.cc +82 -0
  176. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +93 -0
  177. data/src/core/ext/transport/chttp2/alpn/alpn.cc +18 -18
  178. data/src/core/ext/transport/chttp2/alpn/alpn.h +22 -22
  179. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +69 -63
  180. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +28 -22
  181. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +81 -97
  182. data/src/core/ext/transport/chttp2/server/chttp2_server.h +18 -18
  183. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +22 -22
  184. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +30 -30
  185. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +29 -29
  186. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +27 -27
  187. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +273 -283
  188. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +18 -19
  189. data/src/core/ext/transport/chttp2/transport/context_list.cc +19 -19
  190. data/src/core/ext/transport/chttp2/transport/context_list.h +25 -25
  191. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +0 -36
  192. data/src/core/ext/transport/chttp2/transport/decode_huff.h +35 -82
  193. data/src/core/ext/transport/chttp2/transport/flow_control.cc +112 -44
  194. data/src/core/ext/transport/chttp2/transport/flow_control.h +60 -34
  195. data/src/core/ext/transport/chttp2/transport/frame.h +19 -19
  196. data/src/core/ext/transport/chttp2/transport/frame_data.cc +33 -32
  197. data/src/core/ext/transport/chttp2/transport/frame_data.h +23 -23
  198. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +36 -36
  199. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +18 -18
  200. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +25 -24
  201. data/src/core/ext/transport/chttp2/transport/frame_ping.h +19 -19
  202. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +28 -25
  203. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +18 -18
  204. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +34 -36
  205. data/src/core/ext/transport/chttp2/transport/frame_settings.h +20 -20
  206. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +22 -21
  207. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +18 -18
  208. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +133 -181
  209. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +40 -59
  210. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +2 -1
  211. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +93 -143
  212. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +20 -20
  213. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +26 -26
  214. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +18 -18
  215. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +21 -19
  216. data/src/core/ext/transport/chttp2/transport/http2_settings.h +36 -34
  217. data/src/core/ext/transport/chttp2/transport/http_trace.cc +19 -0
  218. data/src/core/ext/transport/chttp2/transport/http_trace.h +24 -0
  219. data/src/core/ext/transport/chttp2/transport/huffsyms.cc +20 -20
  220. data/src/core/ext/transport/chttp2/transport/huffsyms.h +19 -19
  221. data/src/core/ext/transport/chttp2/transport/internal.h +193 -170
  222. data/src/core/ext/transport/chttp2/transport/parsing.cc +147 -80
  223. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +19 -19
  224. data/src/core/ext/transport/chttp2/transport/stream_map.cc +23 -23
  225. data/src/core/ext/transport/chttp2/transport/stream_map.h +31 -31
  226. data/src/core/ext/transport/chttp2/transport/varint.cc +19 -20
  227. data/src/core/ext/transport/chttp2/transport/varint.h +35 -32
  228. data/src/core/ext/transport/chttp2/transport/writing.cc +60 -56
  229. data/src/core/ext/transport/inproc/inproc_plugin.cc +17 -17
  230. data/src/core/ext/transport/inproc/inproc_transport.cc +122 -140
  231. data/src/core/ext/transport/inproc/inproc_transport.h +19 -19
  232. data/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c +62 -0
  233. data/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h +179 -0
  234. data/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c +46 -0
  235. data/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h +98 -0
  236. data/src/core/ext/upb-generated/xds/core/v3/cidr.upb.c +47 -0
  237. data/src/core/ext/upb-generated/xds/core/v3/cidr.upb.h +107 -0
  238. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +3 -2
  239. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +9 -0
  240. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +0 -1
  241. data/src/core/ext/upb-generated/xds/type/matcher/v3/cel.upb.c +46 -0
  242. data/src/core/ext/upb-generated/xds/type/matcher/v3/cel.upb.h +98 -0
  243. data/src/core/ext/upb-generated/xds/type/matcher/v3/domain.upb.c +62 -0
  244. data/src/core/ext/upb-generated/xds/type/matcher/v3/domain.upb.h +174 -0
  245. data/src/core/ext/upb-generated/xds/type/matcher/v3/http_inputs.upb.c +36 -0
  246. data/src/core/ext/upb-generated/xds/type/matcher/v3/http_inputs.upb.h +74 -0
  247. data/src/core/ext/upb-generated/xds/type/matcher/v3/ip.upb.c +65 -0
  248. data/src/core/ext/upb-generated/xds/type/matcher/v3/ip.upb.h +191 -0
  249. data/src/core/ext/upb-generated/xds/type/matcher/v3/range.upb.c +127 -0
  250. data/src/core/ext/upb-generated/xds/type/matcher/v3/range.upb.h +474 -0
  251. data/src/core/ext/upb-generated/xds/type/v3/cel.upb.c +67 -0
  252. data/src/core/ext/upb-generated/xds/type/v3/cel.upb.h +214 -0
  253. data/src/core/ext/upb-generated/xds/type/v3/range.upb.c +64 -0
  254. data/src/core/ext/upb-generated/xds/type/v3/range.upb.h +208 -0
  255. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +0 -1
  256. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c +60 -0
  257. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h +40 -0
  258. data/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c +50 -0
  259. data/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h +35 -0
  260. data/src/core/ext/upbdefs-generated/xds/core/v3/cidr.upbdefs.c +45 -0
  261. data/src/core/ext/upbdefs-generated/xds/core/v3/cidr.upbdefs.h +35 -0
  262. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/cel.upbdefs.c +43 -0
  263. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/cel.upbdefs.h +35 -0
  264. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/domain.upbdefs.c +51 -0
  265. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/domain.upbdefs.h +40 -0
  266. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/http_inputs.upbdefs.c +36 -0
  267. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/http_inputs.upbdefs.h +35 -0
  268. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/ip.upbdefs.c +55 -0
  269. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/ip.upbdefs.h +40 -0
  270. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.c +9 -9
  271. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/range.upbdefs.c +71 -0
  272. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/range.upbdefs.h +60 -0
  273. data/src/core/ext/upbdefs-generated/xds/type/v3/cel.upbdefs.c +60 -0
  274. data/src/core/ext/upbdefs-generated/xds/type/v3/cel.upbdefs.h +40 -0
  275. data/src/core/ext/upbdefs-generated/xds/type/v3/range.upbdefs.c +36 -0
  276. data/src/core/ext/upbdefs-generated/xds/type/v3/range.upbdefs.h +45 -0
  277. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +4 -7
  278. data/src/core/ext/xds/certificate_provider_store.cc +4 -4
  279. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +4 -7
  280. data/src/core/ext/xds/xds_api.cc +20 -95
  281. data/src/core/ext/xds/xds_api.h +5 -8
  282. data/src/core/ext/xds/xds_bootstrap.h +0 -1
  283. data/src/core/ext/xds/xds_bootstrap_grpc.cc +3 -12
  284. data/src/core/ext/xds/xds_bootstrap_grpc.h +16 -1
  285. data/src/core/ext/xds/xds_certificate_provider.cc +22 -25
  286. data/src/core/ext/xds/xds_certificate_provider.h +1 -1
  287. data/src/core/ext/xds/xds_channel_args.h +1 -1
  288. data/src/core/ext/xds/xds_channel_stack_modifier.cc +0 -1
  289. data/src/core/ext/xds/xds_channel_stack_modifier.h +2 -2
  290. data/src/core/ext/xds/xds_client.cc +134 -94
  291. data/src/core/ext/xds/xds_client.h +13 -5
  292. data/src/core/ext/xds/xds_client_grpc.cc +31 -24
  293. data/src/core/ext/xds/xds_client_grpc.h +1 -1
  294. data/src/core/ext/xds/xds_client_stats.cc +17 -17
  295. data/src/core/ext/xds/xds_client_stats.h +18 -18
  296. data/src/core/ext/xds/xds_cluster.cc +359 -203
  297. data/src/core/ext/xds/xds_cluster.h +52 -35
  298. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +54 -71
  299. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +45 -21
  300. data/src/core/ext/xds/xds_common_types.cc +209 -141
  301. data/src/core/ext/xds/xds_common_types.h +19 -13
  302. data/src/core/ext/xds/xds_endpoint.cc +221 -130
  303. data/src/core/ext/xds/xds_endpoint.h +4 -7
  304. data/src/core/ext/xds/xds_health_status.cc +80 -0
  305. data/src/core/ext/xds/xds_health_status.h +82 -0
  306. data/src/core/ext/xds/xds_http_fault_filter.cc +57 -43
  307. data/src/core/ext/xds/xds_http_fault_filter.h +14 -22
  308. data/src/core/ext/xds/xds_http_filters.cc +65 -73
  309. data/src/core/ext/xds/xds_http_filters.h +68 -20
  310. data/src/core/ext/xds/xds_http_rbac_filter.cc +153 -207
  311. data/src/core/ext/xds/xds_http_rbac_filter.h +13 -16
  312. data/src/core/ext/xds/xds_http_stateful_session_filter.cc +218 -0
  313. data/src/core/ext/xds/xds_http_stateful_session_filter.h +58 -0
  314. data/src/core/ext/xds/xds_lb_policy_registry.cc +120 -171
  315. data/src/core/ext/xds/xds_lb_policy_registry.h +10 -11
  316. data/src/core/ext/xds/xds_listener.cc +447 -419
  317. data/src/core/ext/xds/xds_listener.h +45 -47
  318. data/src/core/ext/xds/xds_resource_type.h +3 -11
  319. data/src/core/ext/xds/xds_resource_type_impl.h +10 -13
  320. data/src/core/ext/xds/xds_route_config.cc +514 -528
  321. data/src/core/ext/xds/xds_route_config.h +39 -28
  322. data/src/core/ext/xds/xds_routing.cc +2 -1
  323. data/src/core/ext/xds/xds_routing.h +2 -0
  324. data/src/core/ext/xds/xds_server_config_fetcher.cc +109 -106
  325. data/src/core/ext/xds/xds_transport_grpc.cc +6 -7
  326. data/src/core/ext/xds/xds_transport_grpc.h +1 -1
  327. data/src/core/lib/address_utils/parse_address.cc +30 -29
  328. data/src/core/lib/address_utils/parse_address.h +32 -32
  329. data/src/core/lib/address_utils/sockaddr_utils.cc +29 -28
  330. data/src/core/lib/address_utils/sockaddr_utils.h +33 -33
  331. data/src/core/lib/avl/avl.h +4 -4
  332. data/src/core/lib/backoff/backoff.cc +17 -17
  333. data/src/core/lib/backoff/backoff.h +18 -18
  334. data/src/core/lib/channel/call_tracer.h +10 -1
  335. data/src/core/lib/channel/channel_args.cc +19 -20
  336. data/src/core/lib/channel/channel_args.h +59 -43
  337. data/src/core/lib/channel/channel_args_preconditioning.h +1 -1
  338. data/src/core/lib/channel/channel_stack.cc +62 -58
  339. data/src/core/lib/channel/channel_stack.h +144 -131
  340. data/src/core/lib/channel/channel_stack_builder.cc +21 -24
  341. data/src/core/lib/channel/channel_stack_builder.h +14 -6
  342. data/src/core/lib/channel/channel_stack_builder_impl.cc +43 -25
  343. data/src/core/lib/channel/channel_stack_builder_impl.h +2 -0
  344. data/src/core/lib/channel/channel_trace.cc +21 -22
  345. data/src/core/lib/channel/channel_trace.h +19 -19
  346. data/src/core/lib/channel/channelz.cc +18 -19
  347. data/src/core/lib/channel/channelz.h +26 -26
  348. data/src/core/lib/channel/channelz_registry.cc +17 -17
  349. data/src/core/lib/channel/channelz_registry.h +18 -18
  350. data/src/core/lib/channel/connected_channel.cc +732 -63
  351. data/src/core/lib/channel/connected_channel.h +18 -22
  352. data/src/core/lib/channel/context.h +18 -18
  353. data/src/core/lib/channel/promise_based_filter.cc +1137 -150
  354. data/src/core/lib/channel/promise_based_filter.h +374 -88
  355. data/src/core/lib/channel/status_util.cc +35 -17
  356. data/src/core/lib/channel/status_util.h +26 -19
  357. data/src/core/lib/compression/compression.cc +19 -19
  358. data/src/core/lib/compression/compression_internal.cc +41 -48
  359. data/src/core/lib/compression/compression_internal.h +22 -22
  360. data/src/core/lib/compression/message_compress.cc +26 -26
  361. data/src/core/lib/compression/message_compress.h +25 -25
  362. data/src/core/lib/config/core_configuration.h +1 -1
  363. data/src/core/lib/debug/event_log.cc +88 -0
  364. data/src/core/lib/debug/event_log.h +81 -0
  365. data/src/core/lib/debug/histogram_view.cc +69 -0
  366. data/src/core/lib/{slice/slice_refcount.cc → debug/histogram_view.h} +15 -13
  367. data/src/core/lib/debug/stats.cc +39 -136
  368. data/src/core/lib/debug/stats.h +46 -52
  369. data/src/core/lib/debug/stats_data.cc +224 -73
  370. data/src/core/lib/debug/stats_data.h +263 -122
  371. data/src/core/lib/debug/trace.cc +18 -18
  372. data/src/core/lib/debug/trace.h +19 -19
  373. data/src/core/lib/event_engine/common_closures.h +71 -0
  374. data/src/core/lib/event_engine/default_event_engine.cc +38 -15
  375. data/src/core/lib/event_engine/default_event_engine.h +15 -3
  376. data/src/core/lib/event_engine/default_event_engine_factory.cc +2 -4
  377. data/src/core/lib/event_engine/executor/executor.h +1 -1
  378. data/src/core/lib/event_engine/forkable.h +1 -1
  379. data/src/core/lib/event_engine/memory_allocator.cc +1 -1
  380. data/src/core/lib/event_engine/poller.h +10 -4
  381. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +614 -0
  382. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +129 -0
  383. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +900 -0
  384. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
  385. data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
  386. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
  387. data/src/core/lib/event_engine/{executor/threaded_executor.cc → posix_engine/event_poller_posix_default.h} +11 -14
  388. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
  389. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
  390. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +265 -0
  391. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
  392. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1308 -0
  393. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +684 -0
  394. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +456 -28
  395. data/src/core/lib/event_engine/posix_engine/posix_engine.h +148 -24
  396. data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
  397. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +236 -0
  398. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +228 -0
  399. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +380 -0
  400. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +91 -0
  401. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +853 -0
  402. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +316 -0
  403. data/src/core/lib/event_engine/posix_engine/timer.cc +49 -49
  404. data/src/core/lib/event_engine/posix_engine/timer.h +87 -86
  405. data/src/core/lib/event_engine/posix_engine/timer_heap.cc +27 -27
  406. data/src/core/lib/event_engine/posix_engine/timer_heap.h +21 -21
  407. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +76 -214
  408. data/src/core/lib/event_engine/posix_engine/timer_manager.h +41 -69
  409. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +332 -0
  410. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +185 -0
  411. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +127 -0
  412. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
  413. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +150 -0
  414. data/src/core/lib/event_engine/{executor/threaded_executor.h → posix_engine/wakeup_fd_pipe.h} +16 -15
  415. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
  416. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
  417. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
  418. data/src/core/lib/event_engine/slice.cc +7 -6
  419. data/src/core/lib/event_engine/slice_buffer.cc +2 -2
  420. data/src/core/lib/event_engine/socket_notifier.h +1 -1
  421. data/src/core/lib/event_engine/tcp_socket_utils.cc +373 -0
  422. data/src/core/lib/event_engine/tcp_socket_utils.h +85 -0
  423. data/src/core/lib/event_engine/thread_pool.cc +125 -43
  424. data/src/core/lib/event_engine/thread_pool.h +49 -26
  425. data/src/core/lib/event_engine/time_util.h +1 -1
  426. data/src/core/lib/event_engine/windows/iocp.cc +13 -12
  427. data/src/core/lib/event_engine/windows/iocp.h +1 -1
  428. data/src/core/lib/event_engine/windows/win_socket.cc +9 -9
  429. data/src/core/lib/event_engine/windows/windows_engine.cc +26 -20
  430. data/src/core/lib/event_engine/windows/windows_engine.h +8 -4
  431. data/src/core/lib/experiments/config.cc +1 -1
  432. data/src/core/lib/experiments/experiments.cc +13 -13
  433. data/src/core/lib/experiments/experiments.h +8 -6
  434. data/src/core/lib/gpr/alloc.cc +19 -17
  435. data/src/core/lib/gpr/alloc.h +18 -18
  436. data/src/core/lib/gpr/atm.cc +17 -17
  437. data/src/core/lib/gpr/cpu_iphone.cc +24 -24
  438. data/src/core/lib/gpr/cpu_linux.cc +28 -23
  439. data/src/core/lib/gpr/cpu_posix.cc +23 -22
  440. data/src/core/lib/gpr/cpu_windows.cc +20 -18
  441. data/src/core/lib/gpr/log.cc +27 -19
  442. data/src/core/lib/gpr/log_android.cc +22 -20
  443. data/src/core/lib/gpr/log_linux.cc +24 -24
  444. data/src/core/lib/gpr/log_posix.cc +20 -19
  445. data/src/core/lib/gpr/log_windows.cc +25 -24
  446. data/src/core/lib/gpr/spinlock.h +18 -18
  447. data/src/core/lib/gpr/string.cc +25 -24
  448. data/src/core/lib/gpr/string.h +58 -58
  449. data/src/core/lib/gpr/string_posix.cc +24 -24
  450. data/src/core/lib/gpr/string_util_windows.cc +22 -22
  451. data/src/core/lib/gpr/string_windows.cc +24 -24
  452. data/src/core/lib/gpr/sync.cc +25 -25
  453. data/src/core/lib/gpr/sync_abseil.cc +22 -20
  454. data/src/core/lib/gpr/sync_posix.cc +23 -21
  455. data/src/core/lib/gpr/sync_windows.cc +29 -27
  456. data/src/core/lib/gpr/time.cc +23 -21
  457. data/src/core/lib/gpr/time_posix.cc +35 -30
  458. data/src/core/lib/gpr/time_precise.cc +22 -22
  459. data/src/core/lib/gpr/time_precise.h +18 -19
  460. data/src/core/lib/gpr/time_windows.cc +25 -22
  461. data/src/core/lib/gpr/tmpfile.h +22 -22
  462. data/src/core/lib/gpr/tmpfile_msys.cc +21 -20
  463. data/src/core/lib/gpr/tmpfile_posix.cc +22 -20
  464. data/src/core/lib/gpr/tmpfile_windows.cc +23 -22
  465. data/src/core/lib/gpr/useful.h +40 -27
  466. data/src/core/lib/gpr/wrap_memcpy.cc +23 -23
  467. data/src/core/lib/gprpp/atomic_utils.h +18 -18
  468. data/src/core/lib/gprpp/bitset.h +24 -0
  469. data/src/core/{ext/xds/xds_resource_type.cc → lib/gprpp/crash.cc} +12 -12
  470. data/src/core/lib/gprpp/crash.h +34 -0
  471. data/src/core/lib/gprpp/debug_location.h +18 -18
  472. data/src/core/lib/gprpp/dual_ref_counted.h +1 -1
  473. data/src/core/lib/gprpp/env.h +20 -20
  474. data/src/core/lib/gprpp/env_linux.cc +21 -21
  475. data/src/core/lib/gprpp/env_posix.cc +18 -18
  476. data/src/core/lib/gprpp/env_windows.cc +18 -18
  477. data/src/core/lib/gprpp/examine_stack.cc +17 -17
  478. data/src/core/lib/gprpp/examine_stack.h +18 -18
  479. data/src/core/lib/gprpp/fork.cc +21 -22
  480. data/src/core/lib/gprpp/fork.h +22 -22
  481. data/src/core/lib/gprpp/global_config.h +18 -18
  482. data/src/core/lib/gprpp/global_config_custom.h +18 -18
  483. data/src/core/lib/gprpp/global_config_env.cc +17 -17
  484. data/src/core/lib/gprpp/global_config_env.h +23 -23
  485. data/src/core/lib/gprpp/global_config_generic.h +18 -18
  486. data/src/core/lib/gprpp/host_port.cc +26 -26
  487. data/src/core/lib/gprpp/host_port.h +29 -28
  488. data/src/core/lib/gprpp/load_file.cc +75 -0
  489. data/src/core/lib/gprpp/load_file.h +33 -0
  490. data/src/core/lib/gprpp/manual_constructor.h +18 -17
  491. data/src/core/lib/gprpp/memory.h +18 -18
  492. data/src/core/lib/gprpp/mpscq.cc +17 -17
  493. data/src/core/lib/gprpp/mpscq.h +18 -18
  494. data/src/core/lib/gprpp/no_destruct.h +1 -0
  495. data/src/core/lib/gprpp/orphanable.h +18 -18
  496. data/src/core/lib/gprpp/per_cpu.h +46 -0
  497. data/src/core/lib/gprpp/ref_counted.h +18 -18
  498. data/src/core/lib/gprpp/ref_counted_ptr.h +19 -18
  499. data/src/core/lib/gprpp/stat_posix.cc +5 -4
  500. data/src/core/lib/gprpp/stat_windows.cc +4 -2
  501. data/src/core/lib/gprpp/status_helper.cc +4 -3
  502. data/src/core/lib/gprpp/status_helper.h +1 -3
  503. data/src/core/lib/gprpp/strerror.cc +41 -0
  504. data/src/core/lib/gprpp/strerror.h +29 -0
  505. data/src/core/lib/gprpp/sync.h +20 -20
  506. data/src/core/lib/gprpp/table.h +1 -0
  507. data/src/core/lib/gprpp/thd.h +19 -19
  508. data/src/core/lib/gprpp/thd_posix.cc +30 -31
  509. data/src/core/lib/gprpp/thd_windows.cc +26 -26
  510. data/src/core/lib/gprpp/time.cc +16 -11
  511. data/src/core/lib/gprpp/time.h +13 -3
  512. data/src/core/lib/gprpp/time_averaged_stats.cc +20 -20
  513. data/src/core/lib/gprpp/time_averaged_stats.h +48 -48
  514. data/src/core/lib/gprpp/time_util.h +1 -1
  515. data/src/core/lib/gprpp/unique_type_name.h +18 -18
  516. data/src/core/lib/gprpp/validation_errors.h +18 -1
  517. data/src/core/lib/handshaker/proxy_mapper.h +18 -18
  518. data/src/core/lib/handshaker/proxy_mapper_registry.cc +17 -17
  519. data/src/core/lib/handshaker/proxy_mapper_registry.h +18 -18
  520. data/src/core/lib/http/format_request.cc +18 -18
  521. data/src/core/lib/http/format_request.h +18 -18
  522. data/src/core/lib/http/httpcli.cc +57 -61
  523. data/src/core/lib/http/httpcli.h +26 -26
  524. data/src/core/lib/http/httpcli_security_connector.cc +22 -25
  525. data/src/core/lib/http/parser.cc +76 -87
  526. data/src/core/lib/http/parser.h +32 -32
  527. data/src/core/lib/iomgr/block_annotate.h +21 -21
  528. data/src/core/lib/iomgr/buffer_list.cc +156 -136
  529. data/src/core/lib/iomgr/buffer_list.h +120 -98
  530. data/src/core/lib/iomgr/call_combiner.cc +29 -27
  531. data/src/core/lib/iomgr/call_combiner.h +21 -22
  532. data/src/core/lib/iomgr/cfstream_handle.cc +33 -36
  533. data/src/core/lib/iomgr/cfstream_handle.h +22 -22
  534. data/src/core/lib/iomgr/closure.h +90 -45
  535. data/src/core/lib/iomgr/combiner.cc +20 -19
  536. data/src/core/lib/iomgr/combiner.h +18 -18
  537. data/src/core/lib/iomgr/dualstack_socket_posix.cc +21 -21
  538. data/src/core/lib/iomgr/dynamic_annotations.h +20 -20
  539. data/src/core/lib/iomgr/endpoint.cc +17 -17
  540. data/src/core/lib/iomgr/endpoint.h +46 -46
  541. data/src/core/lib/iomgr/endpoint_cfstream.cc +44 -43
  542. data/src/core/lib/iomgr/endpoint_cfstream.h +27 -27
  543. data/src/core/lib/iomgr/endpoint_pair.h +18 -18
  544. data/src/core/lib/iomgr/endpoint_pair_posix.cc +20 -19
  545. data/src/core/lib/iomgr/endpoint_pair_windows.cc +18 -17
  546. data/src/core/lib/iomgr/error.cc +49 -61
  547. data/src/core/lib/iomgr/error.h +42 -173
  548. data/src/core/lib/iomgr/error_cfstream.cc +18 -18
  549. data/src/core/lib/iomgr/error_cfstream.h +19 -19
  550. data/src/core/lib/iomgr/ev_apple.cc +21 -21
  551. data/src/core/lib/iomgr/ev_apple.h +17 -17
  552. data/src/core/lib/iomgr/ev_epoll1_linux.cc +208 -195
  553. data/src/core/lib/iomgr/ev_epoll1_linux.h +18 -18
  554. data/src/core/lib/iomgr/ev_poll_posix.cc +212 -205
  555. data/src/core/lib/iomgr/ev_poll_posix.h +18 -18
  556. data/src/core/lib/iomgr/ev_posix.cc +36 -28
  557. data/src/core/lib/iomgr/ev_posix.h +85 -81
  558. data/src/core/lib/iomgr/ev_windows.cc +18 -18
  559. data/src/core/lib/iomgr/exec_ctx.cc +34 -34
  560. data/src/core/lib/iomgr/exec_ctx.h +141 -141
  561. data/src/core/lib/iomgr/executor.cc +21 -21
  562. data/src/core/lib/iomgr/executor.h +24 -24
  563. data/src/core/lib/iomgr/fork_posix.cc +24 -22
  564. data/src/core/lib/iomgr/fork_windows.cc +21 -21
  565. data/src/core/lib/iomgr/gethostname.h +18 -18
  566. data/src/core/lib/iomgr/gethostname_fallback.cc +17 -17
  567. data/src/core/lib/iomgr/gethostname_host_name_max.cc +17 -17
  568. data/src/core/lib/iomgr/gethostname_sysconf.cc +17 -17
  569. data/src/core/lib/iomgr/grpc_if_nametoindex.h +20 -20
  570. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +20 -19
  571. data/src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc +20 -19
  572. data/src/core/lib/iomgr/internal_errqueue.cc +4 -2
  573. data/src/core/lib/iomgr/internal_errqueue.h +80 -80
  574. data/src/core/lib/iomgr/iocp_windows.cc +22 -21
  575. data/src/core/lib/iomgr/iocp_windows.h +18 -18
  576. data/src/core/lib/iomgr/iomgr.cc +19 -18
  577. data/src/core/lib/iomgr/iomgr.h +32 -32
  578. data/src/core/lib/iomgr/iomgr_internal.cc +17 -17
  579. data/src/core/lib/iomgr/iomgr_internal.h +25 -25
  580. data/src/core/lib/iomgr/iomgr_posix.cc +20 -20
  581. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +20 -19
  582. data/src/core/lib/iomgr/iomgr_windows.cc +24 -22
  583. data/src/core/lib/iomgr/load_file.cc +24 -27
  584. data/src/core/lib/iomgr/load_file.h +20 -20
  585. data/src/core/lib/iomgr/lockfree_event.cc +114 -114
  586. data/src/core/lib/iomgr/lockfree_event.h +19 -19
  587. data/src/core/lib/iomgr/nameser.h +84 -84
  588. data/src/core/lib/iomgr/polling_entity.cc +25 -21
  589. data/src/core/lib/iomgr/polling_entity.h +27 -27
  590. data/src/core/lib/iomgr/pollset.cc +17 -17
  591. data/src/core/lib/iomgr/pollset.h +51 -51
  592. data/src/core/lib/iomgr/pollset_set.cc +17 -17
  593. data/src/core/lib/iomgr/pollset_set.h +22 -22
  594. data/src/core/lib/iomgr/pollset_set_windows.cc +18 -18
  595. data/src/core/lib/iomgr/pollset_set_windows.h +18 -18
  596. data/src/core/lib/iomgr/pollset_windows.cc +30 -29
  597. data/src/core/lib/iomgr/pollset_windows.h +22 -22
  598. data/src/core/lib/iomgr/port.h +29 -29
  599. data/src/core/lib/iomgr/python_util.h +20 -20
  600. data/src/core/lib/iomgr/resolve_address.cc +26 -20
  601. data/src/core/lib/iomgr/resolve_address.h +21 -22
  602. data/src/core/lib/iomgr/resolve_address_impl.h +2 -2
  603. data/src/core/lib/iomgr/resolve_address_posix.cc +35 -45
  604. data/src/core/lib/iomgr/resolve_address_posix.h +1 -2
  605. data/src/core/lib/iomgr/resolve_address_windows.cc +18 -20
  606. data/src/core/lib/iomgr/resolve_address_windows.h +1 -2
  607. data/src/core/lib/iomgr/resolved_address.h +1 -1
  608. data/src/core/lib/iomgr/sockaddr.h +21 -21
  609. data/src/core/lib/iomgr/sockaddr_posix.h +18 -18
  610. data/src/core/lib/iomgr/sockaddr_utils_posix.cc +18 -17
  611. data/src/core/lib/iomgr/sockaddr_windows.h +18 -18
  612. data/src/core/lib/iomgr/socket_factory_posix.cc +18 -18
  613. data/src/core/lib/iomgr/socket_factory_posix.h +30 -30
  614. data/src/core/lib/iomgr/socket_mutator.cc +19 -18
  615. data/src/core/lib/iomgr/socket_mutator.h +37 -37
  616. data/src/core/lib/iomgr/socket_utils.h +24 -24
  617. data/src/core/lib/iomgr/socket_utils_common_posix.cc +68 -66
  618. data/src/core/lib/iomgr/socket_utils_linux.cc +18 -17
  619. data/src/core/lib/iomgr/socket_utils_posix.cc +22 -20
  620. data/src/core/lib/iomgr/socket_utils_posix.h +78 -78
  621. data/src/core/lib/iomgr/socket_utils_windows.cc +20 -19
  622. data/src/core/lib/iomgr/socket_windows.cc +37 -36
  623. data/src/core/lib/iomgr/socket_windows.h +56 -56
  624. data/src/core/lib/iomgr/systemd_utils.cc +116 -0
  625. data/src/core/lib/{slice/slice_buffer_api.cc → iomgr/systemd_utils.h} +12 -14
  626. data/src/core/lib/iomgr/tcp_client.cc +17 -17
  627. data/src/core/lib/iomgr/tcp_client.h +26 -26
  628. data/src/core/lib/iomgr/tcp_client_cfstream.cc +25 -28
  629. data/src/core/lib/iomgr/tcp_client_posix.cc +70 -73
  630. data/src/core/lib/iomgr/tcp_client_posix.h +43 -43
  631. data/src/core/lib/iomgr/tcp_client_windows.cc +36 -39
  632. data/src/core/lib/iomgr/tcp_posix.cc +223 -237
  633. data/src/core/lib/iomgr/tcp_posix.h +27 -27
  634. data/src/core/lib/iomgr/tcp_server.cc +30 -22
  635. data/src/core/lib/iomgr/tcp_server.h +68 -62
  636. data/src/core/lib/iomgr/tcp_server_posix.cc +124 -94
  637. data/src/core/lib/iomgr/tcp_server_utils_posix.h +54 -51
  638. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +90 -55
  639. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +40 -40
  640. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +19 -19
  641. data/src/core/lib/iomgr/tcp_server_windows.cc +97 -104
  642. data/src/core/lib/iomgr/tcp_windows.cc +109 -93
  643. data/src/core/lib/iomgr/tcp_windows.h +29 -29
  644. data/src/core/lib/iomgr/timer.cc +17 -17
  645. data/src/core/lib/iomgr/timer.h +65 -65
  646. data/src/core/lib/iomgr/timer_generic.cc +115 -122
  647. data/src/core/lib/iomgr/timer_generic.h +19 -19
  648. data/src/core/lib/iomgr/timer_heap.cc +25 -25
  649. data/src/core/lib/iomgr/timer_heap.h +19 -19
  650. data/src/core/lib/iomgr/timer_manager.cc +30 -29
  651. data/src/core/lib/iomgr/timer_manager.h +25 -25
  652. data/src/core/lib/iomgr/unix_sockets_posix.cc +20 -21
  653. data/src/core/lib/iomgr/unix_sockets_posix.h +18 -18
  654. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +19 -17
  655. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +23 -21
  656. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +23 -23
  657. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +29 -26
  658. data/src/core/lib/iomgr/wakeup_fd_pipe.h +18 -18
  659. data/src/core/lib/iomgr/wakeup_fd_posix.cc +18 -18
  660. data/src/core/lib/iomgr/wakeup_fd_posix.h +50 -50
  661. data/src/core/lib/json/json_channel_args.h +42 -0
  662. data/src/core/lib/json/json_object_loader.cc +17 -2
  663. data/src/core/lib/json/json_object_loader.h +37 -1
  664. data/src/core/lib/json/json_reader.cc +28 -28
  665. data/src/core/lib/json/json_util.cc +5 -5
  666. data/src/core/lib/json/json_util.h +4 -4
  667. data/src/core/lib/json/json_writer.cc +56 -56
  668. data/src/core/lib/load_balancing/lb_policy.cc +18 -18
  669. data/src/core/lib/load_balancing/lb_policy.h +7 -4
  670. data/src/core/lib/load_balancing/subchannel_interface.h +1 -8
  671. data/src/core/lib/matchers/matchers.cc +6 -5
  672. data/src/core/lib/matchers/matchers.h +1 -1
  673. data/src/core/lib/promise/activity.cc +16 -2
  674. data/src/core/lib/promise/activity.h +58 -27
  675. data/src/core/lib/promise/arena_promise.h +82 -52
  676. data/src/core/lib/promise/context.h +14 -6
  677. data/src/core/lib/promise/detail/basic_seq.h +9 -28
  678. data/src/core/lib/promise/detail/promise_factory.h +59 -10
  679. data/src/core/lib/promise/detail/status.h +28 -0
  680. data/src/core/lib/promise/detail/switch.h +1455 -0
  681. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +20 -12
  682. data/src/core/lib/promise/for_each.h +155 -0
  683. data/src/core/lib/promise/latch.h +13 -19
  684. data/src/core/lib/promise/loop.h +7 -5
  685. data/src/core/lib/promise/map.h +1 -0
  686. data/src/core/lib/promise/map_pipe.h +88 -0
  687. data/src/core/lib/promise/pipe.cc +19 -0
  688. data/src/core/lib/promise/pipe.h +505 -0
  689. data/src/core/lib/promise/poll.h +19 -0
  690. data/src/core/lib/promise/seq.h +4 -5
  691. data/src/core/lib/promise/sleep.cc +5 -4
  692. data/src/core/lib/promise/sleep.h +1 -2
  693. data/src/core/lib/promise/try_concurrently.h +342 -0
  694. data/src/core/lib/promise/try_seq.h +11 -13
  695. data/src/core/lib/resolver/resolver.cc +17 -17
  696. data/src/core/lib/resolver/server_address.cc +18 -17
  697. data/src/core/lib/resolver/server_address.h +19 -21
  698. data/src/core/lib/resource_quota/api.cc +0 -1
  699. data/src/core/lib/resource_quota/api.h +1 -1
  700. data/src/core/lib/resource_quota/arena.cc +36 -17
  701. data/src/core/lib/resource_quota/arena.h +107 -18
  702. data/src/core/lib/resource_quota/memory_quota.cc +140 -43
  703. data/src/core/lib/resource_quota/memory_quota.h +85 -23
  704. data/src/core/lib/resource_quota/resource_quota.h +1 -1
  705. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  706. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +0 -1
  707. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +1 -3
  708. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +4 -2
  709. data/src/core/lib/security/authorization/matchers.cc +25 -22
  710. data/src/core/lib/security/authorization/rbac_policy.cc +2 -3
  711. data/src/core/lib/security/authorization/rbac_policy.h +1 -1
  712. data/src/core/lib/security/context/security_context.cc +22 -23
  713. data/src/core/lib/security/context/security_context.h +40 -30
  714. data/src/core/lib/security/credentials/alts/alts_credentials.cc +17 -17
  715. data/src/core/lib/security/credentials/alts/alts_credentials.h +50 -50
  716. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +19 -19
  717. data/src/core/lib/security/credentials/alts/check_gcp_environment.h +41 -41
  718. data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +17 -17
  719. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +18 -17
  720. data/src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc +18 -17
  721. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +19 -19
  722. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc +18 -18
  723. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h +36 -37
  724. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +18 -18
  725. data/src/core/lib/security/credentials/call_creds_util.h +1 -1
  726. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +3 -4
  727. data/src/core/lib/security/credentials/composite/composite_credentials.cc +22 -22
  728. data/src/core/lib/security/credentials/composite/composite_credentials.h +20 -21
  729. data/src/core/lib/security/credentials/credentials.cc +19 -18
  730. data/src/core/lib/security/credentials/credentials.h +34 -33
  731. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +77 -55
  732. data/src/core/lib/security/credentials/external/aws_request_signer.cc +4 -3
  733. data/src/core/lib/security/credentials/external/external_account_credentials.cc +40 -51
  734. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +17 -21
  735. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +21 -25
  736. data/src/core/lib/security/credentials/fake/fake_credentials.cc +20 -19
  737. data/src/core/lib/security/credentials/fake/fake_credentials.h +34 -35
  738. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +17 -17
  739. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +75 -73
  740. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +18 -19
  741. data/src/core/lib/security/credentials/iam/iam_credentials.cc +18 -17
  742. data/src/core/lib/security/credentials/iam/iam_credentials.h +18 -18
  743. data/src/core/lib/security/credentials/jwt/json_token.cc +24 -25
  744. data/src/core/lib/security/credentials/jwt/json_token.h +32 -32
  745. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +18 -18
  746. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +18 -19
  747. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +75 -75
  748. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +43 -43
  749. data/src/core/lib/security/credentials/local/local_credentials.cc +17 -17
  750. data/src/core/lib/security/credentials/local/local_credentials.h +20 -20
  751. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +52 -59
  752. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +19 -19
  753. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +24 -23
  754. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +22 -22
  755. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +19 -20
  756. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +18 -18
  757. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +20 -28
  758. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +4 -11
  759. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +30 -43
  760. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +1 -1
  761. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +18 -18
  762. data/src/core/lib/security/credentials/tls/tls_credentials.cc +18 -19
  763. data/src/core/lib/security/credentials/tls/tls_credentials.h +18 -18
  764. data/src/core/lib/security/credentials/xds/xds_credentials.cc +1 -2
  765. data/src/core/lib/security/credentials/xds/xds_credentials.h +1 -1
  766. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +32 -38
  767. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +41 -42
  768. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +32 -41
  769. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +20 -21
  770. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  771. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +3 -8
  772. data/src/core/lib/security/security_connector/load_system_roots.h +18 -18
  773. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +18 -18
  774. data/src/core/lib/security/security_connector/load_system_roots_supported.cc +19 -22
  775. data/src/core/lib/security/security_connector/load_system_roots_supported.h +19 -20
  776. data/src/core/lib/security/security_connector/local/local_security_connector.cc +30 -34
  777. data/src/core/lib/security/security_connector/local/local_security_connector.h +40 -41
  778. data/src/core/lib/security/security_connector/security_connector.cc +17 -17
  779. data/src/core/lib/security/security_connector/security_connector.h +32 -33
  780. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +34 -39
  781. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +38 -39
  782. data/src/core/lib/security/security_connector/ssl_utils.cc +37 -39
  783. data/src/core/lib/security/security_connector/ssl_utils.h +31 -31
  784. data/src/core/lib/security/security_connector/ssl_utils_config.cc +22 -22
  785. data/src/core/lib/security/security_connector/ssl_utils_config.h +18 -19
  786. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +42 -48
  787. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +17 -17
  788. data/src/core/lib/security/transport/auth_filters.h +18 -18
  789. data/src/core/lib/security/transport/client_auth_filter.cc +21 -21
  790. data/src/core/lib/security/transport/secure_endpoint.cc +54 -56
  791. data/src/core/lib/security/transport/secure_endpoint.h +22 -22
  792. data/src/core/lib/security/transport/security_handshaker.cc +70 -70
  793. data/src/core/lib/security/transport/security_handshaker.h +19 -19
  794. data/src/core/lib/security/transport/server_auth_filter.cc +43 -44
  795. data/src/core/lib/security/transport/tsi_error.cc +23 -20
  796. data/src/core/lib/security/transport/tsi_error.h +18 -18
  797. data/src/core/lib/security/util/json_util.cc +21 -22
  798. data/src/core/lib/security/util/json_util.h +18 -18
  799. data/src/core/lib/service_config/service_config.h +2 -2
  800. data/src/core/lib/service_config/service_config_call_data.h +7 -1
  801. data/src/core/lib/service_config/service_config_impl.cc +111 -158
  802. data/src/core/lib/service_config/service_config_impl.h +14 -17
  803. data/src/core/lib/service_config/service_config_parser.cc +14 -31
  804. data/src/core/lib/service_config/service_config_parser.h +14 -10
  805. data/src/core/lib/slice/b64.cc +26 -26
  806. data/src/core/lib/slice/b64.h +29 -29
  807. data/src/core/lib/slice/percent_encoding.cc +17 -17
  808. data/src/core/lib/slice/percent_encoding.h +24 -24
  809. data/src/core/lib/slice/slice.cc +44 -38
  810. data/src/core/lib/slice/slice.h +57 -11
  811. data/src/core/lib/slice/slice_buffer.cc +63 -59
  812. data/src/core/lib/slice/slice_buffer.h +27 -2
  813. data/src/core/lib/slice/slice_internal.h +31 -39
  814. data/src/core/lib/slice/slice_refcount.h +34 -19
  815. data/src/core/lib/slice/slice_string_helpers.cc +17 -17
  816. data/src/core/lib/slice/slice_string_helpers.h +19 -19
  817. data/src/core/lib/surface/api_trace.cc +17 -17
  818. data/src/core/lib/surface/api_trace.h +22 -22
  819. data/src/core/lib/surface/byte_buffer.cc +22 -23
  820. data/src/core/lib/surface/byte_buffer_reader.cc +23 -23
  821. data/src/core/lib/surface/call.cc +1521 -335
  822. data/src/core/lib/surface/call.h +86 -39
  823. data/src/core/lib/surface/call_details.cc +20 -21
  824. data/src/core/lib/surface/call_log_batch.cc +18 -18
  825. data/src/core/lib/surface/call_test_only.h +30 -30
  826. data/src/core/lib/surface/call_trace.cc +113 -0
  827. data/src/core/{ext/filters/http/message_compress/message_decompress_filter.h → lib/surface/call_trace.h} +10 -12
  828. data/src/core/lib/surface/channel.cc +62 -67
  829. data/src/core/lib/surface/channel.h +40 -32
  830. data/src/core/lib/surface/channel_init.cc +17 -17
  831. data/src/core/lib/surface/channel_init.h +18 -18
  832. data/src/core/lib/surface/channel_ping.cc +19 -19
  833. data/src/core/lib/surface/channel_stack_type.cc +21 -17
  834. data/src/core/lib/surface/channel_stack_type.h +20 -18
  835. data/src/core/lib/surface/completion_queue.cc +173 -191
  836. data/src/core/lib/surface/completion_queue.h +32 -32
  837. data/src/core/lib/surface/completion_queue_factory.cc +28 -28
  838. data/src/core/lib/surface/completion_queue_factory.h +20 -20
  839. data/src/core/lib/surface/event_string.cc +17 -17
  840. data/src/core/lib/surface/event_string.h +20 -20
  841. data/src/core/lib/surface/init.cc +29 -58
  842. data/src/core/lib/surface/init.h +18 -18
  843. data/src/core/lib/surface/init_internally.cc +1 -0
  844. data/src/core/lib/surface/init_internally.h +9 -0
  845. data/src/core/lib/surface/lame_client.cc +28 -26
  846. data/src/core/lib/surface/lame_client.h +19 -19
  847. data/src/core/lib/surface/metadata_array.cc +17 -18
  848. data/src/core/lib/surface/server.cc +61 -83
  849. data/src/core/lib/surface/server.h +5 -7
  850. data/src/core/lib/surface/validate_metadata.cc +28 -29
  851. data/src/core/lib/surface/validate_metadata.h +18 -18
  852. data/src/core/lib/surface/version.cc +21 -21
  853. data/src/core/lib/transport/bdp_estimator.cc +17 -17
  854. data/src/core/lib/transport/bdp_estimator.h +18 -19
  855. data/src/core/lib/transport/connectivity_state.cc +19 -19
  856. data/src/core/lib/transport/connectivity_state.h +19 -19
  857. data/src/core/lib/transport/error_utils.cc +51 -45
  858. data/src/core/lib/transport/error_utils.h +21 -21
  859. data/src/core/lib/transport/handshaker.cc +49 -46
  860. data/src/core/lib/transport/handshaker.h +43 -38
  861. data/src/core/lib/transport/handshaker_factory.h +44 -18
  862. data/src/core/lib/transport/handshaker_registry.cc +25 -19
  863. data/src/core/lib/transport/handshaker_registry.h +21 -22
  864. data/src/core/lib/transport/http2_errors.h +20 -20
  865. data/src/core/lib/transport/http_connect_handshaker.cc +40 -41
  866. data/src/core/lib/transport/http_connect_handshaker.h +18 -18
  867. data/src/core/lib/transport/metadata_batch.cc +4 -1
  868. data/src/core/lib/transport/metadata_batch.h +46 -20
  869. data/src/core/lib/transport/parsed_metadata.cc +2 -6
  870. data/src/core/lib/transport/parsed_metadata.h +1 -0
  871. data/src/core/lib/transport/pid_controller.cc +20 -20
  872. data/src/core/lib/transport/pid_controller.h +24 -24
  873. data/src/core/lib/transport/status_conversion.cc +22 -22
  874. data/src/core/lib/transport/status_conversion.h +20 -20
  875. data/src/core/lib/transport/tcp_connect_handshaker.cc +15 -20
  876. data/src/core/lib/transport/tcp_connect_handshaker.h +1 -1
  877. data/src/core/lib/transport/timeout_encoding.cc +22 -22
  878. data/src/core/lib/transport/timeout_encoding.h +18 -18
  879. data/src/core/lib/transport/transport.cc +88 -41
  880. data/src/core/lib/transport/transport.h +193 -195
  881. data/src/core/lib/transport/transport_impl.h +42 -42
  882. data/src/core/lib/transport/transport_op_string.cc +26 -25
  883. data/src/core/plugin_registry/grpc_plugin_registry.cc +25 -27
  884. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +7 -14
  885. data/src/core/tsi/alts/crypt/aes_gcm.cc +20 -20
  886. data/src/core/tsi/alts/crypt/gsec.cc +26 -26
  887. data/src/core/tsi/alts/crypt/gsec.h +334 -334
  888. data/src/core/tsi/alts/frame_protector/alts_counter.cc +23 -23
  889. data/src/core/tsi/alts/frame_protector/alts_counter.h +66 -66
  890. data/src/core/tsi/alts/frame_protector/alts_crypter.cc +19 -19
  891. data/src/core/tsi/alts/frame_protector/alts_crypter.h +206 -206
  892. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +72 -71
  893. data/src/core/tsi/alts/frame_protector/alts_frame_protector.h +38 -38
  894. data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc +18 -18
  895. data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h +80 -81
  896. data/src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc +22 -22
  897. data/src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc +22 -22
  898. data/src/core/tsi/alts/frame_protector/frame_handler.cc +26 -25
  899. data/src/core/tsi/alts/frame_protector/frame_handler.h +166 -166
  900. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +78 -77
  901. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +99 -99
  902. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +18 -17
  903. data/src/core/tsi/alts/handshaker/alts_shared_resource.h +41 -42
  904. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +37 -36
  905. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +58 -58
  906. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +20 -20
  907. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +21 -20
  908. data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +36 -36
  909. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +19 -19
  910. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +102 -101
  911. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +45 -44
  912. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h +38 -39
  913. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +38 -36
  914. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h +33 -34
  915. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +65 -66
  916. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +32 -31
  917. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +53 -54
  918. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +54 -53
  919. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h +138 -139
  920. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +58 -57
  921. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h +41 -42
  922. data/src/core/tsi/fake_transport_security.cc +80 -79
  923. data/src/core/tsi/fake_transport_security.h +30 -30
  924. data/src/core/tsi/local_transport_security.cc +34 -33
  925. data/src/core/tsi/local_transport_security.h +31 -31
  926. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +8 -3
  927. data/src/core/tsi/ssl/session_cache/ssl_session.h +18 -18
  928. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +19 -19
  929. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +18 -17
  930. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +19 -19
  931. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +25 -20
  932. data/src/core/tsi/ssl_transport_security.cc +139 -323
  933. data/src/core/tsi/ssl_transport_security.h +201 -200
  934. data/src/core/tsi/ssl_transport_security_utils.cc +250 -0
  935. data/src/core/tsi/ssl_transport_security_utils.h +147 -0
  936. data/src/core/tsi/ssl_types.h +25 -25
  937. data/src/core/tsi/transport_security.cc +26 -26
  938. data/src/core/tsi/transport_security.h +45 -45
  939. data/src/core/tsi/transport_security_grpc.cc +20 -20
  940. data/src/core/tsi/transport_security_grpc.h +39 -39
  941. data/src/core/tsi/transport_security_interface.h +330 -330
  942. data/src/ruby/ext/grpc/{ext-export-truffleruby.clang → ext-export-truffleruby-with-ruby-abi-version.clang} +0 -0
  943. data/src/ruby/ext/grpc/{ext-export-truffleruby.gcc → ext-export-truffleruby-with-ruby-abi-version.gcc} +0 -0
  944. data/src/ruby/ext/grpc/ext-export-with-ruby-abi-version.clang +2 -0
  945. data/src/ruby/ext/grpc/ext-export-with-ruby-abi-version.gcc +7 -0
  946. data/src/ruby/ext/grpc/ext-export.clang +0 -1
  947. data/src/ruby/ext/grpc/ext-export.gcc +1 -2
  948. data/src/ruby/ext/grpc/extconf.rb +47 -2
  949. data/src/ruby/ext/grpc/rb_call.c +1 -0
  950. data/src/ruby/ext/grpc/rb_channel.c +1 -0
  951. data/src/ruby/ext/grpc/rb_channel_args.c +1 -0
  952. data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
  953. data/src/ruby/ext/grpc/rb_grpc.c +1 -0
  954. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +38 -38
  955. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +59 -59
  956. data/src/ruby/lib/grpc/generic/bidi_call.rb +2 -0
  957. data/src/ruby/lib/grpc/version.rb +1 -1
  958. data/src/ruby/spec/channel_spec.rb +0 -43
  959. data/src/ruby/spec/client_server_spec.rb +20 -8
  960. data/src/ruby/spec/generic/active_call_spec.rb +12 -3
  961. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  962. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  963. data/third_party/re2/re2/bitstate.cc +3 -3
  964. data/third_party/re2/re2/dfa.cc +13 -13
  965. data/third_party/re2/re2/nfa.cc +4 -4
  966. data/third_party/re2/re2/onepass.cc +2 -2
  967. data/third_party/re2/re2/prefilter_tree.cc +27 -59
  968. data/third_party/re2/re2/prefilter_tree.h +3 -2
  969. data/third_party/re2/re2/prog.cc +11 -2
  970. data/third_party/re2/re2/prog.h +17 -5
  971. data/third_party/re2/re2/re2.cc +6 -11
  972. data/third_party/re2/re2/re2.h +1 -1
  973. data/third_party/re2/re2/regexp.cc +1 -2
  974. data/third_party/re2/re2/stringpiece.h +10 -7
  975. data/third_party/re2/re2/unicode_casefold.cc +25 -11
  976. data/third_party/re2/re2/unicode_groups.cc +319 -151
  977. data/third_party/re2/re2/walker-inl.h +3 -2
  978. data/third_party/re2/util/mutex.h +4 -4
  979. data/third_party/zlib/compress.c +3 -3
  980. data/third_party/zlib/crc32.c +21 -12
  981. data/third_party/zlib/deflate.c +112 -106
  982. data/third_party/zlib/deflate.h +2 -2
  983. data/third_party/zlib/gzlib.c +1 -1
  984. data/third_party/zlib/gzread.c +3 -5
  985. data/third_party/zlib/gzwrite.c +1 -1
  986. data/third_party/zlib/infback.c +10 -7
  987. data/third_party/zlib/inflate.c +5 -2
  988. data/third_party/zlib/inftrees.c +2 -2
  989. data/third_party/zlib/inftrees.h +1 -1
  990. data/third_party/zlib/trees.c +61 -62
  991. data/third_party/zlib/uncompr.c +2 -2
  992. data/third_party/zlib/zconf.h +16 -3
  993. data/third_party/zlib/zlib.h +10 -10
  994. data/third_party/zlib/zutil.c +9 -7
  995. data/third_party/zlib/zutil.h +1 -0
  996. metadata +146 -40
  997. data/include/grpc/impl/codegen/gpr_slice.h +0 -71
  998. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -188
  999. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -187
  1000. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +0 -332
  1001. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +0 -52
  1002. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +0 -322
  1003. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +0 -62
  1004. data/src/core/lib/gpr/murmur_hash.cc +0 -82
  1005. data/src/core/lib/gpr/murmur_hash.h +0 -29
  1006. data/src/core/lib/gpr/tls.h +0 -156
  1007. data/src/core/lib/promise/call_push_pull.h +0 -148
  1008. data/src/core/lib/slice/slice_api.cc +0 -39
  1009. data/src/core/lib/slice/slice_refcount_base.h +0 -60
@@ -28,7 +28,6 @@
28
28
  #include <utility>
29
29
  #include <vector>
30
30
 
31
- #include "absl/memory/memory.h"
32
31
  #include "absl/status/status.h"
33
32
  #include "absl/status/statusor.h"
34
33
  #include "absl/strings/str_cat.h"
@@ -58,33 +57,25 @@
58
57
  #include <grpc/support/log.h>
59
58
 
60
59
  #include "src/core/ext/xds/upb_utils.h"
61
- #include "src/core/ext/xds/xds_bootstrap.h"
62
60
  #include "src/core/ext/xds/xds_cluster_specifier_plugin.h"
63
61
  #include "src/core/ext/xds/xds_common_types.h"
64
62
  #include "src/core/ext/xds/xds_http_filters.h"
65
63
  #include "src/core/ext/xds/xds_resource_type.h"
66
- #include "src/core/ext/xds/xds_resource_type_impl.h"
67
64
  #include "src/core/ext/xds/xds_routing.h"
68
65
  #include "src/core/lib/channel/status_util.h"
66
+ #include "src/core/lib/config/core_configuration.h"
69
67
  #include "src/core/lib/debug/trace.h"
70
68
  #include "src/core/lib/gpr/string.h"
71
69
  #include "src/core/lib/gprpp/env.h"
72
70
  #include "src/core/lib/gprpp/match.h"
71
+ #include "src/core/lib/gprpp/ref_counted_ptr.h"
73
72
  #include "src/core/lib/gprpp/time.h"
74
- #include "src/core/lib/iomgr/error.h"
73
+ #include "src/core/lib/json/json.h"
74
+ #include "src/core/lib/load_balancing/lb_policy_registry.h"
75
75
  #include "src/core/lib/matchers/matchers.h"
76
76
 
77
77
  namespace grpc_core {
78
78
 
79
- // TODO(yashykt): Remove once RBAC is no longer experimental
80
- bool XdsRbacEnabled() {
81
- auto value = GetEnv("GRPC_XDS_EXPERIMENTAL_RBAC");
82
- if (!value.has_value()) return false;
83
- bool parsed_value;
84
- bool parse_succeeded = gpr_parse_bool_value(value->c_str(), &parsed_value);
85
- return parse_succeeded && parsed_value;
86
- }
87
-
88
79
  // TODO(donnadionne): Remove once RLS is no longer experimental
89
80
  bool XdsRlsEnabled() {
90
81
  auto value = GetEnv("GRPC_EXPERIMENTAL_XDS_RLS_LB");
@@ -134,85 +125,77 @@ std::string XdsRouteConfigResource::Route::Matchers::ToString() const {
134
125
  }
135
126
 
136
127
  //
137
- // XdsRouteConfigResource::Route::RouteAction::HashPolicy
128
+ // XdsRouteConfigResource::Route::RouteAction::HashPolicy::Header
138
129
  //
139
130
 
140
- XdsRouteConfigResource::Route::RouteAction::HashPolicy::HashPolicy(
141
- const HashPolicy& other)
142
- : type(other.type),
143
- header_name(other.header_name),
131
+ XdsRouteConfigResource::Route::RouteAction::HashPolicy::Header::Header(
132
+ const Header& other)
133
+ : header_name(other.header_name),
144
134
  regex_substitution(other.regex_substitution) {
145
135
  if (other.regex != nullptr) {
146
136
  regex =
147
- absl::make_unique<RE2>(other.regex->pattern(), other.regex->options());
137
+ std::make_unique<RE2>(other.regex->pattern(), other.regex->options());
148
138
  }
149
139
  }
150
140
 
151
- XdsRouteConfigResource::Route::RouteAction::HashPolicy&
152
- XdsRouteConfigResource::Route::RouteAction::HashPolicy::operator=(
153
- const HashPolicy& other) {
154
- type = other.type;
141
+ XdsRouteConfigResource::Route::RouteAction::HashPolicy::Header&
142
+ XdsRouteConfigResource::Route::RouteAction::HashPolicy::Header::operator=(
143
+ const Header& other) {
155
144
  header_name = other.header_name;
156
145
  if (other.regex != nullptr) {
157
146
  regex =
158
- absl::make_unique<RE2>(other.regex->pattern(), other.regex->options());
147
+ std::make_unique<RE2>(other.regex->pattern(), other.regex->options());
159
148
  }
160
149
  regex_substitution = other.regex_substitution;
161
150
  return *this;
162
151
  }
163
152
 
164
- XdsRouteConfigResource::Route::RouteAction::HashPolicy::HashPolicy(
165
- HashPolicy&& other) noexcept
166
- : type(other.type),
167
- header_name(std::move(other.header_name)),
153
+ XdsRouteConfigResource::Route::RouteAction::HashPolicy::Header::Header(
154
+ Header&& other) noexcept
155
+ : header_name(std::move(other.header_name)),
168
156
  regex(std::move(other.regex)),
169
157
  regex_substitution(std::move(other.regex_substitution)) {}
170
158
 
171
- XdsRouteConfigResource::Route::RouteAction::HashPolicy&
172
- XdsRouteConfigResource::Route::RouteAction::HashPolicy::operator=(
173
- HashPolicy&& other) noexcept {
174
- type = other.type;
159
+ XdsRouteConfigResource::Route::RouteAction::HashPolicy::Header&
160
+ XdsRouteConfigResource::Route::RouteAction::HashPolicy::Header::operator=(
161
+ Header&& other) noexcept {
175
162
  header_name = std::move(other.header_name);
176
163
  regex = std::move(other.regex);
177
164
  regex_substitution = std::move(other.regex_substitution);
178
165
  return *this;
179
166
  }
180
167
 
181
- bool XdsRouteConfigResource::Route::RouteAction::HashPolicy::HashPolicy::
182
- operator==(const HashPolicy& other) const {
183
- if (type != other.type) return false;
184
- if (type == Type::HEADER) {
185
- if (regex == nullptr) {
186
- if (other.regex != nullptr) return false;
187
- } else {
188
- if (other.regex == nullptr) return false;
189
- return header_name == other.header_name &&
190
- regex->pattern() == other.regex->pattern() &&
191
- regex_substitution == other.regex_substitution;
192
- }
168
+ bool XdsRouteConfigResource::Route::RouteAction::HashPolicy::Header::operator==(
169
+ const Header& other) const {
170
+ if (header_name != other.header_name) return false;
171
+ if (regex == nullptr) {
172
+ if (other.regex != nullptr) return false;
173
+ } else {
174
+ if (other.regex == nullptr) return false;
175
+ if (regex->pattern() != other.regex->pattern()) return false;
193
176
  }
194
- return true;
177
+ return regex_substitution == other.regex_substitution;
195
178
  }
196
179
 
180
+ std::string
181
+ XdsRouteConfigResource::Route::RouteAction::HashPolicy::Header::ToString()
182
+ const {
183
+ return absl::StrCat("Header ", header_name, "/",
184
+ (regex == nullptr) ? "" : regex->pattern(), "/",
185
+ regex_substitution);
186
+ }
187
+
188
+ //
189
+ // XdsRouteConfigResource::Route::RouteAction::HashPolicy
190
+ //
191
+
197
192
  std::string XdsRouteConfigResource::Route::RouteAction::HashPolicy::ToString()
198
193
  const {
199
- std::vector<std::string> contents;
200
- switch (type) {
201
- case Type::HEADER:
202
- contents.push_back("type=HEADER");
203
- break;
204
- case Type::CHANNEL_ID:
205
- contents.push_back("type=CHANNEL_ID");
206
- break;
207
- }
208
- contents.push_back(
209
- absl::StrFormat("terminal=%s", terminal ? "true" : "false"));
210
- if (type == Type::HEADER) {
211
- contents.push_back(absl::StrFormat(
212
- "Header %s:/%s/%s", header_name,
213
- (regex == nullptr) ? "" : regex->pattern(), regex_substitution));
214
- }
215
- return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
194
+ std::string type = Match(
195
+ policy, [](const Header& header) { return header.ToString(); },
196
+ [](const ChannelId&) -> std::string { return "ChannelId"; });
197
+ return absl::StrCat("{", type, ", terminal=", terminal ? "true" : "false",
198
+ "}");
216
199
  }
217
200
 
218
201
  //
@@ -243,6 +226,7 @@ XdsRouteConfigResource::Route::RouteAction::ClusterWeight::ToString() const {
243
226
 
244
227
  std::string XdsRouteConfigResource::Route::RouteAction::ToString() const {
245
228
  std::vector<std::string> contents;
229
+ contents.reserve(hash_policies.size());
246
230
  for (const HashPolicy& hash_policy : hash_policies) {
247
231
  contents.push_back(absl::StrCat("hash_policy=", hash_policy.ToString()));
248
232
  }
@@ -339,65 +323,84 @@ std::string XdsRouteConfigResource::ToString() const {
339
323
 
340
324
  namespace {
341
325
 
342
- absl::StatusOr<XdsRouteConfigResource::ClusterSpecifierPluginMap>
343
- ClusterSpecifierPluginParse(
326
+ XdsRouteConfigResource::ClusterSpecifierPluginMap ClusterSpecifierPluginParse(
344
327
  const XdsResourceType::DecodeContext& context,
345
- const envoy_config_route_v3_RouteConfiguration* route_config) {
328
+ const envoy_config_route_v3_RouteConfiguration* route_config,
329
+ ValidationErrors* errors) {
346
330
  XdsRouteConfigResource::ClusterSpecifierPluginMap
347
331
  cluster_specifier_plugin_map;
332
+ const auto& cluster_specifier_plugin_registry =
333
+ static_cast<const GrpcXdsBootstrap&>(context.client->bootstrap())
334
+ .cluster_specifier_plugin_registry();
348
335
  size_t num_cluster_specifier_plugins;
349
336
  const envoy_config_route_v3_ClusterSpecifierPlugin* const*
350
337
  cluster_specifier_plugin =
351
338
  envoy_config_route_v3_RouteConfiguration_cluster_specifier_plugins(
352
339
  route_config, &num_cluster_specifier_plugins);
353
340
  for (size_t i = 0; i < num_cluster_specifier_plugins; ++i) {
354
- const envoy_config_core_v3_TypedExtensionConfig* extension =
341
+ bool is_optional = envoy_config_route_v3_ClusterSpecifierPlugin_is_optional(
342
+ cluster_specifier_plugin[i]);
343
+ ValidationErrors::ScopedField field(
344
+ errors, absl::StrCat(".cluster_specifier_plugins[", i, "].extension"));
345
+ const envoy_config_core_v3_TypedExtensionConfig* typed_extension_config =
355
346
  envoy_config_route_v3_ClusterSpecifierPlugin_extension(
356
347
  cluster_specifier_plugin[i]);
357
348
  std::string name = UpbStringToStdString(
358
- envoy_config_core_v3_TypedExtensionConfig_name(extension));
349
+ envoy_config_core_v3_TypedExtensionConfig_name(typed_extension_config));
359
350
  if (cluster_specifier_plugin_map.find(name) !=
360
351
  cluster_specifier_plugin_map.end()) {
361
- return absl::InvalidArgumentError(absl::StrCat(
362
- "Duplicated definition of cluster_specifier_plugin ", name));
352
+ ValidationErrors::ScopedField field(errors, ".name");
353
+ errors->AddError(absl::StrCat("duplicate name \"", name, "\""));
354
+ } else {
355
+ // Add a sentinel entry in case we encounter an error later, just so we
356
+ // don't generate duplicate errors for each route that uses this plugin.
357
+ cluster_specifier_plugin_map[name] = "<sentinel>";
363
358
  }
359
+ ValidationErrors::ScopedField field2(errors, ".typed_config");
364
360
  const google_protobuf_Any* any =
365
- envoy_config_core_v3_TypedExtensionConfig_typed_config(extension);
366
- if (any == nullptr) {
367
- return absl::InvalidArgumentError(
368
- "Could not obtrain TypedExtensionConfig for plugin config.");
369
- }
370
- auto plugin_type = ExtractExtensionTypeName(context, any);
371
- if (!plugin_type.ok()) return plugin_type.status();
372
- bool is_optional = envoy_config_route_v3_ClusterSpecifierPlugin_is_optional(
373
- cluster_specifier_plugin[i]);
361
+ envoy_config_core_v3_TypedExtensionConfig_typed_config(
362
+ typed_extension_config);
363
+ auto extension = ExtractXdsExtension(context, any, errors);
364
+ if (!extension.has_value()) continue;
374
365
  const XdsClusterSpecifierPluginImpl* cluster_specifier_plugin_impl =
375
- XdsClusterSpecifierPluginRegistry::GetPluginForType(plugin_type->type);
376
- std::string lb_policy_config;
366
+ cluster_specifier_plugin_registry.GetPluginForType(extension->type);
377
367
  if (cluster_specifier_plugin_impl == nullptr) {
378
- if (!is_optional) {
379
- return absl::InvalidArgumentError(absl::StrCat(
380
- "Unknown ClusterSpecifierPlugin type ", plugin_type->type));
368
+ if (is_optional) {
369
+ // Empty string indicates an optional plugin.
370
+ // This is used later when validating routes, and since we will skip
371
+ // any routes that refer to this plugin, we won't wind up including
372
+ // this plugin in the resource that we return to the watcher.
373
+ cluster_specifier_plugin_map[std::move(name)] = "";
374
+ } else {
375
+ // Not optional, report error.
376
+ errors->AddError("unsupported ClusterSpecifierPlugin type");
381
377
  }
382
- // Optional plugin, leave lb_policy_config empty.
378
+ continue;
379
+ }
380
+ const size_t original_error_size = errors->size();
381
+ Json lb_policy_config =
382
+ cluster_specifier_plugin_impl->GenerateLoadBalancingPolicyConfig(
383
+ std::move(*extension), context.arena, context.symtab, errors);
384
+ if (errors->size() != original_error_size) continue;
385
+ auto config =
386
+ CoreConfiguration::Get().lb_policy_registry().ParseLoadBalancingConfig(
387
+ lb_policy_config);
388
+ if (!config.ok()) {
389
+ errors->AddError(absl::StrCat(
390
+ "ClusterSpecifierPlugin returned invalid LB policy config: ",
391
+ config.status().message()));
383
392
  } else {
384
- auto config =
385
- cluster_specifier_plugin_impl->GenerateLoadBalancingPolicyConfig(
386
- google_protobuf_Any_value(any), context.arena, context.symtab);
387
- if (!config.ok()) return config.status();
388
- lb_policy_config = std::move(*config);
393
+ cluster_specifier_plugin_map[std::move(name)] = lb_policy_config.Dump();
389
394
  }
390
- cluster_specifier_plugin_map[std::move(name)] = std::move(lb_policy_config);
391
395
  }
392
396
  return cluster_specifier_plugin_map;
393
397
  }
394
398
 
395
- absl::Status RoutePathMatchParse(const envoy_config_route_v3_RouteMatch* match,
396
- XdsRouteConfigResource::Route* route,
397
- bool* ignore_route) {
399
+ absl::optional<StringMatcher> RoutePathMatchParse(
400
+ const envoy_config_route_v3_RouteMatch* match, ValidationErrors* errors) {
401
+ bool case_sensitive = true;
398
402
  auto* case_sensitive_ptr =
399
403
  envoy_config_route_v3_RouteMatch_case_sensitive(match);
400
- bool case_sensitive = true;
401
404
  if (case_sensitive_ptr != nullptr) {
402
405
  case_sensitive = google_protobuf_BoolValue_value(case_sensitive_ptr);
403
406
  }
@@ -406,25 +409,18 @@ absl::Status RoutePathMatchParse(const envoy_config_route_v3_RouteMatch* match,
406
409
  if (envoy_config_route_v3_RouteMatch_has_prefix(match)) {
407
410
  absl::string_view prefix =
408
411
  UpbStringToAbsl(envoy_config_route_v3_RouteMatch_prefix(match));
409
- // Empty prefix "" is accepted.
412
+ // For any prefix that cannot match a path of the form "/service/method",
413
+ // ignore the route.
410
414
  if (!prefix.empty()) {
411
- // Prefix "/" is accepted.
412
- if (prefix[0] != '/') {
413
- // Prefix which does not start with a / will never match anything, so
414
- // ignore this route.
415
- *ignore_route = true;
416
- return absl::OkStatus();
417
- }
415
+ // Does not start with a slash.
416
+ if (prefix[0] != '/') return absl::nullopt;
418
417
  std::vector<absl::string_view> prefix_elements =
419
418
  absl::StrSplit(prefix.substr(1), absl::MaxSplits('/', 2));
420
- if (prefix_elements.size() > 2) {
421
- // Prefix cannot have more than 2 slashes.
422
- *ignore_route = true;
423
- return absl::OkStatus();
424
- } else if (prefix_elements.size() == 2 && prefix_elements[0].empty()) {
425
- // Prefix contains empty string between the 2 slashes
426
- *ignore_route = true;
427
- return absl::OkStatus();
419
+ // More than 2 slashes.
420
+ if (prefix_elements.size() > 2) return absl::nullopt;
421
+ // Two consecutive slashes.
422
+ if (prefix_elements.size() == 2 && prefix_elements[0].empty()) {
423
+ return absl::nullopt;
428
424
  }
429
425
  }
430
426
  type = StringMatcher::Type::kPrefix;
@@ -432,35 +428,19 @@ absl::Status RoutePathMatchParse(const envoy_config_route_v3_RouteMatch* match,
432
428
  } else if (envoy_config_route_v3_RouteMatch_has_path(match)) {
433
429
  absl::string_view path =
434
430
  UpbStringToAbsl(envoy_config_route_v3_RouteMatch_path(match));
435
- if (path.empty()) {
436
- // Path that is empty will never match anything, so ignore this route.
437
- *ignore_route = true;
438
- return absl::OkStatus();
439
- }
440
- if (path[0] != '/') {
441
- // Path which does not start with a / will never match anything, so
442
- // ignore this route.
443
- *ignore_route = true;
444
- return absl::OkStatus();
445
- }
431
+ // For any path not of the form "/service/method", ignore the route.
432
+ // Empty path.
433
+ if (path.empty()) return absl::nullopt;
434
+ // Does not start with a slash.
435
+ if (path[0] != '/') return absl::nullopt;
446
436
  std::vector<absl::string_view> path_elements =
447
437
  absl::StrSplit(path.substr(1), absl::MaxSplits('/', 2));
448
- if (path_elements.size() != 2) {
449
- // Path not in the required format of /service/method will never match
450
- // anything, so ignore this route.
451
- *ignore_route = true;
452
- return absl::OkStatus();
453
- } else if (path_elements[0].empty()) {
454
- // Path contains empty service name will never match anything, so ignore
455
- // this route.
456
- *ignore_route = true;
457
- return absl::OkStatus();
458
- } else if (path_elements[1].empty()) {
459
- // Path contains empty method name will never match anything, so ignore
460
- // this route.
461
- *ignore_route = true;
462
- return absl::OkStatus();
463
- }
438
+ // Number of slashes does not equal 2.
439
+ if (path_elements.size() != 2) return absl::nullopt;
440
+ // Empty service name.
441
+ if (path_elements[0].empty()) return absl::nullopt;
442
+ // Empty method name.
443
+ if (path_elements[1].empty()) return absl::nullopt;
464
444
  type = StringMatcher::Type::kExact;
465
445
  match_string = std::string(path);
466
446
  } else if (envoy_config_route_v3_RouteMatch_has_safe_regex(match)) {
@@ -471,27 +451,30 @@ absl::Status RoutePathMatchParse(const envoy_config_route_v3_RouteMatch* match,
471
451
  match_string = UpbStringToStdString(
472
452
  envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher));
473
453
  } else {
474
- return absl::InvalidArgumentError(
475
- "Invalid route path specifier specified.");
454
+ errors->AddError("invalid path specifier");
455
+ return absl::nullopt;
476
456
  }
477
457
  absl::StatusOr<StringMatcher> string_matcher =
478
458
  StringMatcher::Create(type, match_string, case_sensitive);
479
459
  if (!string_matcher.ok()) {
480
- return absl::InvalidArgumentError(
481
- absl::StrCat("path matcher: ", string_matcher.status().message()));
460
+ errors->AddError(absl::StrCat("error creating path matcher: ",
461
+ string_matcher.status().message()));
462
+ return absl::nullopt;
482
463
  }
483
- route->matchers.path_matcher = std::move(string_matcher.value());
484
- return absl::OkStatus();
464
+ return std::move(*string_matcher);
485
465
  }
486
466
 
487
- absl::Status RouteHeaderMatchersParse(
488
- const envoy_config_route_v3_RouteMatch* match,
489
- XdsRouteConfigResource::Route* route) {
467
+ void RouteHeaderMatchersParse(const envoy_config_route_v3_RouteMatch* match,
468
+ XdsRouteConfigResource::Route* route,
469
+ ValidationErrors* errors) {
490
470
  size_t size;
491
471
  const envoy_config_route_v3_HeaderMatcher* const* headers =
492
472
  envoy_config_route_v3_RouteMatch_headers(match, &size);
493
473
  for (size_t i = 0; i < size; ++i) {
474
+ ValidationErrors::ScopedField field(errors,
475
+ absl::StrCat(".headers[", i, "]"));
494
476
  const envoy_config_route_v3_HeaderMatcher* header = headers[i];
477
+ GPR_ASSERT(header != nullptr);
495
478
  const std::string name =
496
479
  UpbStringToStdString(envoy_config_route_v3_HeaderMatcher_name(header));
497
480
  HeaderMatcher::Type type;
@@ -503,6 +486,18 @@ absl::Status RouteHeaderMatchersParse(
503
486
  type = HeaderMatcher::Type::kExact;
504
487
  match_string = UpbStringToStdString(
505
488
  envoy_config_route_v3_HeaderMatcher_exact_match(header));
489
+ } else if (envoy_config_route_v3_HeaderMatcher_has_prefix_match(header)) {
490
+ type = HeaderMatcher::Type::kPrefix;
491
+ match_string = UpbStringToStdString(
492
+ envoy_config_route_v3_HeaderMatcher_prefix_match(header));
493
+ } else if (envoy_config_route_v3_HeaderMatcher_has_suffix_match(header)) {
494
+ type = HeaderMatcher::Type::kSuffix;
495
+ match_string = UpbStringToStdString(
496
+ envoy_config_route_v3_HeaderMatcher_suffix_match(header));
497
+ } else if (envoy_config_route_v3_HeaderMatcher_has_contains_match(header)) {
498
+ type = HeaderMatcher::Type::kContains;
499
+ match_string = UpbStringToStdString(
500
+ envoy_config_route_v3_HeaderMatcher_contains_match(header));
506
501
  } else if (envoy_config_route_v3_HeaderMatcher_has_safe_regex_match(
507
502
  header)) {
508
503
  const envoy_type_matcher_v3_RegexMatcher* regex_matcher =
@@ -520,21 +515,9 @@ absl::Status RouteHeaderMatchersParse(
520
515
  } else if (envoy_config_route_v3_HeaderMatcher_has_present_match(header)) {
521
516
  type = HeaderMatcher::Type::kPresent;
522
517
  present_match = envoy_config_route_v3_HeaderMatcher_present_match(header);
523
- } else if (envoy_config_route_v3_HeaderMatcher_has_prefix_match(header)) {
524
- type = HeaderMatcher::Type::kPrefix;
525
- match_string = UpbStringToStdString(
526
- envoy_config_route_v3_HeaderMatcher_prefix_match(header));
527
- } else if (envoy_config_route_v3_HeaderMatcher_has_suffix_match(header)) {
528
- type = HeaderMatcher::Type::kSuffix;
529
- match_string = UpbStringToStdString(
530
- envoy_config_route_v3_HeaderMatcher_suffix_match(header));
531
- } else if (envoy_config_route_v3_HeaderMatcher_has_contains_match(header)) {
532
- type = HeaderMatcher::Type::kContains;
533
- match_string = UpbStringToStdString(
534
- envoy_config_route_v3_HeaderMatcher_contains_match(header));
535
518
  } else {
536
- return absl::InvalidArgumentError(
537
- "Invalid route header matcher specified.");
519
+ errors->AddError("invalid header matcher");
520
+ continue;
538
521
  }
539
522
  bool invert_match =
540
523
  envoy_config_route_v3_HeaderMatcher_invert_match(header);
@@ -542,18 +525,17 @@ absl::Status RouteHeaderMatchersParse(
542
525
  HeaderMatcher::Create(name, type, match_string, range_start, range_end,
543
526
  present_match, invert_match);
544
527
  if (!header_matcher.ok()) {
545
- return absl::InvalidArgumentError(
546
- absl::StrCat("header matcher: ", header_matcher.status().message()));
528
+ errors->AddError(absl::StrCat("cannot create header matcher: ",
529
+ header_matcher.status().message()));
530
+ } else {
531
+ route->matchers.header_matchers.emplace_back(std::move(*header_matcher));
547
532
  }
548
- route->matchers.header_matchers.emplace_back(
549
- std::move(header_matcher.value()));
550
533
  }
551
- return absl::OkStatus();
552
534
  }
553
535
 
554
- absl::Status RouteRuntimeFractionParse(
555
- const envoy_config_route_v3_RouteMatch* match,
556
- XdsRouteConfigResource::Route* route) {
536
+ void RouteRuntimeFractionParse(const envoy_config_route_v3_RouteMatch* match,
537
+ XdsRouteConfigResource::Route* route,
538
+ ValidationErrors* errors) {
557
539
  const envoy_config_core_v3_RuntimeFractionalPercent* runtime_fraction =
558
540
  envoy_config_route_v3_RouteMatch_runtime_fraction(match);
559
541
  if (runtime_fraction != nullptr) {
@@ -562,9 +544,8 @@ absl::Status RouteRuntimeFractionParse(
562
544
  runtime_fraction);
563
545
  if (fraction != nullptr) {
564
546
  uint32_t numerator = envoy_type_v3_FractionalPercent_numerator(fraction);
565
- const auto denominator =
566
- static_cast<envoy_type_v3_FractionalPercent_DenominatorType>(
567
- envoy_type_v3_FractionalPercent_denominator(fraction));
547
+ const uint32_t denominator =
548
+ envoy_type_v3_FractionalPercent_denominator(fraction);
568
549
  // Normalize to million.
569
550
  switch (denominator) {
570
551
  case envoy_type_v3_FractionalPercent_HUNDRED:
@@ -575,100 +556,98 @@ absl::Status RouteRuntimeFractionParse(
575
556
  break;
576
557
  case envoy_type_v3_FractionalPercent_MILLION:
577
558
  break;
578
- default:
579
- return absl::InvalidArgumentError("Unknown denominator type");
559
+ default: {
560
+ ValidationErrors::ScopedField field(
561
+ errors, ".runtime_fraction.default_value.denominator");
562
+ errors->AddError("unknown denominator type");
563
+ return;
564
+ }
580
565
  }
581
566
  route->matchers.fraction_per_million = numerator;
582
567
  }
583
568
  }
584
- return GRPC_ERROR_NONE;
585
569
  }
586
570
 
587
571
  template <typename ParentType, typename EntryType>
588
- absl::StatusOr<XdsRouteConfigResource::TypedPerFilterConfig>
589
- ParseTypedPerFilterConfig(
572
+ XdsRouteConfigResource::TypedPerFilterConfig ParseTypedPerFilterConfig(
590
573
  const XdsResourceType::DecodeContext& context, const ParentType* parent,
591
574
  const EntryType* (*entry_func)(const ParentType*, size_t*),
592
575
  upb_StringView (*key_func)(const EntryType*),
593
- const google_protobuf_Any* (*value_func)(const EntryType*)) {
576
+ const google_protobuf_Any* (*value_func)(const EntryType*),
577
+ ValidationErrors* errors) {
594
578
  XdsRouteConfigResource::TypedPerFilterConfig typed_per_filter_config;
595
579
  size_t filter_it = kUpb_Map_Begin;
596
580
  while (true) {
597
581
  const auto* filter_entry = entry_func(parent, &filter_it);
598
582
  if (filter_entry == nullptr) break;
599
583
  absl::string_view key = UpbStringToAbsl(key_func(filter_entry));
600
- if (key.empty()) {
601
- return absl::InvalidArgumentError("empty filter name in map");
602
- }
584
+ ValidationErrors::ScopedField field(errors, absl::StrCat("[", key, "]"));
585
+ if (key.empty()) errors->AddError("filter name must be non-empty");
603
586
  const google_protobuf_Any* any = value_func(filter_entry);
604
- GPR_ASSERT(any != nullptr);
605
- absl::string_view filter_type =
606
- UpbStringToAbsl(google_protobuf_Any_type_url(any));
607
- if (filter_type.empty()) {
608
- return absl::InvalidArgumentError(
609
- absl::StrCat("no filter config specified for filter name ", key));
610
- }
587
+ auto extension = ExtractXdsExtension(context, any, errors);
588
+ if (!extension.has_value()) continue;
589
+ auto* extension_to_use = &*extension;
590
+ absl::optional<XdsExtension> nested_extension;
611
591
  bool is_optional = false;
612
- if (filter_type ==
613
- "type.googleapis.com/envoy.config.route.v3.FilterConfig") {
614
- upb_StringView any_value = google_protobuf_Any_value(any);
592
+ if (extension->type == "envoy.config.route.v3.FilterConfig") {
593
+ absl::string_view* serialized_config =
594
+ absl::get_if<absl::string_view>(&extension->value);
595
+ if (serialized_config == nullptr) {
596
+ errors->AddError("could not parse FilterConfig");
597
+ continue;
598
+ }
615
599
  const auto* filter_config = envoy_config_route_v3_FilterConfig_parse(
616
- any_value.data, any_value.size, context.arena);
600
+ serialized_config->data(), serialized_config->size(), context.arena);
617
601
  if (filter_config == nullptr) {
618
- return absl::InvalidArgumentError(
619
- absl::StrCat("could not parse FilterConfig wrapper for ", key));
602
+ errors->AddError("could not parse FilterConfig");
603
+ continue;
620
604
  }
621
605
  is_optional =
622
606
  envoy_config_route_v3_FilterConfig_is_optional(filter_config);
623
607
  any = envoy_config_route_v3_FilterConfig_config(filter_config);
624
- if (any == nullptr) {
625
- if (is_optional) continue;
626
- return absl::InvalidArgumentError(
627
- absl::StrCat("no filter config specified for filter name ", key));
628
- }
608
+ extension->validation_fields.emplace_back(errors, ".config");
609
+ nested_extension = ExtractXdsExtension(context, any, errors);
610
+ if (!nested_extension.has_value()) continue;
611
+ extension_to_use = &*nested_extension;
629
612
  }
630
- auto type = ExtractExtensionTypeName(context, any);
631
- if (!type.ok()) return type.status();
613
+ const auto& http_filter_registry =
614
+ static_cast<const GrpcXdsBootstrap&>(context.client->bootstrap())
615
+ .http_filter_registry();
632
616
  const XdsHttpFilterImpl* filter_impl =
633
- XdsHttpFilterRegistry::GetFilterForType(type->type);
617
+ http_filter_registry.GetFilterForType(extension_to_use->type);
634
618
  if (filter_impl == nullptr) {
635
- if (is_optional) continue;
636
- return absl::InvalidArgumentError(
637
- absl::StrCat("no filter registered for config type ", type->type));
619
+ if (!is_optional) errors->AddError("unsupported filter type");
620
+ continue;
638
621
  }
639
- absl::StatusOr<XdsHttpFilterImpl::FilterConfig> filter_config =
622
+ absl::optional<XdsHttpFilterImpl::FilterConfig> filter_config =
640
623
  filter_impl->GenerateFilterConfigOverride(
641
- google_protobuf_Any_value(any), context.arena);
642
- if (!filter_config.ok()) {
643
- return absl::InvalidArgumentError(
644
- absl::StrCat("filter config for type ", type->type,
645
- " failed to parse: ", filter_config.status().message()));
624
+ context, std::move(*extension_to_use), errors);
625
+ if (filter_config.has_value()) {
626
+ typed_per_filter_config[std::string(key)] = std::move(*filter_config);
646
627
  }
647
- typed_per_filter_config[std::string(key)] = std::move(*filter_config);
648
628
  }
649
629
  return typed_per_filter_config;
650
630
  }
651
631
 
652
- absl::Status RetryPolicyParse(
632
+ XdsRouteConfigResource::RetryPolicy RetryPolicyParse(
653
633
  const XdsResourceType::DecodeContext& context,
654
- const envoy_config_route_v3_RetryPolicy* retry_policy,
655
- absl::optional<XdsRouteConfigResource::RetryPolicy>* retry) {
656
- std::vector<std::string> errors;
657
- XdsRouteConfigResource::RetryPolicy retry_to_return;
634
+ const envoy_config_route_v3_RetryPolicy* retry_policy_proto,
635
+ ValidationErrors* errors) {
636
+ XdsRouteConfigResource::RetryPolicy retry_policy;
658
637
  auto retry_on = UpbStringToStdString(
659
- envoy_config_route_v3_RetryPolicy_retry_on(retry_policy));
638
+ envoy_config_route_v3_RetryPolicy_retry_on(retry_policy_proto));
660
639
  std::vector<absl::string_view> codes = absl::StrSplit(retry_on, ',');
661
640
  for (const auto& code : codes) {
662
641
  if (code == "cancelled") {
663
- retry_to_return.retry_on.Add(GRPC_STATUS_CANCELLED);
642
+ retry_policy.retry_on.Add(GRPC_STATUS_CANCELLED);
664
643
  } else if (code == "deadline-exceeded") {
665
- retry_to_return.retry_on.Add(GRPC_STATUS_DEADLINE_EXCEEDED);
644
+ retry_policy.retry_on.Add(GRPC_STATUS_DEADLINE_EXCEEDED);
666
645
  } else if (code == "internal") {
667
- retry_to_return.retry_on.Add(GRPC_STATUS_INTERNAL);
646
+ retry_policy.retry_on.Add(GRPC_STATUS_INTERNAL);
668
647
  } else if (code == "resource-exhausted") {
669
- retry_to_return.retry_on.Add(GRPC_STATUS_RESOURCE_EXHAUSTED);
648
+ retry_policy.retry_on.Add(GRPC_STATUS_RESOURCE_EXHAUSTED);
670
649
  } else if (code == "unavailable") {
671
- retry_to_return.retry_on.Add(GRPC_STATUS_UNAVAILABLE);
650
+ retry_policy.retry_on.Add(GRPC_STATUS_UNAVAILABLE);
672
651
  } else {
673
652
  if (GRPC_TRACE_FLAG_ENABLED(*context.tracer)) {
674
653
  gpr_log(GPR_INFO, "Unsupported retry_on policy %s.",
@@ -677,187 +656,90 @@ absl::Status RetryPolicyParse(
677
656
  }
678
657
  }
679
658
  const google_protobuf_UInt32Value* num_retries =
680
- envoy_config_route_v3_RetryPolicy_num_retries(retry_policy);
659
+ envoy_config_route_v3_RetryPolicy_num_retries(retry_policy_proto);
681
660
  if (num_retries != nullptr) {
682
661
  uint32_t num_retries_value = google_protobuf_UInt32Value_value(num_retries);
683
662
  if (num_retries_value == 0) {
684
- errors.emplace_back(
685
- "RouteAction RetryPolicy num_retries set to invalid value 0.");
663
+ ValidationErrors::ScopedField field(errors, ".num_retries");
664
+ errors->AddError("must be greater than 0");
686
665
  } else {
687
- retry_to_return.num_retries = num_retries_value;
666
+ retry_policy.num_retries = num_retries_value;
688
667
  }
689
668
  } else {
690
- retry_to_return.num_retries = 1;
669
+ retry_policy.num_retries = 1;
691
670
  }
692
671
  const envoy_config_route_v3_RetryPolicy_RetryBackOff* backoff =
693
- envoy_config_route_v3_RetryPolicy_retry_back_off(retry_policy);
672
+ envoy_config_route_v3_RetryPolicy_retry_back_off(retry_policy_proto);
694
673
  if (backoff != nullptr) {
695
- const google_protobuf_Duration* base_interval =
696
- envoy_config_route_v3_RetryPolicy_RetryBackOff_base_interval(backoff);
697
- if (base_interval == nullptr) {
698
- errors.emplace_back(
699
- "RouteAction RetryPolicy RetryBackoff missing base interval.");
700
- } else {
701
- retry_to_return.retry_back_off.base_interval =
702
- ParseDuration(base_interval);
674
+ ValidationErrors::ScopedField field(errors, ".retry_back_off");
675
+ {
676
+ ValidationErrors::ScopedField field(errors, ".base_interval");
677
+ const google_protobuf_Duration* base_interval =
678
+ envoy_config_route_v3_RetryPolicy_RetryBackOff_base_interval(backoff);
679
+ if (base_interval == nullptr) {
680
+ errors->AddError("field not present");
681
+ } else {
682
+ retry_policy.retry_back_off.base_interval =
683
+ ParseDuration(base_interval, errors);
684
+ }
703
685
  }
704
- const google_protobuf_Duration* max_interval =
705
- envoy_config_route_v3_RetryPolicy_RetryBackOff_max_interval(backoff);
706
- Duration max;
707
- if (max_interval != nullptr) {
708
- max = ParseDuration(max_interval);
709
- } else {
710
- // if max interval is not set, it is 10x the base.
711
- max = 10 * retry_to_return.retry_back_off.base_interval;
686
+ {
687
+ ValidationErrors::ScopedField field(errors, ".max_interval");
688
+ const google_protobuf_Duration* max_interval =
689
+ envoy_config_route_v3_RetryPolicy_RetryBackOff_max_interval(backoff);
690
+ Duration max;
691
+ if (max_interval != nullptr) {
692
+ max = ParseDuration(max_interval, errors);
693
+ } else {
694
+ // if max interval is not set, it is 10x the base.
695
+ max = 10 * retry_policy.retry_back_off.base_interval;
696
+ }
697
+ retry_policy.retry_back_off.max_interval = max;
712
698
  }
713
- retry_to_return.retry_back_off.max_interval = max;
714
699
  } else {
715
- retry_to_return.retry_back_off.base_interval = Duration::Milliseconds(25);
716
- retry_to_return.retry_back_off.max_interval = Duration::Milliseconds(250);
700
+ retry_policy.retry_back_off.base_interval = Duration::Milliseconds(25);
701
+ retry_policy.retry_back_off.max_interval = Duration::Milliseconds(250);
717
702
  }
718
- // Return result.
719
- if (!errors.empty()) {
720
- return absl::InvalidArgumentError(absl::StrCat(
721
- "Errors parsing retry policy: [", absl::StrJoin(errors, "; "), "]"));
722
- }
723
- *retry = retry_to_return;
724
- return absl::OkStatus();
703
+ return retry_policy;
725
704
  }
726
705
 
727
- absl::StatusOr<XdsRouteConfigResource::Route::RouteAction> RouteActionParse(
706
+ absl::optional<XdsRouteConfigResource::Route::RouteAction> RouteActionParse(
728
707
  const XdsResourceType::DecodeContext& context,
729
- const envoy_config_route_v3_Route* route_msg,
708
+ const envoy_config_route_v3_RouteAction* route_action_proto,
730
709
  const std::map<std::string /*cluster_specifier_plugin_name*/,
731
710
  std::string /*LB policy config*/>&
732
711
  cluster_specifier_plugin_map,
733
- bool* ignore_route) {
734
- XdsRouteConfigResource::Route::RouteAction route;
735
- const envoy_config_route_v3_RouteAction* route_action =
736
- envoy_config_route_v3_Route_route(route_msg);
737
- // Get the cluster or weighted_clusters in the RouteAction.
738
- if (envoy_config_route_v3_RouteAction_has_cluster(route_action)) {
739
- std::string cluster_name = UpbStringToStdString(
740
- envoy_config_route_v3_RouteAction_cluster(route_action));
741
- if (cluster_name.empty()) {
742
- return absl::InvalidArgumentError(
743
- "RouteAction cluster contains empty cluster name.");
744
- }
745
- route.action = XdsRouteConfigResource::Route::RouteAction::ClusterName{
746
- std::move(cluster_name)};
747
- } else if (envoy_config_route_v3_RouteAction_has_weighted_clusters(
748
- route_action)) {
749
- std::vector<XdsRouteConfigResource::Route::RouteAction::ClusterWeight>
750
- action_weighted_clusters;
751
- const envoy_config_route_v3_WeightedCluster* weighted_cluster =
752
- envoy_config_route_v3_RouteAction_weighted_clusters(route_action);
753
- uint32_t total_weight = 100;
754
- const google_protobuf_UInt32Value* weight =
755
- envoy_config_route_v3_WeightedCluster_total_weight(weighted_cluster);
756
- if (weight != nullptr) {
757
- total_weight = google_protobuf_UInt32Value_value(weight);
758
- }
759
- size_t clusters_size;
760
- const envoy_config_route_v3_WeightedCluster_ClusterWeight* const* clusters =
761
- envoy_config_route_v3_WeightedCluster_clusters(weighted_cluster,
762
- &clusters_size);
763
- uint32_t sum_of_weights = 0;
764
- for (size_t j = 0; j < clusters_size; ++j) {
765
- const envoy_config_route_v3_WeightedCluster_ClusterWeight*
766
- cluster_weight = clusters[j];
767
- XdsRouteConfigResource::Route::RouteAction::ClusterWeight cluster;
768
- cluster.name = UpbStringToStdString(
769
- envoy_config_route_v3_WeightedCluster_ClusterWeight_name(
770
- cluster_weight));
771
- if (cluster.name.empty()) {
772
- return absl::InvalidArgumentError(
773
- "RouteAction weighted_cluster cluster contains empty cluster "
774
- "name.");
775
- }
776
- const google_protobuf_UInt32Value* weight =
777
- envoy_config_route_v3_WeightedCluster_ClusterWeight_weight(
778
- cluster_weight);
779
- if (weight == nullptr) {
780
- return absl::InvalidArgumentError(
781
- "RouteAction weighted_cluster cluster missing weight");
782
- }
783
- cluster.weight = google_protobuf_UInt32Value_value(weight);
784
- if (cluster.weight == 0) continue;
785
- sum_of_weights += cluster.weight;
786
- if (context.server.ShouldUseV3()) {
787
- auto typed_per_filter_config = ParseTypedPerFilterConfig<
788
- envoy_config_route_v3_WeightedCluster_ClusterWeight,
789
- envoy_config_route_v3_WeightedCluster_ClusterWeight_TypedPerFilterConfigEntry>(
790
- context, cluster_weight,
791
- envoy_config_route_v3_WeightedCluster_ClusterWeight_typed_per_filter_config_next,
792
- envoy_config_route_v3_WeightedCluster_ClusterWeight_TypedPerFilterConfigEntry_key,
793
- envoy_config_route_v3_WeightedCluster_ClusterWeight_TypedPerFilterConfigEntry_value);
794
- if (!typed_per_filter_config.ok()) {
795
- return typed_per_filter_config.status();
796
- }
797
- cluster.typed_per_filter_config = std::move(*typed_per_filter_config);
798
- }
799
- action_weighted_clusters.emplace_back(std::move(cluster));
800
- }
801
- if (total_weight != sum_of_weights) {
802
- return absl::InvalidArgumentError(
803
- "RouteAction weighted_cluster has incorrect total weight");
804
- }
805
- if (action_weighted_clusters.empty()) {
806
- return absl::InvalidArgumentError(
807
- "RouteAction weighted_cluster has no valid clusters specified.");
808
- }
809
- route.action = std::move(action_weighted_clusters);
810
- } else if (XdsRlsEnabled() &&
811
- envoy_config_route_v3_RouteAction_has_cluster_specifier_plugin(
812
- route_action)) {
813
- std::string plugin_name = UpbStringToStdString(
814
- envoy_config_route_v3_RouteAction_cluster_specifier_plugin(
815
- route_action));
816
- if (plugin_name.empty()) {
817
- return absl::InvalidArgumentError(
818
- "RouteAction cluster contains empty cluster specifier plugin name.");
819
- }
820
- auto it = cluster_specifier_plugin_map.find(plugin_name);
821
- if (it == cluster_specifier_plugin_map.end()) {
822
- return absl::InvalidArgumentError(
823
- absl::StrCat("RouteAction cluster contains cluster specifier plugin "
824
- "name not configured: ",
825
- plugin_name));
826
- }
827
- if (it->second.empty()) *ignore_route = true;
828
- route.action =
829
- XdsRouteConfigResource::Route::RouteAction::ClusterSpecifierPluginName{
830
- std::move(plugin_name)};
831
- } else {
832
- // No cluster or weighted_clusters or plugin found in RouteAction, ignore
833
- // this route.
834
- *ignore_route = true;
835
- }
836
- if (!*ignore_route) {
837
- const envoy_config_route_v3_RouteAction_MaxStreamDuration*
838
- max_stream_duration =
839
- envoy_config_route_v3_RouteAction_max_stream_duration(route_action);
840
- if (max_stream_duration != nullptr) {
841
- const google_protobuf_Duration* duration =
842
- envoy_config_route_v3_RouteAction_MaxStreamDuration_grpc_timeout_header_max(
712
+ ValidationErrors* errors) {
713
+ XdsRouteConfigResource::Route::RouteAction route_action;
714
+ // grpc_timeout_header_max or max_stream_duration
715
+ const auto* max_stream_duration =
716
+ envoy_config_route_v3_RouteAction_max_stream_duration(route_action_proto);
717
+ if (max_stream_duration != nullptr) {
718
+ ValidationErrors::ScopedField field(errors, ".max_stream_duration");
719
+ const google_protobuf_Duration* duration =
720
+ envoy_config_route_v3_RouteAction_MaxStreamDuration_grpc_timeout_header_max(
721
+ max_stream_duration);
722
+ if (duration != nullptr) {
723
+ ValidationErrors::ScopedField field(errors, ".grpc_timeout_header_max");
724
+ route_action.max_stream_duration = ParseDuration(duration, errors);
725
+ } else {
726
+ duration =
727
+ envoy_config_route_v3_RouteAction_MaxStreamDuration_max_stream_duration(
843
728
  max_stream_duration);
844
- if (duration == nullptr) {
845
- duration =
846
- envoy_config_route_v3_RouteAction_MaxStreamDuration_max_stream_duration(
847
- max_stream_duration);
848
- }
849
729
  if (duration != nullptr) {
850
- route.max_stream_duration = ParseDuration(duration);
730
+ ValidationErrors::ScopedField field(errors, ".max_stream_duration");
731
+ route_action.max_stream_duration = ParseDuration(duration, errors);
851
732
  }
852
733
  }
853
734
  }
854
- // Get HashPolicy from RouteAction
735
+ // hash_policy
855
736
  size_t size = 0;
856
737
  const envoy_config_route_v3_RouteAction_HashPolicy* const* hash_policies =
857
- envoy_config_route_v3_RouteAction_hash_policy(route_action, &size);
738
+ envoy_config_route_v3_RouteAction_hash_policy(route_action_proto, &size);
858
739
  for (size_t i = 0; i < size; ++i) {
859
- const envoy_config_route_v3_RouteAction_HashPolicy* hash_policy =
860
- hash_policies[i];
740
+ ValidationErrors::ScopedField field(errors,
741
+ absl::StrCat(".hash_policy[", i, "]"));
742
+ const auto* hash_policy = hash_policies[i];
861
743
  XdsRouteConfigResource::Route::RouteAction::HashPolicy policy;
862
744
  policy.terminal =
863
745
  envoy_config_route_v3_RouteAction_HashPolicy_terminal(hash_policy);
@@ -866,94 +748,260 @@ absl::StatusOr<XdsRouteConfigResource::Route::RouteAction> RouteActionParse(
866
748
  filter_state;
867
749
  if ((header = envoy_config_route_v3_RouteAction_HashPolicy_header(
868
750
  hash_policy)) != nullptr) {
869
- policy.type =
870
- XdsRouteConfigResource::Route::RouteAction::HashPolicy::Type::HEADER;
871
- policy.header_name = UpbStringToStdString(
751
+ // header
752
+ ValidationErrors::ScopedField field(errors, ".header");
753
+ XdsRouteConfigResource::Route::RouteAction::HashPolicy::Header
754
+ header_policy;
755
+ header_policy.header_name = UpbStringToStdString(
872
756
  envoy_config_route_v3_RouteAction_HashPolicy_Header_header_name(
873
757
  header));
874
- const struct envoy_type_matcher_v3_RegexMatchAndSubstitute*
875
- regex_rewrite =
876
- envoy_config_route_v3_RouteAction_HashPolicy_Header_regex_rewrite(
877
- header);
758
+ if (header_policy.header_name.empty()) {
759
+ ValidationErrors::ScopedField field(errors, ".header_name");
760
+ errors->AddError("must be non-empty");
761
+ }
762
+ // regex_rewrite
763
+ const auto* regex_rewrite =
764
+ envoy_config_route_v3_RouteAction_HashPolicy_Header_regex_rewrite(
765
+ header);
878
766
  if (regex_rewrite != nullptr) {
879
- const envoy_type_matcher_v3_RegexMatcher* regex_matcher =
767
+ ValidationErrors::ScopedField field(errors, ".regex_rewrite.pattern");
768
+ const auto* pattern =
880
769
  envoy_type_matcher_v3_RegexMatchAndSubstitute_pattern(
881
770
  regex_rewrite);
882
- if (regex_matcher == nullptr) {
883
- gpr_log(
884
- GPR_DEBUG,
885
- "RouteAction HashPolicy contains policy specifier Header with "
886
- "RegexMatchAndSubstitution but RegexMatcher pattern is "
887
- "missing");
771
+ if (pattern == nullptr) {
772
+ errors->AddError("field not present");
773
+ continue;
774
+ }
775
+ ValidationErrors::ScopedField field2(errors, ".regex");
776
+ std::string regex = UpbStringToStdString(
777
+ envoy_type_matcher_v3_RegexMatcher_regex(pattern));
778
+ if (regex.empty()) {
779
+ errors->AddError("field not present");
888
780
  continue;
889
781
  }
890
782
  RE2::Options options;
891
- policy.regex = absl::make_unique<RE2>(
892
- UpbStringToStdString(
893
- envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher)),
894
- options);
895
- if (!policy.regex->ok()) {
896
- gpr_log(
897
- GPR_DEBUG,
898
- "RouteAction HashPolicy contains policy specifier Header with "
899
- "RegexMatchAndSubstitution but RegexMatcher pattern does not "
900
- "compile");
783
+ header_policy.regex = std::make_unique<RE2>(regex, options);
784
+ if (!header_policy.regex->ok()) {
785
+ errors->AddError(absl::StrCat("errors compiling regex: ",
786
+ header_policy.regex->error()));
901
787
  continue;
902
788
  }
903
- policy.regex_substitution = UpbStringToStdString(
789
+ header_policy.regex_substitution = UpbStringToStdString(
904
790
  envoy_type_matcher_v3_RegexMatchAndSubstitute_substitution(
905
791
  regex_rewrite));
906
792
  }
793
+ policy.policy = std::move(header_policy);
907
794
  } else if ((filter_state =
908
795
  envoy_config_route_v3_RouteAction_HashPolicy_filter_state(
909
796
  hash_policy)) != nullptr) {
797
+ // filter_state
910
798
  std::string key = UpbStringToStdString(
911
799
  envoy_config_route_v3_RouteAction_HashPolicy_FilterState_key(
912
800
  filter_state));
913
- if (key == "io.grpc.channel_id") {
914
- policy.type = XdsRouteConfigResource::Route::RouteAction::HashPolicy::
915
- Type::CHANNEL_ID;
916
- } else {
917
- gpr_log(GPR_DEBUG,
918
- "RouteAction HashPolicy contains policy specifier "
919
- "FilterState but "
920
- "key is not io.grpc.channel_id.");
921
- continue;
922
- }
801
+ if (key != "io.grpc.channel_id") continue;
802
+ policy.policy =
803
+ XdsRouteConfigResource::Route::RouteAction::HashPolicy::ChannelId();
923
804
  } else {
924
- gpr_log(GPR_DEBUG,
925
- "RouteAction HashPolicy contains unsupported policy specifier.");
805
+ // Unsupported hash policy type, ignore it.
926
806
  continue;
927
807
  }
928
- route.hash_policies.emplace_back(std::move(policy));
808
+ route_action.hash_policies.emplace_back(std::move(policy));
929
809
  }
930
810
  // Get retry policy
931
811
  const envoy_config_route_v3_RetryPolicy* retry_policy =
932
- envoy_config_route_v3_RouteAction_retry_policy(route_action);
812
+ envoy_config_route_v3_RouteAction_retry_policy(route_action_proto);
933
813
  if (retry_policy != nullptr) {
934
- absl::optional<XdsRouteConfigResource::RetryPolicy> retry;
935
- absl::Status status = RetryPolicyParse(context, retry_policy, &retry);
936
- if (!status.ok()) return status;
937
- route.retry_policy = retry;
814
+ ValidationErrors::ScopedField field(errors, ".retry_policy");
815
+ route_action.retry_policy = RetryPolicyParse(context, retry_policy, errors);
816
+ }
817
+ // Parse cluster specifier, which is one of several options.
818
+ if (envoy_config_route_v3_RouteAction_has_cluster(route_action_proto)) {
819
+ // Cluster name.
820
+ std::string cluster_name = UpbStringToStdString(
821
+ envoy_config_route_v3_RouteAction_cluster(route_action_proto));
822
+ if (cluster_name.empty()) {
823
+ ValidationErrors::ScopedField field(errors, ".cluster");
824
+ errors->AddError("must be non-empty");
825
+ }
826
+ route_action.action =
827
+ XdsRouteConfigResource::Route::RouteAction::ClusterName{
828
+ std::move(cluster_name)};
829
+ } else if (envoy_config_route_v3_RouteAction_has_weighted_clusters(
830
+ route_action_proto)) {
831
+ // WeightedClusters.
832
+ ValidationErrors::ScopedField field(errors, ".weighted_clusters");
833
+ const envoy_config_route_v3_WeightedCluster* weighted_clusters_proto =
834
+ envoy_config_route_v3_RouteAction_weighted_clusters(route_action_proto);
835
+ GPR_ASSERT(weighted_clusters_proto != nullptr);
836
+ std::vector<XdsRouteConfigResource::Route::RouteAction::ClusterWeight>
837
+ action_weighted_clusters;
838
+ size_t clusters_size;
839
+ const envoy_config_route_v3_WeightedCluster_ClusterWeight* const* clusters =
840
+ envoy_config_route_v3_WeightedCluster_clusters(weighted_clusters_proto,
841
+ &clusters_size);
842
+ for (size_t i = 0; i < clusters_size; ++i) {
843
+ ValidationErrors::ScopedField field(errors,
844
+ absl::StrCat(".clusters[", i, "]"));
845
+ const auto* cluster_proto = clusters[i];
846
+ XdsRouteConfigResource::Route::RouteAction::ClusterWeight cluster;
847
+ // typed_per_filter_config
848
+ {
849
+ ValidationErrors::ScopedField field(errors, ".typed_per_filter_config");
850
+ cluster.typed_per_filter_config = ParseTypedPerFilterConfig<
851
+ envoy_config_route_v3_WeightedCluster_ClusterWeight,
852
+ envoy_config_route_v3_WeightedCluster_ClusterWeight_TypedPerFilterConfigEntry>(
853
+ context, cluster_proto,
854
+ envoy_config_route_v3_WeightedCluster_ClusterWeight_typed_per_filter_config_next,
855
+ envoy_config_route_v3_WeightedCluster_ClusterWeight_TypedPerFilterConfigEntry_key,
856
+ envoy_config_route_v3_WeightedCluster_ClusterWeight_TypedPerFilterConfigEntry_value,
857
+ errors);
858
+ }
859
+ // name
860
+ cluster.name = UpbStringToStdString(
861
+ envoy_config_route_v3_WeightedCluster_ClusterWeight_name(
862
+ cluster_proto));
863
+ if (cluster.name.empty()) {
864
+ ValidationErrors::ScopedField field(errors, ".name");
865
+ errors->AddError("must be non-empty");
866
+ }
867
+ // weight
868
+ const google_protobuf_UInt32Value* weight_proto =
869
+ envoy_config_route_v3_WeightedCluster_ClusterWeight_weight(
870
+ cluster_proto);
871
+ if (weight_proto == nullptr) {
872
+ ValidationErrors::ScopedField field(errors, ".weight");
873
+ errors->AddError("field not present");
874
+ } else {
875
+ cluster.weight = google_protobuf_UInt32Value_value(weight_proto);
876
+ if (cluster.weight == 0) continue;
877
+ }
878
+ // Add entry to WeightedClusters.
879
+ action_weighted_clusters.emplace_back(std::move(cluster));
880
+ }
881
+ if (action_weighted_clusters.empty()) {
882
+ errors->AddError("no valid clusters specified");
883
+ }
884
+ route_action.action = std::move(action_weighted_clusters);
885
+ } else if (XdsRlsEnabled() &&
886
+ envoy_config_route_v3_RouteAction_has_cluster_specifier_plugin(
887
+ route_action_proto)) {
888
+ // ClusterSpecifierPlugin
889
+ ValidationErrors::ScopedField field(errors, ".cluster_specifier_plugin");
890
+ std::string plugin_name = UpbStringToStdString(
891
+ envoy_config_route_v3_RouteAction_cluster_specifier_plugin(
892
+ route_action_proto));
893
+ if (plugin_name.empty()) {
894
+ errors->AddError("must be non-empty");
895
+ return absl::nullopt;
896
+ }
897
+ auto it = cluster_specifier_plugin_map.find(plugin_name);
898
+ if (it == cluster_specifier_plugin_map.end()) {
899
+ errors->AddError(absl::StrCat("unknown cluster specifier plugin name \"",
900
+ plugin_name, "\""));
901
+ } else {
902
+ // If the cluster specifier config is empty, that means that the
903
+ // plugin was unsupported but optional. In that case, skip this route.
904
+ if (it->second.empty()) return absl::nullopt;
905
+ }
906
+ route_action.action =
907
+ XdsRouteConfigResource::Route::RouteAction::ClusterSpecifierPluginName{
908
+ std::move(plugin_name)};
909
+ } else {
910
+ // Not a supported cluster specifier, so ignore this route.
911
+ return absl::nullopt;
912
+ }
913
+ return route_action;
914
+ }
915
+
916
+ absl::optional<XdsRouteConfigResource::Route> ParseRoute(
917
+ const XdsResourceType::DecodeContext& context,
918
+ const envoy_config_route_v3_Route* route_proto,
919
+ const absl::optional<XdsRouteConfigResource::RetryPolicy>&
920
+ virtual_host_retry_policy,
921
+ const XdsRouteConfigResource::ClusterSpecifierPluginMap&
922
+ cluster_specifier_plugin_map,
923
+ std::set<absl::string_view>* cluster_specifier_plugins_not_seen,
924
+ ValidationErrors* errors) {
925
+ XdsRouteConfigResource::Route route;
926
+ // Parse route match.
927
+ {
928
+ ValidationErrors::ScopedField field(errors, ".match");
929
+ const auto* match = envoy_config_route_v3_Route_match(route_proto);
930
+ if (match == nullptr) {
931
+ errors->AddError("field not present");
932
+ return absl::nullopt;
933
+ }
934
+ // Skip routes with query_parameters set.
935
+ size_t query_parameters_size;
936
+ static_cast<void>(envoy_config_route_v3_RouteMatch_query_parameters(
937
+ match, &query_parameters_size));
938
+ if (query_parameters_size > 0) return absl::nullopt;
939
+ // Parse matchers.
940
+ auto path_matcher = RoutePathMatchParse(match, errors);
941
+ if (!path_matcher.has_value()) return absl::nullopt;
942
+ route.matchers.path_matcher = std::move(*path_matcher);
943
+ RouteHeaderMatchersParse(match, &route, errors);
944
+ RouteRuntimeFractionParse(match, &route, errors);
945
+ }
946
+ // Parse route action.
947
+ const envoy_config_route_v3_RouteAction* route_action_proto =
948
+ envoy_config_route_v3_Route_route(route_proto);
949
+ if (route_action_proto != nullptr) {
950
+ ValidationErrors::ScopedField field(errors, ".route");
951
+ auto route_action = RouteActionParse(context, route_action_proto,
952
+ cluster_specifier_plugin_map, errors);
953
+ if (!route_action.has_value()) return absl::nullopt;
954
+ // If the route does not have a retry policy but the vhost does,
955
+ // use the vhost retry policy for this route.
956
+ if (!route_action->retry_policy.has_value()) {
957
+ route_action->retry_policy = virtual_host_retry_policy;
958
+ }
959
+ // Mark off plugins used in route action.
960
+ auto* cluster_specifier_action = absl::get_if<
961
+ XdsRouteConfigResource::Route::RouteAction::ClusterSpecifierPluginName>(
962
+ &route_action->action);
963
+ if (cluster_specifier_action != nullptr) {
964
+ cluster_specifier_plugins_not_seen->erase(
965
+ cluster_specifier_action->cluster_specifier_plugin_name);
966
+ }
967
+ route.action = std::move(*route_action);
968
+ } else if (envoy_config_route_v3_Route_has_non_forwarding_action(
969
+ route_proto)) {
970
+ route.action = XdsRouteConfigResource::Route::NonForwardingAction();
971
+ } else {
972
+ // Leave route.action initialized to UnknownAction (its default).
973
+ }
974
+ // Parse typed_per_filter_config.
975
+ {
976
+ ValidationErrors::ScopedField field(errors, ".typed_per_filter_config");
977
+ route.typed_per_filter_config = ParseTypedPerFilterConfig<
978
+ envoy_config_route_v3_Route,
979
+ envoy_config_route_v3_Route_TypedPerFilterConfigEntry>(
980
+ context, route_proto,
981
+ envoy_config_route_v3_Route_typed_per_filter_config_next,
982
+ envoy_config_route_v3_Route_TypedPerFilterConfigEntry_key,
983
+ envoy_config_route_v3_Route_TypedPerFilterConfigEntry_value, errors);
938
984
  }
939
985
  return route;
940
986
  }
941
987
 
942
988
  } // namespace
943
989
 
944
- absl::StatusOr<XdsRouteConfigResource> XdsRouteConfigResource::Parse(
990
+ XdsRouteConfigResource XdsRouteConfigResource::Parse(
945
991
  const XdsResourceType::DecodeContext& context,
946
- const envoy_config_route_v3_RouteConfiguration* route_config) {
992
+ const envoy_config_route_v3_RouteConfiguration* route_config,
993
+ ValidationErrors* errors) {
947
994
  XdsRouteConfigResource rds_update;
948
- // Get the cluster spcifier plugins
995
+ // Get the cluster spcifier plugin map.
949
996
  if (XdsRlsEnabled()) {
950
- auto cluster_specifier_plugin_map =
951
- ClusterSpecifierPluginParse(context, route_config);
952
- if (!cluster_specifier_plugin_map.ok()) {
953
- return cluster_specifier_plugin_map.status();
954
- }
955
997
  rds_update.cluster_specifier_plugin_map =
956
- std::move(*cluster_specifier_plugin_map);
998
+ ClusterSpecifierPluginParse(context, route_config, errors);
999
+ }
1000
+ // Build a set of configured cluster_specifier_plugin names to make sure
1001
+ // each is actually referenced by a route action.
1002
+ std::set<absl::string_view> cluster_specifier_plugins_not_seen;
1003
+ for (auto& plugin : rds_update.cluster_specifier_plugin_map) {
1004
+ cluster_specifier_plugins_not_seen.emplace(plugin.first);
957
1005
  }
958
1006
  // Get the virtual hosts.
959
1007
  size_t num_virtual_hosts;
@@ -961,6 +1009,8 @@ absl::StatusOr<XdsRouteConfigResource> XdsRouteConfigResource::Parse(
961
1009
  envoy_config_route_v3_RouteConfiguration_virtual_hosts(
962
1010
  route_config, &num_virtual_hosts);
963
1011
  for (size_t i = 0; i < num_virtual_hosts; ++i) {
1012
+ ValidationErrors::ScopedField field(
1013
+ errors, absl::StrCat(".virtual_hosts[", i, "]"));
964
1014
  rds_update.virtual_hosts.emplace_back();
965
1015
  XdsRouteConfigResource::VirtualHost& vhost =
966
1016
  rds_update.virtual_hosts.back();
@@ -971,27 +1021,28 @@ absl::StatusOr<XdsRouteConfigResource> XdsRouteConfigResource::Parse(
971
1021
  for (size_t j = 0; j < domain_size; ++j) {
972
1022
  std::string domain_pattern = UpbStringToStdString(domains[j]);
973
1023
  if (!XdsRouting::IsValidDomainPattern(domain_pattern)) {
974
- return absl::InvalidArgumentError(
975
- absl::StrCat("Invalid domain pattern \"", domain_pattern, "\"."));
1024
+ ValidationErrors::ScopedField field(errors,
1025
+ absl::StrCat(".domains[", j, "]"));
1026
+ errors->AddError(
1027
+ absl::StrCat("invalid domain pattern \"", domain_pattern, "\""));
976
1028
  }
977
1029
  vhost.domains.emplace_back(std::move(domain_pattern));
978
1030
  }
979
1031
  if (vhost.domains.empty()) {
980
- return absl::InvalidArgumentError("VirtualHost has no domains");
1032
+ ValidationErrors::ScopedField field(errors, ".domains");
1033
+ errors->AddError("must be non-empty");
981
1034
  }
982
1035
  // Parse typed_per_filter_config.
983
- if (context.server.ShouldUseV3()) {
984
- auto typed_per_filter_config = ParseTypedPerFilterConfig<
1036
+ {
1037
+ ValidationErrors::ScopedField field(errors, ".typed_per_filter_config");
1038
+ vhost.typed_per_filter_config = ParseTypedPerFilterConfig<
985
1039
  envoy_config_route_v3_VirtualHost,
986
1040
  envoy_config_route_v3_VirtualHost_TypedPerFilterConfigEntry>(
987
1041
  context, virtual_hosts[i],
988
1042
  envoy_config_route_v3_VirtualHost_typed_per_filter_config_next,
989
1043
  envoy_config_route_v3_VirtualHost_TypedPerFilterConfigEntry_key,
990
- envoy_config_route_v3_VirtualHost_TypedPerFilterConfigEntry_value);
991
- if (!typed_per_filter_config.ok()) {
992
- return typed_per_filter_config.status();
993
- }
994
- vhost.typed_per_filter_config = std::move(*typed_per_filter_config);
1044
+ envoy_config_route_v3_VirtualHost_TypedPerFilterConfigEntry_value,
1045
+ errors);
995
1046
  }
996
1047
  // Parse retry policy.
997
1048
  absl::optional<XdsRouteConfigResource::RetryPolicy>
@@ -999,94 +1050,28 @@ absl::StatusOr<XdsRouteConfigResource> XdsRouteConfigResource::Parse(
999
1050
  const envoy_config_route_v3_RetryPolicy* retry_policy =
1000
1051
  envoy_config_route_v3_VirtualHost_retry_policy(virtual_hosts[i]);
1001
1052
  if (retry_policy != nullptr) {
1002
- absl::Status status =
1003
- RetryPolicyParse(context, retry_policy, &virtual_host_retry_policy);
1004
- if (!status.ok()) return status;
1053
+ ValidationErrors::ScopedField field(errors, ".retry_policy");
1054
+ virtual_host_retry_policy =
1055
+ RetryPolicyParse(context, retry_policy, errors);
1005
1056
  }
1006
1057
  // Parse routes.
1058
+ ValidationErrors::ScopedField field2(errors, ".routes");
1007
1059
  size_t num_routes;
1008
1060
  const envoy_config_route_v3_Route* const* routes =
1009
1061
  envoy_config_route_v3_VirtualHost_routes(virtual_hosts[i], &num_routes);
1010
- if (num_routes < 1) {
1011
- return absl::InvalidArgumentError("No route found in the virtual host.");
1012
- }
1013
- // Build a set of cluster_specifier_plugin configured to make sure each is
1014
- // actually referenced by a route action.
1015
- std::set<absl::string_view> cluster_specifier_plugins;
1016
- for (auto& plugin : rds_update.cluster_specifier_plugin_map) {
1017
- cluster_specifier_plugins.emplace(plugin.first);
1018
- }
1019
- // Loop over the whole list of routes
1020
1062
  for (size_t j = 0; j < num_routes; ++j) {
1021
- const envoy_config_route_v3_RouteMatch* match =
1022
- envoy_config_route_v3_Route_match(routes[j]);
1023
- if (match == nullptr) {
1024
- return absl::InvalidArgumentError("Match can't be null.");
1025
- }
1026
- size_t query_parameters_size;
1027
- static_cast<void>(envoy_config_route_v3_RouteMatch_query_parameters(
1028
- match, &query_parameters_size));
1029
- if (query_parameters_size > 0) {
1030
- continue;
1031
- }
1032
- XdsRouteConfigResource::Route route;
1033
- bool ignore_route = false;
1034
- absl::Status status = RoutePathMatchParse(match, &route, &ignore_route);
1035
- if (!status.ok()) return status;
1036
- if (ignore_route) continue;
1037
- status = RouteHeaderMatchersParse(match, &route);
1038
- if (!status.ok()) return status;
1039
- status = RouteRuntimeFractionParse(match, &route);
1040
- if (!status.ok()) return status;
1041
- if (envoy_config_route_v3_Route_has_route(routes[j])) {
1042
- route.action.emplace<XdsRouteConfigResource::Route::RouteAction>();
1043
- auto route_action = RouteActionParse(
1044
- context, routes[j], rds_update.cluster_specifier_plugin_map,
1045
- &ignore_route);
1046
- if (!route_action.ok()) return route_action.status();
1047
- if (ignore_route) continue;
1048
- if (route_action->retry_policy == absl::nullopt &&
1049
- retry_policy != nullptr) {
1050
- route_action->retry_policy = virtual_host_retry_policy;
1051
- }
1052
- // Mark off plugins used in route action.
1053
- auto* cluster_specifier_action =
1054
- absl::get_if<XdsRouteConfigResource::Route::RouteAction::
1055
- ClusterSpecifierPluginName>(&route_action->action);
1056
- if (cluster_specifier_action != nullptr) {
1057
- cluster_specifier_plugins.erase(
1058
- cluster_specifier_action->cluster_specifier_plugin_name);
1059
- }
1060
- route.action = std::move(*route_action);
1061
- } else if (envoy_config_route_v3_Route_has_non_forwarding_action(
1062
- routes[j])) {
1063
- route.action
1064
- .emplace<XdsRouteConfigResource::Route::NonForwardingAction>();
1065
- }
1066
- if (context.server.ShouldUseV3()) {
1067
- auto typed_per_filter_config = ParseTypedPerFilterConfig<
1068
- envoy_config_route_v3_Route,
1069
- envoy_config_route_v3_Route_TypedPerFilterConfigEntry>(
1070
- context, routes[j],
1071
- envoy_config_route_v3_Route_typed_per_filter_config_next,
1072
- envoy_config_route_v3_Route_TypedPerFilterConfigEntry_key,
1073
- envoy_config_route_v3_Route_TypedPerFilterConfigEntry_value);
1074
- if (!typed_per_filter_config.ok()) {
1075
- return typed_per_filter_config.status();
1076
- }
1077
- route.typed_per_filter_config = std::move(*typed_per_filter_config);
1078
- }
1079
- vhost.routes.emplace_back(std::move(route));
1080
- }
1081
- if (vhost.routes.empty()) {
1082
- return absl::InvalidArgumentError("No valid routes specified.");
1083
- }
1084
- // For plugins not used in route action, delete from the update to prevent
1085
- // further use.
1086
- for (auto& unused_plugin : cluster_specifier_plugins) {
1087
- rds_update.cluster_specifier_plugin_map.erase(std::string(unused_plugin));
1063
+ ValidationErrors::ScopedField field(errors, absl::StrCat("[", j, "]"));
1064
+ auto route = ParseRoute(context, routes[j], virtual_host_retry_policy,
1065
+ rds_update.cluster_specifier_plugin_map,
1066
+ &cluster_specifier_plugins_not_seen, errors);
1067
+ if (route.has_value()) vhost.routes.emplace_back(std::move(*route));
1088
1068
  }
1089
1069
  }
1070
+ // For cluster specifier plugins that were not used in any route action,
1071
+ // delete them from the update, since they will never be used.
1072
+ for (auto& unused_plugin : cluster_specifier_plugins_not_seen) {
1073
+ rds_update.cluster_specifier_plugin_map.erase(std::string(unused_plugin));
1074
+ }
1090
1075
  return rds_update;
1091
1076
  }
1092
1077
 
@@ -1114,7 +1099,7 @@ void MaybeLogRouteConfiguration(
1114
1099
 
1115
1100
  XdsResourceType::DecodeResult XdsRouteConfigResourceType::Decode(
1116
1101
  const XdsResourceType::DecodeContext& context,
1117
- absl::string_view serialized_resource, bool /*is_v2*/) const {
1102
+ absl::string_view serialized_resource) const {
1118
1103
  DecodeResult result;
1119
1104
  // Parse serialized proto.
1120
1105
  auto* resource = envoy_config_route_v3_RouteConfiguration_parse(
@@ -1128,23 +1113,24 @@ XdsResourceType::DecodeResult XdsRouteConfigResourceType::Decode(
1128
1113
  // Validate resource.
1129
1114
  result.name = UpbStringToStdString(
1130
1115
  envoy_config_route_v3_RouteConfiguration_name(resource));
1131
- auto rds_update = XdsRouteConfigResource::Parse(context, resource);
1132
- if (!rds_update.ok()) {
1116
+ ValidationErrors errors;
1117
+ auto rds_update = XdsRouteConfigResource::Parse(context, resource, &errors);
1118
+ if (!errors.ok()) {
1119
+ absl::Status status =
1120
+ errors.status("errors validating RouteConfiguration resource");
1133
1121
  if (GRPC_TRACE_FLAG_ENABLED(*context.tracer)) {
1134
1122
  gpr_log(GPR_ERROR, "[xds_client %p] invalid RouteConfiguration %s: %s",
1135
- context.client, result.name->c_str(),
1136
- rds_update.status().ToString().c_str());
1123
+ context.client, result.name->c_str(), status.ToString().c_str());
1137
1124
  }
1138
- result.resource = rds_update.status();
1125
+ result.resource = std::move(status);
1139
1126
  } else {
1140
1127
  if (GRPC_TRACE_FLAG_ENABLED(*context.tracer)) {
1141
1128
  gpr_log(GPR_INFO, "[xds_client %p] parsed RouteConfiguration %s: %s",
1142
1129
  context.client, result.name->c_str(),
1143
- rds_update->ToString().c_str());
1130
+ rds_update.ToString().c_str());
1144
1131
  }
1145
- auto resource = absl::make_unique<ResourceDataSubclass>();
1146
- resource->resource = std::move(*rds_update);
1147
- result.resource = std::move(resource);
1132
+ result.resource =
1133
+ std::make_unique<XdsRouteConfigResource>(std::move(rds_update));
1148
1134
  }
1149
1135
  return result;
1150
1136
  }