grpc 1.60.2 → 1.61.0.pre2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +208 -165
  3. data/include/grpc/event_engine/event_engine.h +59 -12
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +6 -0
  5. data/include/grpc/event_engine/internal/slice_cast.h +12 -0
  6. data/include/grpc/event_engine/memory_allocator.h +3 -1
  7. data/include/grpc/event_engine/slice.h +5 -0
  8. data/include/grpc/grpc_security.h +22 -1
  9. data/include/grpc/impl/call.h +29 -0
  10. data/include/grpc/impl/channel_arg_names.h +12 -1
  11. data/include/grpc/impl/slice_type.h +1 -1
  12. data/include/grpc/module.modulemap +1 -0
  13. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +54 -7
  14. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +20 -6
  15. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +10 -13
  16. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +18 -10
  17. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +326 -0
  18. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +143 -0
  19. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -2
  20. data/src/core/ext/filters/client_channel/client_channel.cc +32 -6
  21. data/src/core/ext/filters/client_channel/client_channel_internal.h +2 -0
  22. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +54 -21
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +3 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +2 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.cc +12 -15
  27. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.h +8 -5
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +139 -92
  29. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +9 -4
  30. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +9 -4
  31. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +10 -11
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +94 -93
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +5 -3
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +12 -15
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +38 -16
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +25 -28
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +10 -10
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +37 -35
  39. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -9
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +504 -461
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +232 -122
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -6
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +642 -251
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +2 -6
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +7 -8
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +2 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +3 -1
  48. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
  49. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -2
  50. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +6 -8
  51. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.cc +1031 -0
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.h +277 -0
  53. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +128 -270
  54. data/src/core/ext/filters/client_channel/resolver/xds/{xds_resolver.h → xds_resolver_attributes.h} +5 -4
  55. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.cc +25 -0
  56. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.h +30 -0
  57. data/src/core/ext/filters/client_channel/retry_filter.cc +1 -0
  58. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +35 -17
  59. data/src/core/ext/filters/deadline/deadline_filter.cc +12 -0
  60. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +17 -13
  61. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +13 -4
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +23 -32
  63. data/src/core/ext/filters/http/client/http_client_filter.h +10 -5
  64. data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
  65. data/src/core/ext/filters/http/client_authority_filter.h +12 -4
  66. data/src/core/ext/filters/http/http_filters_plugin.cc +42 -20
  67. data/src/core/ext/filters/http/message_compress/compression_filter.cc +55 -80
  68. data/src/core/ext/filters/http/message_compress/compression_filter.h +54 -12
  69. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.cc +325 -0
  70. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.h +139 -0
  71. data/src/core/ext/filters/http/server/http_server_filter.cc +41 -41
  72. data/src/core/ext/filters/http/server/http_server_filter.h +11 -4
  73. data/src/core/ext/filters/message_size/message_size_filter.cc +56 -76
  74. data/src/core/ext/filters/message_size/message_size_filter.h +35 -23
  75. data/src/core/ext/filters/rbac/rbac_filter.cc +15 -11
  76. data/src/core/ext/filters/rbac/rbac_filter.h +11 -4
  77. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +25 -13
  78. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +47 -50
  79. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +21 -4
  80. data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
  81. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
  82. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +11 -2
  83. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +68 -145
  84. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -3
  85. data/src/core/ext/transport/chttp2/transport/flow_control.cc +21 -82
  86. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -8
  87. data/src/core/ext/transport/chttp2/transport/frame.cc +506 -0
  88. data/src/core/ext/transport/chttp2/transport/frame.h +214 -0
  89. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -1
  90. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +33 -79
  91. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -7
  92. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -36
  93. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -2
  94. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +122 -32
  95. data/src/core/ext/transport/chttp2/transport/http2_settings.h +142 -37
  96. data/src/core/ext/transport/chttp2/transport/internal.h +1 -22
  97. data/src/core/ext/transport/chttp2/transport/parsing.cc +23 -37
  98. data/src/core/ext/transport/chttp2/transport/writing.cc +26 -58
  99. data/src/core/ext/transport/inproc/inproc_transport.cc +172 -13
  100. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +712 -0
  101. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +151 -0
  102. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +33 -0
  103. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +133 -0
  104. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +50 -0
  105. data/src/core/ext/xds/certificate_provider_store.cc +2 -1
  106. data/src/core/ext/xds/certificate_provider_store.h +0 -5
  107. data/src/core/ext/xds/xds_api.cc +31 -18
  108. data/src/core/ext/xds/xds_api.h +2 -2
  109. data/src/core/ext/xds/xds_bootstrap.h +3 -0
  110. data/src/core/ext/xds/xds_certificate_provider.cc +88 -287
  111. data/src/core/ext/xds/xds_certificate_provider.h +44 -111
  112. data/src/core/ext/xds/xds_client.cc +420 -414
  113. data/src/core/ext/xds/xds_client.h +31 -22
  114. data/src/core/ext/xds/xds_client_grpc.cc +3 -1
  115. data/src/core/ext/xds/xds_cluster.cc +104 -11
  116. data/src/core/ext/xds/xds_cluster.h +9 -1
  117. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +9 -5
  118. data/src/core/ext/xds/xds_common_types.cc +14 -10
  119. data/src/core/ext/xds/xds_endpoint.cc +9 -4
  120. data/src/core/ext/xds/xds_endpoint.h +5 -1
  121. data/src/core/ext/xds/xds_health_status.cc +12 -2
  122. data/src/core/ext/xds/xds_health_status.h +4 -2
  123. data/src/core/ext/xds/xds_http_rbac_filter.cc +5 -3
  124. data/src/core/ext/xds/xds_listener.cc +14 -8
  125. data/src/core/ext/xds/xds_resource_type_impl.h +6 -4
  126. data/src/core/ext/xds/xds_route_config.cc +34 -22
  127. data/src/core/ext/xds/xds_route_config.h +1 -0
  128. data/src/core/ext/xds/xds_server_config_fetcher.cc +61 -57
  129. data/src/core/ext/xds/xds_transport.h +3 -0
  130. data/src/core/ext/xds/xds_transport_grpc.cc +47 -50
  131. data/src/core/ext/xds/xds_transport_grpc.h +4 -0
  132. data/src/core/lib/channel/call_tracer.cc +12 -0
  133. data/src/core/lib/channel/call_tracer.h +17 -3
  134. data/src/core/lib/channel/channel_args.cc +24 -14
  135. data/src/core/lib/channel/channel_args.h +74 -13
  136. data/src/core/lib/channel/channel_stack.cc +27 -0
  137. data/src/core/lib/channel/channel_stack.h +10 -10
  138. data/src/core/lib/channel/connected_channel.cc +64 -18
  139. data/src/core/lib/channel/promise_based_filter.h +1041 -1
  140. data/src/core/lib/channel/server_call_tracer_filter.cc +43 -35
  141. data/src/core/lib/compression/compression_internal.cc +0 -3
  142. data/src/core/lib/event_engine/ares_resolver.cc +35 -14
  143. data/src/core/lib/event_engine/ares_resolver.h +9 -10
  144. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +8 -1
  145. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +132 -0
  146. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +61 -0
  147. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +52 -36
  148. data/src/core/lib/event_engine/posix_engine/posix_engine.h +4 -9
  149. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +11 -3
  150. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +9 -2
  151. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +7 -0
  152. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +17 -27
  153. data/src/core/lib/event_engine/posix_engine/timer_manager.h +0 -3
  154. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +55 -0
  155. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +114 -0
  156. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.h +51 -0
  157. data/src/core/lib/event_engine/windows/windows_engine.cc +7 -7
  158. data/src/core/lib/experiments/config.cc +13 -0
  159. data/src/core/lib/experiments/config.h +3 -0
  160. data/src/core/lib/experiments/experiments.cc +245 -366
  161. data/src/core/lib/experiments/experiments.h +50 -156
  162. data/src/core/lib/gprpp/debug_location.h +13 -0
  163. data/src/core/lib/gprpp/dual_ref_counted.h +36 -7
  164. data/src/core/lib/gprpp/orphanable.h +27 -0
  165. data/src/core/lib/gprpp/ref_counted.h +63 -22
  166. data/src/core/lib/gprpp/ref_counted_ptr.h +70 -27
  167. data/src/core/lib/gprpp/ref_counted_string.h +13 -0
  168. data/src/core/lib/gprpp/status_helper.cc +1 -2
  169. data/src/core/lib/iomgr/combiner.cc +15 -51
  170. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +31 -0
  171. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +16 -0
  172. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -3
  173. data/src/core/lib/load_balancing/lb_policy.h +1 -1
  174. data/src/core/lib/promise/activity.cc +17 -2
  175. data/src/core/lib/promise/activity.h +5 -4
  176. data/src/core/lib/promise/all_ok.h +80 -0
  177. data/src/core/lib/promise/detail/join_state.h +2077 -0
  178. data/src/core/lib/promise/detail/promise_factory.h +1 -0
  179. data/src/core/lib/promise/detail/promise_like.h +8 -1
  180. data/src/core/lib/promise/detail/seq_state.h +3458 -150
  181. data/src/core/lib/promise/detail/status.h +42 -5
  182. data/src/core/lib/promise/for_each.h +13 -1
  183. data/src/core/lib/promise/if.h +4 -0
  184. data/src/core/lib/promise/latch.h +6 -3
  185. data/src/core/lib/promise/party.cc +33 -31
  186. data/src/core/lib/promise/party.h +142 -6
  187. data/src/core/lib/promise/poll.h +39 -13
  188. data/src/core/lib/promise/promise.h +4 -0
  189. data/src/core/lib/promise/seq.h +107 -7
  190. data/src/core/lib/promise/status_flag.h +196 -0
  191. data/src/core/lib/promise/try_join.h +132 -0
  192. data/src/core/lib/promise/try_seq.h +132 -10
  193. data/src/core/lib/resolver/endpoint_addresses.cc +0 -1
  194. data/src/core/lib/resolver/endpoint_addresses.h +48 -0
  195. data/src/core/lib/resource_quota/arena.h +2 -2
  196. data/src/core/lib/resource_quota/memory_quota.cc +57 -8
  197. data/src/core/lib/resource_quota/memory_quota.h +6 -0
  198. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +14 -11
  199. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +14 -5
  200. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -0
  201. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +4 -0
  202. data/src/core/lib/security/credentials/external/external_account_credentials.cc +28 -20
  203. data/src/core/lib/security/credentials/external/external_account_credentials.h +4 -0
  204. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +4 -0
  205. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -0
  206. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -0
  207. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +4 -0
  208. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -1
  209. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +0 -3
  210. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +12 -0
  211. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +22 -5
  212. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.h +1 -5
  213. data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -0
  214. data/src/core/lib/security/credentials/xds/xds_credentials.cc +21 -28
  215. data/src/core/lib/security/credentials/xds/xds_credentials.h +2 -4
  216. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -3
  217. data/src/core/lib/security/transport/auth_filters.h +71 -4
  218. data/src/core/lib/security/transport/client_auth_filter.cc +2 -4
  219. data/src/core/lib/security/transport/legacy_server_auth_filter.cc +244 -0
  220. data/src/core/lib/security/transport/server_auth_filter.cc +70 -90
  221. data/src/core/lib/slice/slice_buffer.h +3 -0
  222. data/src/core/lib/surface/builtins.cc +1 -1
  223. data/src/core/lib/surface/call.cc +683 -196
  224. data/src/core/lib/surface/call.h +26 -13
  225. data/src/core/lib/surface/call_trace.cc +42 -1
  226. data/src/core/lib/surface/channel.cc +0 -1
  227. data/src/core/lib/surface/channel.h +0 -6
  228. data/src/core/lib/surface/channel_init.h +26 -0
  229. data/src/core/lib/surface/init.cc +14 -8
  230. data/src/core/lib/surface/server.cc +256 -237
  231. data/src/core/lib/surface/server.h +26 -54
  232. data/src/core/lib/surface/version.cc +2 -2
  233. data/src/core/lib/surface/wait_for_cq_end_op.h +94 -0
  234. data/src/core/lib/transport/call_final_info.cc +38 -0
  235. data/src/core/lib/transport/call_final_info.h +54 -0
  236. data/src/core/lib/transport/connectivity_state.cc +3 -2
  237. data/src/core/lib/transport/connectivity_state.h +4 -0
  238. data/src/core/lib/transport/metadata_batch.h +4 -4
  239. data/src/core/lib/transport/transport.cc +70 -19
  240. data/src/core/lib/transport/transport.h +395 -25
  241. data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -0
  242. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +0 -3
  243. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  244. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  245. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  246. data/src/core/tsi/ssl_transport_security.cc +65 -43
  247. data/src/ruby/ext/grpc/rb_channel_args.c +3 -1
  248. data/src/ruby/ext/grpc/rb_grpc.c +0 -1
  249. data/src/ruby/ext/grpc/rb_grpc.h +0 -2
  250. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  251. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  252. data/src/ruby/lib/grpc/version.rb +1 -1
  253. data/third_party/upb/upb/reflection/def_pool.h +2 -2
  254. data/third_party/zlib/adler32.c +5 -27
  255. data/third_party/zlib/compress.c +5 -16
  256. data/third_party/zlib/crc32.c +86 -162
  257. data/third_party/zlib/deflate.c +233 -336
  258. data/third_party/zlib/deflate.h +8 -8
  259. data/third_party/zlib/gzguts.h +11 -12
  260. data/third_party/zlib/infback.c +7 -23
  261. data/third_party/zlib/inffast.c +1 -4
  262. data/third_party/zlib/inffast.h +1 -1
  263. data/third_party/zlib/inflate.c +30 -99
  264. data/third_party/zlib/inftrees.c +6 -11
  265. data/third_party/zlib/inftrees.h +3 -3
  266. data/third_party/zlib/trees.c +224 -302
  267. data/third_party/zlib/uncompr.c +4 -12
  268. data/third_party/zlib/zconf.h +6 -2
  269. data/third_party/zlib/zlib.h +191 -188
  270. data/third_party/zlib/zutil.c +16 -44
  271. data/third_party/zlib/zutil.h +10 -10
  272. metadata +35 -13
  273. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +0 -1173
  274. data/src/core/lib/event_engine/memory_allocator.cc +0 -74
  275. data/src/core/lib/transport/pid_controller.cc +0 -51
  276. data/src/core/lib/transport/pid_controller.h +0 -116
  277. data/third_party/upb/upb/collections/array.h +0 -17
  278. data/third_party/upb/upb/collections/map.h +0 -17
  279. data/third_party/upb/upb/upb.hpp +0 -18
@@ -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