grpc 1.50.0.pre1 → 1.52.0.pre2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (1009) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +206 -49
  3. data/include/grpc/byte_buffer.h +76 -1
  4. data/include/grpc/byte_buffer_reader.h +19 -1
  5. data/include/grpc/compression.h +2 -2
  6. data/include/grpc/event_engine/event_engine.h +27 -6
  7. data/include/grpc/event_engine/internal/memory_allocator_impl.h +1 -1
  8. data/include/grpc/event_engine/internal/slice_cast.h +67 -0
  9. data/include/grpc/event_engine/memory_allocator.h +1 -1
  10. data/include/grpc/event_engine/slice.h +24 -4
  11. data/include/grpc/event_engine/slice_buffer.h +31 -2
  12. data/include/grpc/fork.h +25 -1
  13. data/include/grpc/grpc.h +3 -13
  14. data/include/grpc/grpc_posix.h +1 -1
  15. data/include/grpc/impl/codegen/atm.h +3 -71
  16. data/include/grpc/impl/codegen/atm_gcc_atomic.h +3 -58
  17. data/include/grpc/impl/codegen/atm_gcc_sync.h +3 -59
  18. data/include/grpc/impl/codegen/atm_windows.h +3 -106
  19. data/include/grpc/impl/codegen/byte_buffer.h +4 -78
  20. data/include/grpc/impl/codegen/byte_buffer_reader.h +4 -19
  21. data/include/grpc/impl/codegen/compression_types.h +3 -82
  22. data/include/grpc/impl/codegen/connectivity_state.h +3 -20
  23. data/include/grpc/impl/codegen/fork.h +4 -25
  24. data/include/grpc/impl/codegen/gpr_types.h +2 -34
  25. data/include/grpc/impl/codegen/grpc_types.h +3 -791
  26. data/include/grpc/impl/codegen/log.h +3 -86
  27. data/include/grpc/impl/codegen/port_platform.h +3 -758
  28. data/include/grpc/impl/codegen/propagation_bits.h +3 -28
  29. data/include/grpc/impl/codegen/slice.h +3 -106
  30. data/include/grpc/impl/codegen/status.h +4 -131
  31. data/include/grpc/impl/codegen/sync.h +3 -42
  32. data/include/grpc/impl/codegen/sync_abseil.h +3 -12
  33. data/include/grpc/impl/codegen/sync_custom.h +3 -14
  34. data/include/grpc/impl/codegen/sync_generic.h +3 -25
  35. data/include/grpc/impl/codegen/sync_posix.h +3 -28
  36. data/include/grpc/impl/codegen/sync_windows.h +3 -16
  37. data/include/grpc/impl/compression_types.h +109 -0
  38. data/include/grpc/impl/connectivity_state.h +47 -0
  39. data/include/grpc/impl/grpc_types.h +824 -0
  40. data/include/grpc/impl/propagation_bits.h +54 -0
  41. data/include/grpc/impl/slice_type.h +112 -0
  42. data/include/grpc/load_reporting.h +1 -1
  43. data/include/grpc/module.modulemap +5 -1
  44. data/include/grpc/slice.h +1 -1
  45. data/include/grpc/status.h +131 -1
  46. data/include/grpc/support/atm.h +70 -1
  47. data/include/grpc/support/atm_gcc_atomic.h +59 -1
  48. data/include/grpc/support/atm_gcc_sync.h +58 -1
  49. data/include/grpc/support/atm_windows.h +105 -1
  50. data/include/grpc/support/log.h +87 -1
  51. data/include/grpc/support/log_windows.h +1 -1
  52. data/include/grpc/support/port_platform.h +767 -1
  53. data/include/grpc/support/string_util.h +1 -1
  54. data/include/grpc/support/sync.h +35 -2
  55. data/include/grpc/support/sync_abseil.h +11 -1
  56. data/include/grpc/support/sync_custom.h +13 -1
  57. data/include/grpc/support/sync_generic.h +24 -1
  58. data/include/grpc/support/sync_posix.h +27 -1
  59. data/include/grpc/support/sync_windows.h +15 -1
  60. data/include/grpc/support/time.h +25 -2
  61. data/src/core/ext/filters/census/grpc_context.cc +17 -18
  62. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +28 -22
  63. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +2 -1
  64. data/src/core/ext/filters/channel_idle/idle_filter_state.h +1 -1
  65. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -0
  66. data/src/core/ext/filters/client_channel/backup_poller.cc +24 -24
  67. data/src/core/ext/filters/client_channel/backup_poller.h +21 -21
  68. data/src/core/ext/filters/client_channel/channel_connectivity.cc +51 -28
  69. data/src/core/ext/filters/client_channel/client_channel.cc +157 -168
  70. data/src/core/ext/filters/client_channel/client_channel.h +10 -10
  71. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +17 -19
  72. data/src/core/ext/filters/client_channel/client_channel_channelz.h +19 -19
  73. data/src/core/ext/filters/client_channel/client_channel_factory.cc +17 -17
  74. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +18 -18
  75. data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
  76. data/src/core/ext/filters/client_channel/{resolver_result_parsing.h → client_channel_service_config.h} +26 -23
  77. data/src/core/ext/filters/client_channel/config_selector.h +16 -20
  78. data/src/core/ext/filters/client_channel/connector.h +1 -1
  79. data/src/core/ext/filters/client_channel/dynamic_filters.cc +28 -55
  80. data/src/core/ext/filters/client_channel/dynamic_filters.h +7 -8
  81. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +18 -18
  82. data/src/core/ext/filters/client_channel/health/health_check_client.cc +4 -5
  83. data/src/core/ext/filters/client_channel/http_proxy.cc +39 -40
  84. data/src/core/ext/filters/client_channel/http_proxy.h +18 -18
  85. data/src/core/ext/filters/client_channel/lb_call_state_internal.h +39 -0
  86. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +3 -4
  87. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +17 -17
  88. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +7 -2
  89. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +1 -2
  90. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +59 -130
  91. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +37 -21
  92. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +131 -154
  93. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +24 -25
  94. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -1
  95. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +2 -4
  96. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +18 -20
  97. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +18 -19
  98. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +18 -19
  99. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +18 -19
  100. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +8 -9
  101. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +1 -1
  102. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +212 -223
  103. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +2 -2
  104. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +11 -22
  105. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +73 -101
  106. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +20 -21
  107. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +1 -1
  108. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +119 -106
  109. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +12 -12
  110. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +30 -16
  111. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +60 -56
  112. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +60 -64
  113. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
  114. data/src/core/ext/filters/client_channel/lb_policy/xds/{xds.h → xds_attributes.h} +15 -17
  115. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +22 -28
  116. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +62 -94
  117. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +70 -146
  118. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +651 -0
  119. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +60 -0
  120. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +364 -0
  121. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +18 -18
  122. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +9 -10
  123. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +26 -35
  124. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +40 -41
  125. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +22 -23
  126. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +82 -82
  127. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +117 -118
  128. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +51 -52
  129. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +18 -18
  130. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +18 -18
  131. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +18 -19
  132. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +3 -5
  133. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -3
  134. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +1 -1
  135. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +34 -27
  136. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +44 -34
  137. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +8 -10
  138. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -7
  139. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +122 -119
  140. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +1 -1
  141. data/src/core/ext/filters/client_channel/retry_filter.cc +81 -103
  142. data/src/core/ext/filters/client_channel/retry_service_config.cc +193 -235
  143. data/src/core/ext/filters/client_channel/retry_service_config.h +20 -23
  144. data/src/core/ext/filters/client_channel/retry_throttle.cc +27 -29
  145. data/src/core/ext/filters/client_channel/retry_throttle.h +26 -25
  146. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +3 -3
  147. data/src/core/ext/filters/client_channel/subchannel.cc +158 -178
  148. data/src/core/ext/filters/client_channel/subchannel.h +17 -40
  149. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +18 -18
  150. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +11 -12
  151. data/src/core/ext/filters/deadline/deadline_filter.cc +34 -17
  152. data/src/core/ext/filters/deadline/deadline_filter.h +1 -1
  153. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +3 -2
  154. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +0 -4
  155. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
  156. data/src/core/ext/filters/fault_injection/{service_config_parser.h → fault_injection_service_config_parser.h} +20 -12
  157. data/src/core/ext/filters/http/client/http_client_filter.cc +36 -37
  158. data/src/core/ext/filters/http/client/http_client_filter.h +17 -17
  159. data/src/core/ext/filters/http/client_authority_filter.cc +19 -19
  160. data/src/core/ext/filters/http/client_authority_filter.h +18 -18
  161. data/src/core/ext/filters/http/http_filters_plugin.cc +35 -51
  162. data/src/core/ext/filters/http/message_compress/compression_filter.cc +315 -0
  163. data/src/core/ext/filters/http/message_compress/compression_filter.h +132 -0
  164. data/src/core/ext/filters/http/server/http_server_filter.cc +44 -43
  165. data/src/core/ext/filters/http/server/http_server_filter.h +18 -18
  166. data/src/core/ext/filters/message_size/message_size_filter.cc +92 -123
  167. data/src/core/ext/filters/message_size/message_size_filter.h +23 -16
  168. data/src/core/ext/filters/rbac/rbac_filter.cc +12 -12
  169. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +728 -530
  170. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +4 -3
  171. data/src/core/ext/filters/server_config_selector/server_config_selector.h +6 -8
  172. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +7 -9
  173. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +229 -0
  174. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +66 -0
  175. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.cc +82 -0
  176. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +93 -0
  177. data/src/core/ext/transport/chttp2/alpn/alpn.cc +18 -18
  178. data/src/core/ext/transport/chttp2/alpn/alpn.h +22 -22
  179. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +69 -63
  180. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +28 -22
  181. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +81 -97
  182. data/src/core/ext/transport/chttp2/server/chttp2_server.h +18 -18
  183. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +22 -22
  184. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +30 -30
  185. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +29 -29
  186. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +27 -27
  187. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +273 -283
  188. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +18 -19
  189. data/src/core/ext/transport/chttp2/transport/context_list.cc +19 -19
  190. data/src/core/ext/transport/chttp2/transport/context_list.h +25 -25
  191. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +0 -36
  192. data/src/core/ext/transport/chttp2/transport/decode_huff.h +35 -82
  193. data/src/core/ext/transport/chttp2/transport/flow_control.cc +112 -44
  194. data/src/core/ext/transport/chttp2/transport/flow_control.h +60 -34
  195. data/src/core/ext/transport/chttp2/transport/frame.h +19 -19
  196. data/src/core/ext/transport/chttp2/transport/frame_data.cc +33 -32
  197. data/src/core/ext/transport/chttp2/transport/frame_data.h +23 -23
  198. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +36 -36
  199. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +18 -18
  200. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +25 -24
  201. data/src/core/ext/transport/chttp2/transport/frame_ping.h +19 -19
  202. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +28 -25
  203. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +18 -18
  204. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +34 -36
  205. data/src/core/ext/transport/chttp2/transport/frame_settings.h +20 -20
  206. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +22 -21
  207. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +18 -18
  208. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +133 -181
  209. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +40 -59
  210. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +2 -1
  211. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +93 -143
  212. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +20 -20
  213. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +26 -26
  214. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +18 -18
  215. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +21 -19
  216. data/src/core/ext/transport/chttp2/transport/http2_settings.h +36 -34
  217. data/src/core/ext/transport/chttp2/transport/http_trace.cc +19 -0
  218. data/src/core/ext/transport/chttp2/transport/http_trace.h +24 -0
  219. data/src/core/ext/transport/chttp2/transport/huffsyms.cc +20 -20
  220. data/src/core/ext/transport/chttp2/transport/huffsyms.h +19 -19
  221. data/src/core/ext/transport/chttp2/transport/internal.h +193 -170
  222. data/src/core/ext/transport/chttp2/transport/parsing.cc +147 -80
  223. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +19 -19
  224. data/src/core/ext/transport/chttp2/transport/stream_map.cc +23 -23
  225. data/src/core/ext/transport/chttp2/transport/stream_map.h +31 -31
  226. data/src/core/ext/transport/chttp2/transport/varint.cc +19 -20
  227. data/src/core/ext/transport/chttp2/transport/varint.h +35 -32
  228. data/src/core/ext/transport/chttp2/transport/writing.cc +60 -56
  229. data/src/core/ext/transport/inproc/inproc_plugin.cc +17 -17
  230. data/src/core/ext/transport/inproc/inproc_transport.cc +122 -140
  231. data/src/core/ext/transport/inproc/inproc_transport.h +19 -19
  232. data/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c +62 -0
  233. data/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h +179 -0
  234. data/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c +46 -0
  235. data/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h +98 -0
  236. data/src/core/ext/upb-generated/xds/core/v3/cidr.upb.c +47 -0
  237. data/src/core/ext/upb-generated/xds/core/v3/cidr.upb.h +107 -0
  238. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +3 -2
  239. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +9 -0
  240. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +0 -1
  241. data/src/core/ext/upb-generated/xds/type/matcher/v3/cel.upb.c +46 -0
  242. data/src/core/ext/upb-generated/xds/type/matcher/v3/cel.upb.h +98 -0
  243. data/src/core/ext/upb-generated/xds/type/matcher/v3/domain.upb.c +62 -0
  244. data/src/core/ext/upb-generated/xds/type/matcher/v3/domain.upb.h +174 -0
  245. data/src/core/ext/upb-generated/xds/type/matcher/v3/http_inputs.upb.c +36 -0
  246. data/src/core/ext/upb-generated/xds/type/matcher/v3/http_inputs.upb.h +74 -0
  247. data/src/core/ext/upb-generated/xds/type/matcher/v3/ip.upb.c +65 -0
  248. data/src/core/ext/upb-generated/xds/type/matcher/v3/ip.upb.h +191 -0
  249. data/src/core/ext/upb-generated/xds/type/matcher/v3/range.upb.c +127 -0
  250. data/src/core/ext/upb-generated/xds/type/matcher/v3/range.upb.h +474 -0
  251. data/src/core/ext/upb-generated/xds/type/v3/cel.upb.c +67 -0
  252. data/src/core/ext/upb-generated/xds/type/v3/cel.upb.h +214 -0
  253. data/src/core/ext/upb-generated/xds/type/v3/range.upb.c +64 -0
  254. data/src/core/ext/upb-generated/xds/type/v3/range.upb.h +208 -0
  255. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +0 -1
  256. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c +60 -0
  257. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h +40 -0
  258. data/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c +50 -0
  259. data/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h +35 -0
  260. data/src/core/ext/upbdefs-generated/xds/core/v3/cidr.upbdefs.c +45 -0
  261. data/src/core/ext/upbdefs-generated/xds/core/v3/cidr.upbdefs.h +35 -0
  262. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/cel.upbdefs.c +43 -0
  263. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/cel.upbdefs.h +35 -0
  264. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/domain.upbdefs.c +51 -0
  265. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/domain.upbdefs.h +40 -0
  266. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/http_inputs.upbdefs.c +36 -0
  267. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/http_inputs.upbdefs.h +35 -0
  268. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/ip.upbdefs.c +55 -0
  269. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/ip.upbdefs.h +40 -0
  270. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.c +9 -9
  271. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/range.upbdefs.c +71 -0
  272. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/range.upbdefs.h +60 -0
  273. data/src/core/ext/upbdefs-generated/xds/type/v3/cel.upbdefs.c +60 -0
  274. data/src/core/ext/upbdefs-generated/xds/type/v3/cel.upbdefs.h +40 -0
  275. data/src/core/ext/upbdefs-generated/xds/type/v3/range.upbdefs.c +36 -0
  276. data/src/core/ext/upbdefs-generated/xds/type/v3/range.upbdefs.h +45 -0
  277. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +4 -7
  278. data/src/core/ext/xds/certificate_provider_store.cc +4 -4
  279. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +4 -7
  280. data/src/core/ext/xds/xds_api.cc +20 -95
  281. data/src/core/ext/xds/xds_api.h +5 -8
  282. data/src/core/ext/xds/xds_bootstrap.h +0 -1
  283. data/src/core/ext/xds/xds_bootstrap_grpc.cc +3 -12
  284. data/src/core/ext/xds/xds_bootstrap_grpc.h +16 -1
  285. data/src/core/ext/xds/xds_certificate_provider.cc +22 -25
  286. data/src/core/ext/xds/xds_certificate_provider.h +1 -1
  287. data/src/core/ext/xds/xds_channel_args.h +1 -1
  288. data/src/core/ext/xds/xds_channel_stack_modifier.cc +0 -1
  289. data/src/core/ext/xds/xds_channel_stack_modifier.h +2 -2
  290. data/src/core/ext/xds/xds_client.cc +134 -94
  291. data/src/core/ext/xds/xds_client.h +13 -5
  292. data/src/core/ext/xds/xds_client_grpc.cc +31 -24
  293. data/src/core/ext/xds/xds_client_grpc.h +1 -1
  294. data/src/core/ext/xds/xds_client_stats.cc +17 -17
  295. data/src/core/ext/xds/xds_client_stats.h +18 -18
  296. data/src/core/ext/xds/xds_cluster.cc +359 -203
  297. data/src/core/ext/xds/xds_cluster.h +52 -35
  298. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +54 -71
  299. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +45 -21
  300. data/src/core/ext/xds/xds_common_types.cc +209 -141
  301. data/src/core/ext/xds/xds_common_types.h +19 -13
  302. data/src/core/ext/xds/xds_endpoint.cc +221 -130
  303. data/src/core/ext/xds/xds_endpoint.h +4 -7
  304. data/src/core/ext/xds/xds_health_status.cc +80 -0
  305. data/src/core/ext/xds/xds_health_status.h +82 -0
  306. data/src/core/ext/xds/xds_http_fault_filter.cc +57 -43
  307. data/src/core/ext/xds/xds_http_fault_filter.h +14 -22
  308. data/src/core/ext/xds/xds_http_filters.cc +65 -73
  309. data/src/core/ext/xds/xds_http_filters.h +68 -20
  310. data/src/core/ext/xds/xds_http_rbac_filter.cc +153 -207
  311. data/src/core/ext/xds/xds_http_rbac_filter.h +13 -16
  312. data/src/core/ext/xds/xds_http_stateful_session_filter.cc +218 -0
  313. data/src/core/ext/xds/xds_http_stateful_session_filter.h +58 -0
  314. data/src/core/ext/xds/xds_lb_policy_registry.cc +120 -171
  315. data/src/core/ext/xds/xds_lb_policy_registry.h +10 -11
  316. data/src/core/ext/xds/xds_listener.cc +447 -419
  317. data/src/core/ext/xds/xds_listener.h +45 -47
  318. data/src/core/ext/xds/xds_resource_type.h +3 -11
  319. data/src/core/ext/xds/xds_resource_type_impl.h +10 -13
  320. data/src/core/ext/xds/xds_route_config.cc +514 -528
  321. data/src/core/ext/xds/xds_route_config.h +39 -28
  322. data/src/core/ext/xds/xds_routing.cc +2 -1
  323. data/src/core/ext/xds/xds_routing.h +2 -0
  324. data/src/core/ext/xds/xds_server_config_fetcher.cc +109 -106
  325. data/src/core/ext/xds/xds_transport_grpc.cc +6 -7
  326. data/src/core/ext/xds/xds_transport_grpc.h +1 -1
  327. data/src/core/lib/address_utils/parse_address.cc +30 -29
  328. data/src/core/lib/address_utils/parse_address.h +32 -32
  329. data/src/core/lib/address_utils/sockaddr_utils.cc +29 -28
  330. data/src/core/lib/address_utils/sockaddr_utils.h +33 -33
  331. data/src/core/lib/avl/avl.h +4 -4
  332. data/src/core/lib/backoff/backoff.cc +17 -17
  333. data/src/core/lib/backoff/backoff.h +18 -18
  334. data/src/core/lib/channel/call_tracer.h +10 -1
  335. data/src/core/lib/channel/channel_args.cc +19 -20
  336. data/src/core/lib/channel/channel_args.h +59 -43
  337. data/src/core/lib/channel/channel_args_preconditioning.h +1 -1
  338. data/src/core/lib/channel/channel_stack.cc +62 -58
  339. data/src/core/lib/channel/channel_stack.h +144 -131
  340. data/src/core/lib/channel/channel_stack_builder.cc +21 -24
  341. data/src/core/lib/channel/channel_stack_builder.h +14 -6
  342. data/src/core/lib/channel/channel_stack_builder_impl.cc +43 -25
  343. data/src/core/lib/channel/channel_stack_builder_impl.h +2 -0
  344. data/src/core/lib/channel/channel_trace.cc +21 -22
  345. data/src/core/lib/channel/channel_trace.h +19 -19
  346. data/src/core/lib/channel/channelz.cc +18 -19
  347. data/src/core/lib/channel/channelz.h +26 -26
  348. data/src/core/lib/channel/channelz_registry.cc +17 -17
  349. data/src/core/lib/channel/channelz_registry.h +18 -18
  350. data/src/core/lib/channel/connected_channel.cc +732 -63
  351. data/src/core/lib/channel/connected_channel.h +18 -22
  352. data/src/core/lib/channel/context.h +18 -18
  353. data/src/core/lib/channel/promise_based_filter.cc +1137 -150
  354. data/src/core/lib/channel/promise_based_filter.h +374 -88
  355. data/src/core/lib/channel/status_util.cc +35 -17
  356. data/src/core/lib/channel/status_util.h +26 -19
  357. data/src/core/lib/compression/compression.cc +19 -19
  358. data/src/core/lib/compression/compression_internal.cc +41 -48
  359. data/src/core/lib/compression/compression_internal.h +22 -22
  360. data/src/core/lib/compression/message_compress.cc +26 -26
  361. data/src/core/lib/compression/message_compress.h +25 -25
  362. data/src/core/lib/config/core_configuration.h +1 -1
  363. data/src/core/lib/debug/event_log.cc +88 -0
  364. data/src/core/lib/debug/event_log.h +81 -0
  365. data/src/core/lib/debug/histogram_view.cc +69 -0
  366. data/src/core/lib/{slice/slice_refcount.cc → debug/histogram_view.h} +15 -13
  367. data/src/core/lib/debug/stats.cc +39 -136
  368. data/src/core/lib/debug/stats.h +46 -52
  369. data/src/core/lib/debug/stats_data.cc +224 -73
  370. data/src/core/lib/debug/stats_data.h +263 -122
  371. data/src/core/lib/debug/trace.cc +18 -18
  372. data/src/core/lib/debug/trace.h +19 -19
  373. data/src/core/lib/event_engine/common_closures.h +71 -0
  374. data/src/core/lib/event_engine/default_event_engine.cc +38 -15
  375. data/src/core/lib/event_engine/default_event_engine.h +15 -3
  376. data/src/core/lib/event_engine/default_event_engine_factory.cc +2 -4
  377. data/src/core/lib/event_engine/executor/executor.h +1 -1
  378. data/src/core/lib/event_engine/forkable.h +1 -1
  379. data/src/core/lib/event_engine/memory_allocator.cc +1 -1
  380. data/src/core/lib/event_engine/poller.h +10 -4
  381. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +614 -0
  382. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +129 -0
  383. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +900 -0
  384. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
  385. data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
  386. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
  387. data/src/core/lib/event_engine/{executor/threaded_executor.cc → posix_engine/event_poller_posix_default.h} +11 -14
  388. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
  389. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
  390. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +265 -0
  391. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
  392. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1308 -0
  393. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +684 -0
  394. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +456 -28
  395. data/src/core/lib/event_engine/posix_engine/posix_engine.h +148 -24
  396. data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
  397. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +236 -0
  398. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +228 -0
  399. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +380 -0
  400. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +91 -0
  401. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +853 -0
  402. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +316 -0
  403. data/src/core/lib/event_engine/posix_engine/timer.cc +49 -49
  404. data/src/core/lib/event_engine/posix_engine/timer.h +87 -86
  405. data/src/core/lib/event_engine/posix_engine/timer_heap.cc +27 -27
  406. data/src/core/lib/event_engine/posix_engine/timer_heap.h +21 -21
  407. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +76 -214
  408. data/src/core/lib/event_engine/posix_engine/timer_manager.h +41 -69
  409. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +332 -0
  410. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +185 -0
  411. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +127 -0
  412. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
  413. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +150 -0
  414. data/src/core/lib/event_engine/{executor/threaded_executor.h → posix_engine/wakeup_fd_pipe.h} +16 -15
  415. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
  416. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
  417. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
  418. data/src/core/lib/event_engine/slice.cc +7 -6
  419. data/src/core/lib/event_engine/slice_buffer.cc +2 -2
  420. data/src/core/lib/event_engine/socket_notifier.h +1 -1
  421. data/src/core/lib/event_engine/tcp_socket_utils.cc +373 -0
  422. data/src/core/lib/event_engine/tcp_socket_utils.h +85 -0
  423. data/src/core/lib/event_engine/thread_pool.cc +125 -43
  424. data/src/core/lib/event_engine/thread_pool.h +49 -26
  425. data/src/core/lib/event_engine/time_util.h +1 -1
  426. data/src/core/lib/event_engine/windows/iocp.cc +13 -12
  427. data/src/core/lib/event_engine/windows/iocp.h +1 -1
  428. data/src/core/lib/event_engine/windows/win_socket.cc +9 -9
  429. data/src/core/lib/event_engine/windows/windows_engine.cc +26 -20
  430. data/src/core/lib/event_engine/windows/windows_engine.h +8 -4
  431. data/src/core/lib/experiments/config.cc +1 -1
  432. data/src/core/lib/experiments/experiments.cc +13 -13
  433. data/src/core/lib/experiments/experiments.h +8 -6
  434. data/src/core/lib/gpr/alloc.cc +19 -17
  435. data/src/core/lib/gpr/alloc.h +18 -18
  436. data/src/core/lib/gpr/atm.cc +17 -17
  437. data/src/core/lib/gpr/cpu_iphone.cc +24 -24
  438. data/src/core/lib/gpr/cpu_linux.cc +28 -23
  439. data/src/core/lib/gpr/cpu_posix.cc +23 -22
  440. data/src/core/lib/gpr/cpu_windows.cc +20 -18
  441. data/src/core/lib/gpr/log.cc +27 -19
  442. data/src/core/lib/gpr/log_android.cc +22 -20
  443. data/src/core/lib/gpr/log_linux.cc +24 -24
  444. data/src/core/lib/gpr/log_posix.cc +20 -19
  445. data/src/core/lib/gpr/log_windows.cc +25 -24
  446. data/src/core/lib/gpr/spinlock.h +18 -18
  447. data/src/core/lib/gpr/string.cc +25 -24
  448. data/src/core/lib/gpr/string.h +58 -58
  449. data/src/core/lib/gpr/string_posix.cc +24 -24
  450. data/src/core/lib/gpr/string_util_windows.cc +22 -22
  451. data/src/core/lib/gpr/string_windows.cc +24 -24
  452. data/src/core/lib/gpr/sync.cc +25 -25
  453. data/src/core/lib/gpr/sync_abseil.cc +22 -20
  454. data/src/core/lib/gpr/sync_posix.cc +23 -21
  455. data/src/core/lib/gpr/sync_windows.cc +29 -27
  456. data/src/core/lib/gpr/time.cc +23 -21
  457. data/src/core/lib/gpr/time_posix.cc +35 -30
  458. data/src/core/lib/gpr/time_precise.cc +22 -22
  459. data/src/core/lib/gpr/time_precise.h +18 -19
  460. data/src/core/lib/gpr/time_windows.cc +25 -22
  461. data/src/core/lib/gpr/tmpfile.h +22 -22
  462. data/src/core/lib/gpr/tmpfile_msys.cc +21 -20
  463. data/src/core/lib/gpr/tmpfile_posix.cc +22 -20
  464. data/src/core/lib/gpr/tmpfile_windows.cc +23 -22
  465. data/src/core/lib/gpr/useful.h +40 -27
  466. data/src/core/lib/gpr/wrap_memcpy.cc +23 -23
  467. data/src/core/lib/gprpp/atomic_utils.h +18 -18
  468. data/src/core/lib/gprpp/bitset.h +24 -0
  469. data/src/core/{ext/xds/xds_resource_type.cc → lib/gprpp/crash.cc} +12 -12
  470. data/src/core/lib/gprpp/crash.h +34 -0
  471. data/src/core/lib/gprpp/debug_location.h +18 -18
  472. data/src/core/lib/gprpp/dual_ref_counted.h +1 -1
  473. data/src/core/lib/gprpp/env.h +20 -20
  474. data/src/core/lib/gprpp/env_linux.cc +21 -21
  475. data/src/core/lib/gprpp/env_posix.cc +18 -18
  476. data/src/core/lib/gprpp/env_windows.cc +18 -18
  477. data/src/core/lib/gprpp/examine_stack.cc +17 -17
  478. data/src/core/lib/gprpp/examine_stack.h +18 -18
  479. data/src/core/lib/gprpp/fork.cc +21 -22
  480. data/src/core/lib/gprpp/fork.h +22 -22
  481. data/src/core/lib/gprpp/global_config.h +18 -18
  482. data/src/core/lib/gprpp/global_config_custom.h +18 -18
  483. data/src/core/lib/gprpp/global_config_env.cc +17 -17
  484. data/src/core/lib/gprpp/global_config_env.h +23 -23
  485. data/src/core/lib/gprpp/global_config_generic.h +18 -18
  486. data/src/core/lib/gprpp/host_port.cc +26 -26
  487. data/src/core/lib/gprpp/host_port.h +29 -28
  488. data/src/core/lib/gprpp/load_file.cc +75 -0
  489. data/src/core/lib/gprpp/load_file.h +33 -0
  490. data/src/core/lib/gprpp/manual_constructor.h +18 -17
  491. data/src/core/lib/gprpp/memory.h +18 -18
  492. data/src/core/lib/gprpp/mpscq.cc +17 -17
  493. data/src/core/lib/gprpp/mpscq.h +18 -18
  494. data/src/core/lib/gprpp/no_destruct.h +1 -0
  495. data/src/core/lib/gprpp/orphanable.h +18 -18
  496. data/src/core/lib/gprpp/per_cpu.h +46 -0
  497. data/src/core/lib/gprpp/ref_counted.h +18 -18
  498. data/src/core/lib/gprpp/ref_counted_ptr.h +19 -18
  499. data/src/core/lib/gprpp/stat_posix.cc +5 -4
  500. data/src/core/lib/gprpp/stat_windows.cc +4 -2
  501. data/src/core/lib/gprpp/status_helper.cc +4 -3
  502. data/src/core/lib/gprpp/status_helper.h +1 -3
  503. data/src/core/lib/gprpp/strerror.cc +41 -0
  504. data/src/core/lib/gprpp/strerror.h +29 -0
  505. data/src/core/lib/gprpp/sync.h +20 -20
  506. data/src/core/lib/gprpp/table.h +1 -0
  507. data/src/core/lib/gprpp/thd.h +19 -19
  508. data/src/core/lib/gprpp/thd_posix.cc +30 -31
  509. data/src/core/lib/gprpp/thd_windows.cc +26 -26
  510. data/src/core/lib/gprpp/time.cc +16 -11
  511. data/src/core/lib/gprpp/time.h +13 -3
  512. data/src/core/lib/gprpp/time_averaged_stats.cc +20 -20
  513. data/src/core/lib/gprpp/time_averaged_stats.h +48 -48
  514. data/src/core/lib/gprpp/time_util.h +1 -1
  515. data/src/core/lib/gprpp/unique_type_name.h +18 -18
  516. data/src/core/lib/gprpp/validation_errors.h +18 -1
  517. data/src/core/lib/handshaker/proxy_mapper.h +18 -18
  518. data/src/core/lib/handshaker/proxy_mapper_registry.cc +17 -17
  519. data/src/core/lib/handshaker/proxy_mapper_registry.h +18 -18
  520. data/src/core/lib/http/format_request.cc +18 -18
  521. data/src/core/lib/http/format_request.h +18 -18
  522. data/src/core/lib/http/httpcli.cc +57 -61
  523. data/src/core/lib/http/httpcli.h +26 -26
  524. data/src/core/lib/http/httpcli_security_connector.cc +22 -25
  525. data/src/core/lib/http/parser.cc +76 -87
  526. data/src/core/lib/http/parser.h +32 -32
  527. data/src/core/lib/iomgr/block_annotate.h +21 -21
  528. data/src/core/lib/iomgr/buffer_list.cc +156 -136
  529. data/src/core/lib/iomgr/buffer_list.h +120 -98
  530. data/src/core/lib/iomgr/call_combiner.cc +29 -27
  531. data/src/core/lib/iomgr/call_combiner.h +21 -22
  532. data/src/core/lib/iomgr/cfstream_handle.cc +33 -36
  533. data/src/core/lib/iomgr/cfstream_handle.h +22 -22
  534. data/src/core/lib/iomgr/closure.h +90 -45
  535. data/src/core/lib/iomgr/combiner.cc +20 -19
  536. data/src/core/lib/iomgr/combiner.h +18 -18
  537. data/src/core/lib/iomgr/dualstack_socket_posix.cc +21 -21
  538. data/src/core/lib/iomgr/dynamic_annotations.h +20 -20
  539. data/src/core/lib/iomgr/endpoint.cc +17 -17
  540. data/src/core/lib/iomgr/endpoint.h +46 -46
  541. data/src/core/lib/iomgr/endpoint_cfstream.cc +44 -43
  542. data/src/core/lib/iomgr/endpoint_cfstream.h +27 -27
  543. data/src/core/lib/iomgr/endpoint_pair.h +18 -18
  544. data/src/core/lib/iomgr/endpoint_pair_posix.cc +20 -19
  545. data/src/core/lib/iomgr/endpoint_pair_windows.cc +18 -17
  546. data/src/core/lib/iomgr/error.cc +49 -61
  547. data/src/core/lib/iomgr/error.h +42 -173
  548. data/src/core/lib/iomgr/error_cfstream.cc +18 -18
  549. data/src/core/lib/iomgr/error_cfstream.h +19 -19
  550. data/src/core/lib/iomgr/ev_apple.cc +21 -21
  551. data/src/core/lib/iomgr/ev_apple.h +17 -17
  552. data/src/core/lib/iomgr/ev_epoll1_linux.cc +208 -195
  553. data/src/core/lib/iomgr/ev_epoll1_linux.h +18 -18
  554. data/src/core/lib/iomgr/ev_poll_posix.cc +212 -205
  555. data/src/core/lib/iomgr/ev_poll_posix.h +18 -18
  556. data/src/core/lib/iomgr/ev_posix.cc +36 -28
  557. data/src/core/lib/iomgr/ev_posix.h +85 -81
  558. data/src/core/lib/iomgr/ev_windows.cc +18 -18
  559. data/src/core/lib/iomgr/exec_ctx.cc +34 -34
  560. data/src/core/lib/iomgr/exec_ctx.h +141 -141
  561. data/src/core/lib/iomgr/executor.cc +21 -21
  562. data/src/core/lib/iomgr/executor.h +24 -24
  563. data/src/core/lib/iomgr/fork_posix.cc +24 -22
  564. data/src/core/lib/iomgr/fork_windows.cc +21 -21
  565. data/src/core/lib/iomgr/gethostname.h +18 -18
  566. data/src/core/lib/iomgr/gethostname_fallback.cc +17 -17
  567. data/src/core/lib/iomgr/gethostname_host_name_max.cc +17 -17
  568. data/src/core/lib/iomgr/gethostname_sysconf.cc +17 -17
  569. data/src/core/lib/iomgr/grpc_if_nametoindex.h +20 -20
  570. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +20 -19
  571. data/src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc +20 -19
  572. data/src/core/lib/iomgr/internal_errqueue.cc +4 -2
  573. data/src/core/lib/iomgr/internal_errqueue.h +80 -80
  574. data/src/core/lib/iomgr/iocp_windows.cc +22 -21
  575. data/src/core/lib/iomgr/iocp_windows.h +18 -18
  576. data/src/core/lib/iomgr/iomgr.cc +19 -18
  577. data/src/core/lib/iomgr/iomgr.h +32 -32
  578. data/src/core/lib/iomgr/iomgr_internal.cc +17 -17
  579. data/src/core/lib/iomgr/iomgr_internal.h +25 -25
  580. data/src/core/lib/iomgr/iomgr_posix.cc +20 -20
  581. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +20 -19
  582. data/src/core/lib/iomgr/iomgr_windows.cc +24 -22
  583. data/src/core/lib/iomgr/load_file.cc +24 -27
  584. data/src/core/lib/iomgr/load_file.h +20 -20
  585. data/src/core/lib/iomgr/lockfree_event.cc +114 -114
  586. data/src/core/lib/iomgr/lockfree_event.h +19 -19
  587. data/src/core/lib/iomgr/nameser.h +84 -84
  588. data/src/core/lib/iomgr/polling_entity.cc +25 -21
  589. data/src/core/lib/iomgr/polling_entity.h +27 -27
  590. data/src/core/lib/iomgr/pollset.cc +17 -17
  591. data/src/core/lib/iomgr/pollset.h +51 -51
  592. data/src/core/lib/iomgr/pollset_set.cc +17 -17
  593. data/src/core/lib/iomgr/pollset_set.h +22 -22
  594. data/src/core/lib/iomgr/pollset_set_windows.cc +18 -18
  595. data/src/core/lib/iomgr/pollset_set_windows.h +18 -18
  596. data/src/core/lib/iomgr/pollset_windows.cc +30 -29
  597. data/src/core/lib/iomgr/pollset_windows.h +22 -22
  598. data/src/core/lib/iomgr/port.h +29 -29
  599. data/src/core/lib/iomgr/python_util.h +20 -20
  600. data/src/core/lib/iomgr/resolve_address.cc +26 -20
  601. data/src/core/lib/iomgr/resolve_address.h +21 -22
  602. data/src/core/lib/iomgr/resolve_address_impl.h +2 -2
  603. data/src/core/lib/iomgr/resolve_address_posix.cc +35 -45
  604. data/src/core/lib/iomgr/resolve_address_posix.h +1 -2
  605. data/src/core/lib/iomgr/resolve_address_windows.cc +18 -20
  606. data/src/core/lib/iomgr/resolve_address_windows.h +1 -2
  607. data/src/core/lib/iomgr/resolved_address.h +1 -1
  608. data/src/core/lib/iomgr/sockaddr.h +21 -21
  609. data/src/core/lib/iomgr/sockaddr_posix.h +18 -18
  610. data/src/core/lib/iomgr/sockaddr_utils_posix.cc +18 -17
  611. data/src/core/lib/iomgr/sockaddr_windows.h +18 -18
  612. data/src/core/lib/iomgr/socket_factory_posix.cc +18 -18
  613. data/src/core/lib/iomgr/socket_factory_posix.h +30 -30
  614. data/src/core/lib/iomgr/socket_mutator.cc +19 -18
  615. data/src/core/lib/iomgr/socket_mutator.h +37 -37
  616. data/src/core/lib/iomgr/socket_utils.h +24 -24
  617. data/src/core/lib/iomgr/socket_utils_common_posix.cc +68 -66
  618. data/src/core/lib/iomgr/socket_utils_linux.cc +18 -17
  619. data/src/core/lib/iomgr/socket_utils_posix.cc +22 -20
  620. data/src/core/lib/iomgr/socket_utils_posix.h +78 -78
  621. data/src/core/lib/iomgr/socket_utils_windows.cc +20 -19
  622. data/src/core/lib/iomgr/socket_windows.cc +37 -36
  623. data/src/core/lib/iomgr/socket_windows.h +56 -56
  624. data/src/core/lib/iomgr/systemd_utils.cc +116 -0
  625. data/src/core/lib/{slice/slice_buffer_api.cc → iomgr/systemd_utils.h} +12 -14
  626. data/src/core/lib/iomgr/tcp_client.cc +17 -17
  627. data/src/core/lib/iomgr/tcp_client.h +26 -26
  628. data/src/core/lib/iomgr/tcp_client_cfstream.cc +25 -28
  629. data/src/core/lib/iomgr/tcp_client_posix.cc +70 -73
  630. data/src/core/lib/iomgr/tcp_client_posix.h +43 -43
  631. data/src/core/lib/iomgr/tcp_client_windows.cc +36 -39
  632. data/src/core/lib/iomgr/tcp_posix.cc +223 -237
  633. data/src/core/lib/iomgr/tcp_posix.h +27 -27
  634. data/src/core/lib/iomgr/tcp_server.cc +30 -22
  635. data/src/core/lib/iomgr/tcp_server.h +68 -62
  636. data/src/core/lib/iomgr/tcp_server_posix.cc +124 -94
  637. data/src/core/lib/iomgr/tcp_server_utils_posix.h +54 -51
  638. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +90 -55
  639. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +40 -40
  640. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +19 -19
  641. data/src/core/lib/iomgr/tcp_server_windows.cc +97 -104
  642. data/src/core/lib/iomgr/tcp_windows.cc +109 -93
  643. data/src/core/lib/iomgr/tcp_windows.h +29 -29
  644. data/src/core/lib/iomgr/timer.cc +17 -17
  645. data/src/core/lib/iomgr/timer.h +65 -65
  646. data/src/core/lib/iomgr/timer_generic.cc +115 -122
  647. data/src/core/lib/iomgr/timer_generic.h +19 -19
  648. data/src/core/lib/iomgr/timer_heap.cc +25 -25
  649. data/src/core/lib/iomgr/timer_heap.h +19 -19
  650. data/src/core/lib/iomgr/timer_manager.cc +30 -29
  651. data/src/core/lib/iomgr/timer_manager.h +25 -25
  652. data/src/core/lib/iomgr/unix_sockets_posix.cc +20 -21
  653. data/src/core/lib/iomgr/unix_sockets_posix.h +18 -18
  654. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +19 -17
  655. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +23 -21
  656. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +23 -23
  657. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +29 -26
  658. data/src/core/lib/iomgr/wakeup_fd_pipe.h +18 -18
  659. data/src/core/lib/iomgr/wakeup_fd_posix.cc +18 -18
  660. data/src/core/lib/iomgr/wakeup_fd_posix.h +50 -50
  661. data/src/core/lib/json/json_channel_args.h +42 -0
  662. data/src/core/lib/json/json_object_loader.cc +17 -2
  663. data/src/core/lib/json/json_object_loader.h +37 -1
  664. data/src/core/lib/json/json_reader.cc +28 -28
  665. data/src/core/lib/json/json_util.cc +5 -5
  666. data/src/core/lib/json/json_util.h +4 -4
  667. data/src/core/lib/json/json_writer.cc +56 -56
  668. data/src/core/lib/load_balancing/lb_policy.cc +18 -18
  669. data/src/core/lib/load_balancing/lb_policy.h +7 -4
  670. data/src/core/lib/load_balancing/subchannel_interface.h +1 -8
  671. data/src/core/lib/matchers/matchers.cc +6 -5
  672. data/src/core/lib/matchers/matchers.h +1 -1
  673. data/src/core/lib/promise/activity.cc +16 -2
  674. data/src/core/lib/promise/activity.h +58 -27
  675. data/src/core/lib/promise/arena_promise.h +82 -52
  676. data/src/core/lib/promise/context.h +14 -6
  677. data/src/core/lib/promise/detail/basic_seq.h +9 -28
  678. data/src/core/lib/promise/detail/promise_factory.h +59 -10
  679. data/src/core/lib/promise/detail/status.h +28 -0
  680. data/src/core/lib/promise/detail/switch.h +1455 -0
  681. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +20 -12
  682. data/src/core/lib/promise/for_each.h +155 -0
  683. data/src/core/lib/promise/latch.h +13 -19
  684. data/src/core/lib/promise/loop.h +7 -5
  685. data/src/core/lib/promise/map.h +1 -0
  686. data/src/core/lib/promise/map_pipe.h +88 -0
  687. data/src/core/lib/promise/pipe.cc +19 -0
  688. data/src/core/lib/promise/pipe.h +505 -0
  689. data/src/core/lib/promise/poll.h +19 -0
  690. data/src/core/lib/promise/seq.h +4 -5
  691. data/src/core/lib/promise/sleep.cc +5 -4
  692. data/src/core/lib/promise/sleep.h +1 -2
  693. data/src/core/lib/promise/try_concurrently.h +342 -0
  694. data/src/core/lib/promise/try_seq.h +11 -13
  695. data/src/core/lib/resolver/resolver.cc +17 -17
  696. data/src/core/lib/resolver/server_address.cc +18 -17
  697. data/src/core/lib/resolver/server_address.h +19 -21
  698. data/src/core/lib/resource_quota/api.cc +0 -1
  699. data/src/core/lib/resource_quota/api.h +1 -1
  700. data/src/core/lib/resource_quota/arena.cc +36 -17
  701. data/src/core/lib/resource_quota/arena.h +107 -18
  702. data/src/core/lib/resource_quota/memory_quota.cc +140 -43
  703. data/src/core/lib/resource_quota/memory_quota.h +85 -23
  704. data/src/core/lib/resource_quota/resource_quota.h +1 -1
  705. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  706. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +0 -1
  707. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +1 -3
  708. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +4 -2
  709. data/src/core/lib/security/authorization/matchers.cc +25 -22
  710. data/src/core/lib/security/authorization/rbac_policy.cc +2 -3
  711. data/src/core/lib/security/authorization/rbac_policy.h +1 -1
  712. data/src/core/lib/security/context/security_context.cc +22 -23
  713. data/src/core/lib/security/context/security_context.h +40 -30
  714. data/src/core/lib/security/credentials/alts/alts_credentials.cc +17 -17
  715. data/src/core/lib/security/credentials/alts/alts_credentials.h +50 -50
  716. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +19 -19
  717. data/src/core/lib/security/credentials/alts/check_gcp_environment.h +41 -41
  718. data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +17 -17
  719. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +18 -17
  720. data/src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc +18 -17
  721. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +19 -19
  722. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc +18 -18
  723. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h +36 -37
  724. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +18 -18
  725. data/src/core/lib/security/credentials/call_creds_util.h +1 -1
  726. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +3 -4
  727. data/src/core/lib/security/credentials/composite/composite_credentials.cc +22 -22
  728. data/src/core/lib/security/credentials/composite/composite_credentials.h +20 -21
  729. data/src/core/lib/security/credentials/credentials.cc +19 -18
  730. data/src/core/lib/security/credentials/credentials.h +34 -33
  731. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +77 -55
  732. data/src/core/lib/security/credentials/external/aws_request_signer.cc +4 -3
  733. data/src/core/lib/security/credentials/external/external_account_credentials.cc +40 -51
  734. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +17 -21
  735. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +21 -25
  736. data/src/core/lib/security/credentials/fake/fake_credentials.cc +20 -19
  737. data/src/core/lib/security/credentials/fake/fake_credentials.h +34 -35
  738. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +17 -17
  739. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +75 -73
  740. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +18 -19
  741. data/src/core/lib/security/credentials/iam/iam_credentials.cc +18 -17
  742. data/src/core/lib/security/credentials/iam/iam_credentials.h +18 -18
  743. data/src/core/lib/security/credentials/jwt/json_token.cc +24 -25
  744. data/src/core/lib/security/credentials/jwt/json_token.h +32 -32
  745. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +18 -18
  746. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +18 -19
  747. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +75 -75
  748. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +43 -43
  749. data/src/core/lib/security/credentials/local/local_credentials.cc +17 -17
  750. data/src/core/lib/security/credentials/local/local_credentials.h +20 -20
  751. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +52 -59
  752. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +19 -19
  753. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +24 -23
  754. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +22 -22
  755. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +19 -20
  756. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +18 -18
  757. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +20 -28
  758. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +4 -11
  759. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +30 -43
  760. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +1 -1
  761. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +18 -18
  762. data/src/core/lib/security/credentials/tls/tls_credentials.cc +18 -19
  763. data/src/core/lib/security/credentials/tls/tls_credentials.h +18 -18
  764. data/src/core/lib/security/credentials/xds/xds_credentials.cc +1 -2
  765. data/src/core/lib/security/credentials/xds/xds_credentials.h +1 -1
  766. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +32 -38
  767. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +41 -42
  768. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +32 -41
  769. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +20 -21
  770. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  771. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +3 -8
  772. data/src/core/lib/security/security_connector/load_system_roots.h +18 -18
  773. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +18 -18
  774. data/src/core/lib/security/security_connector/load_system_roots_supported.cc +19 -22
  775. data/src/core/lib/security/security_connector/load_system_roots_supported.h +19 -20
  776. data/src/core/lib/security/security_connector/local/local_security_connector.cc +30 -34
  777. data/src/core/lib/security/security_connector/local/local_security_connector.h +40 -41
  778. data/src/core/lib/security/security_connector/security_connector.cc +17 -17
  779. data/src/core/lib/security/security_connector/security_connector.h +32 -33
  780. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +34 -39
  781. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +38 -39
  782. data/src/core/lib/security/security_connector/ssl_utils.cc +37 -39
  783. data/src/core/lib/security/security_connector/ssl_utils.h +31 -31
  784. data/src/core/lib/security/security_connector/ssl_utils_config.cc +22 -22
  785. data/src/core/lib/security/security_connector/ssl_utils_config.h +18 -19
  786. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +42 -48
  787. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +17 -17
  788. data/src/core/lib/security/transport/auth_filters.h +18 -18
  789. data/src/core/lib/security/transport/client_auth_filter.cc +21 -21
  790. data/src/core/lib/security/transport/secure_endpoint.cc +54 -56
  791. data/src/core/lib/security/transport/secure_endpoint.h +22 -22
  792. data/src/core/lib/security/transport/security_handshaker.cc +70 -70
  793. data/src/core/lib/security/transport/security_handshaker.h +19 -19
  794. data/src/core/lib/security/transport/server_auth_filter.cc +43 -44
  795. data/src/core/lib/security/transport/tsi_error.cc +23 -20
  796. data/src/core/lib/security/transport/tsi_error.h +18 -18
  797. data/src/core/lib/security/util/json_util.cc +21 -22
  798. data/src/core/lib/security/util/json_util.h +18 -18
  799. data/src/core/lib/service_config/service_config.h +2 -2
  800. data/src/core/lib/service_config/service_config_call_data.h +7 -1
  801. data/src/core/lib/service_config/service_config_impl.cc +111 -158
  802. data/src/core/lib/service_config/service_config_impl.h +14 -17
  803. data/src/core/lib/service_config/service_config_parser.cc +14 -31
  804. data/src/core/lib/service_config/service_config_parser.h +14 -10
  805. data/src/core/lib/slice/b64.cc +26 -26
  806. data/src/core/lib/slice/b64.h +29 -29
  807. data/src/core/lib/slice/percent_encoding.cc +17 -17
  808. data/src/core/lib/slice/percent_encoding.h +24 -24
  809. data/src/core/lib/slice/slice.cc +44 -38
  810. data/src/core/lib/slice/slice.h +57 -11
  811. data/src/core/lib/slice/slice_buffer.cc +63 -59
  812. data/src/core/lib/slice/slice_buffer.h +27 -2
  813. data/src/core/lib/slice/slice_internal.h +31 -39
  814. data/src/core/lib/slice/slice_refcount.h +34 -19
  815. data/src/core/lib/slice/slice_string_helpers.cc +17 -17
  816. data/src/core/lib/slice/slice_string_helpers.h +19 -19
  817. data/src/core/lib/surface/api_trace.cc +17 -17
  818. data/src/core/lib/surface/api_trace.h +22 -22
  819. data/src/core/lib/surface/byte_buffer.cc +22 -23
  820. data/src/core/lib/surface/byte_buffer_reader.cc +23 -23
  821. data/src/core/lib/surface/call.cc +1521 -335
  822. data/src/core/lib/surface/call.h +86 -39
  823. data/src/core/lib/surface/call_details.cc +20 -21
  824. data/src/core/lib/surface/call_log_batch.cc +18 -18
  825. data/src/core/lib/surface/call_test_only.h +30 -30
  826. data/src/core/lib/surface/call_trace.cc +113 -0
  827. data/src/core/{ext/filters/http/message_compress/message_decompress_filter.h → lib/surface/call_trace.h} +10 -12
  828. data/src/core/lib/surface/channel.cc +62 -67
  829. data/src/core/lib/surface/channel.h +40 -32
  830. data/src/core/lib/surface/channel_init.cc +17 -17
  831. data/src/core/lib/surface/channel_init.h +18 -18
  832. data/src/core/lib/surface/channel_ping.cc +19 -19
  833. data/src/core/lib/surface/channel_stack_type.cc +21 -17
  834. data/src/core/lib/surface/channel_stack_type.h +20 -18
  835. data/src/core/lib/surface/completion_queue.cc +173 -191
  836. data/src/core/lib/surface/completion_queue.h +32 -32
  837. data/src/core/lib/surface/completion_queue_factory.cc +28 -28
  838. data/src/core/lib/surface/completion_queue_factory.h +20 -20
  839. data/src/core/lib/surface/event_string.cc +17 -17
  840. data/src/core/lib/surface/event_string.h +20 -20
  841. data/src/core/lib/surface/init.cc +29 -58
  842. data/src/core/lib/surface/init.h +18 -18
  843. data/src/core/lib/surface/init_internally.cc +1 -0
  844. data/src/core/lib/surface/init_internally.h +9 -0
  845. data/src/core/lib/surface/lame_client.cc +28 -26
  846. data/src/core/lib/surface/lame_client.h +19 -19
  847. data/src/core/lib/surface/metadata_array.cc +17 -18
  848. data/src/core/lib/surface/server.cc +61 -83
  849. data/src/core/lib/surface/server.h +5 -7
  850. data/src/core/lib/surface/validate_metadata.cc +28 -29
  851. data/src/core/lib/surface/validate_metadata.h +18 -18
  852. data/src/core/lib/surface/version.cc +21 -21
  853. data/src/core/lib/transport/bdp_estimator.cc +17 -17
  854. data/src/core/lib/transport/bdp_estimator.h +18 -19
  855. data/src/core/lib/transport/connectivity_state.cc +19 -19
  856. data/src/core/lib/transport/connectivity_state.h +19 -19
  857. data/src/core/lib/transport/error_utils.cc +51 -45
  858. data/src/core/lib/transport/error_utils.h +21 -21
  859. data/src/core/lib/transport/handshaker.cc +49 -46
  860. data/src/core/lib/transport/handshaker.h +43 -38
  861. data/src/core/lib/transport/handshaker_factory.h +44 -18
  862. data/src/core/lib/transport/handshaker_registry.cc +25 -19
  863. data/src/core/lib/transport/handshaker_registry.h +21 -22
  864. data/src/core/lib/transport/http2_errors.h +20 -20
  865. data/src/core/lib/transport/http_connect_handshaker.cc +40 -41
  866. data/src/core/lib/transport/http_connect_handshaker.h +18 -18
  867. data/src/core/lib/transport/metadata_batch.cc +4 -1
  868. data/src/core/lib/transport/metadata_batch.h +46 -20
  869. data/src/core/lib/transport/parsed_metadata.cc +2 -6
  870. data/src/core/lib/transport/parsed_metadata.h +1 -0
  871. data/src/core/lib/transport/pid_controller.cc +20 -20
  872. data/src/core/lib/transport/pid_controller.h +24 -24
  873. data/src/core/lib/transport/status_conversion.cc +22 -22
  874. data/src/core/lib/transport/status_conversion.h +20 -20
  875. data/src/core/lib/transport/tcp_connect_handshaker.cc +15 -20
  876. data/src/core/lib/transport/tcp_connect_handshaker.h +1 -1
  877. data/src/core/lib/transport/timeout_encoding.cc +22 -22
  878. data/src/core/lib/transport/timeout_encoding.h +18 -18
  879. data/src/core/lib/transport/transport.cc +88 -41
  880. data/src/core/lib/transport/transport.h +193 -195
  881. data/src/core/lib/transport/transport_impl.h +42 -42
  882. data/src/core/lib/transport/transport_op_string.cc +26 -25
  883. data/src/core/plugin_registry/grpc_plugin_registry.cc +25 -27
  884. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +7 -14
  885. data/src/core/tsi/alts/crypt/aes_gcm.cc +20 -20
  886. data/src/core/tsi/alts/crypt/gsec.cc +26 -26
  887. data/src/core/tsi/alts/crypt/gsec.h +334 -334
  888. data/src/core/tsi/alts/frame_protector/alts_counter.cc +23 -23
  889. data/src/core/tsi/alts/frame_protector/alts_counter.h +66 -66
  890. data/src/core/tsi/alts/frame_protector/alts_crypter.cc +19 -19
  891. data/src/core/tsi/alts/frame_protector/alts_crypter.h +206 -206
  892. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +72 -71
  893. data/src/core/tsi/alts/frame_protector/alts_frame_protector.h +38 -38
  894. data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc +18 -18
  895. data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h +80 -81
  896. data/src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc +22 -22
  897. data/src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc +22 -22
  898. data/src/core/tsi/alts/frame_protector/frame_handler.cc +26 -25
  899. data/src/core/tsi/alts/frame_protector/frame_handler.h +166 -166
  900. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +78 -77
  901. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +99 -99
  902. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +18 -17
  903. data/src/core/tsi/alts/handshaker/alts_shared_resource.h +41 -42
  904. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +37 -36
  905. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +58 -58
  906. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +20 -20
  907. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +21 -20
  908. data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +36 -36
  909. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +19 -19
  910. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +102 -101
  911. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +45 -44
  912. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h +38 -39
  913. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +38 -36
  914. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h +33 -34
  915. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +65 -66
  916. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +32 -31
  917. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +53 -54
  918. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +54 -53
  919. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h +138 -139
  920. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +58 -57
  921. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h +41 -42
  922. data/src/core/tsi/fake_transport_security.cc +80 -79
  923. data/src/core/tsi/fake_transport_security.h +30 -30
  924. data/src/core/tsi/local_transport_security.cc +34 -33
  925. data/src/core/tsi/local_transport_security.h +31 -31
  926. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +8 -3
  927. data/src/core/tsi/ssl/session_cache/ssl_session.h +18 -18
  928. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +19 -19
  929. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +18 -17
  930. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +19 -19
  931. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +25 -20
  932. data/src/core/tsi/ssl_transport_security.cc +139 -323
  933. data/src/core/tsi/ssl_transport_security.h +201 -200
  934. data/src/core/tsi/ssl_transport_security_utils.cc +250 -0
  935. data/src/core/tsi/ssl_transport_security_utils.h +147 -0
  936. data/src/core/tsi/ssl_types.h +25 -25
  937. data/src/core/tsi/transport_security.cc +26 -26
  938. data/src/core/tsi/transport_security.h +45 -45
  939. data/src/core/tsi/transport_security_grpc.cc +20 -20
  940. data/src/core/tsi/transport_security_grpc.h +39 -39
  941. data/src/core/tsi/transport_security_interface.h +330 -330
  942. data/src/ruby/ext/grpc/{ext-export-truffleruby.clang → ext-export-truffleruby-with-ruby-abi-version.clang} +0 -0
  943. data/src/ruby/ext/grpc/{ext-export-truffleruby.gcc → ext-export-truffleruby-with-ruby-abi-version.gcc} +0 -0
  944. data/src/ruby/ext/grpc/ext-export-with-ruby-abi-version.clang +2 -0
  945. data/src/ruby/ext/grpc/ext-export-with-ruby-abi-version.gcc +7 -0
  946. data/src/ruby/ext/grpc/ext-export.clang +0 -1
  947. data/src/ruby/ext/grpc/ext-export.gcc +1 -2
  948. data/src/ruby/ext/grpc/extconf.rb +47 -2
  949. data/src/ruby/ext/grpc/rb_call.c +1 -0
  950. data/src/ruby/ext/grpc/rb_channel.c +1 -0
  951. data/src/ruby/ext/grpc/rb_channel_args.c +1 -0
  952. data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
  953. data/src/ruby/ext/grpc/rb_grpc.c +1 -0
  954. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +38 -38
  955. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +59 -59
  956. data/src/ruby/lib/grpc/generic/bidi_call.rb +2 -0
  957. data/src/ruby/lib/grpc/version.rb +1 -1
  958. data/src/ruby/spec/channel_spec.rb +0 -43
  959. data/src/ruby/spec/client_server_spec.rb +20 -8
  960. data/src/ruby/spec/generic/active_call_spec.rb +12 -3
  961. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  962. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  963. data/third_party/re2/re2/bitstate.cc +3 -3
  964. data/third_party/re2/re2/dfa.cc +13 -13
  965. data/third_party/re2/re2/nfa.cc +4 -4
  966. data/third_party/re2/re2/onepass.cc +2 -2
  967. data/third_party/re2/re2/prefilter_tree.cc +27 -59
  968. data/third_party/re2/re2/prefilter_tree.h +3 -2
  969. data/third_party/re2/re2/prog.cc +11 -2
  970. data/third_party/re2/re2/prog.h +17 -5
  971. data/third_party/re2/re2/re2.cc +6 -11
  972. data/third_party/re2/re2/re2.h +1 -1
  973. data/third_party/re2/re2/regexp.cc +1 -2
  974. data/third_party/re2/re2/stringpiece.h +10 -7
  975. data/third_party/re2/re2/unicode_casefold.cc +25 -11
  976. data/third_party/re2/re2/unicode_groups.cc +319 -151
  977. data/third_party/re2/re2/walker-inl.h +3 -2
  978. data/third_party/re2/util/mutex.h +4 -4
  979. data/third_party/zlib/compress.c +3 -3
  980. data/third_party/zlib/crc32.c +21 -12
  981. data/third_party/zlib/deflate.c +112 -106
  982. data/third_party/zlib/deflate.h +2 -2
  983. data/third_party/zlib/gzlib.c +1 -1
  984. data/third_party/zlib/gzread.c +3 -5
  985. data/third_party/zlib/gzwrite.c +1 -1
  986. data/third_party/zlib/infback.c +10 -7
  987. data/third_party/zlib/inflate.c +5 -2
  988. data/third_party/zlib/inftrees.c +2 -2
  989. data/third_party/zlib/inftrees.h +1 -1
  990. data/third_party/zlib/trees.c +61 -62
  991. data/third_party/zlib/uncompr.c +2 -2
  992. data/third_party/zlib/zconf.h +16 -3
  993. data/third_party/zlib/zlib.h +10 -10
  994. data/third_party/zlib/zutil.c +9 -7
  995. data/third_party/zlib/zutil.h +1 -0
  996. metadata +146 -40
  997. data/include/grpc/impl/codegen/gpr_slice.h +0 -71
  998. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -188
  999. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -187
  1000. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +0 -332
  1001. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +0 -52
  1002. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +0 -322
  1003. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +0 -62
  1004. data/src/core/lib/gpr/murmur_hash.cc +0 -82
  1005. data/src/core/lib/gpr/murmur_hash.h +0 -29
  1006. data/src/core/lib/gpr/tls.h +0 -156
  1007. data/src/core/lib/promise/call_push_pull.h +0 -148
  1008. data/src/core/lib/slice/slice_api.cc +0 -39
  1009. data/src/core/lib/slice/slice_refcount_base.h +0 -60
@@ -18,599 +18,797 @@
18
18
 
19
19
  #include "src/core/ext/filters/rbac/rbac_service_config_parser.h"
20
20
 
21
- #include <stdint.h>
22
-
21
+ #include <cstdint>
23
22
  #include <map>
24
23
  #include <string>
25
24
 
26
- #include "absl/memory/memory.h"
27
25
  #include "absl/status/status.h"
28
26
  #include "absl/status/statusor.h"
29
- #include "absl/strings/str_cat.h"
30
- #include "absl/strings/str_format.h"
31
27
  #include "absl/types/optional.h"
32
28
 
33
29
  #include "src/core/lib/channel/channel_args.h"
34
- #include "src/core/lib/iomgr/error.h"
35
- #include "src/core/lib/json/json_util.h"
30
+ #include "src/core/lib/json/json_args.h"
31
+ #include "src/core/lib/json/json_object_loader.h"
36
32
  #include "src/core/lib/matchers/matchers.h"
37
- #include "src/core/lib/transport/error_utils.h"
38
33
 
39
34
  namespace grpc_core {
40
35
 
41
36
  namespace {
42
37
 
43
- std::string ParseRegexMatcher(const Json::Object& regex_matcher_json,
44
- std::vector<grpc_error_handle>* error_list) {
45
- std::string regex;
46
- ParseJsonObjectField(regex_matcher_json, "regex", &regex, error_list);
47
- return regex;
38
+ // RbacConfig: one or more RbacPolicy structs
39
+ struct RbacConfig {
40
+ // RbacPolicy: optional Rules
41
+ struct RbacPolicy {
42
+ // Rules: an action, plus a map of policy names to Policy structs
43
+ struct Rules {
44
+ // Policy: a list of Permissions and a list of Principals
45
+ struct Policy {
46
+ // CidrRange: represents an IP range
47
+ struct CidrRange {
48
+ Rbac::CidrRange cidr_range;
49
+
50
+ static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
51
+ void JsonPostLoad(const Json& json, const JsonArgs& args,
52
+ ValidationErrors* errors);
53
+ };
54
+
55
+ // SafeRegexMatch: a regex matcher
56
+ struct SafeRegexMatch {
57
+ std::string regex;
58
+
59
+ static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
60
+ };
61
+
62
+ // HeaderMatch: a matcher for HTTP headers
63
+ struct HeaderMatch {
64
+ // RangeMatch: matches a range of numerical values
65
+ struct RangeMatch {
66
+ int64_t start;
67
+ int64_t end;
68
+
69
+ static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
70
+ };
71
+
72
+ HeaderMatcher matcher;
73
+
74
+ static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
75
+ void JsonPostLoad(const Json& json, const JsonArgs& args,
76
+ ValidationErrors* errors);
77
+ };
78
+
79
+ // StringMatch: a matcher for strings
80
+ struct StringMatch {
81
+ StringMatcher matcher;
82
+
83
+ static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
84
+ void JsonPostLoad(const Json& json, const JsonArgs& args,
85
+ ValidationErrors* errors);
86
+ };
87
+
88
+ // PathMatch: a matcher for paths
89
+ struct PathMatch {
90
+ StringMatch path;
91
+
92
+ static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
93
+ };
94
+
95
+ // Metadata: a matcher for Envoy metadata (not really applicable
96
+ // to gRPC; we use only the invert field for proper match semantics)
97
+ struct Metadata {
98
+ bool invert = false;
99
+
100
+ static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
101
+ };
102
+
103
+ // Permission: a matcher for request attributes
104
+ struct Permission {
105
+ // PermissionList: a list used for "and" and "or" matchers
106
+ struct PermissionList {
107
+ std::vector<Permission> rules;
108
+
109
+ PermissionList() = default;
110
+ PermissionList(const PermissionList&) = delete;
111
+ PermissionList& operator=(const PermissionList&) = delete;
112
+ PermissionList(PermissionList&&) = default;
113
+ PermissionList& operator=(PermissionList&&) = default;
114
+
115
+ static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
116
+ };
117
+
118
+ std::unique_ptr<Rbac::Permission> permission;
119
+
120
+ Permission() = default;
121
+ Permission(const Permission&) = delete;
122
+ Permission& operator=(const Permission&) = delete;
123
+ Permission(Permission&&) = default;
124
+ Permission& operator=(Permission&&) = default;
125
+
126
+ static std::vector<std::unique_ptr<Rbac::Permission>>
127
+ MakeRbacPermissionList(std::vector<Permission> permission_list);
128
+ static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
129
+ void JsonPostLoad(const Json& json, const JsonArgs& args,
130
+ ValidationErrors* errors);
131
+ };
132
+
133
+ // Principal: a matcher for client identity
134
+ struct Principal {
135
+ // PrincipalList: a list used for "and" and "or" matchers
136
+ struct PrincipalList {
137
+ std::vector<Principal> ids;
138
+
139
+ PrincipalList() = default;
140
+ PrincipalList(const PrincipalList&) = delete;
141
+ PrincipalList& operator=(const PrincipalList&) = delete;
142
+ PrincipalList(PrincipalList&&) = default;
143
+ PrincipalList& operator=(PrincipalList&&) = default;
144
+
145
+ static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
146
+ };
147
+
148
+ struct Authenticated {
149
+ absl::optional<StringMatch> principal_name;
150
+
151
+ static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
152
+ };
153
+
154
+ std::unique_ptr<Rbac::Principal> principal;
155
+
156
+ Principal() = default;
157
+ Principal(const Principal&) = delete;
158
+ Principal& operator=(const Principal&) = delete;
159
+ Principal(Principal&&) = default;
160
+ Principal& operator=(Principal&&) = default;
161
+
162
+ static std::vector<std::unique_ptr<Rbac::Principal>>
163
+ MakeRbacPrincipalList(std::vector<Principal> principal_list);
164
+ static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
165
+ void JsonPostLoad(const Json& json, const JsonArgs& args,
166
+ ValidationErrors* errors);
167
+ };
168
+
169
+ std::vector<Permission> permissions;
170
+ std::vector<Principal> principals;
171
+
172
+ Policy() = default;
173
+ Policy(const Policy&) = delete;
174
+ Policy& operator=(const Policy&) = delete;
175
+ Policy(Policy&&) = default;
176
+ Policy& operator=(Policy&&) = default;
177
+
178
+ Rbac::Policy TakeAsRbacPolicy();
179
+ static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
180
+ };
181
+
182
+ int action;
183
+ std::map<std::string, Policy> policies;
184
+
185
+ Rules() = default;
186
+ Rules(const Rules&) = delete;
187
+ Rules& operator=(const Rules&) = delete;
188
+ Rules(Rules&&) = default;
189
+ Rules& operator=(Rules&&) = default;
190
+
191
+ Rbac TakeAsRbac();
192
+ static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
193
+ void JsonPostLoad(const Json&, const JsonArgs&, ValidationErrors* errors);
194
+ };
195
+
196
+ absl::optional<Rules> rules;
197
+
198
+ Rbac TakeAsRbac();
199
+ static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
200
+ };
201
+
202
+ std::vector<RbacPolicy> rbac_policies;
203
+
204
+ std::vector<Rbac> TakeAsRbacList();
205
+ static const JsonLoaderInterface* JsonLoader(const JsonArgs&);
206
+ };
207
+
208
+ //
209
+ // RbacConfig::RbacPolicy::Rules::Policy::CidrRange
210
+ //
211
+
212
+ const JsonLoaderInterface*
213
+ RbacConfig::RbacPolicy::Rules::Policy::CidrRange::JsonLoader(const JsonArgs&) {
214
+ // All fields handled in JsonPostLoad().
215
+ static const auto* loader = JsonObjectLoader<CidrRange>().Finish();
216
+ return loader;
48
217
  }
49
218
 
50
- absl::StatusOr<HeaderMatcher> ParseHeaderMatcher(
51
- const Json::Object& header_matcher_json,
52
- std::vector<grpc_error_handle>* error_list) {
53
- std::string name;
54
- ParseJsonObjectField(header_matcher_json, "name", &name, error_list);
55
- std::string match;
56
- HeaderMatcher::Type type = HeaderMatcher::Type();
57
- const Json::Object* inner_json;
58
- int64_t start = 0;
59
- int64_t end = 0;
60
- bool present_match = false;
61
- bool invert_match = false;
62
- ParseJsonObjectField(header_matcher_json, "invertMatch", &invert_match,
63
- error_list, /*required=*/false);
64
- if (ParseJsonObjectField(header_matcher_json, "exactMatch", &match,
65
- error_list, /*required=*/false)) {
66
- type = HeaderMatcher::Type::kExact;
67
- } else if (ParseJsonObjectField(header_matcher_json, "safeRegexMatch",
68
- &inner_json, error_list,
69
- /*required=*/false)) {
70
- type = HeaderMatcher::Type::kSafeRegex;
71
- std::vector<grpc_error_handle> safe_regex_matcher_error_list;
72
- match = ParseRegexMatcher(*inner_json, &safe_regex_matcher_error_list);
73
- if (!safe_regex_matcher_error_list.empty()) {
74
- error_list->push_back(GRPC_ERROR_CREATE_FROM_VECTOR(
75
- "safeRegexMatch", &safe_regex_matcher_error_list));
76
- }
77
- } else if (ParseJsonObjectField(header_matcher_json, "rangeMatch",
78
- &inner_json, error_list,
79
- /*required=*/false)) {
80
- type = HeaderMatcher::Type::kRange;
81
- std::vector<grpc_error_handle> range_error_list;
82
- ParseJsonObjectField(*inner_json, "start", &start, &range_error_list);
83
- ParseJsonObjectField(*inner_json, "end", &end, &range_error_list);
84
- if (!range_error_list.empty()) {
85
- error_list->push_back(
86
- GRPC_ERROR_CREATE_FROM_VECTOR("rangeMatch", &range_error_list));
87
- }
88
- } else if (ParseJsonObjectField(header_matcher_json, "presentMatch",
89
- &present_match, error_list,
90
- /*required=*/false)) {
91
- type = HeaderMatcher::Type::kPresent;
92
- } else if (ParseJsonObjectField(header_matcher_json, "prefixMatch", &match,
93
- error_list, /*required=*/false)) {
94
- type = HeaderMatcher::Type::kPrefix;
95
- } else if (ParseJsonObjectField(header_matcher_json, "suffixMatch", &match,
96
- error_list, /*required=*/false)) {
97
- type = HeaderMatcher::Type::kSuffix;
98
- } else if (ParseJsonObjectField(header_matcher_json, "containsMatch", &match,
99
- error_list, /*required=*/false)) {
100
- type = HeaderMatcher::Type::kContains;
101
- } else {
102
- return absl::InvalidArgumentError("No valid matcher found");
103
- }
104
- return HeaderMatcher::Create(name, type, match, start, end, present_match,
105
- invert_match);
219
+ void RbacConfig::RbacPolicy::Rules::Policy::CidrRange::JsonPostLoad(
220
+ const Json& json, const JsonArgs& args, ValidationErrors* errors) {
221
+ auto address_prefix = LoadJsonObjectField<std::string>(
222
+ json.object_value(), args, "addressPrefix", errors);
223
+ auto prefix_len = LoadJsonObjectField<uint32_t>(json.object_value(), args,
224
+ "prefixLen", errors,
225
+ /*required=*/false);
226
+ cidr_range =
227
+ Rbac::CidrRange(address_prefix.value_or(""), prefix_len.value_or(0));
106
228
  }
107
229
 
108
- absl::StatusOr<StringMatcher> ParseStringMatcher(
109
- const Json::Object& string_matcher_json,
110
- std::vector<grpc_error_handle>* error_list) {
111
- std::string match;
112
- StringMatcher::Type type = StringMatcher::Type();
113
- const Json::Object* inner_json;
114
- bool ignore_case = false;
115
- ParseJsonObjectField(string_matcher_json, "ignoreCase", &ignore_case,
116
- error_list, /*required=*/false);
117
- if (ParseJsonObjectField(string_matcher_json, "exact", &match, error_list,
118
- /*required=*/false)) {
119
- type = StringMatcher::Type::kExact;
120
- } else if (ParseJsonObjectField(string_matcher_json, "prefix", &match,
121
- error_list, /*required=*/false)) {
122
- type = StringMatcher::Type::kPrefix;
123
- } else if (ParseJsonObjectField(string_matcher_json, "suffix", &match,
124
- error_list, /*required=*/false)) {
125
- type = StringMatcher::Type::kSuffix;
126
- } else if (ParseJsonObjectField(string_matcher_json, "safeRegex", &inner_json,
127
- error_list, /*required=*/false)) {
128
- type = StringMatcher::Type::kSafeRegex;
129
- std::vector<grpc_error_handle> safe_regex_matcher_error_list;
130
- match = ParseRegexMatcher(*inner_json, &safe_regex_matcher_error_list);
131
- if (!safe_regex_matcher_error_list.empty()) {
132
- error_list->push_back(GRPC_ERROR_CREATE_FROM_VECTOR(
133
- "safeRegex", &safe_regex_matcher_error_list));
134
- }
135
- } else if (ParseJsonObjectField(string_matcher_json, "contains", &match,
136
- error_list, /*required=*/false)) {
137
- type = StringMatcher::Type::kContains;
138
- } else {
139
- return absl::InvalidArgumentError("No valid matcher found");
140
- }
141
- return StringMatcher::Create(type, match, ignore_case);
230
+ //
231
+ // RbacConfig::RbacPolicy::Rules::Policy::SafeRegexMatch
232
+ //
233
+
234
+ const JsonLoaderInterface*
235
+ RbacConfig::RbacPolicy::Rules::Policy::SafeRegexMatch::JsonLoader(
236
+ const JsonArgs&) {
237
+ static const auto* loader = JsonObjectLoader<SafeRegexMatch>()
238
+ .Field("regex", &SafeRegexMatch::regex)
239
+ .Finish();
240
+ return loader;
142
241
  }
143
242
 
144
- absl::StatusOr<StringMatcher> ParsePathMatcher(
145
- const Json::Object& path_matcher_json,
146
- std::vector<grpc_error_handle>* error_list) {
147
- const Json::Object* string_matcher_json;
148
- if (ParseJsonObjectField(path_matcher_json, "path", &string_matcher_json,
149
- error_list)) {
150
- std::vector<grpc_error_handle> sub_error_list;
151
- auto matcher = ParseStringMatcher(*string_matcher_json, &sub_error_list);
152
- if (!sub_error_list.empty()) {
153
- error_list->push_back(
154
- GRPC_ERROR_CREATE_FROM_VECTOR("path", &sub_error_list));
155
- }
156
- return matcher;
157
- }
158
- return absl::InvalidArgumentError("No path found");
243
+ //
244
+ // RbacConfig::RbacPolicy::Rules::Policy::HeaderMatch::RangeMatch
245
+ //
246
+
247
+ const JsonLoaderInterface*
248
+ RbacConfig::RbacPolicy::Rules::Policy::HeaderMatch::RangeMatch::JsonLoader(
249
+ const JsonArgs&) {
250
+ static const auto* loader = JsonObjectLoader<RangeMatch>()
251
+ .Field("start", &RangeMatch::start)
252
+ .Field("end", &RangeMatch::end)
253
+ .Finish();
254
+ return loader;
159
255
  }
160
256
 
161
- Rbac::CidrRange ParseCidrRange(const Json::Object& cidr_range_json,
162
- std::vector<grpc_error_handle>* error_list) {
163
- std::string address_prefix;
164
- ParseJsonObjectField(cidr_range_json, "addressPrefix", &address_prefix,
165
- error_list);
166
- const Json::Object* uint32_json;
167
- uint32_t prefix_len = 0; // default value
168
- if (ParseJsonObjectField(cidr_range_json, "prefixLen", &uint32_json,
169
- error_list, /*required=*/false)) {
170
- std::vector<grpc_error_handle> sub_error_list;
171
- ParseJsonObjectField(*uint32_json, "value", &prefix_len, &sub_error_list);
172
- if (!sub_error_list.empty()) {
173
- error_list->push_back(
174
- GRPC_ERROR_CREATE_FROM_VECTOR("prefixLen", &sub_error_list));
175
- }
176
- }
177
- return Rbac::CidrRange(std::move(address_prefix), prefix_len);
257
+ //
258
+ // RbacConfig::RbacPolicy::Rules::Policy::HeaderMatch
259
+ //
260
+
261
+ const JsonLoaderInterface*
262
+ RbacConfig::RbacPolicy::Rules::Policy::HeaderMatch::JsonLoader(
263
+ const JsonArgs&) {
264
+ // All fields handled in JsonPostLoad().
265
+ static const auto* loader = JsonObjectLoader<HeaderMatch>().Finish();
266
+ return loader;
178
267
  }
179
268
 
180
- Rbac::Permission ParsePermission(const Json::Object& permission_json,
181
- std::vector<grpc_error_handle>* error_list) {
182
- auto parse_permission_set = [](const Json::Object& permission_set_json,
183
- std::vector<grpc_error_handle>* error_list) {
184
- const Json::Array* rules_json;
185
- std::vector<std::unique_ptr<Rbac::Permission>> permissions;
186
- if (ParseJsonObjectField(permission_set_json, "rules", &rules_json,
187
- error_list)) {
188
- for (size_t i = 0; i < rules_json->size(); ++i) {
189
- const Json::Object* permission_json;
190
- if (!ExtractJsonType((*rules_json)[i],
191
- absl::StrFormat("rules[%d]", i).c_str(),
192
- &permission_json, error_list)) {
193
- continue;
194
- }
195
- std::vector<grpc_error_handle> permission_error_list;
196
- permissions.emplace_back(absl::make_unique<Rbac::Permission>(
197
- ParsePermission(*permission_json, &permission_error_list)));
198
- if (!permission_error_list.empty()) {
199
- error_list->push_back(GRPC_ERROR_CREATE_FROM_VECTOR_AND_CPP_STRING(
200
- absl::StrFormat("rules[%d]", i), &permission_error_list));
201
- }
202
- }
203
- }
204
- return permissions;
205
- };
206
- Rbac::Permission permission;
207
- const Json::Object* inner_json;
208
- bool any;
209
- int port;
210
- if (ParseJsonObjectField(permission_json, "andRules", &inner_json, error_list,
211
- /*required=*/false)) {
212
- std::vector<grpc_error_handle> and_rules_error_list;
213
- permission = Rbac::Permission::MakeAndPermission(
214
- parse_permission_set(*inner_json, &and_rules_error_list));
215
- if (!and_rules_error_list.empty()) {
216
- error_list->push_back(
217
- GRPC_ERROR_CREATE_FROM_VECTOR("andRules", &and_rules_error_list));
218
- }
219
- } else if (ParseJsonObjectField(permission_json, "orRules", &inner_json,
220
- error_list, /*required=*/false)) {
221
- std::vector<grpc_error_handle> or_rules_error_list;
222
- permission = Rbac::Permission::MakeOrPermission(
223
- parse_permission_set(*inner_json, &or_rules_error_list));
224
- if (!or_rules_error_list.empty()) {
225
- error_list->push_back(
226
- GRPC_ERROR_CREATE_FROM_VECTOR("orRules", &or_rules_error_list));
227
- }
228
- } else if (ParseJsonObjectField(permission_json, "any", &any, error_list,
229
- /*required=*/false) &&
230
- any) {
231
- permission = Rbac::Permission::MakeAnyPermission();
232
- } else if (ParseJsonObjectField(permission_json, "header", &inner_json,
233
- error_list,
234
- /*required=*/false)) {
235
- std::vector<grpc_error_handle> header_error_list;
236
- auto matcher = ParseHeaderMatcher(*inner_json, &header_error_list);
237
- if (matcher.ok()) {
238
- permission = Rbac::Permission::MakeHeaderPermission(*matcher);
269
+ void RbacConfig::RbacPolicy::Rules::Policy::HeaderMatch::JsonPostLoad(
270
+ const Json& json, const JsonArgs& args, ValidationErrors* errors) {
271
+ const size_t original_error_size = errors->size();
272
+ std::string name = LoadJsonObjectField<std::string>(json.object_value(), args,
273
+ "name", errors)
274
+ .value_or("");
275
+ bool invert_match = LoadJsonObjectField<bool>(json.object_value(), args,
276
+ "invertMatch", errors,
277
+ /*required=*/false)
278
+ .value_or(false);
279
+ auto set_header_matcher = [&](absl::StatusOr<HeaderMatcher> header_matcher) {
280
+ if (header_matcher.ok()) {
281
+ matcher = *header_matcher;
239
282
  } else {
240
- header_error_list.push_back(absl_status_to_grpc_error(matcher.status()));
241
- }
242
- if (!header_error_list.empty()) {
243
- error_list->push_back(
244
- GRPC_ERROR_CREATE_FROM_VECTOR("header", &header_error_list));
245
- }
246
- } else if (ParseJsonObjectField(permission_json, "urlPath", &inner_json,
247
- error_list,
248
- /*required=*/false)) {
249
- std::vector<grpc_error_handle> url_path_error_list;
250
- auto matcher = ParsePathMatcher(*inner_json, &url_path_error_list);
251
- if (matcher.ok()) {
252
- permission = Rbac::Permission::MakePathPermission(*matcher);
253
- } else {
254
- url_path_error_list.push_back(
255
- absl_status_to_grpc_error(matcher.status()));
256
- }
257
- if (!url_path_error_list.empty()) {
258
- error_list->push_back(
259
- GRPC_ERROR_CREATE_FROM_VECTOR("urlPath", &url_path_error_list));
283
+ errors->AddError(header_matcher.status().message());
260
284
  }
261
- } else if (ParseJsonObjectField(permission_json, "destinationIp", &inner_json,
262
- error_list, /*required=*/false)) {
263
- std::vector<grpc_error_handle> destination_ip_error_list;
264
- permission = Rbac::Permission::MakeDestIpPermission(
265
- ParseCidrRange(*inner_json, &destination_ip_error_list));
266
- if (!destination_ip_error_list.empty()) {
267
- error_list->push_back(GRPC_ERROR_CREATE_FROM_VECTOR(
268
- "destinationIp", &destination_ip_error_list));
269
- }
270
- } else if (ParseJsonObjectField(permission_json, "destinationPort", &port,
271
- error_list, /*required=*/false)) {
272
- permission = Rbac::Permission::MakeDestPortPermission(port);
273
- } else if (ParseJsonObjectField(permission_json, "metadata", &inner_json,
274
- error_list, /*required=*/false)) {
275
- std::vector<grpc_error_handle> metadata_error_list;
276
- bool invert = false;
277
- ParseJsonObjectField(*inner_json, "invert", &invert, &metadata_error_list,
278
- /*required=*/false);
279
- if (metadata_error_list.empty()) {
280
- permission = Rbac::Permission::MakeMetadataPermission(invert);
281
- } else {
282
- error_list->push_back(
283
- GRPC_ERROR_CREATE_FROM_VECTOR("metadata", &metadata_error_list));
284
- }
285
- } else if (ParseJsonObjectField(permission_json, "notRule", &inner_json,
286
- error_list, /*required=*/false)) {
287
- std::vector<grpc_error_handle> not_rule_error_list;
288
- permission = Rbac::Permission::MakeNotPermission(
289
- ParsePermission(*inner_json, &not_rule_error_list));
290
- if (!not_rule_error_list.empty()) {
291
- error_list->push_back(
292
- GRPC_ERROR_CREATE_FROM_VECTOR("notRule", &not_rule_error_list));
293
- }
294
- } else if (ParseJsonObjectField(permission_json, "requestedServerName",
295
- &inner_json, error_list,
296
- /*required=*/false)) {
297
- std::vector<grpc_error_handle> req_server_name_error_list;
298
- auto matcher = ParseStringMatcher(*inner_json, &req_server_name_error_list);
299
- if (matcher.ok()) {
300
- permission = Rbac::Permission::MakeReqServerNamePermission(*matcher);
301
- } else {
302
- req_server_name_error_list.push_back(
303
- absl_status_to_grpc_error(matcher.status()));
304
- }
305
- if (!req_server_name_error_list.empty()) {
306
- error_list->push_back(GRPC_ERROR_CREATE_FROM_VECTOR(
307
- "requestedServerName", &req_server_name_error_list));
308
- }
309
- } else {
310
- error_list->push_back(
311
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("No valid rule found"));
285
+ };
286
+ auto check_match = [&](absl::string_view field_name,
287
+ HeaderMatcher::Type type) {
288
+ auto match = LoadJsonObjectField<std::string>(json.object_value(), args,
289
+ field_name, errors,
290
+ /*required=*/false);
291
+ if (match.has_value()) {
292
+ set_header_matcher(
293
+ HeaderMatcher::Create(name, type, *match, 0, 0, false, invert_match));
294
+ return true;
295
+ }
296
+ return false;
297
+ };
298
+ if (check_match("exactMatch", HeaderMatcher::Type::kExact) ||
299
+ check_match("prefixMatch", HeaderMatcher::Type::kPrefix) ||
300
+ check_match("suffixMatch", HeaderMatcher::Type::kSuffix) ||
301
+ check_match("containsMatch", HeaderMatcher::Type::kContains)) {
302
+ return;
303
+ }
304
+ auto present_match = LoadJsonObjectField<bool>(json.object_value(), args,
305
+ "presentMatch", errors,
306
+ /*required=*/false);
307
+ if (present_match.has_value()) {
308
+ set_header_matcher(
309
+ HeaderMatcher::Create(name, HeaderMatcher::Type::kPresent, "", 0, 0,
310
+ *present_match, invert_match));
311
+ return;
312
+ }
313
+ auto regex_match = LoadJsonObjectField<SafeRegexMatch>(
314
+ json.object_value(), args, "safeRegexMatch", errors,
315
+ /*required=*/false);
316
+ if (regex_match.has_value()) {
317
+ set_header_matcher(
318
+ HeaderMatcher::Create(name, HeaderMatcher::Type::kSafeRegex,
319
+ regex_match->regex, 0, 0, false, invert_match));
320
+ return;
321
+ }
322
+ auto range_match = LoadJsonObjectField<RangeMatch>(json.object_value(), args,
323
+ "rangeMatch", errors,
324
+ /*required=*/false);
325
+ if (range_match.has_value()) {
326
+ set_header_matcher(HeaderMatcher::Create(name, HeaderMatcher::Type::kRange,
327
+ "", range_match->start,
328
+ range_match->end, invert_match));
329
+ return;
330
+ }
331
+ if (errors->size() == original_error_size) {
332
+ errors->AddError("no valid matcher found");
312
333
  }
313
- return permission;
314
334
  }
315
335
 
316
- Rbac::Principal ParsePrincipal(const Json::Object& principal_json,
317
- std::vector<grpc_error_handle>* error_list) {
318
- auto parse_principal_set = [](const Json::Object& principal_set_json,
319
- std::vector<grpc_error_handle>* error_list) {
320
- const Json::Array* rules_json;
321
- std::vector<std::unique_ptr<Rbac::Principal>> principals;
322
- if (ParseJsonObjectField(principal_set_json, "ids", &rules_json,
323
- error_list)) {
324
- for (size_t i = 0; i < rules_json->size(); ++i) {
325
- const Json::Object* principal_json;
326
- if (!ExtractJsonType((*rules_json)[i],
327
- absl::StrFormat("ids[%d]", i).c_str(),
328
- &principal_json, error_list)) {
329
- continue;
330
- }
331
- std::vector<grpc_error_handle> principal_error_list;
332
- principals.emplace_back(absl::make_unique<Rbac::Principal>(
333
- ParsePrincipal(*principal_json, &principal_error_list)));
334
- if (!principal_error_list.empty()) {
335
- error_list->push_back(GRPC_ERROR_CREATE_FROM_VECTOR_AND_CPP_STRING(
336
- absl::StrFormat("ids[%d]", i), &principal_error_list));
337
- }
338
- }
339
- }
340
- return principals;
341
- };
342
- Rbac::Principal principal;
343
- const Json::Object* inner_json;
344
- bool any;
345
- if (ParseJsonObjectField(principal_json, "andIds", &inner_json, error_list,
346
- /*required=*/false)) {
347
- std::vector<grpc_error_handle> and_rules_error_list;
348
- principal = Rbac::Principal::MakeAndPrincipal(
349
- parse_principal_set(*inner_json, &and_rules_error_list));
350
- if (!and_rules_error_list.empty()) {
351
- error_list->push_back(
352
- GRPC_ERROR_CREATE_FROM_VECTOR("andIds", &and_rules_error_list));
353
- }
354
- } else if (ParseJsonObjectField(principal_json, "orIds", &inner_json,
355
- error_list, /*required=*/false)) {
356
- std::vector<grpc_error_handle> or_rules_error_list;
357
- principal = Rbac::Principal::MakeOrPrincipal(
358
- parse_principal_set(*inner_json, &or_rules_error_list));
359
- if (!or_rules_error_list.empty()) {
360
- error_list->push_back(
361
- GRPC_ERROR_CREATE_FROM_VECTOR("orIds", &or_rules_error_list));
362
- }
363
- } else if (ParseJsonObjectField(principal_json, "any", &any, error_list,
364
- /*required=*/false) &&
365
- any) {
366
- principal = Rbac::Principal::MakeAnyPrincipal();
367
- } else if (ParseJsonObjectField(principal_json, "authenticated", &inner_json,
368
- error_list, /*required=*/false)) {
369
- std::vector<grpc_error_handle> authenticated_error_list;
370
- const Json::Object* principal_name_json;
371
- if (ParseJsonObjectField(*inner_json, "principalName", &principal_name_json,
372
- &authenticated_error_list, /*required=*/false)) {
373
- std::vector<grpc_error_handle> principal_name_error_list;
374
- auto matcher =
375
- ParseStringMatcher(*principal_name_json, &principal_name_error_list);
376
- if (matcher.ok()) {
377
- principal = Rbac::Principal::MakeAuthenticatedPrincipal(*matcher);
378
- } else {
379
- principal_name_error_list.push_back(
380
- absl_status_to_grpc_error(matcher.status()));
381
- }
382
- if (!principal_name_error_list.empty()) {
383
- authenticated_error_list.push_back(GRPC_ERROR_CREATE_FROM_VECTOR(
384
- "principalName", &principal_name_error_list));
385
- }
386
- } else if (authenticated_error_list.empty()) {
387
- // No principalName found. Match for all users.
388
- principal = Rbac::Principal::MakeAnyPrincipal();
389
- } else {
390
- error_list->push_back(GRPC_ERROR_CREATE_FROM_VECTOR(
391
- "authenticated", &authenticated_error_list));
392
- }
393
- } else if (ParseJsonObjectField(principal_json, "sourceIp", &inner_json,
394
- error_list, /*required=*/false)) {
395
- std::vector<grpc_error_handle> source_ip_error_list;
396
- principal = Rbac::Principal::MakeSourceIpPrincipal(
397
- ParseCidrRange(*inner_json, &source_ip_error_list));
398
- if (!source_ip_error_list.empty()) {
399
- error_list->push_back(
400
- GRPC_ERROR_CREATE_FROM_VECTOR("sourceIp", &source_ip_error_list));
401
- }
402
- } else if (ParseJsonObjectField(principal_json, "directRemoteIp", &inner_json,
403
- error_list, /*required=*/false)) {
404
- std::vector<grpc_error_handle> direct_remote_ip_error_list;
405
- principal = Rbac::Principal::MakeDirectRemoteIpPrincipal(
406
- ParseCidrRange(*inner_json, &direct_remote_ip_error_list));
407
- if (!direct_remote_ip_error_list.empty()) {
408
- error_list->push_back(GRPC_ERROR_CREATE_FROM_VECTOR(
409
- "directRemoteIp", &direct_remote_ip_error_list));
410
- }
411
- } else if (ParseJsonObjectField(principal_json, "remoteIp", &inner_json,
412
- error_list, /*required=*/false)) {
413
- std::vector<grpc_error_handle> remote_ip_error_list;
414
- principal = Rbac::Principal::MakeRemoteIpPrincipal(
415
- ParseCidrRange(*inner_json, &remote_ip_error_list));
416
- if (!remote_ip_error_list.empty()) {
417
- error_list->push_back(
418
- GRPC_ERROR_CREATE_FROM_VECTOR("remoteIp", &remote_ip_error_list));
419
- }
420
- } else if (ParseJsonObjectField(principal_json, "header", &inner_json,
421
- error_list,
422
- /*required=*/false)) {
423
- std::vector<grpc_error_handle> header_error_list;
424
- auto matcher = ParseHeaderMatcher(*inner_json, &header_error_list);
425
- if (matcher.ok()) {
426
- principal = Rbac::Principal::MakeHeaderPrincipal(*matcher);
427
- } else {
428
- header_error_list.push_back(absl_status_to_grpc_error(matcher.status()));
429
- }
430
- if (!header_error_list.empty()) {
431
- error_list->push_back(
432
- GRPC_ERROR_CREATE_FROM_VECTOR("header", &header_error_list));
433
- }
434
- } else if (ParseJsonObjectField(principal_json, "urlPath", &inner_json,
435
- error_list,
436
- /*required=*/false)) {
437
- std::vector<grpc_error_handle> url_path_error_list;
438
- auto matcher = ParsePathMatcher(*inner_json, &url_path_error_list);
439
- if (matcher.ok()) {
440
- principal = Rbac::Principal::MakePathPrincipal(*matcher);
441
- } else {
442
- url_path_error_list.push_back(
443
- absl_status_to_grpc_error(matcher.status()));
444
- }
445
- if (!url_path_error_list.empty()) {
446
- error_list->push_back(
447
- GRPC_ERROR_CREATE_FROM_VECTOR("urlPath", &url_path_error_list));
448
- }
449
- } else if (ParseJsonObjectField(principal_json, "metadata", &inner_json,
450
- error_list, /*required=*/false)) {
451
- std::vector<grpc_error_handle> metadata_error_list;
452
- bool invert = false;
453
- ParseJsonObjectField(*inner_json, "invert", &invert, &metadata_error_list,
454
- /*required=*/false);
455
- if (metadata_error_list.empty()) {
456
- principal = Rbac::Principal::MakeMetadataPrincipal(invert);
336
+ //
337
+ // RbacConfig::RbacPolicy::Rules::Policy::StringMatch
338
+ //
339
+
340
+ const JsonLoaderInterface*
341
+ RbacConfig::RbacPolicy::Rules::Policy::StringMatch::JsonLoader(
342
+ const JsonArgs&) {
343
+ // All fields handled in JsonPostLoad().
344
+ static const auto* loader = JsonObjectLoader<StringMatch>().Finish();
345
+ return loader;
346
+ }
347
+
348
+ void RbacConfig::RbacPolicy::Rules::Policy::StringMatch::JsonPostLoad(
349
+ const Json& json, const JsonArgs& args, ValidationErrors* errors) {
350
+ const size_t original_error_size = errors->size();
351
+ bool ignore_case =
352
+ LoadJsonObjectField<bool>(json.object_value(), args, "ignoreCase", errors,
353
+ /*required=*/false)
354
+ .value_or(false);
355
+ auto set_string_matcher = [&](absl::StatusOr<StringMatcher> string_matcher) {
356
+ if (string_matcher.ok()) {
357
+ matcher = *string_matcher;
457
358
  } else {
458
- error_list->push_back(
459
- GRPC_ERROR_CREATE_FROM_VECTOR("metadata", &metadata_error_list));
460
- }
461
- } else if (ParseJsonObjectField(principal_json, "notId", &inner_json,
462
- error_list, /*required=*/false)) {
463
- std::vector<grpc_error_handle> not_rule_error_list;
464
- principal = Rbac::Principal::MakeNotPrincipal(
465
- ParsePrincipal(*inner_json, &not_rule_error_list));
466
- if (!not_rule_error_list.empty()) {
467
- error_list->push_back(
468
- GRPC_ERROR_CREATE_FROM_VECTOR("notId", &not_rule_error_list));
359
+ errors->AddError(string_matcher.status().message());
469
360
  }
470
- } else {
471
- error_list->push_back(
472
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("No valid id found"));
361
+ };
362
+ auto check_match = [&](absl::string_view field_name,
363
+ StringMatcher::Type type) {
364
+ auto match = LoadJsonObjectField<std::string>(json.object_value(), args,
365
+ field_name, errors,
366
+ /*required=*/false);
367
+ if (match.has_value()) {
368
+ set_string_matcher(StringMatcher::Create(type, *match, ignore_case));
369
+ return true;
370
+ }
371
+ return false;
372
+ };
373
+ if (check_match("exact", StringMatcher::Type::kExact) ||
374
+ check_match("prefix", StringMatcher::Type::kPrefix) ||
375
+ check_match("suffix", StringMatcher::Type::kSuffix) ||
376
+ check_match("contains", StringMatcher::Type::kContains)) {
377
+ return;
378
+ }
379
+ auto regex_match = LoadJsonObjectField<SafeRegexMatch>(
380
+ json.object_value(), args, "safeRegex", errors,
381
+ /*required=*/false);
382
+ if (regex_match.has_value()) {
383
+ set_string_matcher(StringMatcher::Create(StringMatcher::Type::kSafeRegex,
384
+ regex_match->regex, ignore_case));
385
+ return;
386
+ }
387
+ if (errors->size() == original_error_size) {
388
+ errors->AddError("no valid matcher found");
473
389
  }
474
- return principal;
475
390
  }
476
391
 
477
- Rbac::Policy ParsePolicy(const Json::Object& policy_json,
478
- std::vector<grpc_error_handle>* error_list) {
479
- Rbac::Policy policy;
480
- const Json::Array* permissions_json_array;
392
+ //
393
+ // RbacConfig::RbacPolicy::Rules::Policy::PathMatch
394
+ //
395
+
396
+ const JsonLoaderInterface*
397
+ RbacConfig::RbacPolicy::Rules::Policy::PathMatch::JsonLoader(const JsonArgs&) {
398
+ static const auto* loader =
399
+ JsonObjectLoader<PathMatch>().Field("path", &PathMatch::path).Finish();
400
+ return loader;
401
+ }
402
+
403
+ //
404
+ // RbacConfig::RbacPolicy::Rules::Policy::Metadata
405
+ //
406
+
407
+ const JsonLoaderInterface*
408
+ RbacConfig::RbacPolicy::Rules::Policy::Metadata::JsonLoader(const JsonArgs&) {
409
+ static const auto* loader = JsonObjectLoader<Metadata>()
410
+ .OptionalField("invert", &Metadata::invert)
411
+ .Finish();
412
+ return loader;
413
+ }
414
+
415
+ //
416
+ // RbacConfig::RbacPolicy::Rules::Policy::Permission::PermissionList
417
+ //
418
+
419
+ const JsonLoaderInterface*
420
+ RbacConfig::RbacPolicy::Rules::Policy::Permission::PermissionList::JsonLoader(
421
+ const JsonArgs&) {
422
+ static const auto* loader = JsonObjectLoader<PermissionList>()
423
+ .Field("rules", &PermissionList::rules)
424
+ .Finish();
425
+ return loader;
426
+ }
427
+
428
+ //
429
+ // RbacConfig::RbacPolicy::Rules::Policy::Permission
430
+ //
431
+
432
+ std::vector<std::unique_ptr<Rbac::Permission>>
433
+ RbacConfig::RbacPolicy::Rules::Policy::Permission::MakeRbacPermissionList(
434
+ std::vector<Permission> permission_list) {
481
435
  std::vector<std::unique_ptr<Rbac::Permission>> permissions;
482
- if (ParseJsonObjectField(policy_json, "permissions", &permissions_json_array,
483
- error_list)) {
484
- for (size_t i = 0; i < permissions_json_array->size(); ++i) {
485
- const Json::Object* permission_json;
486
- if (!ExtractJsonType((*permissions_json_array)[i],
487
- absl::StrFormat("permissions[%d]", i),
488
- &permission_json, error_list)) {
489
- continue;
490
- }
491
- std::vector<grpc_error_handle> permission_error_list;
492
- permissions.emplace_back(absl::make_unique<Rbac::Permission>(
493
- ParsePermission(*permission_json, &permission_error_list)));
494
- if (!permission_error_list.empty()) {
495
- error_list->push_back(GRPC_ERROR_CREATE_FROM_VECTOR_AND_CPP_STRING(
496
- absl::StrFormat("permissions[%d]", i), &permission_error_list));
497
- }
498
- }
436
+ permissions.reserve(permission_list.size());
437
+ for (auto& rule : permission_list) {
438
+ permissions.emplace_back(std::move(rule.permission));
439
+ }
440
+ return permissions;
441
+ }
442
+
443
+ const JsonLoaderInterface*
444
+ RbacConfig::RbacPolicy::Rules::Policy::Permission::JsonLoader(const JsonArgs&) {
445
+ // All fields handled in JsonPostLoad().
446
+ static const auto* loader = JsonObjectLoader<Permission>().Finish();
447
+ return loader;
448
+ }
449
+
450
+ void RbacConfig::RbacPolicy::Rules::Policy::Permission::JsonPostLoad(
451
+ const Json& json, const JsonArgs& args, ValidationErrors* errors) {
452
+ const size_t original_error_size = errors->size();
453
+ auto any = LoadJsonObjectField<bool>(json.object_value(), args, "any", errors,
454
+ /*required=*/false);
455
+ if (any.has_value()) {
456
+ permission = std::make_unique<Rbac::Permission>(
457
+ Rbac::Permission::MakeAnyPermission());
458
+ return;
459
+ }
460
+ auto header = LoadJsonObjectField<HeaderMatch>(json.object_value(), args,
461
+ "header", errors,
462
+ /*required=*/false);
463
+ if (header.has_value()) {
464
+ permission = std::make_unique<Rbac::Permission>(
465
+ Rbac::Permission::MakeHeaderPermission(std::move(header->matcher)));
466
+ return;
467
+ }
468
+ auto url_path = LoadJsonObjectField<PathMatch>(json.object_value(), args,
469
+ "urlPath", errors,
470
+ /*required=*/false);
471
+ if (url_path.has_value()) {
472
+ permission = std::make_unique<Rbac::Permission>(
473
+ Rbac::Permission::MakePathPermission(url_path->path.matcher));
474
+ return;
499
475
  }
500
- const Json::Array* principals_json_array;
476
+ auto destination_ip = LoadJsonObjectField<CidrRange>(
477
+ json.object_value(), args, "destinationIp", errors,
478
+ /*required=*/false);
479
+ if (destination_ip.has_value()) {
480
+ permission = std::make_unique<Rbac::Permission>(
481
+ Rbac::Permission::MakeDestIpPermission(
482
+ std::move(destination_ip->cidr_range)));
483
+ return;
484
+ }
485
+ auto destination_port = LoadJsonObjectField<uint32_t>(
486
+ json.object_value(), args, "destinationPort", errors,
487
+ /*required=*/false);
488
+ if (destination_port.has_value()) {
489
+ permission = std::make_unique<Rbac::Permission>(
490
+ Rbac::Permission::MakeDestPortPermission(*destination_port));
491
+ return;
492
+ }
493
+ auto metadata = LoadJsonObjectField<Metadata>(json.object_value(), args,
494
+ "metadata", errors,
495
+ /*required=*/false);
496
+ if (metadata.has_value()) {
497
+ permission = std::make_unique<Rbac::Permission>(
498
+ Rbac::Permission::MakeMetadataPermission(metadata->invert));
499
+ return;
500
+ }
501
+ auto requested_server_name = LoadJsonObjectField<StringMatch>(
502
+ json.object_value(), args, "requestedServerName", errors,
503
+ /*required=*/false);
504
+ if (requested_server_name.has_value()) {
505
+ permission = std::make_unique<Rbac::Permission>(
506
+ Rbac::Permission::MakeReqServerNamePermission(
507
+ std::move(requested_server_name->matcher)));
508
+ return;
509
+ }
510
+ auto rules = LoadJsonObjectField<PermissionList>(json.object_value(), args,
511
+ "andRules", errors,
512
+ /*required=*/false);
513
+ if (rules.has_value()) {
514
+ permission =
515
+ std::make_unique<Rbac::Permission>(Rbac::Permission::MakeAndPermission(
516
+ MakeRbacPermissionList(std::move(rules->rules))));
517
+ return;
518
+ }
519
+ rules = LoadJsonObjectField<PermissionList>(json.object_value(), args,
520
+ "orRules", errors,
521
+ /*required=*/false);
522
+ if (rules.has_value()) {
523
+ permission =
524
+ std::make_unique<Rbac::Permission>(Rbac::Permission::MakeOrPermission(
525
+ MakeRbacPermissionList(std::move(rules->rules))));
526
+ return;
527
+ }
528
+ auto not_rule = LoadJsonObjectField<Permission>(json.object_value(), args,
529
+ "notRule", errors,
530
+ /*required=*/false);
531
+ if (not_rule.has_value()) {
532
+ permission = std::make_unique<Rbac::Permission>(
533
+ Rbac::Permission::MakeNotPermission(std::move(*not_rule->permission)));
534
+ return;
535
+ }
536
+ if (errors->size() == original_error_size) {
537
+ errors->AddError("no valid rule found");
538
+ }
539
+ }
540
+
541
+ //
542
+ // RbacConfig::RbacPolicy::Rules::Policy::Principal::PrincipalList
543
+ //
544
+
545
+ const JsonLoaderInterface*
546
+ RbacConfig::RbacPolicy::Rules::Policy::Principal::PrincipalList::JsonLoader(
547
+ const JsonArgs&) {
548
+ static const auto* loader = JsonObjectLoader<PrincipalList>()
549
+ .Field("ids", &PrincipalList::ids)
550
+ .Finish();
551
+ return loader;
552
+ }
553
+
554
+ //
555
+ // RbacConfig::RbacPolicy::Rules::Policy::Principal::Authenticated
556
+ //
557
+
558
+ const JsonLoaderInterface*
559
+ RbacConfig::RbacPolicy::Rules::Policy::Principal::Authenticated::JsonLoader(
560
+ const JsonArgs&) {
561
+ static const auto* loader =
562
+ JsonObjectLoader<Authenticated>()
563
+ .OptionalField("principalName", &Authenticated::principal_name)
564
+ .Finish();
565
+ return loader;
566
+ }
567
+
568
+ //
569
+ // RbacConfig::RbacPolicy::Rules::Policy::Principal
570
+ //
571
+
572
+ std::vector<std::unique_ptr<Rbac::Principal>>
573
+ RbacConfig::RbacPolicy::Rules::Policy::Principal::MakeRbacPrincipalList(
574
+ std::vector<Principal> principal_list) {
501
575
  std::vector<std::unique_ptr<Rbac::Principal>> principals;
502
- if (ParseJsonObjectField(policy_json, "principals", &principals_json_array,
503
- error_list)) {
504
- for (size_t i = 0; i < principals_json_array->size(); ++i) {
505
- const Json::Object* principal_json;
506
- if (!ExtractJsonType((*principals_json_array)[i],
507
- absl::StrFormat("principals[%d]", i),
508
- &principal_json, error_list)) {
509
- continue;
510
- }
511
- std::vector<grpc_error_handle> principal_error_list;
512
- principals.emplace_back(absl::make_unique<Rbac::Principal>(
513
- ParsePrincipal(*principal_json, &principal_error_list)));
514
- if (!principal_error_list.empty()) {
515
- error_list->push_back(GRPC_ERROR_CREATE_FROM_VECTOR_AND_CPP_STRING(
516
- absl::StrFormat("principals[%d]", i), &principal_error_list));
517
- }
518
- }
576
+ principals.reserve(principal_list.size());
577
+ for (auto& id : principal_list) {
578
+ principals.emplace_back(std::move(id.principal));
519
579
  }
520
- policy.permissions =
521
- Rbac::Permission::MakeOrPermission(std::move(permissions));
522
- policy.principals = Rbac::Principal::MakeOrPrincipal(std::move(principals));
523
- return policy;
580
+ return principals;
524
581
  }
525
582
 
526
- Rbac ParseRbac(const Json::Object& rbac_json,
527
- std::vector<grpc_error_handle>* error_list) {
528
- Rbac rbac;
529
- const Json::Object* rules_json;
530
- if (!ParseJsonObjectField(rbac_json, "rules", &rules_json, error_list,
531
- /*required=*/false)) {
532
- // No enforcing to be applied. An empty deny policy with an empty map is
533
- // equivalent to no enforcing.
534
- return Rbac(Rbac::Action::kDeny, {});
583
+ const JsonLoaderInterface*
584
+ RbacConfig::RbacPolicy::Rules::Policy::Principal::JsonLoader(const JsonArgs&) {
585
+ // All fields handled in JsonPostLoad().
586
+ static const auto* loader = JsonObjectLoader<Principal>().Finish();
587
+ return loader;
588
+ }
589
+
590
+ void RbacConfig::RbacPolicy::Rules::Policy::Principal::JsonPostLoad(
591
+ const Json& json, const JsonArgs& args, ValidationErrors* errors) {
592
+ const size_t original_error_size = errors->size();
593
+ auto any = LoadJsonObjectField<bool>(json.object_value(), args, "any", errors,
594
+ /*required=*/false);
595
+ if (any.has_value()) {
596
+ principal =
597
+ std::make_unique<Rbac::Principal>(Rbac::Principal::MakeAnyPrincipal());
598
+ return;
535
599
  }
536
- int action;
537
- if (ParseJsonObjectField(*rules_json, "action", &action, error_list)) {
538
- if (action > 1) {
539
- error_list->push_back(
540
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Unknown action"));
600
+ auto authenticated = LoadJsonObjectField<Authenticated>(
601
+ json.object_value(), args, "authenticated", errors,
602
+ /*required=*/false);
603
+ if (authenticated.has_value()) {
604
+ if (authenticated->principal_name.has_value()) {
605
+ principal = std::make_unique<Rbac::Principal>(
606
+ Rbac::Principal::MakeAuthenticatedPrincipal(
607
+ std::move(authenticated->principal_name->matcher)));
608
+ } else {
609
+ // No principalName found. Match for all users.
610
+ principal = std::make_unique<Rbac::Principal>(
611
+ Rbac::Principal::MakeAnyPrincipal());
541
612
  }
613
+ return;
614
+ }
615
+ auto cidr_range = LoadJsonObjectField<CidrRange>(json.object_value(), args,
616
+ "sourceIp", errors,
617
+ /*required=*/false);
618
+ if (cidr_range.has_value()) {
619
+ principal = std::make_unique<Rbac::Principal>(
620
+ Rbac::Principal::MakeSourceIpPrincipal(
621
+ std::move(cidr_range->cidr_range)));
622
+ return;
623
+ }
624
+ cidr_range = LoadJsonObjectField<CidrRange>(json.object_value(), args,
625
+ "directRemoteIp", errors,
626
+ /*required=*/false);
627
+ if (cidr_range.has_value()) {
628
+ principal = std::make_unique<Rbac::Principal>(
629
+ Rbac::Principal::MakeDirectRemoteIpPrincipal(
630
+ std::move(cidr_range->cidr_range)));
631
+ return;
632
+ }
633
+ cidr_range = LoadJsonObjectField<CidrRange>(json.object_value(), args,
634
+ "remoteIp", errors,
635
+ /*required=*/false);
636
+ if (cidr_range.has_value()) {
637
+ principal = std::make_unique<Rbac::Principal>(
638
+ Rbac::Principal::MakeRemoteIpPrincipal(
639
+ std::move(cidr_range->cidr_range)));
640
+ return;
641
+ }
642
+ auto header = LoadJsonObjectField<HeaderMatch>(json.object_value(), args,
643
+ "header", errors,
644
+ /*required=*/false);
645
+ if (header.has_value()) {
646
+ principal = std::make_unique<Rbac::Principal>(
647
+ Rbac::Principal::MakeHeaderPrincipal(std::move(header->matcher)));
648
+ return;
649
+ }
650
+ auto url_path = LoadJsonObjectField<PathMatch>(json.object_value(), args,
651
+ "urlPath", errors,
652
+ /*required=*/false);
653
+ if (url_path.has_value()) {
654
+ principal = std::make_unique<Rbac::Principal>(
655
+ Rbac::Principal::MakePathPrincipal(std::move(url_path->path.matcher)));
656
+ return;
657
+ }
658
+ auto metadata = LoadJsonObjectField<Metadata>(json.object_value(), args,
659
+ "metadata", errors,
660
+ /*required=*/false);
661
+ if (metadata.has_value()) {
662
+ principal = std::make_unique<Rbac::Principal>(
663
+ Rbac::Principal::MakeMetadataPrincipal(metadata->invert));
664
+ return;
665
+ }
666
+ auto ids = LoadJsonObjectField<PrincipalList>(json.object_value(), args,
667
+ "andIds", errors,
668
+ /*required=*/false);
669
+ if (ids.has_value()) {
670
+ principal =
671
+ std::make_unique<Rbac::Principal>(Rbac::Principal::MakeAndPrincipal(
672
+ MakeRbacPrincipalList(std::move(ids->ids))));
673
+ return;
674
+ }
675
+ ids = LoadJsonObjectField<PrincipalList>(json.object_value(), args, "orIds",
676
+ errors,
677
+ /*required=*/false);
678
+ if (ids.has_value()) {
679
+ principal =
680
+ std::make_unique<Rbac::Principal>(Rbac::Principal::MakeOrPrincipal(
681
+ MakeRbacPrincipalList(std::move(ids->ids))));
682
+ return;
683
+ }
684
+ auto not_rule =
685
+ LoadJsonObjectField<Principal>(json.object_value(), args, "notId", errors,
686
+ /*required=*/false);
687
+ if (not_rule.has_value()) {
688
+ principal = std::make_unique<Rbac::Principal>(
689
+ Rbac::Principal::MakeNotPrincipal(std::move(*not_rule->principal)));
690
+ return;
542
691
  }
692
+ if (errors->size() == original_error_size) {
693
+ errors->AddError("no valid id found");
694
+ }
695
+ }
696
+
697
+ //
698
+ // RbacConfig::RbacPolicy::Rules::Policy
699
+ //
700
+
701
+ Rbac::Policy RbacConfig::RbacPolicy::Rules::Policy::TakeAsRbacPolicy() {
702
+ Rbac::Policy policy;
703
+ policy.permissions = Rbac::Permission::MakeOrPermission(
704
+ Permission::MakeRbacPermissionList(std::move(permissions)));
705
+ policy.principals = Rbac::Principal::MakeOrPrincipal(
706
+ Principal::MakeRbacPrincipalList(std::move(principals)));
707
+ return policy;
708
+ }
709
+
710
+ const JsonLoaderInterface* RbacConfig::RbacPolicy::Rules::Policy::JsonLoader(
711
+ const JsonArgs&) {
712
+ static const auto* loader = JsonObjectLoader<Policy>()
713
+ .Field("permissions", &Policy::permissions)
714
+ .Field("principals", &Policy::principals)
715
+ .Finish();
716
+ return loader;
717
+ }
718
+
719
+ //
720
+ // RbacConfig::RbacPolicy::Rules
721
+ //
722
+
723
+ Rbac RbacConfig::RbacPolicy::Rules::TakeAsRbac() {
724
+ Rbac rbac;
543
725
  rbac.action = static_cast<Rbac::Action>(action);
544
- const Json::Object* policies_json;
545
- if (ParseJsonObjectField(*rules_json, "policies", &policies_json, error_list,
546
- /*required=*/false)) {
547
- for (const auto& entry : *policies_json) {
548
- std::vector<grpc_error_handle> policy_error_list;
549
- rbac.policies.emplace(
550
- entry.first,
551
- ParsePolicy(entry.second.object_value(), &policy_error_list));
552
- if (!policy_error_list.empty()) {
553
- error_list->push_back(GRPC_ERROR_CREATE_FROM_VECTOR_AND_CPP_STRING(
554
- absl::StrFormat("policies key:'%s'", entry.first.c_str()),
555
- &policy_error_list));
556
- }
557
- }
726
+ for (auto& p : policies) {
727
+ rbac.policies.emplace(p.first, p.second.TakeAsRbacPolicy());
558
728
  }
559
729
  return rbac;
560
730
  }
561
731
 
562
- std::vector<Rbac> ParseRbacArray(const Json::Array& policies_json_array,
563
- std::vector<grpc_error_handle>* error_list) {
564
- std::vector<Rbac> policies;
565
- for (size_t i = 0; i < policies_json_array.size(); ++i) {
566
- const Json::Object* rbac_json;
567
- if (!ExtractJsonType(policies_json_array[i],
568
- absl::StrFormat("rbacPolicy[%d]", i), &rbac_json,
569
- error_list)) {
570
- continue;
571
- }
572
- std::vector<grpc_error_handle> rbac_policy_error_list;
573
- policies.emplace_back(ParseRbac(*rbac_json, &rbac_policy_error_list));
574
- if (!rbac_policy_error_list.empty()) {
575
- error_list->push_back(GRPC_ERROR_CREATE_FROM_VECTOR_AND_CPP_STRING(
576
- absl::StrFormat("rbacPolicy[%d]", i), &rbac_policy_error_list));
577
- }
732
+ const JsonLoaderInterface* RbacConfig::RbacPolicy::Rules::JsonLoader(
733
+ const JsonArgs&) {
734
+ static const auto* loader = JsonObjectLoader<Rules>()
735
+ .Field("action", &Rules::action)
736
+ .OptionalField("policies", &Rules::policies)
737
+ .Finish();
738
+ return loader;
739
+ }
740
+
741
+ void RbacConfig::RbacPolicy::Rules::JsonPostLoad(const Json&, const JsonArgs&,
742
+ ValidationErrors* errors) {
743
+ // Validate action field.
744
+ auto rbac_action = static_cast<Rbac::Action>(action);
745
+ if (rbac_action != Rbac::Action::kAllow &&
746
+ rbac_action != Rbac::Action::kDeny) {
747
+ ValidationErrors::ScopedField field(errors, ".action");
748
+ errors->AddError("unknown action");
749
+ }
750
+ }
751
+
752
+ //
753
+ // RbacConfig::RbacPolicy
754
+ //
755
+
756
+ Rbac RbacConfig::RbacPolicy::TakeAsRbac() {
757
+ if (!rules.has_value()) {
758
+ // No enforcing to be applied. An empty deny policy with an empty map
759
+ // is equivalent to no enforcing.
760
+ return Rbac(Rbac::Action::kDeny, {});
578
761
  }
579
- return policies;
762
+ return rules->TakeAsRbac();
763
+ }
764
+
765
+ const JsonLoaderInterface* RbacConfig::RbacPolicy::JsonLoader(const JsonArgs&) {
766
+ static const auto* loader = JsonObjectLoader<RbacPolicy>()
767
+ .OptionalField("rules", &RbacPolicy::rules)
768
+ .Finish();
769
+ return loader;
770
+ }
771
+
772
+ //
773
+ // RbacConfig
774
+ //
775
+
776
+ std::vector<Rbac> RbacConfig::TakeAsRbacList() {
777
+ std::vector<Rbac> rbac_list;
778
+ rbac_list.reserve(rbac_policies.size());
779
+ for (auto& rbac_policy : rbac_policies) {
780
+ rbac_list.emplace_back(rbac_policy.TakeAsRbac());
781
+ }
782
+ return rbac_list;
783
+ }
784
+
785
+ const JsonLoaderInterface* RbacConfig::JsonLoader(const JsonArgs&) {
786
+ static const auto* loader =
787
+ JsonObjectLoader<RbacConfig>()
788
+ .Field("rbacPolicy", &RbacConfig::rbac_policies)
789
+ .Finish();
790
+ return loader;
580
791
  }
581
792
 
582
793
  } // namespace
583
794
 
584
- absl::StatusOr<std::unique_ptr<ServiceConfigParser::ParsedConfig>>
795
+ std::unique_ptr<ServiceConfigParser::ParsedConfig>
585
796
  RbacServiceConfigParser::ParsePerMethodParams(const ChannelArgs& args,
586
- const Json& json) {
797
+ const Json& json,
798
+ ValidationErrors* errors) {
587
799
  // Only parse rbac policy if the channel arg is present
588
800
  if (!args.GetBool(GRPC_ARG_PARSE_RBAC_METHOD_CONFIG).value_or(false)) {
589
801
  return nullptr;
590
802
  }
591
- std::vector<Rbac> rbac_policies;
592
- std::vector<grpc_error_handle> error_list;
593
- const Json::Array* policies_json_array;
594
- if (ParseJsonObjectField(json.object_value(), "rbacPolicy",
595
- &policies_json_array, &error_list)) {
596
- rbac_policies = ParseRbacArray(*policies_json_array, &error_list);
597
- }
598
- grpc_error_handle error =
599
- GRPC_ERROR_CREATE_FROM_VECTOR("Rbac parser", &error_list);
600
- if (!GRPC_ERROR_IS_NONE(error)) {
601
- absl::Status status = absl::InvalidArgumentError(
602
- absl::StrCat("error parsing RBAC method parameters: ",
603
- grpc_error_std_string(error)));
604
- GRPC_ERROR_UNREF(error);
605
- return status;
606
- }
803
+ auto rbac_config = LoadFromJson<RbacConfig>(json, JsonArgs(), errors);
804
+ std::vector<Rbac> rbac_policies = rbac_config.TakeAsRbacList();
607
805
  if (rbac_policies.empty()) return nullptr;
608
- return absl::make_unique<RbacMethodParsedConfig>(std::move(rbac_policies));
806
+ return std::make_unique<RbacMethodParsedConfig>(std::move(rbac_policies));
609
807
  }
610
808
 
611
809
  void RbacServiceConfigParser::Register(CoreConfiguration::Builder* builder) {
612
810
  builder->service_config_parser()->RegisterParser(
613
- absl::make_unique<RbacServiceConfigParser>());
811
+ std::make_unique<RbacServiceConfigParser>());
614
812
  }
615
813
 
616
814
  size_t RbacServiceConfigParser::ParserIndex() {