grpc 1.56.2 → 1.57.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (383) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +29 -22
  3. data/include/grpc/event_engine/event_engine.h +22 -32
  4. data/include/grpc/impl/grpc_types.h +3 -0
  5. data/include/grpc/support/port_platform.h +29 -23
  6. data/src/core/ext/filters/client_channel/client_channel.cc +44 -8
  7. data/src/core/ext/filters/client_channel/dynamic_filters.h +3 -3
  8. data/src/core/ext/filters/client_channel/http_proxy.cc +5 -0
  9. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +21 -52
  10. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +19 -7
  11. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +25 -35
  12. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +78 -132
  13. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +2 -1
  14. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +4 -3
  15. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +3 -1
  16. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +38 -15
  17. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.h +3 -5
  18. data/src/core/ext/filters/client_channel/lb_policy/health_check_client_internal.h +22 -6
  19. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric_internal.h +2 -0
  20. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +97 -71
  21. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +2 -16
  22. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +56 -11
  23. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.h +25 -0
  24. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +6 -32
  25. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +4 -6
  26. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +20 -79
  27. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +1 -1
  28. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +31 -19
  29. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +1 -1
  30. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +7 -41
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +3 -67
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +8 -0
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +31 -74
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +7 -51
  35. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +16 -87
  36. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +16 -50
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +12 -74
  38. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +1 -4
  39. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +69 -59
  40. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +7 -2
  41. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +1 -0
  42. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +25 -13
  43. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +366 -311
  44. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +17 -1
  45. data/src/core/ext/filters/client_channel/retry_filter.cc +39 -2498
  46. data/src/core/ext/filters/client_channel/retry_filter.h +91 -1
  47. data/src/core/ext/filters/client_channel/retry_filter_legacy_call_data.cc +2052 -0
  48. data/src/core/ext/filters/client_channel/retry_filter_legacy_call_data.h +442 -0
  49. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +38 -58
  50. data/src/core/ext/filters/client_channel/subchannel.h +3 -3
  51. data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +3 -0
  52. data/src/core/ext/filters/rbac/rbac_filter.cc +40 -111
  53. data/src/core/ext/filters/rbac/rbac_filter.h +12 -30
  54. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +162 -86
  55. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +0 -6
  56. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +7 -4
  57. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +131 -186
  58. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +6569 -174
  59. data/src/core/ext/transport/chttp2/transport/decode_huff.h +2278 -441
  60. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -3
  61. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +4 -3
  62. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +9 -8
  63. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +4 -4
  64. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +3 -2
  65. data/src/core/ext/transport/chttp2/transport/internal.h +8 -4
  66. data/src/core/ext/transport/chttp2/transport/parsing.cc +15 -3
  67. data/src/core/ext/transport/chttp2/transport/writing.cc +2 -3
  68. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +27 -6
  69. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +143 -0
  70. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +2 -9
  71. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +0 -39
  72. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +13 -8
  73. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +35 -6
  74. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +17 -13
  75. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +85 -20
  76. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +26 -7
  77. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +45 -3
  78. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +4 -3
  79. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +21 -0
  80. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +30 -6
  81. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +180 -0
  82. data/src/core/ext/upb-generated/envoy/data/accesslog/v3/accesslog.upb.c +558 -0
  83. data/src/core/ext/upb-generated/envoy/data/accesslog/v3/accesslog.upb.h +2710 -0
  84. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +30 -11
  85. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +53 -24
  86. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +30 -5
  87. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +110 -0
  88. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +41 -15
  89. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +150 -27
  90. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.c +1 -0
  91. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/pick_first/v3/pick_first.upb.c +47 -0
  92. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/pick_first/v3/pick_first.upb.h +93 -0
  93. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +88 -76
  94. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h +5 -0
  95. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +11 -12
  96. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +0 -5
  97. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +162 -160
  98. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +129 -118
  99. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +141 -135
  100. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/metrics_service.upbdefs.c +19 -12
  101. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +38 -30
  102. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +5 -0
  103. data/src/core/ext/upbdefs-generated/envoy/data/accesslog/v3/accesslog.upbdefs.c +402 -0
  104. data/src/core/ext/upbdefs-generated/envoy/data/accesslog/v3/accesslog.upbdefs.h +111 -0
  105. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +80 -74
  106. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +63 -47
  107. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +5 -0
  108. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +315 -293
  109. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +5 -0
  110. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +29 -29
  111. data/src/core/ext/xds/xds_bootstrap_grpc.cc +33 -30
  112. data/src/core/ext/xds/xds_bootstrap_grpc.h +5 -13
  113. data/src/core/ext/xds/xds_client_grpc.cc +11 -6
  114. data/src/core/ext/xds/xds_client_grpc.h +16 -2
  115. data/src/core/ext/xds/xds_client_stats.h +10 -0
  116. data/src/core/ext/xds/xds_cluster.cc +26 -16
  117. data/src/core/ext/xds/xds_endpoint.cc +4 -7
  118. data/src/core/ext/xds/xds_health_status.cc +0 -17
  119. data/src/core/ext/xds/xds_health_status.h +5 -25
  120. data/src/core/ext/xds/xds_lb_policy_registry.cc +39 -0
  121. data/src/core/ext/xds/xds_route_config.cc +4 -0
  122. data/src/core/ext/xds/xds_transport_grpc.cc +1 -3
  123. data/src/core/lib/address_utils/parse_address.cc +63 -1
  124. data/src/core/lib/address_utils/parse_address.h +8 -0
  125. data/src/core/lib/address_utils/sockaddr_utils.cc +46 -1
  126. data/src/core/lib/address_utils/sockaddr_utils.h +2 -2
  127. data/src/core/lib/channel/channel_args.cc +21 -10
  128. data/src/core/lib/channel/channel_args.h +3 -0
  129. data/src/core/lib/channel/connected_channel.cc +4 -1
  130. data/src/core/lib/channel/promise_based_filter.h +1 -0
  131. data/src/core/lib/debug/trace.cc +1 -4
  132. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +2 -1
  133. data/src/core/lib/event_engine/cf_engine/cf_engine.h +1 -1
  134. data/src/core/lib/event_engine/event_engine.cc +0 -12
  135. data/src/core/lib/event_engine/forkable.cc +47 -42
  136. data/src/core/lib/event_engine/handle_containers.h +0 -4
  137. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +4 -6
  138. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +4 -6
  139. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +25 -11
  140. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +3 -1
  141. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +2 -1
  142. data/src/core/lib/event_engine/posix_engine/posix_engine.h +8 -12
  143. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +37 -27
  144. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +2 -0
  145. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +4 -2
  146. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +42 -2
  147. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +6 -0
  148. data/src/core/lib/event_engine/posix_engine/timer.h +10 -37
  149. data/src/core/lib/event_engine/tcp_socket_utils.cc +67 -7
  150. data/src/core/lib/event_engine/tcp_socket_utils.h +3 -0
  151. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +90 -37
  152. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +32 -12
  153. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.cc +12 -21
  154. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.h +8 -12
  155. data/src/core/lib/event_engine/windows/windows_endpoint.cc +55 -54
  156. data/src/core/lib/event_engine/windows/windows_endpoint.h +15 -12
  157. data/src/core/lib/event_engine/windows/windows_engine.cc +2 -1
  158. data/src/core/lib/event_engine/windows/windows_engine.h +8 -12
  159. data/src/core/lib/experiments/config.cc +60 -22
  160. data/src/core/lib/experiments/config.h +20 -8
  161. data/src/core/lib/experiments/experiments.cc +278 -0
  162. data/src/core/lib/experiments/experiments.h +59 -1
  163. data/src/core/lib/gprpp/dual_ref_counted.h +9 -9
  164. data/src/core/lib/gprpp/fork.cc +8 -9
  165. data/src/core/lib/gprpp/fork.h +6 -5
  166. data/src/core/lib/gprpp/if_list.h +4530 -0
  167. data/src/core/lib/gprpp/orphanable.h +3 -3
  168. data/src/core/lib/gprpp/ref_counted.h +6 -6
  169. data/src/core/lib/gprpp/sorted_pack.h +3 -12
  170. data/src/core/lib/gprpp/status_helper.h +16 -15
  171. data/src/core/lib/gprpp/time.h +12 -0
  172. data/src/core/lib/gprpp/type_list.h +32 -0
  173. data/src/core/lib/http/httpcli.h +6 -9
  174. data/src/core/lib/iomgr/error.cc +32 -2
  175. data/src/core/lib/iomgr/error.h +9 -10
  176. data/src/core/lib/iomgr/ev_epoll1_linux.cc +5 -7
  177. data/src/core/lib/iomgr/ev_poll_posix.cc +6 -5
  178. data/src/core/lib/iomgr/exec_ctx.h +11 -0
  179. data/src/core/lib/iomgr/pollset.h +4 -5
  180. data/src/core/lib/iomgr/port.h +10 -0
  181. data/src/core/lib/iomgr/resolve_address.cc +13 -1
  182. data/src/core/lib/iomgr/resolve_address.h +17 -3
  183. data/src/core/lib/iomgr/sockaddr_posix.h +7 -0
  184. data/src/core/lib/iomgr/socket_utils_common_posix.cc +29 -0
  185. data/src/core/lib/iomgr/socket_utils_posix.cc +2 -0
  186. data/src/core/lib/iomgr/socket_utils_posix.h +6 -0
  187. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -1
  188. data/src/core/lib/iomgr/tcp_posix.cc +21 -4
  189. data/src/core/lib/iomgr/tcp_server_posix.cc +3 -2
  190. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -2
  191. data/src/core/lib/iomgr/tcp_windows.cc +1 -3
  192. data/src/core/lib/iomgr/vsock.cc +59 -0
  193. data/src/core/lib/iomgr/vsock.h +38 -0
  194. data/src/core/lib/iomgr/wakeup_fd_posix.h +3 -6
  195. data/src/core/lib/load_balancing/delegating_helper.h +115 -0
  196. data/src/core/lib/load_balancing/lb_policy.h +20 -0
  197. data/src/core/lib/load_balancing/subchannel_interface.h +6 -0
  198. data/src/core/lib/promise/party.h +1 -1
  199. data/src/core/lib/resolver/resolver_factory.h +3 -2
  200. data/src/core/lib/resolver/server_address.cc +9 -94
  201. data/src/core/lib/resolver/server_address.h +10 -64
  202. data/src/core/lib/resource_quota/memory_quota.h +1 -1
  203. data/src/core/lib/security/credentials/channel_creds_registry.h +51 -27
  204. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +169 -9
  205. data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
  206. data/src/core/lib/security/credentials/composite/composite_credentials.h +3 -1
  207. data/src/core/lib/security/credentials/external/external_account_credentials.cc +40 -1
  208. data/src/core/lib/security/credentials/external/external_account_credentials.h +6 -0
  209. data/src/core/lib/security/credentials/fake/fake_credentials.cc +30 -38
  210. data/src/core/lib/security/credentials/fake/fake_credentials.h +28 -0
  211. data/src/core/lib/security/credentials/tls/tls_credentials.cc +1 -1
  212. data/src/core/lib/security/credentials/tls/tls_credentials.h +3 -1
  213. data/src/core/lib/service_config/service_config_call_data.h +5 -0
  214. data/src/core/lib/slice/slice.h +16 -0
  215. data/src/core/lib/surface/call.cc +31 -29
  216. data/src/core/lib/surface/server.h +2 -2
  217. data/src/core/lib/surface/version.cc +2 -2
  218. data/src/core/lib/transport/metadata_batch.cc +7 -7
  219. data/src/core/lib/transport/metadata_batch.h +86 -48
  220. data/src/core/lib/transport/parsed_metadata.h +34 -20
  221. data/src/core/lib/transport/simple_slice_based_metadata.h +9 -2
  222. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +4 -6
  223. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +1 -2
  224. data/src/core/tsi/ssl_transport_security.cc +28 -7
  225. data/src/ruby/bin/math_pb.rb +24 -18
  226. data/src/ruby/ext/grpc/extconf.rb +19 -18
  227. data/src/ruby/ext/grpc/rb_call.c +62 -39
  228. data/src/ruby/ext/grpc/rb_call_credentials.c +0 -1
  229. data/src/ruby/ext/grpc/rb_channel.c +126 -49
  230. data/src/ruby/ext/grpc/rb_channel.h +1 -0
  231. data/src/ruby/ext/grpc/rb_channel_args.c +16 -2
  232. data/src/ruby/ext/grpc/rb_channel_args.h +4 -0
  233. data/src/ruby/ext/grpc/rb_channel_credentials.c +0 -1
  234. data/src/ruby/ext/grpc/rb_compression_options.c +0 -1
  235. data/src/ruby/ext/grpc/rb_event_thread.c +22 -6
  236. data/src/ruby/ext/grpc/rb_event_thread.h +1 -0
  237. data/src/ruby/ext/grpc/rb_grpc.c +192 -30
  238. data/src/ruby/ext/grpc/rb_grpc.h +8 -2
  239. data/src/ruby/ext/grpc/rb_server.c +62 -45
  240. data/src/ruby/ext/grpc/rb_server_credentials.c +0 -1
  241. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +0 -1
  242. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +0 -1
  243. data/src/ruby/lib/grpc/generic/bidi_call.rb +2 -0
  244. data/src/ruby/lib/grpc/version.rb +1 -1
  245. data/src/ruby/pb/grpc/health/v1/health_pb.rb +24 -13
  246. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +24 -3
  247. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +25 -111
  248. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +25 -2
  249. data/third_party/boringssl-with-bazel/err_data.c +552 -552
  250. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +5 -5
  251. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +34 -1
  252. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +4 -1
  253. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +3 -3
  254. data/third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c +7 -8
  255. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +2 -2
  256. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +2 -2
  257. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +8 -8
  258. data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +2 -2
  259. data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +2 -2
  260. data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +19 -1
  261. data/third_party/boringssl-with-bazel/src/crypto/chacha/internal.h +8 -1
  262. data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +28 -185
  263. data/third_party/boringssl-with-bazel/src/crypto/conf/conf_def.h +3 -7
  264. data/third_party/boringssl-with-bazel/src/crypto/conf/internal.h +8 -0
  265. data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_apple.c +3 -0
  266. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c +49 -46
  267. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_64_adx.c +18 -0
  268. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_tables.h +2809 -7417
  269. data/third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h +27 -5
  270. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +20 -0
  271. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c +110 -72
  272. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_derive.c +4 -3
  273. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +15 -14
  274. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +13 -10
  275. data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +35 -12
  276. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c +2 -4
  277. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c +3 -7
  278. data/third_party/boringssl-with-bazel/src/crypto/evp/pbkdf.c +3 -3
  279. data/third_party/boringssl-with-bazel/src/crypto/evp/print.c +7 -6
  280. data/third_party/boringssl-with-bazel/src/crypto/ex_data.c +34 -72
  281. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -1
  282. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +12 -5
  283. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd.c +5 -6
  284. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +12 -6
  285. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +17 -18
  286. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery_inv.c +51 -15
  287. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/rsaz_exp.c +7 -7
  288. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/delocate.h +5 -6
  289. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/internal.h +2 -0
  290. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/builtin_curves.h +277 -0
  291. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +180 -404
  292. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +3 -3
  293. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +24 -57
  294. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/felem.c +17 -13
  295. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +33 -71
  296. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +18 -17
  297. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +5 -7
  298. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-nistz.c +15 -18
  299. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +9 -11
  300. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c +24 -24
  301. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +11 -27
  302. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +8 -8
  303. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +4 -4
  304. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +9 -3
  305. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/hkdf/hkdf.c +1 -1
  306. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +40 -26
  307. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +21 -7
  308. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +38 -19
  309. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +2 -29
  310. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +55 -0
  311. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +33 -52
  312. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +3 -8
  313. data/third_party/boringssl-with-bazel/src/crypto/internal.h +198 -79
  314. data/third_party/boringssl-with-bazel/src/crypto/kyber/kyber.c +5 -4
  315. data/third_party/boringssl-with-bazel/src/crypto/mem.c +7 -8
  316. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +19 -23
  317. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +3 -3
  318. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/p5_pbev2.c +3 -3
  319. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +7 -7
  320. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +8 -5
  321. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +1 -0
  322. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +7 -6
  323. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c +6 -12
  324. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/getentropy.c +48 -0
  325. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/{fuchsia.c → ios.c} +8 -8
  326. data/third_party/boringssl-with-bazel/src/crypto/{refcount_no_threads.c → rand_extra/trusty.c} +15 -19
  327. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +41 -19
  328. data/third_party/boringssl-with-bazel/src/crypto/{refcount_c11.c → refcount.c} +11 -17
  329. data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +147 -72
  330. data/third_party/boringssl-with-bazel/src/crypto/thread_none.c +0 -8
  331. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +6 -35
  332. data/third_party/boringssl-with-bazel/src/crypto/thread_win.c +5 -26
  333. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +14 -18
  334. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +54 -143
  335. data/third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c +7 -13
  336. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +1 -1
  337. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +1 -1
  338. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +2 -4
  339. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +2 -2
  340. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +1 -1
  341. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +8 -12
  342. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +19 -20
  343. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +11 -15
  344. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +5 -5
  345. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +1 -1
  346. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +7 -7
  347. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +2 -3
  348. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +4 -6
  349. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +4 -119
  350. data/third_party/boringssl-with-bazel/src/include/openssl/asm_base.h +207 -0
  351. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +5 -0
  352. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +2 -116
  353. data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +0 -2
  354. data/third_party/boringssl-with-bazel/src/include/openssl/chacha.h +6 -0
  355. data/third_party/boringssl-with-bazel/src/include/openssl/conf.h +5 -1
  356. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +0 -21
  357. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +21 -2
  358. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +19 -6
  359. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +11 -7
  360. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +13 -14
  361. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +0 -61
  362. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +127 -81
  363. data/third_party/boringssl-with-bazel/src/include/openssl/stack.h +224 -209
  364. data/third_party/boringssl-with-bazel/src/include/openssl/target.h +154 -0
  365. data/third_party/boringssl-with-bazel/src/include/openssl/thread.h +1 -29
  366. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +4 -4
  367. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +3 -2
  368. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +9 -65
  369. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +20 -20
  370. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +1 -1
  371. data/third_party/boringssl-with-bazel/src/ssl/internal.h +4 -11
  372. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +24 -18
  373. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +37 -30
  374. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +125 -26
  375. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +2 -3
  376. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64_adx.h +691 -0
  377. data/third_party/upb/upb/collections/map.c +3 -3
  378. metadata +27 -12
  379. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +0 -42
  380. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.h +0 -64
  381. data/src/core/ext/transport/chttp2/transport/stream_map.cc +0 -177
  382. data/src/core/ext/transport/chttp2/transport/stream_map.h +0 -68
  383. data/third_party/boringssl-with-bazel/src/crypto/refcount_win.c +0 -89
@@ -18,20 +18,22 @@
18
18
 
19
19
  #include "src/core/ext/filters/rbac/rbac_filter.h"
20
20
 
21
- #include <new>
21
+ #include <functional>
22
+ #include <memory>
22
23
  #include <utility>
23
24
 
24
25
  #include "absl/status/status.h"
25
26
 
26
27
  #include <grpc/grpc_security.h>
27
- #include <grpc/status.h>
28
- #include <grpc/support/log.h>
29
28
 
30
29
  #include "src/core/ext/filters/rbac/rbac_service_config_parser.h"
31
30
  #include "src/core/lib/channel/channel_args.h"
31
+ #include "src/core/lib/channel/channel_stack.h"
32
+ #include "src/core/lib/channel/context.h"
32
33
  #include "src/core/lib/config/core_configuration.h"
33
- #include "src/core/lib/gprpp/debug_location.h"
34
- #include "src/core/lib/gprpp/status_helper.h"
34
+ #include "src/core/lib/iomgr/error.h"
35
+ #include "src/core/lib/promise/context.h"
36
+ #include "src/core/lib/promise/promise.h"
35
37
  #include "src/core/lib/security/authorization/authorization_engine.h"
36
38
  #include "src/core/lib/security/authorization/grpc_authorization_engine.h"
37
39
  #include "src/core/lib/security/context/security_context.h"
@@ -41,101 +43,34 @@
41
43
 
42
44
  namespace grpc_core {
43
45
 
44
- //
45
- // RbacFilter::CallData
46
- //
47
-
48
- // CallData
49
-
50
- grpc_error_handle RbacFilter::CallData::Init(
51
- grpc_call_element* elem, const grpc_call_element_args* args) {
52
- new (elem->call_data) CallData(elem, *args);
53
- return absl::OkStatus();
54
- }
55
-
56
- void RbacFilter::CallData::Destroy(grpc_call_element* elem,
57
- const grpc_call_final_info* /*final_info*/,
58
- grpc_closure* /*then_schedule_closure*/) {
59
- auto* calld = static_cast<CallData*>(elem->call_data);
60
- calld->~CallData();
61
- }
62
-
63
- void RbacFilter::CallData::StartTransportStreamOpBatch(
64
- grpc_call_element* elem, grpc_transport_stream_op_batch* op) {
65
- CallData* calld = static_cast<CallData*>(elem->call_data);
66
- if (op->recv_initial_metadata) {
67
- calld->recv_initial_metadata_ =
68
- op->payload->recv_initial_metadata.recv_initial_metadata;
69
- calld->original_recv_initial_metadata_ready_ =
70
- op->payload->recv_initial_metadata.recv_initial_metadata_ready;
71
- op->payload->recv_initial_metadata.recv_initial_metadata_ready =
72
- &calld->recv_initial_metadata_ready_;
73
- }
74
- // Chain to the next filter.
75
- grpc_call_next_op(elem, op);
76
- }
77
-
78
- RbacFilter::CallData::CallData(grpc_call_element* elem,
79
- const grpc_call_element_args& args)
80
- : call_context_(args.context) {
81
- GRPC_CLOSURE_INIT(&recv_initial_metadata_ready_, RecvInitialMetadataReady,
82
- elem, grpc_schedule_on_exec_ctx);
83
- }
84
-
85
- void RbacFilter::CallData::RecvInitialMetadataReady(void* user_data,
86
- grpc_error_handle error) {
87
- grpc_call_element* elem = static_cast<grpc_call_element*>(user_data);
88
- CallData* calld = static_cast<CallData*>(elem->call_data);
89
- RbacFilter* filter = static_cast<RbacFilter*>(elem->channel_data);
90
- if (error.ok()) {
91
- // Fetch and apply the rbac policy from the service config.
92
- auto* service_config_call_data = static_cast<ServiceConfigCallData*>(
93
- calld->call_context_[GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA].value);
94
- auto* method_params = static_cast<RbacMethodParsedConfig*>(
95
- service_config_call_data->GetMethodParsedConfig(
96
- filter->service_config_parser_index_));
97
- if (method_params == nullptr) {
98
- error = GRPC_ERROR_CREATE("No RBAC policy found.");
99
- } else {
100
- RbacFilter* chand = static_cast<RbacFilter*>(elem->channel_data);
101
- auto* authorization_engine =
102
- method_params->authorization_engine(chand->index_);
103
- if (authorization_engine
104
- ->Evaluate(EvaluateArgs(calld->recv_initial_metadata_,
105
- &chand->per_channel_evaluate_args_))
106
- .type == AuthorizationEngine::Decision::Type::kDeny) {
107
- error = GRPC_ERROR_CREATE("Unauthorized RPC rejected");
108
- }
109
- }
110
- if (!error.ok()) {
111
- error = grpc_error_set_int(error, StatusIntProperty::kRpcStatus,
112
- GRPC_STATUS_PERMISSION_DENIED);
46
+ ArenaPromise<ServerMetadataHandle> RbacFilter::MakeCallPromise(
47
+ CallArgs call_args, NextPromiseFactory next_promise_factory) {
48
+ // Fetch and apply the rbac policy from the service config.
49
+ auto* service_config_call_data = static_cast<ServiceConfigCallData*>(
50
+ GetContext<
51
+ grpc_call_context_element>()[GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA]
52
+ .value);
53
+ auto* method_params = static_cast<RbacMethodParsedConfig*>(
54
+ service_config_call_data->GetMethodParsedConfig(
55
+ service_config_parser_index_));
56
+ if (method_params == nullptr) {
57
+ return Immediate(ServerMetadataFromStatus(
58
+ absl::PermissionDeniedError("No RBAC policy found.")));
59
+ } else {
60
+ auto* authorization_engine = method_params->authorization_engine(index_);
61
+ if (authorization_engine
62
+ ->Evaluate(EvaluateArgs(call_args.client_initial_metadata.get(),
63
+ &per_channel_evaluate_args_))
64
+ .type == AuthorizationEngine::Decision::Type::kDeny) {
65
+ return Immediate(ServerMetadataFromStatus(
66
+ absl::PermissionDeniedError("Unauthorized RPC rejected")));
113
67
  }
114
68
  }
115
- grpc_closure* closure = calld->original_recv_initial_metadata_ready_;
116
- calld->original_recv_initial_metadata_ready_ = nullptr;
117
- Closure::Run(DEBUG_LOCATION, closure, error);
69
+ return next_promise_factory(std::move(call_args));
118
70
  }
119
71
 
120
- //
121
- // RbacFilter
122
- //
123
-
124
- const grpc_channel_filter RbacFilter::kFilterVtable = {
125
- RbacFilter::CallData::StartTransportStreamOpBatch,
126
- nullptr,
127
- grpc_channel_next_op,
128
- sizeof(RbacFilter::CallData),
129
- RbacFilter::CallData::Init,
130
- grpc_call_stack_ignore_set_pollset_or_pollset_set,
131
- RbacFilter::CallData::Destroy,
132
- sizeof(RbacFilter),
133
- RbacFilter::Init,
134
- grpc_channel_stack_no_post_init,
135
- RbacFilter::Destroy,
136
- grpc_channel_next_get_info,
137
- "rbac_filter",
138
- };
72
+ const grpc_channel_filter RbacFilter::kFilterVtable =
73
+ MakePromiseBasedFilter<RbacFilter, FilterEndpoint::kServer>("rbac_filter");
139
74
 
140
75
  RbacFilter::RbacFilter(size_t index,
141
76
  EvaluateArgs::PerChannelArgs per_channel_evaluate_args)
@@ -143,29 +78,23 @@ RbacFilter::RbacFilter(size_t index,
143
78
  service_config_parser_index_(RbacServiceConfigParser::ParserIndex()),
144
79
  per_channel_evaluate_args_(std::move(per_channel_evaluate_args)) {}
145
80
 
146
- grpc_error_handle RbacFilter::Init(grpc_channel_element* elem,
147
- grpc_channel_element_args* args) {
148
- GPR_ASSERT(elem->filter == &kFilterVtable);
149
- auto* auth_context = args->channel_args.GetObject<grpc_auth_context>();
81
+ absl::StatusOr<RbacFilter> RbacFilter::Create(const ChannelArgs& args,
82
+ ChannelFilter::Args filter_args) {
83
+ auto* auth_context = args.GetObject<grpc_auth_context>();
150
84
  if (auth_context == nullptr) {
151
85
  return GRPC_ERROR_CREATE("No auth context found");
152
86
  }
153
- auto* transport = args->channel_args.GetObject<grpc_transport>();
87
+ auto* transport = args.GetObject<grpc_transport>();
154
88
  if (transport == nullptr) {
155
89
  // This should never happen since the transport is always set on the server
156
90
  // side.
157
91
  return GRPC_ERROR_CREATE("No transport configured");
158
92
  }
159
- new (elem->channel_data) RbacFilter(
160
- grpc_channel_stack_filter_instance_number(args->channel_stack, elem),
161
- EvaluateArgs::PerChannelArgs(auth_context,
162
- grpc_transport_get_endpoint(transport)));
163
- return absl::OkStatus();
164
- }
165
-
166
- void RbacFilter::Destroy(grpc_channel_element* elem) {
167
- auto* chand = static_cast<RbacFilter*>(elem->channel_data);
168
- chand->~RbacFilter();
93
+ return RbacFilter(grpc_channel_stack_filter_instance_number(
94
+ filter_args.channel_stack(),
95
+ filter_args.uninitialized_channel_element()),
96
+ EvaluateArgs::PerChannelArgs(
97
+ auth_context, grpc_transport_get_endpoint(transport)));
169
98
  }
170
99
 
171
100
  void RbacFilterRegister(CoreConfiguration::Builder* builder) {
@@ -21,20 +21,20 @@
21
21
 
22
22
  #include <stddef.h>
23
23
 
24
+ #include "absl/status/statusor.h"
25
+
26
+ #include "src/core/lib/channel/channel_args.h"
24
27
  #include "src/core/lib/channel/channel_fwd.h"
25
- #include "src/core/lib/channel/channel_stack.h"
26
- #include "src/core/lib/channel/context.h"
27
- #include "src/core/lib/iomgr/closure.h"
28
- #include "src/core/lib/iomgr/error.h"
28
+ #include "src/core/lib/channel/promise_based_filter.h"
29
+ #include "src/core/lib/promise/arena_promise.h"
29
30
  #include "src/core/lib/security/authorization/evaluate_args.h"
30
- #include "src/core/lib/transport/metadata_batch.h"
31
31
  #include "src/core/lib/transport/transport.h"
32
32
 
33
33
  namespace grpc_core {
34
34
 
35
35
  // Filter used when xDS server config fetcher provides a configuration with an
36
36
  // HTTP RBAC filter. Also serves as the type for channel data for the filter.
37
- class RbacFilter {
37
+ class RbacFilter : public ChannelFilter {
38
38
  public:
39
39
  // This channel filter is intended to be used by connections on xDS enabled
40
40
  // servers configured with RBAC. The RBAC filter fetches the RBAC policy from
@@ -42,34 +42,16 @@ class RbacFilter {
42
42
  // and enforces the RBAC policy.
43
43
  static const grpc_channel_filter kFilterVtable;
44
44
 
45
- private:
46
- class CallData {
47
- public:
48
- static grpc_error_handle Init(grpc_call_element* elem,
49
- const grpc_call_element_args* args);
50
- static void Destroy(grpc_call_element* elem,
51
- const grpc_call_final_info* /* final_info */,
52
- grpc_closure* /* then_schedule_closure */);
53
- static void StartTransportStreamOpBatch(grpc_call_element* elem,
54
- grpc_transport_stream_op_batch* op);
55
-
56
- private:
57
- CallData(grpc_call_element* elem, const grpc_call_element_args& args);
58
- static void RecvInitialMetadataReady(void* user_data,
59
- grpc_error_handle error);
45
+ static absl::StatusOr<RbacFilter> Create(const ChannelArgs& args,
46
+ ChannelFilter::Args filter_args);
60
47
 
61
- grpc_call_context_element* call_context_;
62
- // State for keeping track of recv_initial_metadata
63
- grpc_metadata_batch* recv_initial_metadata_ = nullptr;
64
- grpc_closure* original_recv_initial_metadata_ready_ = nullptr;
65
- grpc_closure recv_initial_metadata_ready_;
66
- };
48
+ // Construct a promise for one call.
49
+ ArenaPromise<ServerMetadataHandle> MakeCallPromise(
50
+ CallArgs call_args, NextPromiseFactory next_promise_factory) override;
67
51
 
52
+ private:
68
53
  RbacFilter(size_t index,
69
54
  EvaluateArgs::PerChannelArgs per_channel_evaluate_args);
70
- static grpc_error_handle Init(grpc_channel_element* elem,
71
- grpc_channel_element_args* args);
72
- static void Destroy(grpc_channel_element* elem);
73
55
 
74
56
  // The index of this filter instance among instances of the same filter.
75
57
  size_t index_;
@@ -33,11 +33,13 @@
33
33
  #include "absl/strings/str_join.h"
34
34
  #include "absl/strings/str_split.h"
35
35
  #include "absl/strings/string_view.h"
36
+ #include "absl/strings/strip.h"
36
37
  #include "absl/types/optional.h"
37
38
 
38
39
  #include <grpc/support/log.h>
39
40
  #include <grpc/support/time.h>
40
41
 
42
+ #include "src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h"
41
43
  #include "src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h"
42
44
  #include "src/core/lib/channel/channel_stack.h"
43
45
  #include "src/core/lib/channel/context.h"
@@ -83,35 +85,142 @@ StatefulSessionFilter::StatefulSessionFilter(ChannelFilter::Args filter_args)
83
85
 
84
86
  namespace {
85
87
 
88
+ absl::string_view AllocateStringOnArena(
89
+ absl::string_view src1, absl::string_view src2 = absl::string_view()) {
90
+ if (src1.empty() && src2.empty()) {
91
+ return absl::string_view();
92
+ }
93
+ char* arena_allocated_value =
94
+ static_cast<char*>(GetContext<Arena>()->Alloc(src1.size() + src2.size()));
95
+ memcpy(arena_allocated_value, src1.data(), src1.size());
96
+ if (!src2.empty()) {
97
+ memcpy(arena_allocated_value + src1.size(), src2.data(), src2.size());
98
+ }
99
+ return absl::string_view(arena_allocated_value, src1.size() + src2.size());
100
+ }
101
+
86
102
  // Adds the set-cookie header to the server initial metadata if needed.
87
103
  void MaybeUpdateServerInitialMetadata(
88
104
  const StatefulSessionMethodParsedConfig::CookieConfig* cookie_config,
89
- absl::optional<absl::string_view> cookie_value,
90
- ServerMetadata* server_initial_metadata) {
105
+ bool cluster_changed, absl::string_view host_override,
106
+ absl::string_view actual_cluster, ServerMetadata* server_initial_metadata) {
91
107
  // Get peer string.
92
108
  Slice* peer_string = server_initial_metadata->get_pointer(PeerString());
93
- if (peer_string == nullptr) return; // Nothing we can do.
94
- // If there was no cookie or if the address changed, set the cookie.
95
- if (!cookie_value.has_value() ||
96
- peer_string->as_string_view() != *cookie_value) {
97
- std::vector<std::string> parts = {absl::StrCat(
98
- *cookie_config->name, "=",
99
- absl::Base64Escape(peer_string->as_string_view()), "; HttpOnly")};
100
- if (!cookie_config->path.empty()) {
101
- parts.emplace_back(absl::StrCat("Path=", cookie_config->path));
102
- }
103
- if (cookie_config->ttl > Duration::Zero()) {
104
- parts.emplace_back(
105
- absl::StrCat("Max-Age=", cookie_config->ttl.as_timespec().tv_sec));
106
- }
107
- server_initial_metadata->Append(
108
- "set-cookie", Slice::FromCopiedString(absl::StrJoin(parts, "; ")),
109
- [](absl::string_view error, const Slice&) {
110
- Crash(absl::StrCat("ERROR ADDING set-cookie METADATA: ", error));
111
- });
109
+ if (peer_string == nullptr) {
110
+ // No changes, keep the same set-cookie header.
111
+ return;
112
+ }
113
+ if (host_override == peer_string->as_string_view() && !cluster_changed) {
114
+ return;
115
+ }
116
+ std::string new_value(peer_string->as_string_view());
117
+ if (!actual_cluster.empty()) {
118
+ absl::StrAppend(&new_value, ";", actual_cluster);
119
+ }
120
+ std::vector<std::string> parts = {absl::StrCat(
121
+ *cookie_config->name, "=", absl::Base64Escape(new_value), "; HttpOnly")};
122
+ if (!cookie_config->path.empty()) {
123
+ parts.emplace_back(absl::StrCat("Path=", cookie_config->path));
124
+ }
125
+ if (cookie_config->ttl > Duration::Zero()) {
126
+ parts.emplace_back(
127
+ absl::StrCat("Max-Age=", cookie_config->ttl.as_timespec().tv_sec));
128
+ }
129
+ server_initial_metadata->Append(
130
+ "set-cookie", Slice::FromCopiedString(absl::StrJoin(parts, "; ")),
131
+ [](absl::string_view error, const Slice&) {
132
+ Crash(absl::StrCat("ERROR ADDING set-cookie METADATA: ", error));
133
+ });
134
+ }
135
+
136
+ // Returns an arena-allocated string containing the cluster name
137
+ // to use for this RPC, which will live long enough to use when modifying
138
+ // the server's initial metadata. If cluster_from_cookie is non-empty and
139
+ // points to a cluster present in the selected route, uses that; otherwise,
140
+ // uses the cluster selected by the XdsConfigSelector.
141
+ // Returns the empty string if cluster override cannot be used (i.e., the route
142
+ // uses a cluster specifier plugin).
143
+ absl::string_view GetClusterToUse(
144
+ absl::string_view cluster_from_cookie,
145
+ ServiceConfigCallData* service_config_call_data) {
146
+ // Get cluster assigned by the XdsConfigSelector.
147
+ auto cluster_attribute =
148
+ service_config_call_data->GetCallAttribute<XdsClusterAttribute>();
149
+ GPR_ASSERT(cluster_attribute != nullptr);
150
+ auto current_cluster = cluster_attribute->cluster();
151
+ static constexpr absl::string_view kClusterPrefix = "cluster:";
152
+ // If prefix is not "cluster:", then we can't use cluster override.
153
+ if (!absl::ConsumePrefix(&current_cluster, kClusterPrefix)) {
154
+ return absl::string_view();
155
+ }
156
+ // No cluster in cookie, use the cluster from the attribute
157
+ if (cluster_from_cookie.empty()) {
158
+ return AllocateStringOnArena(current_cluster);
159
+ }
160
+ // Use cluster from the cookie if it is configured for the route.
161
+ auto route_data =
162
+ service_config_call_data->GetCallAttribute<XdsRouteStateAttribute>();
163
+ GPR_ASSERT(route_data != nullptr);
164
+ // Cookie cluster was not configured for route - use the one from the
165
+ // attribute
166
+ if (!route_data->HasClusterForRoute(cluster_from_cookie)) {
167
+ return AllocateStringOnArena(current_cluster);
168
+ }
169
+ auto arena_allocated_cluster =
170
+ AllocateStringOnArena(kClusterPrefix, cluster_from_cookie);
171
+ // Update the cluster name attribute with an arena allocated value.
172
+ cluster_attribute->set_cluster(arena_allocated_cluster);
173
+ return absl::StripPrefix(arena_allocated_cluster, kClusterPrefix);
174
+ }
175
+
176
+ std::string GetCookieValue(const ClientMetadataHandle& client_initial_metadata,
177
+ absl::string_view cookie_name) {
178
+ // Check to see if the cookie header is present.
179
+ std::string buffer;
180
+ auto header_value =
181
+ client_initial_metadata->GetStringValue("cookie", &buffer);
182
+ if (!header_value.has_value()) return "";
183
+ // Parse cookie header.
184
+ std::vector<absl::string_view> values;
185
+ for (absl::string_view cookie : absl::StrSplit(*header_value, "; ")) {
186
+ std::pair<absl::string_view, absl::string_view> kv =
187
+ absl::StrSplit(cookie, absl::MaxSplits('=', 1));
188
+ if (kv.first == cookie_name) values.push_back(kv.second);
112
189
  }
190
+ if (values.empty()) return "";
191
+ // TODO(roth): Figure out the right behavior for multiple cookies.
192
+ // For now, just choose the first value.
193
+ std::string decoded;
194
+ if (absl::Base64Unescape(values.front(), &decoded)) {
195
+ return decoded;
196
+ }
197
+ return "";
113
198
  }
114
199
 
200
+ bool IsConfiguredPath(absl::string_view configured_path,
201
+ const ClientMetadataHandle& client_initial_metadata) {
202
+ // No path configured meaning all paths match
203
+ if (configured_path.empty()) {
204
+ return true;
205
+ }
206
+ // Check to see if the configured path matches the request path.
207
+ Slice* path_slice = client_initial_metadata->get_pointer(HttpPathMetadata());
208
+ GPR_ASSERT(path_slice != nullptr);
209
+ absl::string_view path = path_slice->as_string_view();
210
+ // Matching criteria from
211
+ // https://www.rfc-editor.org/rfc/rfc6265#section-5.1.4.
212
+ // The cookie-path is a prefix of the request-path (and)
213
+ if (!absl::StartsWith(path, configured_path)) {
214
+ return false;
215
+ }
216
+ // One of
217
+ // 1. The cookie-path and the request-path are identical.
218
+ // 2. The last character of the cookie-path is %x2F ("/").
219
+ // 3. The first character of the request-path that is not included
220
+ // in the cookie-path is a %x2F ("/") character.
221
+ return path.length() == configured_path.length() ||
222
+ configured_path.back() == '/' || path[configured_path.length()] == '/';
223
+ }
115
224
  } // namespace
116
225
 
117
226
  // Construct a promise for one call.
@@ -129,90 +238,57 @@ ArenaPromise<ServerMetadataHandle> StatefulSessionFilter::MakeCallPromise(
129
238
  GPR_ASSERT(method_params != nullptr);
130
239
  auto* cookie_config = method_params->GetConfig(index_);
131
240
  GPR_ASSERT(cookie_config != nullptr);
132
- if (!cookie_config->name.has_value()) {
241
+ if (!cookie_config->name.has_value() ||
242
+ !IsConfiguredPath(cookie_config->path,
243
+ call_args.client_initial_metadata)) {
133
244
  return next_promise_factory(std::move(call_args));
134
245
  }
135
- // We have a config.
136
- // If the config has a path, check to see if it matches the request path.
137
- if (!cookie_config->path.empty()) {
138
- Slice* path_slice =
139
- call_args.client_initial_metadata->get_pointer(HttpPathMetadata());
140
- GPR_ASSERT(path_slice != nullptr);
141
- absl::string_view path = path_slice->as_string_view();
142
- // Matching criteria from
143
- // https://www.rfc-editor.org/rfc/rfc6265#section-5.1.4.
144
- if (!absl::StartsWith(path, cookie_config->path) ||
145
- (path.size() != cookie_config->path.size() &&
146
- cookie_config->path.back() != '/' &&
147
- path[cookie_config->path.size() + 1] != '/')) {
148
- return next_promise_factory(std::move(call_args));
149
- }
150
- }
151
- // Check to see if we have a host override cookie.
152
- auto cookie_value = GetOverrideHostFromCookie(
153
- call_args.client_initial_metadata, *cookie_config->name);
154
- if (cookie_value.has_value()) {
155
- if (GRPC_TRACE_FLAG_ENABLED(grpc_stateful_session_filter_trace)) {
156
- gpr_log(GPR_INFO,
157
- "chand=%p: stateful session filter found cookie %s value %s",
158
- this, cookie_config->name->c_str(),
159
- std::string(*cookie_value).c_str());
160
- }
161
- // We have a valid cookie, so add the call attribute to be used by the
162
- // xds_override_host LB policy.
246
+ // Base64-decode cookie value.
247
+ std::string cookie_value =
248
+ GetCookieValue(call_args.client_initial_metadata, *cookie_config->name);
249
+ // Cookie format is "host;cluster"
250
+ std::pair<absl::string_view, absl::string_view> host_cluster =
251
+ absl::StrSplit(cookie_value, absl::MaxSplits(';', 1));
252
+ absl::string_view host_override;
253
+ // Set override host attribute. Allocate the string on the
254
+ // arena, so that it has the right lifetime.
255
+ if (!host_cluster.first.empty()) {
256
+ host_override = AllocateStringOnArena(host_cluster.first);
163
257
  service_config_call_data->SetCallAttribute(
164
- GetContext<Arena>()->New<XdsOverrideHostAttribute>(*cookie_value));
258
+ GetContext<Arena>()->New<XdsOverrideHostAttribute>(host_override));
165
259
  }
260
+ // Check if the cluster override is valid, and apply it if necessary.
261
+ // Note that cluster_name will point to an arena-allocated string
262
+ // that will still be alive when we see the server initial metadata.
263
+ // If the cluster name is empty, that means we cannot use a
264
+ // cluster override (i.e., the route uses a cluster specifier plugin).
265
+ absl::string_view cluster_name =
266
+ GetClusterToUse(host_cluster.second, service_config_call_data);
267
+ bool cluster_changed = cluster_name != host_cluster.second;
166
268
  // Intercept server initial metadata.
167
269
  call_args.server_initial_metadata->InterceptAndMap(
168
- [cookie_config, cookie_value](ServerMetadataHandle md) {
270
+ [cookie_config, cluster_changed, host_override,
271
+ cluster_name](ServerMetadataHandle md) {
169
272
  // Add cookie to server initial metadata if needed.
170
- MaybeUpdateServerInitialMetadata(cookie_config, cookie_value, md.get());
273
+ MaybeUpdateServerInitialMetadata(cookie_config, cluster_changed,
274
+ host_override, cluster_name, md.get());
171
275
  return md;
172
276
  });
173
277
  return Map(next_promise_factory(std::move(call_args)),
174
- [cookie_config, cookie_value](ServerMetadataHandle md) {
278
+ [cookie_config, cluster_changed, host_override,
279
+ cluster_name](ServerMetadataHandle md) {
175
280
  // If we got a Trailers-Only response, then add the
176
281
  // cookie to the trailing metadata instead of the
177
282
  // initial metadata.
178
283
  if (md->get(GrpcTrailersOnly()).value_or(false)) {
179
- MaybeUpdateServerInitialMetadata(cookie_config, cookie_value,
180
- md.get());
284
+ MaybeUpdateServerInitialMetadata(
285
+ cookie_config, cluster_changed, host_override,
286
+ cluster_name, md.get());
181
287
  }
182
288
  return md;
183
289
  });
184
290
  }
185
291
 
186
- absl::optional<absl::string_view>
187
- StatefulSessionFilter::GetOverrideHostFromCookie(
188
- const ClientMetadataHandle& client_initial_metadata,
189
- absl::string_view cookie_name) {
190
- // Check to see if the cookie header is present.
191
- std::string buffer;
192
- auto header_value =
193
- client_initial_metadata->GetStringValue("cookie", &buffer);
194
- if (!header_value.has_value()) return absl::nullopt;
195
- // Parse cookie header.
196
- std::vector<absl::string_view> values;
197
- for (absl::string_view cookie : absl::StrSplit(*header_value, "; ")) {
198
- std::pair<absl::string_view, absl::string_view> kv =
199
- absl::StrSplit(cookie, absl::MaxSplits('=', 1));
200
- if (kv.first == cookie_name) values.push_back(kv.second);
201
- }
202
- if (values.empty()) return absl::nullopt;
203
- // TODO(roth): Figure out the right behavior for multiple cookies.
204
- // For now, just choose the first value.
205
- absl::string_view value = values.front();
206
- // Base64-decode it.
207
- std::string decoded_value;
208
- if (!absl::Base64Unescape(value, &decoded_value)) return absl::nullopt;
209
- // Copy it into the arena, since it will need to persist until the LB pick.
210
- char* arena_value =
211
- static_cast<char*>(GetContext<Arena>()->Alloc(decoded_value.size()));
212
- memcpy(arena_value, decoded_value.c_str(), decoded_value.size());
213
- return absl::string_view(arena_value, decoded_value.size());
214
- }
215
-
216
292
  void StatefulSessionFilterRegister(CoreConfiguration::Builder* builder) {
217
293
  StatefulSessionServiceConfigParser::Register(builder);
218
294
  }
@@ -23,7 +23,6 @@
23
23
 
24
24
  #include "absl/status/statusor.h"
25
25
  #include "absl/strings/string_view.h"
26
- #include "absl/types/optional.h"
27
26
 
28
27
  #include "src/core/lib/channel/channel_args.h"
29
28
  #include "src/core/lib/channel/channel_fwd.h"
@@ -65,11 +64,6 @@ class StatefulSessionFilter : public ChannelFilter {
65
64
 
66
65
  private:
67
66
  explicit StatefulSessionFilter(ChannelFilter::Args filter_args);
68
-
69
- absl::optional<absl::string_view> GetOverrideHostFromCookie(
70
- const ClientMetadataHandle& initial_metadata,
71
- absl::string_view cookie_name);
72
-
73
67
  // The relative index of instances of the same filter.
74
68
  const size_t index_;
75
69
  // Index of the service config parser.
@@ -71,6 +71,7 @@
71
71
  #include "src/core/lib/iomgr/resolved_address.h"
72
72
  #include "src/core/lib/iomgr/tcp_server.h"
73
73
  #include "src/core/lib/iomgr/unix_sockets_posix.h"
74
+ #include "src/core/lib/iomgr/vsock.h"
74
75
  #include "src/core/lib/resource_quota/memory_quota.h"
75
76
  #include "src/core/lib/resource_quota/resource_quota.h"
76
77
  #include "src/core/lib/security/credentials/credentials.h"
@@ -98,6 +99,7 @@ using ::grpc_event_engine::experimental::EventEngine;
98
99
 
99
100
  const char kUnixUriPrefix[] = "unix:";
100
101
  const char kUnixAbstractUriPrefix[] = "unix-abstract:";
102
+ const char kVSockUriPrefix[] = "vsock:";
101
103
 
102
104
  class Chttp2ServerListener : public Server::ListenerInterface {
103
105
  public:
@@ -244,13 +246,12 @@ class Chttp2ServerListener : public Server::ListenerInterface {
244
246
  IncrementRefCount();
245
247
  }
246
248
 
247
- RefCountedPtr<Chttp2ServerListener> Ref() GRPC_MUST_USE_RESULT {
249
+ GRPC_MUST_USE_RESULT RefCountedPtr<Chttp2ServerListener> Ref() {
248
250
  IncrementRefCount();
249
251
  return RefCountedPtr<Chttp2ServerListener>(this);
250
252
  }
251
- RefCountedPtr<Chttp2ServerListener> Ref(const DebugLocation& /* location */,
252
- const char* /* reason */)
253
- GRPC_MUST_USE_RESULT {
253
+ GRPC_MUST_USE_RESULT RefCountedPtr<Chttp2ServerListener> Ref(
254
+ const DebugLocation& /* location */, const char* /* reason */) {
254
255
  return Ref();
255
256
  }
256
257
 
@@ -941,6 +942,8 @@ grpc_error_handle Chttp2ServerAddPort(Server* server, const char* addr,
941
942
  kUnixAbstractUriPrefix)) {
942
943
  resolved_or =
943
944
  grpc_resolve_unix_abstract_domain_address(parsed_addr_unprefixed);
945
+ } else if (absl::ConsumePrefix(&parsed_addr_unprefixed, kVSockUriPrefix)) {
946
+ resolved_or = grpc_resolve_vsock_address(parsed_addr_unprefixed);
944
947
  } else {
945
948
  resolved_or =
946
949
  GetDNSResolver()->LookupHostnameBlocking(parsed_addr, "https");