grpc 1.60.2 → 1.61.0.pre2

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 (279) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +208 -165
  3. data/include/grpc/event_engine/event_engine.h +59 -12
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +6 -0
  5. data/include/grpc/event_engine/internal/slice_cast.h +12 -0
  6. data/include/grpc/event_engine/memory_allocator.h +3 -1
  7. data/include/grpc/event_engine/slice.h +5 -0
  8. data/include/grpc/grpc_security.h +22 -1
  9. data/include/grpc/impl/call.h +29 -0
  10. data/include/grpc/impl/channel_arg_names.h +12 -1
  11. data/include/grpc/impl/slice_type.h +1 -1
  12. data/include/grpc/module.modulemap +1 -0
  13. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +54 -7
  14. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +20 -6
  15. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +10 -13
  16. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +18 -10
  17. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +326 -0
  18. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +143 -0
  19. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -2
  20. data/src/core/ext/filters/client_channel/client_channel.cc +32 -6
  21. data/src/core/ext/filters/client_channel/client_channel_internal.h +2 -0
  22. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +54 -21
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +3 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +2 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.cc +12 -15
  27. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.h +8 -5
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +139 -92
  29. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +9 -4
  30. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +9 -4
  31. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +10 -11
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +94 -93
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +5 -3
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +12 -15
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +38 -16
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +25 -28
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +10 -10
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +37 -35
  39. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -9
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +504 -461
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +232 -122
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -6
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +642 -251
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +2 -6
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +7 -8
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +2 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +3 -1
  48. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
  49. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -2
  50. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +6 -8
  51. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.cc +1031 -0
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.h +277 -0
  53. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +128 -270
  54. data/src/core/ext/filters/client_channel/resolver/xds/{xds_resolver.h → xds_resolver_attributes.h} +5 -4
  55. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.cc +25 -0
  56. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.h +30 -0
  57. data/src/core/ext/filters/client_channel/retry_filter.cc +1 -0
  58. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +35 -17
  59. data/src/core/ext/filters/deadline/deadline_filter.cc +12 -0
  60. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +17 -13
  61. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +13 -4
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +23 -32
  63. data/src/core/ext/filters/http/client/http_client_filter.h +10 -5
  64. data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
  65. data/src/core/ext/filters/http/client_authority_filter.h +12 -4
  66. data/src/core/ext/filters/http/http_filters_plugin.cc +42 -20
  67. data/src/core/ext/filters/http/message_compress/compression_filter.cc +55 -80
  68. data/src/core/ext/filters/http/message_compress/compression_filter.h +54 -12
  69. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.cc +325 -0
  70. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.h +139 -0
  71. data/src/core/ext/filters/http/server/http_server_filter.cc +41 -41
  72. data/src/core/ext/filters/http/server/http_server_filter.h +11 -4
  73. data/src/core/ext/filters/message_size/message_size_filter.cc +56 -76
  74. data/src/core/ext/filters/message_size/message_size_filter.h +35 -23
  75. data/src/core/ext/filters/rbac/rbac_filter.cc +15 -11
  76. data/src/core/ext/filters/rbac/rbac_filter.h +11 -4
  77. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +25 -13
  78. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +47 -50
  79. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +21 -4
  80. data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
  81. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
  82. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +11 -2
  83. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +68 -145
  84. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -3
  85. data/src/core/ext/transport/chttp2/transport/flow_control.cc +21 -82
  86. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -8
  87. data/src/core/ext/transport/chttp2/transport/frame.cc +506 -0
  88. data/src/core/ext/transport/chttp2/transport/frame.h +214 -0
  89. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -1
  90. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +33 -79
  91. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -7
  92. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -36
  93. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -2
  94. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +122 -32
  95. data/src/core/ext/transport/chttp2/transport/http2_settings.h +142 -37
  96. data/src/core/ext/transport/chttp2/transport/internal.h +1 -22
  97. data/src/core/ext/transport/chttp2/transport/parsing.cc +23 -37
  98. data/src/core/ext/transport/chttp2/transport/writing.cc +26 -58
  99. data/src/core/ext/transport/inproc/inproc_transport.cc +172 -13
  100. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +712 -0
  101. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +151 -0
  102. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +33 -0
  103. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +133 -0
  104. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +50 -0
  105. data/src/core/ext/xds/certificate_provider_store.cc +2 -1
  106. data/src/core/ext/xds/certificate_provider_store.h +0 -5
  107. data/src/core/ext/xds/xds_api.cc +31 -18
  108. data/src/core/ext/xds/xds_api.h +2 -2
  109. data/src/core/ext/xds/xds_bootstrap.h +3 -0
  110. data/src/core/ext/xds/xds_certificate_provider.cc +88 -287
  111. data/src/core/ext/xds/xds_certificate_provider.h +44 -111
  112. data/src/core/ext/xds/xds_client.cc +420 -414
  113. data/src/core/ext/xds/xds_client.h +31 -22
  114. data/src/core/ext/xds/xds_client_grpc.cc +3 -1
  115. data/src/core/ext/xds/xds_cluster.cc +104 -11
  116. data/src/core/ext/xds/xds_cluster.h +9 -1
  117. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +9 -5
  118. data/src/core/ext/xds/xds_common_types.cc +14 -10
  119. data/src/core/ext/xds/xds_endpoint.cc +9 -4
  120. data/src/core/ext/xds/xds_endpoint.h +5 -1
  121. data/src/core/ext/xds/xds_health_status.cc +12 -2
  122. data/src/core/ext/xds/xds_health_status.h +4 -2
  123. data/src/core/ext/xds/xds_http_rbac_filter.cc +5 -3
  124. data/src/core/ext/xds/xds_listener.cc +14 -8
  125. data/src/core/ext/xds/xds_resource_type_impl.h +6 -4
  126. data/src/core/ext/xds/xds_route_config.cc +34 -22
  127. data/src/core/ext/xds/xds_route_config.h +1 -0
  128. data/src/core/ext/xds/xds_server_config_fetcher.cc +61 -57
  129. data/src/core/ext/xds/xds_transport.h +3 -0
  130. data/src/core/ext/xds/xds_transport_grpc.cc +47 -50
  131. data/src/core/ext/xds/xds_transport_grpc.h +4 -0
  132. data/src/core/lib/channel/call_tracer.cc +12 -0
  133. data/src/core/lib/channel/call_tracer.h +17 -3
  134. data/src/core/lib/channel/channel_args.cc +24 -14
  135. data/src/core/lib/channel/channel_args.h +74 -13
  136. data/src/core/lib/channel/channel_stack.cc +27 -0
  137. data/src/core/lib/channel/channel_stack.h +10 -10
  138. data/src/core/lib/channel/connected_channel.cc +64 -18
  139. data/src/core/lib/channel/promise_based_filter.h +1041 -1
  140. data/src/core/lib/channel/server_call_tracer_filter.cc +43 -35
  141. data/src/core/lib/compression/compression_internal.cc +0 -3
  142. data/src/core/lib/event_engine/ares_resolver.cc +35 -14
  143. data/src/core/lib/event_engine/ares_resolver.h +9 -10
  144. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +8 -1
  145. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +132 -0
  146. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +61 -0
  147. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +52 -36
  148. data/src/core/lib/event_engine/posix_engine/posix_engine.h +4 -9
  149. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +11 -3
  150. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +9 -2
  151. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +7 -0
  152. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +17 -27
  153. data/src/core/lib/event_engine/posix_engine/timer_manager.h +0 -3
  154. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +55 -0
  155. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +114 -0
  156. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.h +51 -0
  157. data/src/core/lib/event_engine/windows/windows_engine.cc +7 -7
  158. data/src/core/lib/experiments/config.cc +13 -0
  159. data/src/core/lib/experiments/config.h +3 -0
  160. data/src/core/lib/experiments/experiments.cc +245 -366
  161. data/src/core/lib/experiments/experiments.h +50 -156
  162. data/src/core/lib/gprpp/debug_location.h +13 -0
  163. data/src/core/lib/gprpp/dual_ref_counted.h +36 -7
  164. data/src/core/lib/gprpp/orphanable.h +27 -0
  165. data/src/core/lib/gprpp/ref_counted.h +63 -22
  166. data/src/core/lib/gprpp/ref_counted_ptr.h +70 -27
  167. data/src/core/lib/gprpp/ref_counted_string.h +13 -0
  168. data/src/core/lib/gprpp/status_helper.cc +1 -2
  169. data/src/core/lib/iomgr/combiner.cc +15 -51
  170. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +31 -0
  171. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +16 -0
  172. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -3
  173. data/src/core/lib/load_balancing/lb_policy.h +1 -1
  174. data/src/core/lib/promise/activity.cc +17 -2
  175. data/src/core/lib/promise/activity.h +5 -4
  176. data/src/core/lib/promise/all_ok.h +80 -0
  177. data/src/core/lib/promise/detail/join_state.h +2077 -0
  178. data/src/core/lib/promise/detail/promise_factory.h +1 -0
  179. data/src/core/lib/promise/detail/promise_like.h +8 -1
  180. data/src/core/lib/promise/detail/seq_state.h +3458 -150
  181. data/src/core/lib/promise/detail/status.h +42 -5
  182. data/src/core/lib/promise/for_each.h +13 -1
  183. data/src/core/lib/promise/if.h +4 -0
  184. data/src/core/lib/promise/latch.h +6 -3
  185. data/src/core/lib/promise/party.cc +33 -31
  186. data/src/core/lib/promise/party.h +142 -6
  187. data/src/core/lib/promise/poll.h +39 -13
  188. data/src/core/lib/promise/promise.h +4 -0
  189. data/src/core/lib/promise/seq.h +107 -7
  190. data/src/core/lib/promise/status_flag.h +196 -0
  191. data/src/core/lib/promise/try_join.h +132 -0
  192. data/src/core/lib/promise/try_seq.h +132 -10
  193. data/src/core/lib/resolver/endpoint_addresses.cc +0 -1
  194. data/src/core/lib/resolver/endpoint_addresses.h +48 -0
  195. data/src/core/lib/resource_quota/arena.h +2 -2
  196. data/src/core/lib/resource_quota/memory_quota.cc +57 -8
  197. data/src/core/lib/resource_quota/memory_quota.h +6 -0
  198. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +14 -11
  199. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +14 -5
  200. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -0
  201. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +4 -0
  202. data/src/core/lib/security/credentials/external/external_account_credentials.cc +28 -20
  203. data/src/core/lib/security/credentials/external/external_account_credentials.h +4 -0
  204. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +4 -0
  205. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -0
  206. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -0
  207. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +4 -0
  208. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -1
  209. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +0 -3
  210. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +12 -0
  211. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +22 -5
  212. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.h +1 -5
  213. data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -0
  214. data/src/core/lib/security/credentials/xds/xds_credentials.cc +21 -28
  215. data/src/core/lib/security/credentials/xds/xds_credentials.h +2 -4
  216. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -3
  217. data/src/core/lib/security/transport/auth_filters.h +71 -4
  218. data/src/core/lib/security/transport/client_auth_filter.cc +2 -4
  219. data/src/core/lib/security/transport/legacy_server_auth_filter.cc +244 -0
  220. data/src/core/lib/security/transport/server_auth_filter.cc +70 -90
  221. data/src/core/lib/slice/slice_buffer.h +3 -0
  222. data/src/core/lib/surface/builtins.cc +1 -1
  223. data/src/core/lib/surface/call.cc +683 -196
  224. data/src/core/lib/surface/call.h +26 -13
  225. data/src/core/lib/surface/call_trace.cc +42 -1
  226. data/src/core/lib/surface/channel.cc +0 -1
  227. data/src/core/lib/surface/channel.h +0 -6
  228. data/src/core/lib/surface/channel_init.h +26 -0
  229. data/src/core/lib/surface/init.cc +14 -8
  230. data/src/core/lib/surface/server.cc +256 -237
  231. data/src/core/lib/surface/server.h +26 -54
  232. data/src/core/lib/surface/version.cc +2 -2
  233. data/src/core/lib/surface/wait_for_cq_end_op.h +94 -0
  234. data/src/core/lib/transport/call_final_info.cc +38 -0
  235. data/src/core/lib/transport/call_final_info.h +54 -0
  236. data/src/core/lib/transport/connectivity_state.cc +3 -2
  237. data/src/core/lib/transport/connectivity_state.h +4 -0
  238. data/src/core/lib/transport/metadata_batch.h +4 -4
  239. data/src/core/lib/transport/transport.cc +70 -19
  240. data/src/core/lib/transport/transport.h +395 -25
  241. data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -0
  242. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +0 -3
  243. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  244. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  245. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  246. data/src/core/tsi/ssl_transport_security.cc +65 -43
  247. data/src/ruby/ext/grpc/rb_channel_args.c +3 -1
  248. data/src/ruby/ext/grpc/rb_grpc.c +0 -1
  249. data/src/ruby/ext/grpc/rb_grpc.h +0 -2
  250. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  251. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  252. data/src/ruby/lib/grpc/version.rb +1 -1
  253. data/third_party/upb/upb/reflection/def_pool.h +2 -2
  254. data/third_party/zlib/adler32.c +5 -27
  255. data/third_party/zlib/compress.c +5 -16
  256. data/third_party/zlib/crc32.c +86 -162
  257. data/third_party/zlib/deflate.c +233 -336
  258. data/third_party/zlib/deflate.h +8 -8
  259. data/third_party/zlib/gzguts.h +11 -12
  260. data/third_party/zlib/infback.c +7 -23
  261. data/third_party/zlib/inffast.c +1 -4
  262. data/third_party/zlib/inffast.h +1 -1
  263. data/third_party/zlib/inflate.c +30 -99
  264. data/third_party/zlib/inftrees.c +6 -11
  265. data/third_party/zlib/inftrees.h +3 -3
  266. data/third_party/zlib/trees.c +224 -302
  267. data/third_party/zlib/uncompr.c +4 -12
  268. data/third_party/zlib/zconf.h +6 -2
  269. data/third_party/zlib/zlib.h +191 -188
  270. data/third_party/zlib/zutil.c +16 -44
  271. data/third_party/zlib/zutil.h +10 -10
  272. metadata +35 -13
  273. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +0 -1173
  274. data/src/core/lib/event_engine/memory_allocator.cc +0 -74
  275. data/src/core/lib/transport/pid_controller.cc +0 -51
  276. data/src/core/lib/transport/pid_controller.h +0 -116
  277. data/third_party/upb/upb/collections/array.h +0 -17
  278. data/third_party/upb/upb/collections/map.h +0 -17
  279. data/third_party/upb/upb/upb.hpp +0 -18
@@ -0,0 +1,139 @@
1
+ //
2
+ //
3
+ // Copyright 2020 gRPC authors.
4
+ //
5
+ // Licensed under the Apache License, Version 2.0 (the "License");
6
+ // you may not use this file except in compliance with the License.
7
+ // You may obtain a copy of the License at
8
+ //
9
+ // http://www.apache.org/licenses/LICENSE-2.0
10
+ //
11
+ // Unless required by applicable law or agreed to in writing, software
12
+ // distributed under the License is distributed on an "AS IS" BASIS,
13
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ // See the License for the specific language governing permissions and
15
+ // limitations under the License.
16
+ //
17
+ //
18
+
19
+ #ifndef GRPC_SRC_CORE_EXT_FILTERS_HTTP_MESSAGE_COMPRESS_LEGACY_COMPRESSION_FILTER_H
20
+ #define GRPC_SRC_CORE_EXT_FILTERS_HTTP_MESSAGE_COMPRESS_LEGACY_COMPRESSION_FILTER_H
21
+
22
+ #include <grpc/support/port_platform.h>
23
+
24
+ #include <stddef.h>
25
+ #include <stdint.h>
26
+
27
+ #include "absl/status/statusor.h"
28
+ #include "absl/types/optional.h"
29
+
30
+ #include <grpc/impl/compression_types.h>
31
+
32
+ #include "src/core/lib/channel/channel_args.h"
33
+ #include "src/core/lib/channel/channel_fwd.h"
34
+ #include "src/core/lib/channel/promise_based_filter.h"
35
+ #include "src/core/lib/compression/compression_internal.h"
36
+ #include "src/core/lib/promise/arena_promise.h"
37
+ #include "src/core/lib/transport/metadata_batch.h"
38
+ #include "src/core/lib/transport/transport.h"
39
+
40
+ namespace grpc_core {
41
+
42
+ /// Compression filter for messages.
43
+ ///
44
+ /// See <grpc/compression.h> for the available compression settings.
45
+ ///
46
+ /// Compression settings may come from:
47
+ /// - Channel configuration, as established at channel creation time.
48
+ /// - The metadata accompanying the outgoing data to be compressed. This is
49
+ /// taken as a request only. We may choose not to honor it. The metadata key
50
+ /// is given by \a GRPC_COMPRESSION_REQUEST_ALGORITHM_MD_KEY.
51
+ ///
52
+ /// Compression can be disabled for concrete messages (for instance in order to
53
+ /// prevent CRIME/BEAST type attacks) by having the GRPC_WRITE_NO_COMPRESS set
54
+ /// in the MessageHandle flags.
55
+ ///
56
+ /// The attempted compression mechanism is added to the resulting initial
57
+ /// metadata under the 'grpc-encoding' key.
58
+ ///
59
+ /// If compression is actually performed, the MessageHandle's flag is modified
60
+ /// to incorporate GRPC_WRITE_INTERNAL_COMPRESS. Otherwise, and regardless of
61
+ /// the aforementioned 'grpc-encoding' metadata value, data will pass through
62
+ /// uncompressed.
63
+
64
+ class LegacyCompressionFilter : public ChannelFilter {
65
+ protected:
66
+ struct DecompressArgs {
67
+ grpc_compression_algorithm algorithm;
68
+ absl::optional<uint32_t> max_recv_message_length;
69
+ };
70
+
71
+ explicit LegacyCompressionFilter(const ChannelArgs& args);
72
+
73
+ grpc_compression_algorithm default_compression_algorithm() const {
74
+ return default_compression_algorithm_;
75
+ }
76
+
77
+ CompressionAlgorithmSet enabled_compression_algorithms() const {
78
+ return enabled_compression_algorithms_;
79
+ }
80
+
81
+ grpc_compression_algorithm HandleOutgoingMetadata(
82
+ grpc_metadata_batch& outgoing_metadata);
83
+ DecompressArgs HandleIncomingMetadata(
84
+ const grpc_metadata_batch& incoming_metadata);
85
+
86
+ // Compress one message synchronously.
87
+ MessageHandle CompressMessage(MessageHandle message,
88
+ grpc_compression_algorithm algorithm) const;
89
+ // Decompress one message synchronously.
90
+ absl::StatusOr<MessageHandle> DecompressMessage(MessageHandle message,
91
+ DecompressArgs args) const;
92
+
93
+ private:
94
+ // Max receive message length, if set.
95
+ absl::optional<uint32_t> max_recv_size_;
96
+ size_t message_size_service_config_parser_index_;
97
+ // The default, channel-level, compression algorithm.
98
+ grpc_compression_algorithm default_compression_algorithm_;
99
+ // Enabled compression algorithms.
100
+ CompressionAlgorithmSet enabled_compression_algorithms_;
101
+ // Is compression enabled?
102
+ bool enable_compression_;
103
+ // Is decompression enabled?
104
+ bool enable_decompression_;
105
+ };
106
+
107
+ class LegacyClientCompressionFilter final : public LegacyCompressionFilter {
108
+ public:
109
+ static const grpc_channel_filter kFilter;
110
+
111
+ static absl::StatusOr<LegacyClientCompressionFilter> Create(
112
+ const ChannelArgs& args, ChannelFilter::Args filter_args);
113
+
114
+ // Construct a promise for one call.
115
+ ArenaPromise<ServerMetadataHandle> MakeCallPromise(
116
+ CallArgs call_args, NextPromiseFactory next_promise_factory) override;
117
+
118
+ private:
119
+ using LegacyCompressionFilter::LegacyCompressionFilter;
120
+ };
121
+
122
+ class LegacyServerCompressionFilter final : public LegacyCompressionFilter {
123
+ public:
124
+ static const grpc_channel_filter kFilter;
125
+
126
+ static absl::StatusOr<LegacyServerCompressionFilter> Create(
127
+ const ChannelArgs& args, ChannelFilter::Args filter_args);
128
+
129
+ // Construct a promise for one call.
130
+ ArenaPromise<ServerMetadataHandle> MakeCallPromise(
131
+ CallArgs call_args, NextPromiseFactory next_promise_factory) override;
132
+
133
+ private:
134
+ using LegacyCompressionFilter::LegacyCompressionFilter;
135
+ };
136
+
137
+ } // namespace grpc_core
138
+
139
+ #endif // GRPC_SRC_CORE_EXT_FILTERS_HTTP_MESSAGE_COMPRESS_LEGACY_COMPRESSION_FILTER_H
@@ -49,6 +49,10 @@
49
49
 
50
50
  namespace grpc_core {
51
51
 
52
+ const NoInterceptor HttpServerFilter::Call::OnClientToServerMessage;
53
+ const NoInterceptor HttpServerFilter::Call::OnServerToClientMessage;
54
+ const NoInterceptor HttpServerFilter::Call::OnFinalize;
55
+
52
56
  const grpc_channel_filter HttpServerFilter::kFilter =
53
57
  MakePromiseBasedFilter<HttpServerFilter, FilterEndpoint::kServer,
54
58
  kFilterExaminesServerInitialMetadata>("http-server");
@@ -71,85 +75,81 @@ ServerMetadataHandle MalformedRequest(absl::string_view explanation) {
71
75
  }
72
76
  } // namespace
73
77
 
74
- ArenaPromise<ServerMetadataHandle> HttpServerFilter::MakeCallPromise(
75
- CallArgs call_args, NextPromiseFactory next_promise_factory) {
76
- const auto& md = call_args.client_initial_metadata;
77
-
78
- auto method = md->get(HttpMethodMetadata());
78
+ ServerMetadataHandle HttpServerFilter::Call::OnClientInitialMetadata(
79
+ ClientMetadata& md, HttpServerFilter* filter) {
80
+ auto method = md.get(HttpMethodMetadata());
79
81
  if (method.has_value()) {
80
82
  switch (*method) {
81
83
  case HttpMethodMetadata::kPost:
82
84
  break;
83
85
  case HttpMethodMetadata::kPut:
84
- if (allow_put_requests_) {
86
+ if (filter->allow_put_requests_) {
85
87
  break;
86
88
  }
87
89
  ABSL_FALLTHROUGH_INTENDED;
88
90
  case HttpMethodMetadata::kInvalid:
89
91
  case HttpMethodMetadata::kGet:
90
- return Immediate(MalformedRequest("Bad method header"));
92
+ return MalformedRequest("Bad method header");
91
93
  }
92
94
  } else {
93
- return Immediate(MalformedRequest("Missing :method header"));
95
+ return MalformedRequest("Missing :method header");
94
96
  }
95
97
 
96
- auto te = md->Take(TeMetadata());
98
+ auto te = md.Take(TeMetadata());
97
99
  if (te == TeMetadata::kTrailers) {
98
100
  // Do nothing, ok.
99
101
  } else if (!te.has_value()) {
100
- return Immediate(MalformedRequest("Missing :te header"));
102
+ return MalformedRequest("Missing :te header");
101
103
  } else {
102
- return Immediate(MalformedRequest("Bad :te header"));
104
+ return MalformedRequest("Bad :te header");
103
105
  }
104
106
 
105
- auto scheme = md->Take(HttpSchemeMetadata());
107
+ auto scheme = md.Take(HttpSchemeMetadata());
106
108
  if (scheme.has_value()) {
107
109
  if (*scheme == HttpSchemeMetadata::kInvalid) {
108
- return Immediate(MalformedRequest("Bad :scheme header"));
110
+ return MalformedRequest("Bad :scheme header");
109
111
  }
110
112
  } else {
111
- return Immediate(MalformedRequest("Missing :scheme header"));
113
+ return MalformedRequest("Missing :scheme header");
112
114
  }
113
115
 
114
- md->Remove(ContentTypeMetadata());
116
+ md.Remove(ContentTypeMetadata());
115
117
 
116
- Slice* path_slice = md->get_pointer(HttpPathMetadata());
118
+ Slice* path_slice = md.get_pointer(HttpPathMetadata());
117
119
  if (path_slice == nullptr) {
118
- return Immediate(MalformedRequest("Missing :path header"));
120
+ return MalformedRequest("Missing :path header");
119
121
  }
120
122
 
121
- if (md->get_pointer(HttpAuthorityMetadata()) == nullptr) {
122
- absl::optional<Slice> host = md->Take(HostMetadata());
123
+ if (md.get_pointer(HttpAuthorityMetadata()) == nullptr) {
124
+ absl::optional<Slice> host = md.Take(HostMetadata());
123
125
  if (host.has_value()) {
124
- md->Set(HttpAuthorityMetadata(), std::move(*host));
126
+ md.Set(HttpAuthorityMetadata(), std::move(*host));
125
127
  }
126
128
  }
127
129
 
128
- if (md->get_pointer(HttpAuthorityMetadata()) == nullptr) {
129
- return Immediate(MalformedRequest("Missing :authority header"));
130
+ if (md.get_pointer(HttpAuthorityMetadata()) == nullptr) {
131
+ return MalformedRequest("Missing :authority header");
130
132
  }
131
133
 
132
- if (!surface_user_agent_) {
133
- md->Remove(UserAgentMetadata());
134
+ if (!filter->surface_user_agent_) {
135
+ md.Remove(UserAgentMetadata());
134
136
  }
135
137
 
136
- call_args.server_initial_metadata->InterceptAndMap(
137
- [](ServerMetadataHandle md) {
138
- if (grpc_call_trace.enabled()) {
139
- gpr_log(GPR_INFO, "%s[http-server] Write metadata",
140
- Activity::current()->DebugTag().c_str());
141
- }
142
- FilterOutgoingMetadata(md.get());
143
- md->Set(HttpStatusMetadata(), 200);
144
- md->Set(ContentTypeMetadata(), ContentTypeMetadata::kApplicationGrpc);
145
- return md;
146
- });
147
-
148
- return Map(next_promise_factory(std::move(call_args)),
149
- [](ServerMetadataHandle md) -> ServerMetadataHandle {
150
- FilterOutgoingMetadata(md.get());
151
- return md;
152
- });
138
+ return nullptr;
139
+ }
140
+
141
+ void HttpServerFilter::Call::OnServerInitialMetadata(ServerMetadata& md) {
142
+ if (grpc_call_trace.enabled()) {
143
+ gpr_log(GPR_INFO, "%s[http-server] Write metadata",
144
+ Activity::current()->DebugTag().c_str());
145
+ }
146
+ FilterOutgoingMetadata(&md);
147
+ md.Set(HttpStatusMetadata(), 200);
148
+ md.Set(ContentTypeMetadata(), ContentTypeMetadata::kApplicationGrpc);
149
+ }
150
+
151
+ void HttpServerFilter::Call::OnServerTrailingMetadata(ServerMetadata& md) {
152
+ FilterOutgoingMetadata(&md);
153
153
  }
154
154
 
155
155
  absl::StatusOr<HttpServerFilter> HttpServerFilter::Create(
@@ -32,16 +32,23 @@
32
32
  namespace grpc_core {
33
33
 
34
34
  // Processes metadata on the server side for HTTP2 transports
35
- class HttpServerFilter : public ChannelFilter {
35
+ class HttpServerFilter : public ImplementChannelFilter<HttpServerFilter> {
36
36
  public:
37
37
  static const grpc_channel_filter kFilter;
38
38
 
39
39
  static absl::StatusOr<HttpServerFilter> Create(
40
40
  const ChannelArgs& args, ChannelFilter::Args filter_args);
41
41
 
42
- // Construct a promise for one call.
43
- ArenaPromise<ServerMetadataHandle> MakeCallPromise(
44
- CallArgs call_args, NextPromiseFactory next_promise_factory) override;
42
+ class Call {
43
+ public:
44
+ ServerMetadataHandle OnClientInitialMetadata(ClientMetadata& md,
45
+ HttpServerFilter* filter);
46
+ void OnServerInitialMetadata(ServerMetadata& md);
47
+ void OnServerTrailingMetadata(ServerMetadata& md);
48
+ static const NoInterceptor OnClientToServerMessage;
49
+ static const NoInterceptor OnServerToClientMessage;
50
+ static const NoInterceptor OnFinalize;
51
+ };
45
52
 
46
53
  private:
47
54
  HttpServerFilter(bool surface_user_agent, bool allow_put_requests)
@@ -50,6 +50,15 @@
50
50
 
51
51
  namespace grpc_core {
52
52
 
53
+ const NoInterceptor ClientMessageSizeFilter::Call::OnClientInitialMetadata;
54
+ const NoInterceptor ClientMessageSizeFilter::Call::OnServerInitialMetadata;
55
+ const NoInterceptor ClientMessageSizeFilter::Call::OnServerTrailingMetadata;
56
+ const NoInterceptor ClientMessageSizeFilter::Call::OnFinalize;
57
+ const NoInterceptor ServerMessageSizeFilter::Call::OnClientInitialMetadata;
58
+ const NoInterceptor ServerMessageSizeFilter::Call::OnServerInitialMetadata;
59
+ const NoInterceptor ServerMessageSizeFilter::Call::OnServerTrailingMetadata;
60
+ const NoInterceptor ServerMessageSizeFilter::Call::OnFinalize;
61
+
53
62
  //
54
63
  // MessageSizeParsedConfig
55
64
  //
@@ -138,60 +147,6 @@ const grpc_channel_filter ServerMessageSizeFilter::kFilter =
138
147
  kFilterExaminesOutboundMessages |
139
148
  kFilterExaminesInboundMessages>("message_size");
140
149
 
141
- class MessageSizeFilter::CallBuilder {
142
- private:
143
- auto Interceptor(uint32_t max_length, bool is_send) {
144
- return [max_length, is_send,
145
- err = err_](MessageHandle msg) -> absl::optional<MessageHandle> {
146
- if (grpc_call_trace.enabled()) {
147
- gpr_log(GPR_INFO, "%s[message_size] %s len:%" PRIdPTR " max:%d",
148
- Activity::current()->DebugTag().c_str(),
149
- is_send ? "send" : "recv", msg->payload()->Length(),
150
- max_length);
151
- }
152
- if (msg->payload()->Length() > max_length) {
153
- if (err->is_set()) return std::move(msg);
154
- auto r = GetContext<Arena>()->MakePooled<ServerMetadata>(
155
- GetContext<Arena>());
156
- r->Set(GrpcStatusMetadata(), GRPC_STATUS_RESOURCE_EXHAUSTED);
157
- r->Set(GrpcMessageMetadata(),
158
- Slice::FromCopiedString(
159
- absl::StrFormat("%s message larger than max (%u vs. %d)",
160
- is_send ? "Sent" : "Received",
161
- msg->payload()->Length(), max_length)));
162
- err->Set(std::move(r));
163
- return absl::nullopt;
164
- }
165
- return std::move(msg);
166
- };
167
- }
168
-
169
- public:
170
- explicit CallBuilder(const MessageSizeParsedConfig& limits)
171
- : limits_(limits) {}
172
-
173
- template <typename T>
174
- void AddSend(T* pipe_end) {
175
- if (!limits_.max_send_size().has_value()) return;
176
- pipe_end->InterceptAndMap(Interceptor(*limits_.max_send_size(), true));
177
- }
178
- template <typename T>
179
- void AddRecv(T* pipe_end) {
180
- if (!limits_.max_recv_size().has_value()) return;
181
- pipe_end->InterceptAndMap(Interceptor(*limits_.max_recv_size(), false));
182
- }
183
-
184
- ArenaPromise<ServerMetadataHandle> Run(
185
- CallArgs call_args, NextPromiseFactory next_promise_factory) {
186
- return Race(err_->Wait(), next_promise_factory(std::move(call_args)));
187
- }
188
-
189
- private:
190
- Latch<ServerMetadataHandle>* const err_ =
191
- GetContext<Arena>()->ManagedNew<Latch<ServerMetadataHandle>>();
192
- MessageSizeParsedConfig limits_;
193
- };
194
-
195
150
  absl::StatusOr<ClientMessageSizeFilter> ClientMessageSizeFilter::Create(
196
151
  const ChannelArgs& args, ChannelFilter::Args) {
197
152
  return ClientMessageSizeFilter(args);
@@ -202,20 +157,40 @@ absl::StatusOr<ServerMessageSizeFilter> ServerMessageSizeFilter::Create(
202
157
  return ServerMessageSizeFilter(args);
203
158
  }
204
159
 
205
- ArenaPromise<ServerMetadataHandle> ClientMessageSizeFilter::MakeCallPromise(
206
- CallArgs call_args, NextPromiseFactory next_promise_factory) {
160
+ namespace {
161
+ ServerMetadataHandle CheckPayload(const Message& msg,
162
+ absl::optional<uint32_t> max_length,
163
+ bool is_send) {
164
+ if (!max_length.has_value()) return nullptr;
165
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_call_trace)) {
166
+ gpr_log(GPR_INFO, "%s[message_size] %s len:%" PRIdPTR " max:%d",
167
+ Activity::current()->DebugTag().c_str(), is_send ? "send" : "recv",
168
+ msg.payload()->Length(), *max_length);
169
+ }
170
+ if (msg.payload()->Length() <= *max_length) return nullptr;
171
+ auto r = GetContext<Arena>()->MakePooled<ServerMetadata>(GetContext<Arena>());
172
+ r->Set(GrpcStatusMetadata(), GRPC_STATUS_RESOURCE_EXHAUSTED);
173
+ r->Set(GrpcMessageMetadata(), Slice::FromCopiedString(absl::StrFormat(
174
+ "%s message larger than max (%u vs. %d)",
175
+ is_send ? "Sent" : "Received",
176
+ msg.payload()->Length(), *max_length)));
177
+ return r;
178
+ }
179
+ } // namespace
180
+
181
+ ClientMessageSizeFilter::Call::Call(ClientMessageSizeFilter* filter)
182
+ : limits_(filter->parsed_config_) {
207
183
  // Get max sizes from channel data, then merge in per-method config values.
208
184
  // Note: Per-method config is only available on the client, so we
209
185
  // apply the max request size to the send limit and the max response
210
186
  // size to the receive limit.
211
- MessageSizeParsedConfig limits = this->limits();
212
187
  const MessageSizeParsedConfig* config_from_call_context =
213
188
  MessageSizeParsedConfig::GetFromCallContext(
214
189
  GetContext<grpc_call_context_element>(),
215
- service_config_parser_index_);
190
+ filter->service_config_parser_index_);
216
191
  if (config_from_call_context != nullptr) {
217
- absl::optional<uint32_t> max_send_size = limits.max_send_size();
218
- absl::optional<uint32_t> max_recv_size = limits.max_recv_size();
192
+ absl::optional<uint32_t> max_send_size = limits_.max_send_size();
193
+ absl::optional<uint32_t> max_recv_size = limits_.max_recv_size();
219
194
  if (config_from_call_context->max_send_size().has_value() &&
220
195
  (!max_send_size.has_value() ||
221
196
  *config_from_call_context->max_send_size() < *max_send_size)) {
@@ -226,21 +201,28 @@ ArenaPromise<ServerMetadataHandle> ClientMessageSizeFilter::MakeCallPromise(
226
201
  *config_from_call_context->max_recv_size() < *max_recv_size)) {
227
202
  max_recv_size = *config_from_call_context->max_recv_size();
228
203
  }
229
- limits = MessageSizeParsedConfig(max_send_size, max_recv_size);
204
+ limits_ = MessageSizeParsedConfig(max_send_size, max_recv_size);
230
205
  }
206
+ }
207
+
208
+ ServerMetadataHandle ServerMessageSizeFilter::Call::OnClientToServerMessage(
209
+ const Message& message, ServerMessageSizeFilter* filter) {
210
+ return CheckPayload(message, filter->parsed_config_.max_recv_size(), false);
211
+ }
212
+
213
+ ServerMetadataHandle ServerMessageSizeFilter::Call::OnServerToClientMessage(
214
+ const Message& message, ServerMessageSizeFilter* filter) {
215
+ return CheckPayload(message, filter->parsed_config_.max_send_size(), true);
216
+ }
231
217
 
232
- CallBuilder b(limits);
233
- b.AddSend(call_args.client_to_server_messages);
234
- b.AddRecv(call_args.server_to_client_messages);
235
- return b.Run(std::move(call_args), std::move(next_promise_factory));
218
+ ServerMetadataHandle ClientMessageSizeFilter::Call::OnClientToServerMessage(
219
+ const Message& message) {
220
+ return CheckPayload(message, limits_.max_send_size(), true);
236
221
  }
237
222
 
238
- ArenaPromise<ServerMetadataHandle> ServerMessageSizeFilter::MakeCallPromise(
239
- CallArgs call_args, NextPromiseFactory next_promise_factory) {
240
- CallBuilder b(limits());
241
- b.AddSend(call_args.server_to_client_messages);
242
- b.AddRecv(call_args.client_to_server_messages);
243
- return b.Run(std::move(call_args), std::move(next_promise_factory));
223
+ ServerMetadataHandle ClientMessageSizeFilter::Call::OnServerToClientMessage(
224
+ const Message& message) {
225
+ return CheckPayload(message, limits_.max_recv_size(), false);
244
226
  }
245
227
 
246
228
  namespace {
@@ -258,12 +240,10 @@ bool HasMessageSizeLimits(const ChannelArgs& channel_args) {
258
240
  void RegisterMessageSizeFilter(CoreConfiguration::Builder* builder) {
259
241
  MessageSizeParser::Register(builder);
260
242
  builder->channel_init()
261
- ->RegisterFilter(GRPC_CLIENT_SUBCHANNEL,
262
- &ClientMessageSizeFilter::kFilter)
243
+ ->RegisterFilter<ClientMessageSizeFilter>(GRPC_CLIENT_SUBCHANNEL)
263
244
  .ExcludeFromMinimalStack();
264
245
  builder->channel_init()
265
- ->RegisterFilter(GRPC_CLIENT_DIRECT_CHANNEL,
266
- &ClientMessageSizeFilter::kFilter)
246
+ ->RegisterFilter<ClientMessageSizeFilter>(GRPC_CLIENT_DIRECT_CHANNEL)
267
247
  .ExcludeFromMinimalStack()
268
248
  .If(HasMessageSizeLimits)
269
249
  // TODO(ctiller): ordering constraint is here to match the ordering that
@@ -271,7 +251,7 @@ void RegisterMessageSizeFilter(CoreConfiguration::Builder* builder) {
271
251
  // filters from first principles.
272
252
  .Before({&grpc_client_deadline_filter});
273
253
  builder->channel_init()
274
- ->RegisterFilter(GRPC_SERVER_CHANNEL, &ServerMessageSizeFilter::kFilter)
254
+ ->RegisterFilter<ServerMessageSizeFilter>(GRPC_SERVER_CHANNEL)
275
255
  .ExcludeFromMinimalStack()
276
256
  .If(HasMessageSizeLimits)
277
257
  // TODO(ctiller): ordering constraint is here to match the ordering that
@@ -86,48 +86,60 @@ class MessageSizeParser : public ServiceConfigParser::Parser {
86
86
  absl::optional<uint32_t> GetMaxRecvSizeFromChannelArgs(const ChannelArgs& args);
87
87
  absl::optional<uint32_t> GetMaxSendSizeFromChannelArgs(const ChannelArgs& args);
88
88
 
89
- class MessageSizeFilter : public ChannelFilter {
90
- protected:
91
- explicit MessageSizeFilter(const ChannelArgs& args)
92
- : limits_(MessageSizeParsedConfig::GetFromChannelArgs(args)) {}
93
-
94
- class CallBuilder;
95
-
96
- const MessageSizeParsedConfig& limits() const { return limits_; }
97
-
98
- private:
99
- MessageSizeParsedConfig limits_;
100
- };
101
-
102
- class ServerMessageSizeFilter final : public MessageSizeFilter {
89
+ class ServerMessageSizeFilter final
90
+ : public ImplementChannelFilter<ServerMessageSizeFilter> {
103
91
  public:
104
92
  static const grpc_channel_filter kFilter;
105
93
 
106
94
  static absl::StatusOr<ServerMessageSizeFilter> Create(
107
95
  const ChannelArgs& args, ChannelFilter::Args filter_args);
108
96
 
109
- // Construct a promise for one call.
110
- ArenaPromise<ServerMetadataHandle> MakeCallPromise(
111
- CallArgs call_args, NextPromiseFactory next_promise_factory) override;
97
+ class Call {
98
+ public:
99
+ static const NoInterceptor OnClientInitialMetadata;
100
+ static const NoInterceptor OnServerInitialMetadata;
101
+ static const NoInterceptor OnServerTrailingMetadata;
102
+ static const NoInterceptor OnFinalize;
103
+ ServerMetadataHandle OnClientToServerMessage(
104
+ const Message& message, ServerMessageSizeFilter* filter);
105
+ ServerMetadataHandle OnServerToClientMessage(
106
+ const Message& message, ServerMessageSizeFilter* filter);
107
+ };
112
108
 
113
109
  private:
114
- using MessageSizeFilter::MessageSizeFilter;
110
+ explicit ServerMessageSizeFilter(const ChannelArgs& args)
111
+ : parsed_config_(MessageSizeParsedConfig::GetFromChannelArgs(args)) {}
112
+ const MessageSizeParsedConfig parsed_config_;
115
113
  };
116
114
 
117
- class ClientMessageSizeFilter final : public MessageSizeFilter {
115
+ class ClientMessageSizeFilter final
116
+ : public ImplementChannelFilter<ClientMessageSizeFilter> {
118
117
  public:
119
118
  static const grpc_channel_filter kFilter;
120
119
 
121
120
  static absl::StatusOr<ClientMessageSizeFilter> Create(
122
121
  const ChannelArgs& args, ChannelFilter::Args filter_args);
123
122
 
124
- // Construct a promise for one call.
125
- ArenaPromise<ServerMetadataHandle> MakeCallPromise(
126
- CallArgs call_args, NextPromiseFactory next_promise_factory) override;
123
+ class Call {
124
+ public:
125
+ explicit Call(ClientMessageSizeFilter* filter);
126
+
127
+ static const NoInterceptor OnClientInitialMetadata;
128
+ static const NoInterceptor OnServerInitialMetadata;
129
+ static const NoInterceptor OnServerTrailingMetadata;
130
+ static const NoInterceptor OnFinalize;
131
+ ServerMetadataHandle OnClientToServerMessage(const Message& message);
132
+ ServerMetadataHandle OnServerToClientMessage(const Message& message);
133
+
134
+ private:
135
+ MessageSizeParsedConfig limits_;
136
+ };
127
137
 
128
138
  private:
139
+ explicit ClientMessageSizeFilter(const ChannelArgs& args)
140
+ : parsed_config_(MessageSizeParsedConfig::GetFromChannelArgs(args)) {}
129
141
  const size_t service_config_parser_index_{MessageSizeParser::ParserIndex()};
130
- using MessageSizeFilter::MessageSizeFilter;
142
+ const MessageSizeParsedConfig parsed_config_;
131
143
  };
132
144
 
133
145
  } // namespace grpc_core
@@ -43,8 +43,14 @@
43
43
 
44
44
  namespace grpc_core {
45
45
 
46
- ArenaPromise<ServerMetadataHandle> RbacFilter::MakeCallPromise(
47
- CallArgs call_args, NextPromiseFactory next_promise_factory) {
46
+ const NoInterceptor RbacFilter::Call::OnServerInitialMetadata;
47
+ const NoInterceptor RbacFilter::Call::OnServerTrailingMetadata;
48
+ const NoInterceptor RbacFilter::Call::OnClientToServerMessage;
49
+ const NoInterceptor RbacFilter::Call::OnServerToClientMessage;
50
+ const NoInterceptor RbacFilter::Call::OnFinalize;
51
+
52
+ absl::Status RbacFilter::Call::OnClientInitialMetadata(ClientMetadata& md,
53
+ RbacFilter* filter) {
48
54
  // Fetch and apply the rbac policy from the service config.
49
55
  auto* service_config_call_data = static_cast<ServiceConfigCallData*>(
50
56
  GetContext<
@@ -52,21 +58,19 @@ ArenaPromise<ServerMetadataHandle> RbacFilter::MakeCallPromise(
52
58
  .value);
53
59
  auto* method_params = static_cast<RbacMethodParsedConfig*>(
54
60
  service_config_call_data->GetMethodParsedConfig(
55
- service_config_parser_index_));
61
+ filter->service_config_parser_index_));
56
62
  if (method_params == nullptr) {
57
- return Immediate(ServerMetadataFromStatus(
58
- absl::PermissionDeniedError("No RBAC policy found.")));
63
+ return absl::PermissionDeniedError("No RBAC policy found.");
59
64
  } else {
60
- auto* authorization_engine = method_params->authorization_engine(index_);
65
+ auto* authorization_engine =
66
+ method_params->authorization_engine(filter->index_);
61
67
  if (authorization_engine
62
- ->Evaluate(EvaluateArgs(call_args.client_initial_metadata.get(),
63
- &per_channel_evaluate_args_))
68
+ ->Evaluate(EvaluateArgs(&md, &filter->per_channel_evaluate_args_))
64
69
  .type == AuthorizationEngine::Decision::Type::kDeny) {
65
- return Immediate(ServerMetadataFromStatus(
66
- absl::PermissionDeniedError("Unauthorized RPC rejected")));
70
+ return absl::PermissionDeniedError("Unauthorized RPC rejected");
67
71
  }
68
72
  }
69
- return next_promise_factory(std::move(call_args));
73
+ return absl::OkStatus();
70
74
  }
71
75
 
72
76
  const grpc_channel_filter RbacFilter::kFilterVtable =
@@ -34,7 +34,7 @@ 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 : public ChannelFilter {
37
+ class RbacFilter : public ImplementChannelFilter<RbacFilter> {
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
@@ -45,9 +45,16 @@ class RbacFilter : public ChannelFilter {
45
45
  static absl::StatusOr<RbacFilter> Create(const ChannelArgs& args,
46
46
  ChannelFilter::Args filter_args);
47
47
 
48
- // Construct a promise for one call.
49
- ArenaPromise<ServerMetadataHandle> MakeCallPromise(
50
- CallArgs call_args, NextPromiseFactory next_promise_factory) override;
48
+ class Call {
49
+ public:
50
+ absl::Status OnClientInitialMetadata(ClientMetadata& md,
51
+ RbacFilter* filter);
52
+ static const NoInterceptor OnServerInitialMetadata;
53
+ static const NoInterceptor OnServerTrailingMetadata;
54
+ static const NoInterceptor OnClientToServerMessage;
55
+ static const NoInterceptor OnServerToClientMessage;
56
+ static const NoInterceptor OnFinalize;
57
+ };
51
58
 
52
59
  private:
53
60
  RbacFilter(size_t index,