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
@@ -56,6 +56,11 @@
56
56
 
57
57
  namespace grpc_core {
58
58
 
59
+ const NoInterceptor ServerCompressionFilter::Call::OnServerTrailingMetadata;
60
+ const NoInterceptor ServerCompressionFilter::Call::OnFinalize;
61
+ const NoInterceptor ClientCompressionFilter::Call::OnServerTrailingMetadata;
62
+ const NoInterceptor ClientCompressionFilter::Call::OnFinalize;
63
+
59
64
  const grpc_channel_filter ClientCompressionFilter::kFilter =
60
65
  MakePromiseBasedFilter<ClientCompressionFilter, FilterEndpoint::kClient,
61
66
  kFilterExaminesServerInitialMetadata |
@@ -77,7 +82,7 @@ absl::StatusOr<ServerCompressionFilter> ServerCompressionFilter::Create(
77
82
  return ServerCompressionFilter(args);
78
83
  }
79
84
 
80
- CompressionFilter::CompressionFilter(const ChannelArgs& args)
85
+ ChannelCompression::ChannelCompression(const ChannelArgs& args)
81
86
  : max_recv_size_(GetMaxRecvSizeFromChannelArgs(args)),
82
87
  message_size_service_config_parser_index_(
83
88
  MessageSizeParser::ParserIndex()),
@@ -105,7 +110,7 @@ CompressionFilter::CompressionFilter(const ChannelArgs& args)
105
110
  }
106
111
  }
107
112
 
108
- MessageHandle CompressionFilter::CompressMessage(
113
+ MessageHandle ChannelCompression::CompressMessage(
109
114
  MessageHandle message, grpc_compression_algorithm algorithm) const {
110
115
  if (GRPC_TRACE_FLAG_ENABLED(grpc_compression_trace)) {
111
116
  gpr_log(GPR_INFO, "CompressMessage: len=%" PRIdPTR " alg=%d flags=%d",
@@ -163,7 +168,7 @@ MessageHandle CompressionFilter::CompressMessage(
163
168
  return message;
164
169
  }
165
170
 
166
- absl::StatusOr<MessageHandle> CompressionFilter::DecompressMessage(
171
+ absl::StatusOr<MessageHandle> ChannelCompression::DecompressMessage(
167
172
  MessageHandle message, DecompressArgs args) const {
168
173
  if (GRPC_TRACE_FLAG_ENABLED(grpc_compression_trace)) {
169
174
  gpr_log(GPR_INFO, "DecompressMessage: len=%" PRIdPTR " max=%d alg=%d",
@@ -208,7 +213,7 @@ absl::StatusOr<MessageHandle> CompressionFilter::DecompressMessage(
208
213
  return std::move(message);
209
214
  }
210
215
 
211
- grpc_compression_algorithm CompressionFilter::HandleOutgoingMetadata(
216
+ grpc_compression_algorithm ChannelCompression::HandleOutgoingMetadata(
212
217
  grpc_metadata_batch& outgoing_metadata) {
213
218
  const auto algorithm = outgoing_metadata.Take(GrpcInternalEncodingRequest())
214
219
  .value_or(default_compression_algorithm());
@@ -221,7 +226,7 @@ grpc_compression_algorithm CompressionFilter::HandleOutgoingMetadata(
221
226
  return algorithm;
222
227
  }
223
228
 
224
- CompressionFilter::DecompressArgs CompressionFilter::HandleIncomingMetadata(
229
+ ChannelCompression::DecompressArgs ChannelCompression::HandleIncomingMetadata(
225
230
  const grpc_metadata_batch& incoming_metadata) {
226
231
  // Configure max receive size.
227
232
  auto max_recv_message_length = max_recv_size_;
@@ -232,89 +237,59 @@ CompressionFilter::DecompressArgs CompressionFilter::HandleIncomingMetadata(
232
237
  if (limits != nullptr && limits->max_recv_size().has_value() &&
233
238
  (!max_recv_message_length.has_value() ||
234
239
  *limits->max_recv_size() < *max_recv_message_length)) {
235
- max_recv_message_length = *limits->max_recv_size();
240
+ max_recv_message_length = limits->max_recv_size();
236
241
  }
237
242
  return DecompressArgs{incoming_metadata.get(GrpcEncodingMetadata())
238
243
  .value_or(GRPC_COMPRESS_NONE),
239
244
  max_recv_message_length};
240
245
  }
241
246
 
242
- ArenaPromise<ServerMetadataHandle> ClientCompressionFilter::MakeCallPromise(
243
- CallArgs call_args, NextPromiseFactory next_promise_factory) {
244
- auto compression_algorithm =
245
- HandleOutgoingMetadata(*call_args.client_initial_metadata);
246
- call_args.client_to_server_messages->InterceptAndMap(
247
- [compression_algorithm,
248
- this](MessageHandle message) -> absl::optional<MessageHandle> {
249
- return CompressMessage(std::move(message), compression_algorithm);
250
- });
251
- auto* decompress_args = GetContext<Arena>()->New<DecompressArgs>(
252
- DecompressArgs{GRPC_COMPRESS_ALGORITHMS_COUNT, absl::nullopt});
253
- auto* decompress_err =
254
- GetContext<Arena>()->New<Latch<ServerMetadataHandle>>();
255
- call_args.server_initial_metadata->InterceptAndMap(
256
- [decompress_args, this](ServerMetadataHandle server_initial_metadata)
257
- -> absl::optional<ServerMetadataHandle> {
258
- if (server_initial_metadata == nullptr) return absl::nullopt;
259
- *decompress_args = HandleIncomingMetadata(*server_initial_metadata);
260
- return std::move(server_initial_metadata);
261
- });
262
- call_args.server_to_client_messages->InterceptAndMap(
263
- [decompress_err, decompress_args,
264
- this](MessageHandle message) -> absl::optional<MessageHandle> {
265
- auto r = DecompressMessage(std::move(message), *decompress_args);
266
- if (!r.ok()) {
267
- decompress_err->Set(ServerMetadataFromStatus(r.status()));
268
- return absl::nullopt;
269
- }
270
- return std::move(*r);
271
- });
272
- // Run the next filter, and race it with getting an error from decompression.
273
- return PrioritizedRace(decompress_err->Wait(),
274
- next_promise_factory(std::move(call_args)));
247
+ void ClientCompressionFilter::Call::OnClientInitialMetadata(
248
+ ClientMetadata& md, ClientCompressionFilter* filter) {
249
+ compression_algorithm_ =
250
+ filter->compression_engine_.HandleOutgoingMetadata(md);
251
+ }
252
+
253
+ MessageHandle ClientCompressionFilter::Call::OnClientToServerMessage(
254
+ MessageHandle message, ClientCompressionFilter* filter) {
255
+ return filter->compression_engine_.CompressMessage(std::move(message),
256
+ compression_algorithm_);
257
+ }
258
+
259
+ void ClientCompressionFilter::Call::OnServerInitialMetadata(
260
+ ServerMetadata& md, ClientCompressionFilter* filter) {
261
+ decompress_args_ = filter->compression_engine_.HandleIncomingMetadata(md);
262
+ }
263
+
264
+ absl::StatusOr<MessageHandle>
265
+ ClientCompressionFilter::Call::OnServerToClientMessage(
266
+ MessageHandle message, ClientCompressionFilter* filter) {
267
+ return filter->compression_engine_.DecompressMessage(std::move(message),
268
+ decompress_args_);
269
+ }
270
+
271
+ void ServerCompressionFilter::Call::OnClientInitialMetadata(
272
+ ClientMetadata& md, ServerCompressionFilter* filter) {
273
+ decompress_args_ = filter->compression_engine_.HandleIncomingMetadata(md);
274
+ }
275
+
276
+ absl::StatusOr<MessageHandle>
277
+ ServerCompressionFilter::Call::OnClientToServerMessage(
278
+ MessageHandle message, ServerCompressionFilter* filter) {
279
+ return filter->compression_engine_.DecompressMessage(std::move(message),
280
+ decompress_args_);
281
+ }
282
+
283
+ void ServerCompressionFilter::Call::OnServerInitialMetadata(
284
+ ServerMetadata& md, ServerCompressionFilter* filter) {
285
+ compression_algorithm_ =
286
+ filter->compression_engine_.HandleOutgoingMetadata(md);
275
287
  }
276
288
 
277
- ArenaPromise<ServerMetadataHandle> ServerCompressionFilter::MakeCallPromise(
278
- CallArgs call_args, NextPromiseFactory next_promise_factory) {
279
- auto decompress_args =
280
- HandleIncomingMetadata(*call_args.client_initial_metadata);
281
- auto* decompress_err =
282
- GetContext<Arena>()->New<Latch<ServerMetadataHandle>>();
283
- call_args.client_to_server_messages->InterceptAndMap(
284
- [decompress_err, decompress_args,
285
- this](MessageHandle message) -> absl::optional<MessageHandle> {
286
- auto r = DecompressMessage(std::move(message), decompress_args);
287
- if (grpc_call_trace.enabled()) {
288
- gpr_log(GPR_DEBUG, "%s[compression] DecompressMessage returned %s",
289
- Activity::current()->DebugTag().c_str(),
290
- r.status().ToString().c_str());
291
- }
292
- if (!r.ok()) {
293
- decompress_err->Set(ServerMetadataFromStatus(r.status()));
294
- return absl::nullopt;
295
- }
296
- return std::move(*r);
297
- });
298
- auto* compression_algorithm =
299
- GetContext<Arena>()->New<grpc_compression_algorithm>();
300
- call_args.server_initial_metadata->InterceptAndMap(
301
- [this, compression_algorithm](ServerMetadataHandle md) {
302
- if (grpc_call_trace.enabled()) {
303
- gpr_log(GPR_INFO, "%s[compression] Write metadata",
304
- Activity::current()->DebugTag().c_str());
305
- }
306
- // Find the compression algorithm.
307
- *compression_algorithm = HandleOutgoingMetadata(*md);
308
- return md;
309
- });
310
- call_args.server_to_client_messages->InterceptAndMap(
311
- [compression_algorithm,
312
- this](MessageHandle message) -> absl::optional<MessageHandle> {
313
- return CompressMessage(std::move(message), *compression_algorithm);
314
- });
315
- // Run the next filter, and race it with getting an error from decompression.
316
- return PrioritizedRace(decompress_err->Wait(),
317
- next_promise_factory(std::move(call_args)));
289
+ MessageHandle ServerCompressionFilter::Call::OnServerToClientMessage(
290
+ MessageHandle message, ServerCompressionFilter* filter) {
291
+ return filter->compression_engine_.CompressMessage(std::move(message),
292
+ compression_algorithm_);
318
293
  }
319
294
 
320
295
  } // namespace grpc_core
@@ -61,15 +61,15 @@ namespace grpc_core {
61
61
  /// the aforementioned 'grpc-encoding' metadata value, data will pass through
62
62
  /// uncompressed.
63
63
 
64
- class CompressionFilter : public ChannelFilter {
65
- protected:
64
+ class ChannelCompression {
65
+ public:
66
+ explicit ChannelCompression(const ChannelArgs& args);
67
+
66
68
  struct DecompressArgs {
67
69
  grpc_compression_algorithm algorithm;
68
70
  absl::optional<uint32_t> max_recv_message_length;
69
71
  };
70
72
 
71
- explicit CompressionFilter(const ChannelArgs& args);
72
-
73
73
  grpc_compression_algorithm default_compression_algorithm() const {
74
74
  return default_compression_algorithm_;
75
75
  }
@@ -104,7 +104,8 @@ class CompressionFilter : public ChannelFilter {
104
104
  bool enable_decompression_;
105
105
  };
106
106
 
107
- class ClientCompressionFilter final : public CompressionFilter {
107
+ class ClientCompressionFilter final
108
+ : public ImplementChannelFilter<ClientCompressionFilter> {
108
109
  public:
109
110
  static const grpc_channel_filter kFilter;
110
111
 
@@ -112,14 +113,35 @@ class ClientCompressionFilter final : public CompressionFilter {
112
113
  const ChannelArgs& args, ChannelFilter::Args filter_args);
113
114
 
114
115
  // Construct a promise for one call.
115
- ArenaPromise<ServerMetadataHandle> MakeCallPromise(
116
- CallArgs call_args, NextPromiseFactory next_promise_factory) override;
116
+ class Call {
117
+ public:
118
+ void OnClientInitialMetadata(ClientMetadata& md,
119
+ ClientCompressionFilter* filter);
120
+ MessageHandle OnClientToServerMessage(MessageHandle message,
121
+ ClientCompressionFilter* filter);
122
+
123
+ void OnServerInitialMetadata(ServerMetadata& md,
124
+ ClientCompressionFilter* filter);
125
+ absl::StatusOr<MessageHandle> OnServerToClientMessage(
126
+ MessageHandle message, ClientCompressionFilter* filter);
127
+
128
+ static const NoInterceptor OnServerTrailingMetadata;
129
+ static const NoInterceptor OnFinalize;
130
+
131
+ private:
132
+ grpc_compression_algorithm compression_algorithm_;
133
+ ChannelCompression::DecompressArgs decompress_args_;
134
+ };
117
135
 
118
136
  private:
119
- using CompressionFilter::CompressionFilter;
137
+ explicit ClientCompressionFilter(const ChannelArgs& args)
138
+ : compression_engine_(args) {}
139
+
140
+ ChannelCompression compression_engine_;
120
141
  };
121
142
 
122
- class ServerCompressionFilter final : public CompressionFilter {
143
+ class ServerCompressionFilter final
144
+ : public ImplementChannelFilter<ServerCompressionFilter> {
123
145
  public:
124
146
  static const grpc_channel_filter kFilter;
125
147
 
@@ -127,11 +149,31 @@ class ServerCompressionFilter final : public CompressionFilter {
127
149
  const ChannelArgs& args, ChannelFilter::Args filter_args);
128
150
 
129
151
  // Construct a promise for one call.
130
- ArenaPromise<ServerMetadataHandle> MakeCallPromise(
131
- CallArgs call_args, NextPromiseFactory next_promise_factory) override;
152
+ class Call {
153
+ public:
154
+ void OnClientInitialMetadata(ClientMetadata& md,
155
+ ServerCompressionFilter* filter);
156
+ absl::StatusOr<MessageHandle> OnClientToServerMessage(
157
+ MessageHandle message, ServerCompressionFilter* filter);
158
+
159
+ void OnServerInitialMetadata(ServerMetadata& md,
160
+ ServerCompressionFilter* filter);
161
+ MessageHandle OnServerToClientMessage(MessageHandle message,
162
+ ServerCompressionFilter* filter);
163
+
164
+ static const NoInterceptor OnServerTrailingMetadata;
165
+ static const NoInterceptor OnFinalize;
166
+
167
+ private:
168
+ ChannelCompression::DecompressArgs decompress_args_;
169
+ grpc_compression_algorithm compression_algorithm_;
170
+ };
132
171
 
133
172
  private:
134
- using CompressionFilter::CompressionFilter;
173
+ explicit ServerCompressionFilter(const ChannelArgs& args)
174
+ : compression_engine_(args) {}
175
+
176
+ ChannelCompression compression_engine_;
135
177
  };
136
178
 
137
179
  } // namespace grpc_core
@@ -0,0 +1,325 @@
1
+ // Copyright 2022 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include <grpc/support/port_platform.h>
16
+
17
+ #include "src/core/ext/filters/http/message_compress/legacy_compression_filter.h"
18
+
19
+ #include <inttypes.h>
20
+
21
+ #include <functional>
22
+ #include <memory>
23
+ #include <utility>
24
+
25
+ #include "absl/status/status.h"
26
+ #include "absl/strings/str_cat.h"
27
+ #include "absl/strings/str_format.h"
28
+ #include "absl/types/optional.h"
29
+
30
+ #include <grpc/compression.h>
31
+ #include <grpc/grpc.h>
32
+ #include <grpc/impl/channel_arg_names.h>
33
+ #include <grpc/impl/compression_types.h>
34
+ #include <grpc/support/log.h>
35
+
36
+ #include "src/core/ext/filters/message_size/message_size_filter.h"
37
+ #include "src/core/lib/channel/call_tracer.h"
38
+ #include "src/core/lib/channel/channel_args.h"
39
+ #include "src/core/lib/channel/channel_stack.h"
40
+ #include "src/core/lib/channel/context.h"
41
+ #include "src/core/lib/channel/promise_based_filter.h"
42
+ #include "src/core/lib/compression/compression_internal.h"
43
+ #include "src/core/lib/compression/message_compress.h"
44
+ #include "src/core/lib/debug/trace.h"
45
+ #include "src/core/lib/promise/activity.h"
46
+ #include "src/core/lib/promise/context.h"
47
+ #include "src/core/lib/promise/latch.h"
48
+ #include "src/core/lib/promise/pipe.h"
49
+ #include "src/core/lib/promise/prioritized_race.h"
50
+ #include "src/core/lib/resource_quota/arena.h"
51
+ #include "src/core/lib/slice/slice_buffer.h"
52
+ #include "src/core/lib/surface/call.h"
53
+ #include "src/core/lib/surface/call_trace.h"
54
+ #include "src/core/lib/transport/metadata_batch.h"
55
+ #include "src/core/lib/transport/transport.h"
56
+
57
+ namespace grpc_core {
58
+
59
+ const grpc_channel_filter LegacyClientCompressionFilter::kFilter =
60
+ MakePromiseBasedFilter<
61
+ LegacyClientCompressionFilter, FilterEndpoint::kClient,
62
+ kFilterExaminesServerInitialMetadata | kFilterExaminesInboundMessages |
63
+ kFilterExaminesOutboundMessages>("compression");
64
+ const grpc_channel_filter LegacyServerCompressionFilter::kFilter =
65
+ MakePromiseBasedFilter<
66
+ LegacyServerCompressionFilter, FilterEndpoint::kServer,
67
+ kFilterExaminesServerInitialMetadata | kFilterExaminesInboundMessages |
68
+ kFilterExaminesOutboundMessages>("compression");
69
+
70
+ absl::StatusOr<LegacyClientCompressionFilter>
71
+ LegacyClientCompressionFilter::Create(const ChannelArgs& args,
72
+ ChannelFilter::Args) {
73
+ return LegacyClientCompressionFilter(args);
74
+ }
75
+
76
+ absl::StatusOr<LegacyServerCompressionFilter>
77
+ LegacyServerCompressionFilter::Create(const ChannelArgs& args,
78
+ ChannelFilter::Args) {
79
+ return LegacyServerCompressionFilter(args);
80
+ }
81
+
82
+ LegacyCompressionFilter::LegacyCompressionFilter(const ChannelArgs& args)
83
+ : max_recv_size_(GetMaxRecvSizeFromChannelArgs(args)),
84
+ message_size_service_config_parser_index_(
85
+ MessageSizeParser::ParserIndex()),
86
+ default_compression_algorithm_(
87
+ DefaultCompressionAlgorithmFromChannelArgs(args).value_or(
88
+ GRPC_COMPRESS_NONE)),
89
+ enabled_compression_algorithms_(
90
+ CompressionAlgorithmSet::FromChannelArgs(args)),
91
+ enable_compression_(
92
+ args.GetBool(GRPC_ARG_ENABLE_PER_MESSAGE_COMPRESSION).value_or(true)),
93
+ enable_decompression_(
94
+ args.GetBool(GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION)
95
+ .value_or(true)) {
96
+ // Make sure the default is enabled.
97
+ if (!enabled_compression_algorithms_.IsSet(default_compression_algorithm_)) {
98
+ const char* name;
99
+ if (!grpc_compression_algorithm_name(default_compression_algorithm_,
100
+ &name)) {
101
+ name = "<unknown>";
102
+ }
103
+ gpr_log(GPR_ERROR,
104
+ "default compression algorithm %s not enabled: switching to none",
105
+ name);
106
+ default_compression_algorithm_ = GRPC_COMPRESS_NONE;
107
+ }
108
+ }
109
+
110
+ MessageHandle LegacyCompressionFilter::CompressMessage(
111
+ MessageHandle message, grpc_compression_algorithm algorithm) const {
112
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_compression_trace)) {
113
+ gpr_log(GPR_INFO, "CompressMessage: len=%" PRIdPTR " alg=%d flags=%d",
114
+ message->payload()->Length(), algorithm, message->flags());
115
+ }
116
+ auto* call_context = GetContext<grpc_call_context_element>();
117
+ auto* call_tracer = static_cast<CallTracerInterface*>(
118
+ call_context[GRPC_CONTEXT_CALL_TRACER].value);
119
+ if (call_tracer != nullptr) {
120
+ call_tracer->RecordSendMessage(*message->payload());
121
+ }
122
+ // Check if we're allowed to compress this message
123
+ // (apps might want to disable compression for certain messages to avoid
124
+ // crime/beast like vulns).
125
+ uint32_t& flags = message->mutable_flags();
126
+ if (algorithm == GRPC_COMPRESS_NONE || !enable_compression_ ||
127
+ (flags & (GRPC_WRITE_NO_COMPRESS | GRPC_WRITE_INTERNAL_COMPRESS))) {
128
+ return message;
129
+ }
130
+ // Try to compress the payload.
131
+ SliceBuffer tmp;
132
+ SliceBuffer* payload = message->payload();
133
+ bool did_compress = grpc_msg_compress(algorithm, payload->c_slice_buffer(),
134
+ tmp.c_slice_buffer());
135
+ // If we achieved compression send it as compressed, otherwise send it as (to
136
+ // avoid spending cycles on the receiver decompressing).
137
+ if (did_compress) {
138
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_compression_trace)) {
139
+ const char* algo_name;
140
+ const size_t before_size = payload->Length();
141
+ const size_t after_size = tmp.Length();
142
+ const float savings_ratio = 1.0f - static_cast<float>(after_size) /
143
+ static_cast<float>(before_size);
144
+ GPR_ASSERT(grpc_compression_algorithm_name(algorithm, &algo_name));
145
+ gpr_log(GPR_INFO,
146
+ "Compressed[%s] %" PRIuPTR " bytes vs. %" PRIuPTR
147
+ " bytes (%.2f%% savings)",
148
+ algo_name, before_size, after_size, 100 * savings_ratio);
149
+ }
150
+ tmp.Swap(payload);
151
+ flags |= GRPC_WRITE_INTERNAL_COMPRESS;
152
+ if (call_tracer != nullptr) {
153
+ call_tracer->RecordSendCompressedMessage(*message->payload());
154
+ }
155
+ } else {
156
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_compression_trace)) {
157
+ const char* algo_name;
158
+ GPR_ASSERT(grpc_compression_algorithm_name(algorithm, &algo_name));
159
+ gpr_log(GPR_INFO,
160
+ "Algorithm '%s' enabled but decided not to compress. Input size: "
161
+ "%" PRIuPTR,
162
+ algo_name, payload->Length());
163
+ }
164
+ }
165
+ return message;
166
+ }
167
+
168
+ absl::StatusOr<MessageHandle> LegacyCompressionFilter::DecompressMessage(
169
+ MessageHandle message, DecompressArgs args) const {
170
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_compression_trace)) {
171
+ gpr_log(GPR_INFO, "DecompressMessage: len=%" PRIdPTR " max=%d alg=%d",
172
+ message->payload()->Length(),
173
+ args.max_recv_message_length.value_or(-1), args.algorithm);
174
+ }
175
+ auto* call_context = GetContext<grpc_call_context_element>();
176
+ auto* call_tracer = static_cast<CallTracerInterface*>(
177
+ call_context[GRPC_CONTEXT_CALL_TRACER].value);
178
+ if (call_tracer != nullptr) {
179
+ call_tracer->RecordReceivedMessage(*message->payload());
180
+ }
181
+ // Check max message length.
182
+ if (args.max_recv_message_length.has_value() &&
183
+ message->payload()->Length() >
184
+ static_cast<size_t>(*args.max_recv_message_length)) {
185
+ return absl::ResourceExhaustedError(absl::StrFormat(
186
+ "Received message larger than max (%u vs. %d)",
187
+ message->payload()->Length(), *args.max_recv_message_length));
188
+ }
189
+ // Check if decompression is enabled (if not, we can just pass the message
190
+ // up).
191
+ if (!enable_decompression_ ||
192
+ (message->flags() & GRPC_WRITE_INTERNAL_COMPRESS) == 0) {
193
+ return std::move(message);
194
+ }
195
+ // Try to decompress the payload.
196
+ SliceBuffer decompressed_slices;
197
+ if (grpc_msg_decompress(args.algorithm, message->payload()->c_slice_buffer(),
198
+ decompressed_slices.c_slice_buffer()) == 0) {
199
+ return absl::InternalError(
200
+ absl::StrCat("Unexpected error decompressing data for algorithm ",
201
+ CompressionAlgorithmAsString(args.algorithm)));
202
+ }
203
+ // Swap the decompressed slices into the message.
204
+ message->payload()->Swap(&decompressed_slices);
205
+ message->mutable_flags() &= ~GRPC_WRITE_INTERNAL_COMPRESS;
206
+ message->mutable_flags() |= GRPC_WRITE_INTERNAL_TEST_ONLY_WAS_COMPRESSED;
207
+ if (call_tracer != nullptr) {
208
+ call_tracer->RecordReceivedDecompressedMessage(*message->payload());
209
+ }
210
+ return std::move(message);
211
+ }
212
+
213
+ grpc_compression_algorithm LegacyCompressionFilter::HandleOutgoingMetadata(
214
+ grpc_metadata_batch& outgoing_metadata) {
215
+ const auto algorithm = outgoing_metadata.Take(GrpcInternalEncodingRequest())
216
+ .value_or(default_compression_algorithm());
217
+ // Convey supported compression algorithms.
218
+ outgoing_metadata.Set(GrpcAcceptEncodingMetadata(),
219
+ enabled_compression_algorithms());
220
+ if (algorithm != GRPC_COMPRESS_NONE) {
221
+ outgoing_metadata.Set(GrpcEncodingMetadata(), algorithm);
222
+ }
223
+ return algorithm;
224
+ }
225
+
226
+ LegacyCompressionFilter::DecompressArgs
227
+ LegacyCompressionFilter::HandleIncomingMetadata(
228
+ const grpc_metadata_batch& incoming_metadata) {
229
+ // Configure max receive size.
230
+ auto max_recv_message_length = max_recv_size_;
231
+ const MessageSizeParsedConfig* limits =
232
+ MessageSizeParsedConfig::GetFromCallContext(
233
+ GetContext<grpc_call_context_element>(),
234
+ message_size_service_config_parser_index_);
235
+ if (limits != nullptr && limits->max_recv_size().has_value() &&
236
+ (!max_recv_message_length.has_value() ||
237
+ *limits->max_recv_size() < *max_recv_message_length)) {
238
+ max_recv_message_length = *limits->max_recv_size();
239
+ }
240
+ return DecompressArgs{incoming_metadata.get(GrpcEncodingMetadata())
241
+ .value_or(GRPC_COMPRESS_NONE),
242
+ max_recv_message_length};
243
+ }
244
+
245
+ ArenaPromise<ServerMetadataHandle>
246
+ LegacyClientCompressionFilter::MakeCallPromise(
247
+ CallArgs call_args, NextPromiseFactory next_promise_factory) {
248
+ auto compression_algorithm =
249
+ HandleOutgoingMetadata(*call_args.client_initial_metadata);
250
+ call_args.client_to_server_messages->InterceptAndMap(
251
+ [compression_algorithm,
252
+ this](MessageHandle message) -> absl::optional<MessageHandle> {
253
+ return CompressMessage(std::move(message), compression_algorithm);
254
+ });
255
+ auto* decompress_args = GetContext<Arena>()->New<DecompressArgs>(
256
+ DecompressArgs{GRPC_COMPRESS_ALGORITHMS_COUNT, absl::nullopt});
257
+ auto* decompress_err =
258
+ GetContext<Arena>()->New<Latch<ServerMetadataHandle>>();
259
+ call_args.server_initial_metadata->InterceptAndMap(
260
+ [decompress_args, this](ServerMetadataHandle server_initial_metadata)
261
+ -> absl::optional<ServerMetadataHandle> {
262
+ if (server_initial_metadata == nullptr) return absl::nullopt;
263
+ *decompress_args = HandleIncomingMetadata(*server_initial_metadata);
264
+ return std::move(server_initial_metadata);
265
+ });
266
+ call_args.server_to_client_messages->InterceptAndMap(
267
+ [decompress_err, decompress_args,
268
+ this](MessageHandle message) -> absl::optional<MessageHandle> {
269
+ auto r = DecompressMessage(std::move(message), *decompress_args);
270
+ if (!r.ok()) {
271
+ decompress_err->Set(ServerMetadataFromStatus(r.status()));
272
+ return absl::nullopt;
273
+ }
274
+ return std::move(*r);
275
+ });
276
+ // Run the next filter, and race it with getting an error from decompression.
277
+ return PrioritizedRace(decompress_err->Wait(),
278
+ next_promise_factory(std::move(call_args)));
279
+ }
280
+
281
+ ArenaPromise<ServerMetadataHandle>
282
+ LegacyServerCompressionFilter::MakeCallPromise(
283
+ CallArgs call_args, NextPromiseFactory next_promise_factory) {
284
+ auto decompress_args =
285
+ HandleIncomingMetadata(*call_args.client_initial_metadata);
286
+ auto* decompress_err =
287
+ GetContext<Arena>()->New<Latch<ServerMetadataHandle>>();
288
+ call_args.client_to_server_messages->InterceptAndMap(
289
+ [decompress_err, decompress_args,
290
+ this](MessageHandle message) -> absl::optional<MessageHandle> {
291
+ auto r = DecompressMessage(std::move(message), decompress_args);
292
+ if (grpc_call_trace.enabled()) {
293
+ gpr_log(GPR_DEBUG, "%s[compression] DecompressMessage returned %s",
294
+ Activity::current()->DebugTag().c_str(),
295
+ r.status().ToString().c_str());
296
+ }
297
+ if (!r.ok()) {
298
+ decompress_err->Set(ServerMetadataFromStatus(r.status()));
299
+ return absl::nullopt;
300
+ }
301
+ return std::move(*r);
302
+ });
303
+ auto* compression_algorithm =
304
+ GetContext<Arena>()->New<grpc_compression_algorithm>();
305
+ call_args.server_initial_metadata->InterceptAndMap(
306
+ [this, compression_algorithm](ServerMetadataHandle md) {
307
+ if (grpc_call_trace.enabled()) {
308
+ gpr_log(GPR_INFO, "%s[compression] Write metadata",
309
+ Activity::current()->DebugTag().c_str());
310
+ }
311
+ // Find the compression algorithm.
312
+ *compression_algorithm = HandleOutgoingMetadata(*md);
313
+ return md;
314
+ });
315
+ call_args.server_to_client_messages->InterceptAndMap(
316
+ [compression_algorithm,
317
+ this](MessageHandle message) -> absl::optional<MessageHandle> {
318
+ return CompressMessage(std::move(message), *compression_algorithm);
319
+ });
320
+ // Run the next filter, and race it with getting an error from decompression.
321
+ return PrioritizedRace(decompress_err->Wait(),
322
+ next_promise_factory(std::move(call_args)));
323
+ }
324
+
325
+ } // namespace grpc_core