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