grpc 1.60.2 → 1.61.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
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,