grpc 1.43.1 → 1.44.0.pre2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (382) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +84 -64
  3. data/include/grpc/grpc_security.h +10 -0
  4. data/include/grpc/impl/codegen/compression_types.h +0 -2
  5. data/include/grpc/impl/codegen/grpc_types.h +6 -0
  6. data/src/core/ext/filters/client_channel/backend_metric.h +1 -1
  7. data/src/core/ext/filters/client_channel/client_channel.cc +62 -68
  8. data/src/core/ext/filters/client_channel/client_channel.h +8 -8
  9. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  10. data/src/core/ext/filters/client_channel/config_selector.h +4 -4
  11. data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
  12. data/src/core/ext/filters/client_channel/health/health_check_client.cc +16 -14
  13. data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
  14. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
  15. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +4 -3
  16. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +6 -5
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +3 -7
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +31 -32
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +0 -7
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +1 -1
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -1
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +43 -29
  24. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +6 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +120 -68
  26. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +60 -48
  27. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +62 -61
  28. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +16 -11
  29. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -5
  30. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +19 -15
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -1
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +14 -12
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +3 -2
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +50 -105
  35. data/src/core/ext/filters/client_channel/lb_policy.cc +15 -14
  36. data/src/core/ext/filters/client_channel/lb_policy.h +19 -3
  37. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -3
  38. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +207 -81
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +22 -12
  40. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +19 -15
  41. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +23 -38
  42. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +118 -207
  43. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +25 -32
  44. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  45. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +82 -73
  46. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +10 -10
  47. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +2 -1
  48. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -5
  49. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +5 -5
  50. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +157 -67
  51. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
  52. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +2 -2
  53. data/src/core/ext/filters/client_channel/retry_filter.cc +37 -64
  54. data/src/core/ext/filters/client_channel/retry_service_config.cc +1 -1
  55. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  56. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +1 -1
  57. data/src/core/ext/filters/client_channel/subchannel.cc +12 -16
  58. data/src/core/ext/filters/client_channel/subchannel.h +2 -3
  59. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +37 -48
  60. data/src/core/ext/filters/fault_injection/service_config_parser.cc +6 -8
  61. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +51 -122
  63. data/src/core/ext/filters/http/client_authority_filter.cc +8 -24
  64. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +42 -140
  65. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +5 -25
  66. data/src/core/ext/filters/http/server/http_server_filter.cc +50 -135
  67. data/src/core/ext/filters/message_size/message_size_filter.cc +1 -1
  68. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  69. data/src/core/ext/filters/rbac/rbac_filter.cc +157 -0
  70. data/src/core/ext/filters/rbac/rbac_filter.h +74 -0
  71. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +605 -0
  72. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +70 -0
  73. data/src/core/ext/filters/server_config_selector/server_config_selector.h +3 -2
  74. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +11 -6
  75. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +1 -1
  76. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +1 -1
  77. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +89 -29
  78. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +0 -1
  79. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +45 -186
  80. data/src/core/ext/transport/chttp2/transport/frame_data.cc +0 -1
  81. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +341 -279
  82. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +69 -159
  83. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +1 -1
  84. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +2 -0
  85. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +19 -32
  86. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -1
  87. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +94 -1
  88. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +2 -24
  89. data/src/core/ext/transport/chttp2/transport/internal.h +0 -33
  90. data/src/core/ext/transport/chttp2/transport/parsing.cc +0 -6
  91. data/src/core/ext/transport/chttp2/transport/writing.cc +47 -116
  92. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -4
  93. data/src/core/ext/transport/inproc/inproc_transport.cc +11 -63
  94. data/src/core/ext/transport/inproc/inproc_transport.h +0 -3
  95. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +61 -0
  96. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +146 -0
  97. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +188 -0
  98. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +70 -0
  99. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +56 -0
  100. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h +40 -0
  101. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.c +154 -0
  102. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.h +95 -0
  103. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.c +58 -0
  104. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.h +55 -0
  105. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.c +44 -0
  106. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.h +40 -0
  107. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.c +153 -0
  108. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.h +100 -0
  109. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.c +75 -0
  110. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.h +55 -0
  111. data/src/core/ext/xds/upb_utils.h +65 -0
  112. data/src/core/ext/xds/xds_api.cc +81 -3458
  113. data/src/core/ext/xds/xds_api.h +56 -611
  114. data/src/core/ext/xds/xds_bootstrap.cc +189 -125
  115. data/src/core/ext/xds/xds_bootstrap.h +20 -15
  116. data/src/core/ext/xds/xds_certificate_provider.h +1 -0
  117. data/src/core/ext/xds/xds_channel_creds.cc +108 -0
  118. data/src/core/ext/xds/xds_channel_creds.h +50 -0
  119. data/src/core/ext/xds/xds_client.cc +584 -994
  120. data/src/core/ext/xds/xds_client.h +78 -135
  121. data/src/core/ext/xds/xds_cluster.cc +451 -0
  122. data/src/core/ext/xds/xds_cluster.h +111 -0
  123. data/src/core/ext/xds/xds_common_types.cc +388 -0
  124. data/src/core/ext/xds/xds_common_types.h +110 -0
  125. data/src/core/ext/xds/xds_endpoint.cc +364 -0
  126. data/src/core/ext/xds/xds_endpoint.h +135 -0
  127. data/src/core/ext/xds/xds_http_filters.cc +5 -0
  128. data/src/core/ext/xds/xds_http_rbac_filter.cc +563 -0
  129. data/src/core/ext/xds/xds_http_rbac_filter.h +54 -0
  130. data/src/core/ext/xds/xds_listener.cc +1036 -0
  131. data/src/core/ext/xds/xds_listener.h +220 -0
  132. data/src/core/ext/{transport/chttp2/transport/hpack_utils.h → xds/xds_resource_type.cc} +12 -9
  133. data/src/core/ext/xds/xds_resource_type.h +98 -0
  134. data/src/core/ext/xds/xds_resource_type_impl.h +87 -0
  135. data/src/core/ext/xds/xds_route_config.cc +993 -0
  136. data/src/core/ext/xds/xds_route_config.h +215 -0
  137. data/src/core/ext/xds/xds_routing.cc +11 -8
  138. data/src/core/ext/xds/xds_routing.h +8 -5
  139. data/src/core/ext/xds/xds_server_config_fetcher.cc +159 -99
  140. data/src/core/lib/address_utils/parse_address.cc +20 -0
  141. data/src/core/lib/address_utils/parse_address.h +5 -0
  142. data/src/core/lib/address_utils/sockaddr_utils.cc +33 -36
  143. data/src/core/lib/address_utils/sockaddr_utils.h +1 -16
  144. data/src/core/lib/backoff/backoff.cc +4 -30
  145. data/src/core/lib/backoff/backoff.h +3 -3
  146. data/src/core/lib/channel/channel_args.cc +0 -1
  147. data/src/core/lib/channel/channel_stack.cc +8 -0
  148. data/src/core/lib/channel/channel_stack.h +1 -1
  149. data/src/core/lib/channel/channel_stack_builder.cc +5 -9
  150. data/src/core/lib/channel/channel_stack_builder.h +4 -7
  151. data/src/core/lib/channel/channelz.cc +1 -0
  152. data/src/core/lib/compression/compression.cc +19 -111
  153. data/src/core/lib/compression/compression_internal.cc +142 -202
  154. data/src/core/lib/compression/compression_internal.h +64 -69
  155. data/src/core/lib/compression/message_compress.cc +11 -11
  156. data/src/core/lib/compression/message_compress.h +2 -2
  157. data/src/core/lib/gpr/useful.h +4 -0
  158. data/src/core/lib/gprpp/bitset.h +7 -0
  159. data/src/core/lib/gprpp/chunked_vector.h +45 -3
  160. data/src/core/lib/gprpp/status_helper.cc +20 -28
  161. data/src/core/lib/gprpp/status_helper.h +6 -19
  162. data/src/core/lib/gprpp/table.h +11 -0
  163. data/src/core/lib/http/httpcli.cc +37 -46
  164. data/src/core/lib/http/httpcli.h +3 -15
  165. data/src/core/lib/iomgr/call_combiner.cc +15 -4
  166. data/src/core/lib/iomgr/closure.h +29 -9
  167. data/src/core/lib/iomgr/combiner.cc +25 -3
  168. data/src/core/lib/iomgr/error.cc +2 -0
  169. data/src/core/lib/iomgr/error.h +3 -0
  170. data/src/core/lib/iomgr/event_engine/iomgr.cc +3 -2
  171. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +6 -0
  172. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +2 -0
  173. data/src/core/lib/iomgr/event_engine/resolver.cc +66 -48
  174. data/src/core/lib/iomgr/event_engine/resolver.h +56 -0
  175. data/src/core/lib/iomgr/exec_ctx.cc +22 -9
  176. data/src/core/lib/iomgr/executor.cc +10 -1
  177. data/src/core/lib/iomgr/fork_posix.cc +3 -2
  178. data/src/core/lib/iomgr/iomgr_custom.cc +4 -1
  179. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  180. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
  181. data/src/core/lib/iomgr/iomgr_windows.cc +2 -2
  182. data/src/core/lib/iomgr/port.h +2 -2
  183. data/src/core/lib/iomgr/resolve_address.cc +5 -24
  184. data/src/core/lib/iomgr/resolve_address.h +47 -44
  185. data/src/core/lib/iomgr/resolve_address_custom.cc +131 -109
  186. data/src/core/lib/iomgr/resolve_address_custom.h +101 -19
  187. data/src/core/lib/iomgr/resolve_address_impl.h +59 -0
  188. data/src/core/lib/iomgr/resolve_address_posix.cc +82 -66
  189. data/src/core/lib/iomgr/resolve_address_posix.h +47 -0
  190. data/src/core/lib/iomgr/resolve_address_windows.cc +93 -74
  191. data/src/core/lib/iomgr/resolve_address_windows.h +47 -0
  192. data/src/core/lib/iomgr/resolved_address.h +39 -0
  193. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -0
  194. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +1 -0
  195. data/src/core/lib/iomgr/unix_sockets_posix.cc +22 -34
  196. data/src/core/lib/iomgr/unix_sockets_posix.h +4 -7
  197. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +6 -15
  198. data/src/core/lib/matchers/matchers.cc +1 -1
  199. data/src/core/lib/promise/activity.h +49 -20
  200. data/src/core/lib/promise/detail/status.h +5 -0
  201. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.cc +17 -25
  202. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.h +43 -44
  203. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_factory.h +10 -5
  204. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.cc +3 -2
  205. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.h +4 -5
  206. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.cc +1 -1
  207. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.h +4 -4
  208. data/src/core/lib/resource_quota/api.h +0 -1
  209. data/src/core/lib/{gprpp → resource_quota}/arena.cc +16 -13
  210. data/src/core/lib/{gprpp → resource_quota}/arena.h +24 -13
  211. data/src/core/lib/security/authorization/evaluate_args.cc +30 -15
  212. data/src/core/lib/security/authorization/evaluate_args.h +1 -0
  213. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +60 -0
  214. data/src/core/lib/security/authorization/grpc_authorization_engine.h +62 -0
  215. data/src/core/lib/security/authorization/matchers.cc +227 -0
  216. data/src/core/lib/security/authorization/matchers.h +211 -0
  217. data/src/core/lib/security/authorization/rbac_policy.cc +442 -0
  218. data/src/core/lib/security/authorization/rbac_policy.h +170 -0
  219. data/src/core/lib/security/context/security_context.cc +4 -2
  220. data/src/core/lib/security/context/security_context.h +1 -1
  221. data/src/core/lib/security/credentials/composite/composite_credentials.cc +5 -5
  222. data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -3
  223. data/src/core/lib/security/credentials/credentials.h +10 -20
  224. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +6 -9
  225. data/src/core/lib/security/credentials/external/external_account_credentials.cc +7 -9
  226. data/src/core/lib/security/credentials/external/external_account_credentials.h +2 -7
  227. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -3
  228. data/src/core/lib/security/credentials/fake/fake_credentials.cc +5 -4
  229. data/src/core/lib/security/credentials/fake/fake_credentials.h +8 -7
  230. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +2 -5
  231. data/src/core/lib/security/credentials/iam/iam_credentials.cc +16 -19
  232. data/src/core/lib/security/credentials/iam/iam_credentials.h +6 -5
  233. data/src/core/lib/security/credentials/jwt/json_token.cc +4 -6
  234. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +16 -28
  235. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +8 -8
  236. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +6 -13
  237. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +44 -57
  238. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +13 -15
  239. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -7
  240. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +5 -4
  241. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +1 -10
  242. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +6 -0
  243. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +7 -0
  244. data/src/core/lib/security/credentials/xds/xds_credentials.h +1 -1
  245. data/src/core/lib/security/security_connector/security_connector.cc +0 -4
  246. data/src/core/lib/security/security_connector/security_connector.h +5 -1
  247. data/src/core/lib/security/security_connector/ssl_utils.cc +14 -24
  248. data/src/core/lib/security/security_connector/ssl_utils.h +5 -14
  249. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +2 -3
  250. data/src/core/lib/security/transport/auth_filters.h +7 -0
  251. data/src/core/lib/security/transport/client_auth_filter.cc +53 -33
  252. data/src/core/lib/security/transport/server_auth_filter.cc +40 -35
  253. data/src/core/{ext → lib}/service_config/service_config.cc +2 -2
  254. data/src/core/{ext → lib}/service_config/service_config.h +4 -4
  255. data/src/core/{ext → lib}/service_config/service_config_call_data.h +5 -5
  256. data/src/core/{ext → lib}/service_config/service_config_parser.cc +1 -1
  257. data/src/core/{ext → lib}/service_config/service_config_parser.h +3 -3
  258. data/src/core/lib/slice/slice.cc +3 -1
  259. data/src/core/lib/slice/slice.h +43 -13
  260. data/src/core/lib/slice/slice_intern.cc +3 -101
  261. data/src/core/lib/slice/slice_internal.h +1 -2
  262. data/src/core/lib/slice/slice_refcount.h +4 -13
  263. data/src/core/lib/slice/slice_refcount_base.h +0 -16
  264. data/src/core/lib/surface/call.cc +140 -382
  265. data/src/core/lib/surface/call.h +4 -4
  266. data/src/core/lib/surface/channel.cc +42 -44
  267. data/src/core/lib/surface/channel.h +4 -4
  268. data/src/core/lib/surface/init.cc +0 -2
  269. data/src/core/lib/surface/lame_client.cc +0 -1
  270. data/src/core/lib/surface/server.cc +12 -29
  271. data/src/core/lib/surface/server.h +2 -2
  272. data/src/core/lib/surface/version.cc +2 -2
  273. data/src/core/lib/transport/error_utils.h +14 -0
  274. data/src/core/lib/transport/metadata_batch.h +799 -717
  275. data/src/core/lib/transport/parsed_metadata.cc +2 -0
  276. data/src/core/lib/transport/parsed_metadata.h +95 -92
  277. data/src/core/lib/transport/timeout_encoding.cc +200 -66
  278. data/src/core/lib/transport/timeout_encoding.h +40 -10
  279. data/src/core/lib/transport/transport.h +1 -1
  280. data/src/core/lib/transport/transport_op_string.cc +6 -39
  281. data/src/core/lib/uri/uri_parser.cc +223 -53
  282. data/src/core/lib/uri/uri_parser.h +36 -23
  283. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -3
  284. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  285. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -4
  286. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -5
  287. data/src/core/tsi/ssl_transport_security.cc +53 -13
  288. data/src/core/tsi/ssl_transport_security.h +18 -6
  289. data/src/ruby/ext/grpc/extconf.rb +10 -3
  290. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  291. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
  292. data/src/ruby/lib/grpc/version.rb +1 -1
  293. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -1
  294. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +48 -0
  295. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +200 -0
  296. data/third_party/abseil-cpp/absl/random/beta_distribution.h +427 -0
  297. data/third_party/abseil-cpp/absl/random/discrete_distribution.cc +98 -0
  298. data/third_party/abseil-cpp/absl/random/discrete_distribution.h +247 -0
  299. data/third_party/abseil-cpp/absl/random/distributions.h +452 -0
  300. data/third_party/abseil-cpp/absl/random/exponential_distribution.h +165 -0
  301. data/third_party/abseil-cpp/absl/random/gaussian_distribution.cc +104 -0
  302. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +275 -0
  303. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +92 -0
  304. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +268 -0
  305. data/third_party/abseil-cpp/absl/random/internal/fastmath.h +57 -0
  306. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +144 -0
  307. data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +245 -0
  308. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +150 -0
  309. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +308 -0
  310. data/third_party/abseil-cpp/absl/random/internal/platform.h +171 -0
  311. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +253 -0
  312. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +131 -0
  313. data/third_party/abseil-cpp/absl/random/internal/randen.cc +91 -0
  314. data/third_party/abseil-cpp/absl/random/internal/randen.h +102 -0
  315. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +221 -0
  316. data/third_party/abseil-cpp/absl/random/internal/randen_detect.h +33 -0
  317. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +239 -0
  318. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +526 -0
  319. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h +50 -0
  320. data/third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc +462 -0
  321. data/third_party/abseil-cpp/absl/random/internal/randen_slow.cc +471 -0
  322. data/third_party/abseil-cpp/absl/random/internal/randen_slow.h +40 -0
  323. data/third_party/abseil-cpp/absl/random/internal/randen_traits.h +88 -0
  324. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +167 -0
  325. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +267 -0
  326. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +104 -0
  327. data/third_party/abseil-cpp/absl/random/internal/traits.h +101 -0
  328. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +244 -0
  329. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +111 -0
  330. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +257 -0
  331. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +258 -0
  332. data/third_party/abseil-cpp/absl/random/random.h +189 -0
  333. data/third_party/abseil-cpp/absl/random/seed_gen_exception.cc +46 -0
  334. data/third_party/abseil-cpp/absl/random/seed_gen_exception.h +55 -0
  335. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +29 -0
  336. data/third_party/abseil-cpp/absl/random/seed_sequences.h +110 -0
  337. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +275 -0
  338. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +202 -0
  339. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +271 -0
  340. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -0
  341. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +13 -0
  342. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +21 -0
  343. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +12 -0
  344. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +1 -2
  345. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +2 -2
  346. data/third_party/boringssl-with-bazel/src/crypto/mem.c +1 -1
  347. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +29 -0
  348. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +0 -1
  349. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +1 -1
  350. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  351. data/third_party/boringssl-with-bazel/src/include/openssl/base64.h +8 -0
  352. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +13 -1
  353. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +10 -0
  354. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +1 -1
  355. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +9 -4
  356. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +6 -1
  357. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +23 -2
  358. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +4 -0
  359. data/third_party/xxhash/xxhash.h +607 -352
  360. metadata +149 -77
  361. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +0 -107
  362. data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +0 -46
  363. data/src/core/ext/transport/chttp2/transport/popularity_count.h +0 -60
  364. data/src/core/lib/compression/algorithm_metadata.h +0 -62
  365. data/src/core/lib/compression/compression_args.cc +0 -140
  366. data/src/core/lib/compression/compression_args.h +0 -58
  367. data/src/core/lib/compression/stream_compression.cc +0 -81
  368. data/src/core/lib/compression/stream_compression.h +0 -117
  369. data/src/core/lib/compression/stream_compression_gzip.cc +0 -231
  370. data/src/core/lib/compression/stream_compression_gzip.h +0 -28
  371. data/src/core/lib/compression/stream_compression_identity.cc +0 -91
  372. data/src/core/lib/compression/stream_compression_identity.h +0 -29
  373. data/src/core/lib/security/credentials/credentials_metadata.cc +0 -61
  374. data/src/core/lib/slice/static_slice.cc +0 -377
  375. data/src/core/lib/slice/static_slice.h +0 -300
  376. data/src/core/lib/transport/metadata.cc +0 -714
  377. data/src/core/lib/transport/metadata.h +0 -449
  378. data/src/core/lib/transport/metadata_batch.cc +0 -99
  379. data/src/core/lib/transport/static_metadata.cc +0 -1032
  380. data/src/core/lib/transport/static_metadata.h +0 -322
  381. data/src/core/lib/transport/status_metadata.cc +0 -63
  382. data/src/core/lib/transport/status_metadata.h +0 -48
@@ -39,17 +39,17 @@
39
39
  #include <grpc/support/string_util.h>
40
40
 
41
41
  #include "src/core/lib/channel/channel_stack.h"
42
- #include "src/core/lib/compression/algorithm_metadata.h"
42
+ #include "src/core/lib/compression/compression_internal.h"
43
43
  #include "src/core/lib/debug/stats.h"
44
44
  #include "src/core/lib/gpr/alloc.h"
45
45
  #include "src/core/lib/gpr/string.h"
46
46
  #include "src/core/lib/gpr/time_precise.h"
47
47
  #include "src/core/lib/gpr/useful.h"
48
- #include "src/core/lib/gprpp/arena.h"
49
48
  #include "src/core/lib/gprpp/manual_constructor.h"
50
49
  #include "src/core/lib/gprpp/ref_counted.h"
51
50
  #include "src/core/lib/iomgr/timer.h"
52
51
  #include "src/core/lib/profiling/timers.h"
52
+ #include "src/core/lib/resource_quota/arena.h"
53
53
  #include "src/core/lib/slice/slice_split.h"
54
54
  #include "src/core/lib/slice/slice_string_helpers.h"
55
55
  #include "src/core/lib/slice/slice_utils.h"
@@ -60,9 +60,6 @@
60
60
  #include "src/core/lib/surface/server.h"
61
61
  #include "src/core/lib/surface/validate_metadata.h"
62
62
  #include "src/core/lib/transport/error_utils.h"
63
- #include "src/core/lib/transport/metadata.h"
64
- #include "src/core/lib/transport/static_metadata.h"
65
- #include "src/core/lib/transport/status_metadata.h"
66
63
  #include "src/core/lib/transport/transport.h"
67
64
 
68
65
  /** The maximum number of concurrent batches possible.
@@ -76,11 +73,6 @@
76
73
  - status/close recv (depending on client/server) */
77
74
  #define MAX_CONCURRENT_BATCHES 6
78
75
 
79
- #define MAX_SEND_EXTRA_METADATA_COUNT 3
80
-
81
- // Used to create arena for the first call.
82
- #define ESTIMATED_MDELEM_COUNT 16
83
-
84
76
  struct batch_control {
85
77
  batch_control() = default;
86
78
 
@@ -196,8 +188,6 @@ struct grpc_call {
196
188
  Element 0 is initial metadata, element 1 is trailing metadata. */
197
189
  grpc_metadata_array* buffered_metadata[2] = {};
198
190
 
199
- grpc_metadata compression_md;
200
-
201
191
  // A char* indicating the peer name.
202
192
  gpr_atm peer_string = 0;
203
193
 
@@ -206,24 +196,18 @@ struct grpc_call {
206
196
  grpc_call_final_info final_info;
207
197
 
208
198
  /* Compression algorithm for *incoming* data */
209
- grpc_message_compression_algorithm incoming_message_compression_algorithm =
210
- GRPC_MESSAGE_COMPRESS_NONE;
211
- /* Stream compression algorithm for *incoming* data */
212
- grpc_stream_compression_algorithm incoming_stream_compression_algorithm =
213
- GRPC_STREAM_COMPRESS_NONE;
199
+ grpc_compression_algorithm incoming_compression_algorithm =
200
+ GRPC_COMPRESS_NONE;
214
201
  /* Supported encodings (compression algorithms), a bitset.
215
202
  * Always support no compression. */
216
- uint32_t encodings_accepted_by_peer = 1 << GRPC_MESSAGE_COMPRESS_NONE;
203
+ grpc_core::CompressionAlgorithmSet encodings_accepted_by_peer{
204
+ GRPC_COMPRESS_NONE};
217
205
  /* Supported stream encodings (stream compression algorithms), a bitset */
218
206
  uint32_t stream_encodings_accepted_by_peer = 0;
219
207
 
220
208
  /* Contexts for various subsystems (security, tracing, ...). */
221
209
  grpc_call_context_element context[GRPC_CONTEXT_COUNT] = {};
222
210
 
223
- /* for the client, extra metadata is initial metadata; for the
224
- server, it's trailing metadata */
225
- grpc_linked_mdelem send_extra_metadata[MAX_SEND_EXTRA_METADATA_COUNT];
226
- int send_extra_metadata_count;
227
211
  grpc_millis send_deadline;
228
212
 
229
213
  grpc_core::ManualConstructor<grpc_core::SliceBufferByteStream> sending_stream;
@@ -339,11 +323,10 @@ static parent_call* get_parent_call(grpc_call* call) {
339
323
  }
340
324
 
341
325
  size_t grpc_call_get_initial_size_estimate() {
342
- return sizeof(grpc_call) + sizeof(batch_control) * MAX_CONCURRENT_BATCHES +
343
- sizeof(grpc_linked_mdelem) * ESTIMATED_MDELEM_COUNT;
326
+ return sizeof(grpc_call) + sizeof(batch_control) * MAX_CONCURRENT_BATCHES;
344
327
  }
345
328
 
346
- grpc_error_handle grpc_call_create(const grpc_call_create_args* args,
329
+ grpc_error_handle grpc_call_create(grpc_call_create_args* args,
347
330
  grpc_call** out_call) {
348
331
  GPR_TIMER_SCOPE("grpc_call_create", 0);
349
332
 
@@ -363,7 +346,8 @@ grpc_error_handle grpc_call_create(const grpc_call_create_args* args,
363
346
  call_and_stack_size + (args->parent ? sizeof(child_call) : 0);
364
347
 
365
348
  std::pair<grpc_core::Arena*, void*> arena_with_call =
366
- grpc_core::Arena::CreateWithAlloc(initial_size, call_alloc_size);
349
+ grpc_core::Arena::CreateWithAlloc(initial_size, call_alloc_size,
350
+ &*args->channel->allocator);
367
351
  arena = arena_with_call.first;
368
352
  call = new (arena_with_call.second) grpc_call(arena, *args);
369
353
  *out_call = call;
@@ -373,24 +357,17 @@ grpc_error_handle grpc_call_create(const grpc_call_create_args* args,
373
357
  call->final_op.client.status = nullptr;
374
358
  call->final_op.client.error_string = nullptr;
375
359
  GRPC_STATS_INC_CLIENT_CALLS_CREATED();
376
- GPR_ASSERT(args->add_initial_metadata_count <
377
- MAX_SEND_EXTRA_METADATA_COUNT);
378
- for (size_t i = 0; i < args->add_initial_metadata_count; i++) {
379
- call->send_extra_metadata[i].md = args->add_initial_metadata[i];
380
- if (grpc_slice_eq_static_interned(
381
- GRPC_MDKEY(args->add_initial_metadata[i]), GRPC_MDSTR_PATH)) {
382
- path = grpc_slice_ref_internal(
383
- GRPC_MDVALUE(args->add_initial_metadata[i]));
384
- }
360
+ path = grpc_slice_ref_internal(args->path->c_slice());
361
+ call->send_initial_metadata.Set(grpc_core::HttpPathMetadata(),
362
+ std::move(*args->path));
363
+ if (args->authority.has_value()) {
364
+ call->send_initial_metadata.Set(grpc_core::HttpAuthorityMetadata(),
365
+ std::move(*args->authority));
385
366
  }
386
- call->send_extra_metadata_count =
387
- static_cast<int>(args->add_initial_metadata_count);
388
367
  } else {
389
368
  GRPC_STATS_INC_SERVER_CALLS_CREATED();
390
369
  call->final_op.server.cancelled = nullptr;
391
370
  call->final_op.server.core_server = args->server;
392
- GPR_ASSERT(args->add_initial_metadata_count == 0);
393
- call->send_extra_metadata_count = 0;
394
371
  }
395
372
 
396
373
  grpc_millis send_deadline = args->send_deadline;
@@ -551,9 +528,6 @@ static void destroy_call(void* call, grpc_error_handle /*error*/) {
551
528
  if (pc != nullptr) {
552
529
  pc->~parent_call();
553
530
  }
554
- for (int i = 0; i < c->send_extra_metadata_count; i++) {
555
- GRPC_MDELEM_UNREF(c->send_extra_metadata[i].md);
556
- }
557
531
  if (c->cq) {
558
532
  GRPC_CQ_INTERNAL_UNREF(c->cq, "bind");
559
533
  }
@@ -779,31 +753,9 @@ static void set_final_status(grpc_call* call, grpc_error_handle error) {
779
753
  * COMPRESSION
780
754
  */
781
755
 
782
- static void set_incoming_message_compression_algorithm(
783
- grpc_call* call, grpc_message_compression_algorithm algo) {
784
- GPR_ASSERT(algo < GRPC_MESSAGE_COMPRESS_ALGORITHMS_COUNT);
785
- call->incoming_message_compression_algorithm = algo;
786
- }
787
-
788
- static void set_incoming_stream_compression_algorithm(
789
- grpc_call* call, grpc_stream_compression_algorithm algo) {
790
- GPR_ASSERT(algo < GRPC_STREAM_COMPRESS_ALGORITHMS_COUNT);
791
- call->incoming_stream_compression_algorithm = algo;
792
- }
793
-
794
756
  grpc_compression_algorithm grpc_call_test_only_get_compression_algorithm(
795
757
  grpc_call* call) {
796
- grpc_compression_algorithm algorithm = GRPC_COMPRESS_NONE;
797
- grpc_compression_algorithm_from_message_stream_compression_algorithm(
798
- &algorithm, call->incoming_message_compression_algorithm,
799
- call->incoming_stream_compression_algorithm);
800
- return algorithm;
801
- }
802
-
803
- static grpc_compression_algorithm compression_algorithm_for_level_locked(
804
- grpc_call* call, grpc_compression_level level) {
805
- return grpc_compression_algorithm_for_level(level,
806
- call->encodings_accepted_by_peer);
758
+ return call->incoming_compression_algorithm;
807
759
  }
808
760
 
809
761
  uint32_t grpc_call_test_only_get_message_flags(grpc_call* call) {
@@ -812,188 +764,91 @@ uint32_t grpc_call_test_only_get_message_flags(grpc_call* call) {
812
764
  return flags;
813
765
  }
814
766
 
815
- static void destroy_encodings_accepted_by_peer(void* /*p*/) {}
816
-
817
- static void set_encodings_accepted_by_peer(grpc_call* /*call*/,
818
- grpc_mdelem mdel,
819
- uint32_t* encodings_accepted_by_peer,
820
- bool stream_encoding) {
821
- size_t i;
822
- uint32_t algorithm;
823
- grpc_slice_buffer accept_encoding_parts;
824
- grpc_slice accept_encoding_slice;
825
- void* accepted_user_data;
826
-
827
- accepted_user_data =
828
- grpc_mdelem_get_user_data(mdel, destroy_encodings_accepted_by_peer);
829
- if (accepted_user_data != nullptr) {
830
- *encodings_accepted_by_peer = static_cast<uint32_t>(
831
- reinterpret_cast<uintptr_t>(accepted_user_data) - 1);
832
- return;
833
- }
834
-
835
- *encodings_accepted_by_peer = 0;
836
-
837
- accept_encoding_slice = GRPC_MDVALUE(mdel);
838
- grpc_slice_buffer_init(&accept_encoding_parts);
839
- grpc_slice_split_without_space(accept_encoding_slice, ",",
840
- &accept_encoding_parts);
841
-
842
- grpc_core::SetBit(encodings_accepted_by_peer, GRPC_COMPRESS_NONE);
843
- for (i = 0; i < accept_encoding_parts.count; i++) {
844
- int r;
845
- grpc_slice accept_encoding_entry_slice = accept_encoding_parts.slices[i];
846
- if (!stream_encoding) {
847
- r = grpc_message_compression_algorithm_parse(
848
- accept_encoding_entry_slice,
849
- reinterpret_cast<grpc_message_compression_algorithm*>(&algorithm));
850
- } else {
851
- r = grpc_stream_compression_algorithm_parse(
852
- accept_encoding_entry_slice,
853
- reinterpret_cast<grpc_stream_compression_algorithm*>(&algorithm));
854
- }
855
- if (r) {
856
- grpc_core::SetBit(encodings_accepted_by_peer, algorithm);
857
- } else {
858
- char* accept_encoding_entry_str =
859
- grpc_slice_to_c_string(accept_encoding_entry_slice);
860
- gpr_log(GPR_DEBUG,
861
- "Unknown entry in accept encoding metadata: '%s'. Ignoring.",
862
- accept_encoding_entry_str);
863
- gpr_free(accept_encoding_entry_str);
864
- }
865
- }
866
-
867
- grpc_slice_buffer_destroy_internal(&accept_encoding_parts);
868
-
869
- grpc_mdelem_set_user_data(
870
- mdel, destroy_encodings_accepted_by_peer,
871
- reinterpret_cast<void*>(
872
- static_cast<uintptr_t>(*encodings_accepted_by_peer) + 1));
873
- }
874
-
875
767
  uint32_t grpc_call_test_only_get_encodings_accepted_by_peer(grpc_call* call) {
876
- uint32_t encodings_accepted_by_peer;
877
- encodings_accepted_by_peer = call->encodings_accepted_by_peer;
878
- return encodings_accepted_by_peer;
879
- }
880
-
881
- grpc_stream_compression_algorithm
882
- grpc_call_test_only_get_incoming_stream_encodings(grpc_call* call) {
883
- return call->incoming_stream_compression_algorithm;
884
- }
885
-
886
- static grpc_linked_mdelem* linked_from_md(grpc_metadata* md) {
887
- return reinterpret_cast<grpc_linked_mdelem*>(&md->internal_data);
888
- }
889
-
890
- static grpc_metadata* get_md_elem(grpc_metadata* metadata,
891
- grpc_metadata* additional_metadata, int i,
892
- int count) {
893
- grpc_metadata* res =
894
- i < count ? &metadata[i] : &additional_metadata[i - count];
895
- GPR_ASSERT(res);
896
- return res;
768
+ return call->encodings_accepted_by_peer.ToLegacyBitmask();
897
769
  }
898
770
 
899
771
  static int prepare_application_metadata(grpc_call* call, int count,
900
772
  grpc_metadata* metadata,
901
- int is_trailing,
902
- grpc_metadata* additional_metadata,
903
- int additional_metadata_count) {
904
- int total_count = count + additional_metadata_count;
773
+ int is_trailing) {
905
774
  int i;
906
775
  grpc_metadata_batch* batch = is_trailing ? &call->send_trailing_metadata
907
776
  : &call->send_initial_metadata;
908
- for (i = 0; i < total_count; i++) {
909
- grpc_metadata* md = get_md_elem(metadata, additional_metadata, i, count);
910
- grpc_linked_mdelem* l = linked_from_md(md);
911
- GPR_ASSERT(sizeof(grpc_linked_mdelem) == sizeof(md->internal_data));
777
+ for (i = 0; i < count; i++) {
778
+ grpc_metadata* md = &metadata[i];
912
779
  if (!GRPC_LOG_IF_ERROR("validate_metadata",
913
780
  grpc_validate_header_key_is_legal(md->key))) {
914
- break;
781
+ return 0;
915
782
  } else if (!grpc_is_binary_header_internal(md->key) &&
916
783
  !GRPC_LOG_IF_ERROR(
917
784
  "validate_metadata",
918
785
  grpc_validate_header_nonbin_value_is_legal(md->value))) {
919
- break;
786
+ return 0;
920
787
  } else if (GRPC_SLICE_LENGTH(md->value) >= UINT32_MAX) {
921
788
  // HTTP2 hpack encoding has a maximum limit.
922
- break;
923
- }
924
- l->md = grpc_mdelem_from_grpc_metadata(const_cast<grpc_metadata*>(md));
925
- }
926
- if (i != total_count) {
927
- for (int j = 0; j < i; j++) {
928
- grpc_metadata* md = get_md_elem(metadata, additional_metadata, j, count);
929
- grpc_linked_mdelem* l = linked_from_md(md);
930
- GRPC_MDELEM_UNREF(l->md);
931
- }
932
- return 0;
933
- }
934
- for (i = 0; i < total_count; i++) {
935
- grpc_metadata* md = get_md_elem(metadata, additional_metadata, i, count);
936
- grpc_linked_mdelem* l = linked_from_md(md);
937
- grpc_error_handle error = batch->LinkTail(l);
938
- if (error != GRPC_ERROR_NONE) {
939
- GRPC_MDELEM_UNREF(l->md);
789
+ return 0;
940
790
  }
941
- GRPC_LOG_IF_ERROR("prepare_application_metadata", error);
791
+ batch->Append(
792
+ grpc_core::StringViewFromSlice(md->key),
793
+ grpc_core::Slice(grpc_slice_ref_internal(md->value)),
794
+ [md](absl::string_view error, const grpc_core::Slice& value) {
795
+ gpr_log(
796
+ GPR_DEBUG, "Append error: %s",
797
+ absl::StrCat("key=", grpc_core::StringViewFromSlice(md->key),
798
+ " error=", error, " value=", value.as_string_view())
799
+ .c_str());
800
+ });
942
801
  }
943
802
 
944
803
  return 1;
945
804
  }
946
805
 
947
- static grpc_message_compression_algorithm decode_message_compression(
948
- grpc_mdelem md) {
949
- grpc_message_compression_algorithm algorithm =
950
- grpc_message_compression_algorithm_from_slice(GRPC_MDVALUE(md));
951
- if (algorithm == GRPC_MESSAGE_COMPRESS_ALGORITHMS_COUNT) {
952
- char* md_c_str = grpc_slice_to_c_string(GRPC_MDVALUE(md));
953
- gpr_log(GPR_ERROR,
954
- "Invalid incoming message compression algorithm: '%s'. "
955
- "Interpreting incoming data as uncompressed.",
956
- md_c_str);
957
- gpr_free(md_c_str);
958
- return GRPC_MESSAGE_COMPRESS_NONE;
959
- }
960
- return algorithm;
961
- }
962
-
963
- static grpc_stream_compression_algorithm decode_stream_compression(
964
- grpc_mdelem md) {
965
- grpc_stream_compression_algorithm algorithm =
966
- grpc_stream_compression_algorithm_from_slice(GRPC_MDVALUE(md));
967
- if (algorithm == GRPC_STREAM_COMPRESS_ALGORITHMS_COUNT) {
968
- char* md_c_str = grpc_slice_to_c_string(GRPC_MDVALUE(md));
969
- gpr_log(GPR_ERROR,
970
- "Invalid incoming stream compression algorithm: '%s'. Interpreting "
971
- "incoming data as uncompressed.",
972
- md_c_str);
973
- gpr_free(md_c_str);
974
- return GRPC_STREAM_COMPRESS_NONE;
975
- }
976
- return algorithm;
977
- }
978
-
979
806
  namespace {
980
807
  class PublishToAppEncoder {
981
808
  public:
982
809
  explicit PublishToAppEncoder(grpc_metadata_array* dest) : dest_(dest) {}
983
810
 
984
- void Encode(grpc_mdelem md) { Append(GRPC_MDKEY(md), GRPC_MDVALUE(md)); }
985
-
986
- void Encode(grpc_core::GrpcTimeoutMetadata, grpc_millis) {}
987
- void Encode(grpc_core::TeMetadata, grpc_core::TeMetadata::ValueType) {}
811
+ void Encode(const grpc_core::Slice& key, const grpc_core::Slice& value) {
812
+ Append(key.c_slice(), value.c_slice());
813
+ }
988
814
 
815
+ // Catch anything that is not explicitly handled, and do not publish it to the
816
+ // application. If new metadata is added to a batch that needs to be
817
+ // published, it should be called out here.
989
818
  template <typename Which>
990
- void Encode(Which, const grpc_core::Slice& value) {
991
- const auto key = Which::key();
992
- Append(grpc_core::ExternallyManagedSlice(key.data(), key.length()),
993
- value.c_slice());
819
+ void Encode(Which, const typename Which::ValueType&) {}
820
+
821
+ void Encode(grpc_core::UserAgentMetadata, const grpc_core::Slice& slice) {
822
+ Append(grpc_core::UserAgentMetadata::key(), slice);
823
+ }
824
+
825
+ void Encode(grpc_core::HostMetadata, const grpc_core::Slice& slice) {
826
+ Append(grpc_core::HostMetadata::key(), slice);
827
+ }
828
+
829
+ void Encode(grpc_core::GrpcPreviousRpcAttemptsMetadata, uint32_t count) {
830
+ Append(grpc_core::GrpcPreviousRpcAttemptsMetadata::key(), count);
831
+ }
832
+
833
+ void Encode(grpc_core::GrpcRetryPushbackMsMetadata, grpc_millis count) {
834
+ Append(grpc_core::GrpcRetryPushbackMsMetadata::key(), count);
835
+ }
836
+
837
+ void Encode(grpc_core::LbTokenMetadata, const grpc_core::Slice& slice) {
838
+ Append(grpc_core::LbTokenMetadata::key(), slice);
994
839
  }
995
840
 
996
841
  private:
842
+ void Append(absl::string_view key, int64_t value) {
843
+ Append(grpc_core::StaticSlice::FromStaticString(key).c_slice(),
844
+ grpc_core::Slice::FromInt64(value).c_slice());
845
+ }
846
+
847
+ void Append(absl::string_view key, const grpc_core::Slice& value) {
848
+ Append(grpc_core::StaticSlice::FromStaticString(key).c_slice(),
849
+ value.c_slice());
850
+ }
851
+
997
852
  void Append(grpc_slice key, grpc_slice value) {
998
853
  auto* mdusr = &dest_->metadata[dest_->count++];
999
854
  mdusr->key = key;
@@ -1023,40 +878,11 @@ static void publish_app_metadata(grpc_call* call, grpc_metadata_batch* b,
1023
878
  }
1024
879
 
1025
880
  static void recv_initial_filter(grpc_call* call, grpc_metadata_batch* b) {
1026
- if (b->legacy_index()->named.content_encoding != nullptr) {
1027
- GPR_TIMER_SCOPE("incoming_stream_compression_algorithm", 0);
1028
- set_incoming_stream_compression_algorithm(
1029
- call, decode_stream_compression(
1030
- b->legacy_index()->named.content_encoding->md));
1031
- b->Remove(GRPC_BATCH_CONTENT_ENCODING);
1032
- }
1033
- if (b->legacy_index()->named.grpc_encoding != nullptr) {
1034
- GPR_TIMER_SCOPE("incoming_message_compression_algorithm", 0);
1035
- set_incoming_message_compression_algorithm(
1036
- call,
1037
- decode_message_compression(b->legacy_index()->named.grpc_encoding->md));
1038
- b->Remove(GRPC_BATCH_GRPC_ENCODING);
1039
- }
1040
- uint32_t message_encodings_accepted_by_peer = 1u;
1041
- uint32_t stream_encodings_accepted_by_peer = 1u;
1042
- if (b->legacy_index()->named.grpc_accept_encoding != nullptr) {
1043
- GPR_TIMER_SCOPE("encodings_accepted_by_peer", 0);
1044
- set_encodings_accepted_by_peer(
1045
- call, b->legacy_index()->named.grpc_accept_encoding->md,
1046
- &message_encodings_accepted_by_peer, false);
1047
- b->Remove(GRPC_BATCH_GRPC_ACCEPT_ENCODING);
1048
- }
1049
- if (b->legacy_index()->named.accept_encoding != nullptr) {
1050
- GPR_TIMER_SCOPE("stream_encodings_accepted_by_peer", 0);
1051
- set_encodings_accepted_by_peer(call,
1052
- b->legacy_index()->named.accept_encoding->md,
1053
- &stream_encodings_accepted_by_peer, true);
1054
- b->Remove(GRPC_BATCH_ACCEPT_ENCODING);
1055
- }
881
+ call->incoming_compression_algorithm =
882
+ b->Take(grpc_core::GrpcEncodingMetadata()).value_or(GRPC_COMPRESS_NONE);
1056
883
  call->encodings_accepted_by_peer =
1057
- grpc_compression_bitset_from_message_stream_compression_bitset(
1058
- message_encodings_accepted_by_peer,
1059
- stream_encodings_accepted_by_peer);
884
+ b->Take(grpc_core::GrpcAcceptEncodingMetadata())
885
+ .value_or(grpc_core::CompressionAlgorithmSet{GRPC_COMPRESS_NONE});
1060
886
  publish_app_metadata(call, b, false);
1061
887
  }
1062
888
 
@@ -1065,37 +891,39 @@ static void recv_trailing_filter(void* args, grpc_metadata_batch* b,
1065
891
  grpc_call* call = static_cast<grpc_call*>(args);
1066
892
  if (batch_error != GRPC_ERROR_NONE) {
1067
893
  set_final_status(call, batch_error);
1068
- } else if (b->legacy_index()->named.grpc_status != nullptr) {
1069
- grpc_status_code status_code = grpc_get_status_code_from_metadata(
1070
- b->legacy_index()->named.grpc_status->md);
1071
- grpc_error_handle error = GRPC_ERROR_NONE;
1072
- if (status_code != GRPC_STATUS_OK) {
1073
- char* peer = grpc_call_get_peer(call);
1074
- error = grpc_error_set_int(GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
1075
- "Error received from peer ", peer)),
1076
- GRPC_ERROR_INT_GRPC_STATUS,
1077
- static_cast<intptr_t>(status_code));
1078
- gpr_free(peer);
1079
- }
1080
- auto grpc_message = b->Take(grpc_core::GrpcMessageMetadata());
1081
- if (grpc_message.has_value()) {
1082
- error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE,
1083
- grpc_message->as_string_view());
1084
- } else if (error != GRPC_ERROR_NONE) {
1085
- error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, "");
1086
- }
1087
- set_final_status(call, GRPC_ERROR_REF(error));
1088
- b->Remove(GRPC_BATCH_GRPC_STATUS);
1089
- GRPC_ERROR_UNREF(error);
1090
- } else if (!call->is_client) {
1091
- set_final_status(call, GRPC_ERROR_NONE);
1092
894
  } else {
1093
- gpr_log(GPR_DEBUG,
1094
- "Received trailing metadata with no error and no status");
1095
- set_final_status(
1096
- call, grpc_error_set_int(
1097
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("No status received"),
1098
- GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNKNOWN));
895
+ absl::optional<grpc_status_code> grpc_status =
896
+ b->Take(grpc_core::GrpcStatusMetadata());
897
+ if (grpc_status.has_value()) {
898
+ grpc_status_code status_code = *grpc_status;
899
+ grpc_error_handle error = GRPC_ERROR_NONE;
900
+ if (status_code != GRPC_STATUS_OK) {
901
+ char* peer = grpc_call_get_peer(call);
902
+ error = grpc_error_set_int(
903
+ GRPC_ERROR_CREATE_FROM_CPP_STRING(
904
+ absl::StrCat("Error received from peer ", peer)),
905
+ GRPC_ERROR_INT_GRPC_STATUS, static_cast<intptr_t>(status_code));
906
+ gpr_free(peer);
907
+ }
908
+ auto grpc_message = b->Take(grpc_core::GrpcMessageMetadata());
909
+ if (grpc_message.has_value()) {
910
+ error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE,
911
+ grpc_message->as_string_view());
912
+ } else if (error != GRPC_ERROR_NONE) {
913
+ error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, "");
914
+ }
915
+ set_final_status(call, GRPC_ERROR_REF(error));
916
+ GRPC_ERROR_UNREF(error);
917
+ } else if (!call->is_client) {
918
+ set_final_status(call, GRPC_ERROR_NONE);
919
+ } else {
920
+ gpr_log(GPR_DEBUG,
921
+ "Received trailing metadata with no error and no status");
922
+ set_final_status(
923
+ call, grpc_error_set_int(
924
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("No status received"),
925
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNKNOWN));
926
+ }
1099
927
  }
1100
928
  publish_app_metadata(call, b, true);
1101
929
  }
@@ -1328,15 +1156,9 @@ static void process_data_after_md(batch_control* bctl) {
1328
1156
  } else {
1329
1157
  call->test_only_last_message_flags = call->receiving_stream->flags();
1330
1158
  if ((call->receiving_stream->flags() & GRPC_WRITE_INTERNAL_COMPRESS) &&
1331
- (call->incoming_message_compression_algorithm >
1332
- GRPC_MESSAGE_COMPRESS_NONE)) {
1333
- grpc_compression_algorithm algo;
1334
- GPR_ASSERT(
1335
- grpc_compression_algorithm_from_message_stream_compression_algorithm(
1336
- &algo, call->incoming_message_compression_algorithm,
1337
- (grpc_stream_compression_algorithm)0));
1338
- *call->receiving_buffer =
1339
- grpc_raw_compressed_byte_buffer_create(nullptr, 0, algo);
1159
+ (call->incoming_compression_algorithm != GRPC_COMPRESS_NONE)) {
1160
+ *call->receiving_buffer = grpc_raw_compressed_byte_buffer_create(
1161
+ nullptr, 0, call->incoming_compression_algorithm);
1340
1162
  } else {
1341
1163
  *call->receiving_buffer = grpc_raw_byte_buffer_create(nullptr, 0);
1342
1164
  }
@@ -1377,35 +1199,6 @@ static void receiving_stream_ready_in_call_combiner(void* bctlp,
1377
1199
  receiving_stream_ready(bctlp, error);
1378
1200
  }
1379
1201
 
1380
- static void GPR_ATTRIBUTE_NOINLINE
1381
- handle_both_stream_and_msg_compression_set(grpc_call* call) {
1382
- std::string error_msg = absl::StrFormat(
1383
- "Incoming stream has both stream compression (%d) and message "
1384
- "compression (%d).",
1385
- call->incoming_stream_compression_algorithm,
1386
- call->incoming_message_compression_algorithm);
1387
- gpr_log(GPR_ERROR, "%s", error_msg.c_str());
1388
- cancel_with_status(call, GRPC_STATUS_INTERNAL, error_msg.c_str());
1389
- }
1390
-
1391
- static void GPR_ATTRIBUTE_NOINLINE
1392
- handle_error_parsing_compression_algorithm(grpc_call* call) {
1393
- std::string error_msg = absl::StrFormat(
1394
- "Error in incoming message compression (%d) or stream "
1395
- "compression (%d).",
1396
- call->incoming_stream_compression_algorithm,
1397
- call->incoming_message_compression_algorithm);
1398
- cancel_with_status(call, GRPC_STATUS_INTERNAL, error_msg.c_str());
1399
- }
1400
-
1401
- static void GPR_ATTRIBUTE_NOINLINE handle_invalid_compression(
1402
- grpc_call* call, grpc_compression_algorithm compression_algorithm) {
1403
- std::string error_msg = absl::StrFormat(
1404
- "Invalid compression algorithm value '%d'.", compression_algorithm);
1405
- gpr_log(GPR_ERROR, "%s", error_msg.c_str());
1406
- cancel_with_status(call, GRPC_STATUS_UNIMPLEMENTED, error_msg.c_str());
1407
- }
1408
-
1409
1202
  static void GPR_ATTRIBUTE_NOINLINE handle_compression_algorithm_disabled(
1410
1203
  grpc_call* call, grpc_compression_algorithm compression_algorithm) {
1411
1204
  const char* algo_name = nullptr;
@@ -1421,44 +1214,30 @@ static void GPR_ATTRIBUTE_NOINLINE handle_compression_algorithm_not_accepted(
1421
1214
  const char* algo_name = nullptr;
1422
1215
  grpc_compression_algorithm_name(compression_algorithm, &algo_name);
1423
1216
  gpr_log(GPR_ERROR,
1424
- "Compression algorithm ('%s') not present in the bitset of "
1425
- "accepted encodings ('0x%x')",
1426
- algo_name, call->encodings_accepted_by_peer);
1217
+ "Compression algorithm ('%s') not present in the "
1218
+ "accepted encodings (%s)",
1219
+ algo_name, call->encodings_accepted_by_peer.ToString().c_str());
1427
1220
  }
1428
1221
 
1429
1222
  static void validate_filtered_metadata(batch_control* bctl) {
1430
- grpc_compression_algorithm compression_algorithm;
1431
1223
  grpc_call* call = bctl->call;
1432
- if (GPR_UNLIKELY(call->incoming_stream_compression_algorithm !=
1433
- GRPC_STREAM_COMPRESS_NONE &&
1434
- call->incoming_message_compression_algorithm !=
1435
- GRPC_MESSAGE_COMPRESS_NONE)) {
1436
- handle_both_stream_and_msg_compression_set(call);
1437
- } else if (
1438
- GPR_UNLIKELY(
1439
- grpc_compression_algorithm_from_message_stream_compression_algorithm(
1440
- &compression_algorithm,
1441
- call->incoming_message_compression_algorithm,
1442
- call->incoming_stream_compression_algorithm) == 0)) {
1443
- handle_error_parsing_compression_algorithm(call);
1444
- } else {
1445
- const grpc_compression_options compression_options =
1446
- grpc_channel_compression_options(call->channel);
1447
- if (GPR_UNLIKELY(compression_algorithm >= GRPC_COMPRESS_ALGORITHMS_COUNT)) {
1448
- handle_invalid_compression(call, compression_algorithm);
1449
- } else if (GPR_UNLIKELY(
1450
- grpc_compression_options_is_algorithm_enabled_internal(
1451
- &compression_options, compression_algorithm) == 0)) {
1452
- /* check if algorithm is supported by current channel config */
1453
- handle_compression_algorithm_disabled(call, compression_algorithm);
1454
- }
1455
- /* GRPC_COMPRESS_NONE is always set. */
1456
- GPR_DEBUG_ASSERT(call->encodings_accepted_by_peer != 0);
1457
- if (GPR_UNLIKELY(!grpc_core::GetBit(call->encodings_accepted_by_peer,
1458
- compression_algorithm))) {
1459
- if (GRPC_TRACE_FLAG_ENABLED(grpc_compression_trace)) {
1460
- handle_compression_algorithm_not_accepted(call, compression_algorithm);
1461
- }
1224
+
1225
+ const grpc_compression_options compression_options =
1226
+ grpc_channel_compression_options(call->channel);
1227
+ const grpc_compression_algorithm compression_algorithm =
1228
+ call->incoming_compression_algorithm;
1229
+ if (GPR_UNLIKELY(!grpc_core::CompressionAlgorithmSet::FromUint32(
1230
+ compression_options.enabled_algorithms_bitset)
1231
+ .IsSet(compression_algorithm))) {
1232
+ /* check if algorithm is supported by current channel config */
1233
+ handle_compression_algorithm_disabled(call, compression_algorithm);
1234
+ }
1235
+ /* GRPC_COMPRESS_NONE is always set. */
1236
+ GPR_DEBUG_ASSERT(call->encodings_accepted_by_peer.IsSet(GRPC_COMPRESS_NONE));
1237
+ if (GPR_UNLIKELY(
1238
+ !call->encodings_accepted_by_peer.IsSet(compression_algorithm))) {
1239
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_compression_trace)) {
1240
+ handle_compression_algorithm_not_accepted(call, compression_algorithm);
1462
1241
  }
1463
1242
  }
1464
1243
  }
@@ -1623,10 +1402,6 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
1623
1402
  // GRPC_COMPRESSION_REQUEST_ALGORITHM_MD_KEY, we shouldn't override that
1624
1403
  // with the compression algorithm mapped from compression level.
1625
1404
  /* process compression level */
1626
- grpc_metadata& compression_md = call->compression_md;
1627
- compression_md.key = grpc_empty_slice();
1628
- compression_md.value = grpc_empty_slice();
1629
- size_t additional_metadata_count = 0;
1630
1405
  grpc_compression_level effective_compression_level =
1631
1406
  GRPC_COMPRESS_LEVEL_NONE;
1632
1407
  bool level_set = false;
@@ -1645,36 +1420,23 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
1645
1420
  // Currently, only server side supports compression level setting.
1646
1421
  if (level_set && !call->is_client) {
1647
1422
  const grpc_compression_algorithm calgo =
1648
- compression_algorithm_for_level_locked(
1649
- call, effective_compression_level);
1423
+ call->encodings_accepted_by_peer.CompressionAlgorithmForLevel(
1424
+ effective_compression_level);
1650
1425
  // The following metadata will be checked and removed by the message
1651
1426
  // compression filter. It will be used as the call's compression
1652
1427
  // algorithm.
1653
- compression_md.key = GRPC_MDSTR_GRPC_INTERNAL_ENCODING_REQUEST;
1654
- compression_md.value = grpc_compression_algorithm_slice(calgo);
1655
- additional_metadata_count++;
1428
+ call->send_initial_metadata.Set(
1429
+ grpc_core::GrpcInternalEncodingRequest(), calgo);
1656
1430
  }
1657
- if (op->data.send_initial_metadata.count + additional_metadata_count >
1658
- INT_MAX) {
1431
+ if (op->data.send_initial_metadata.count > INT_MAX) {
1659
1432
  error = GRPC_CALL_ERROR_INVALID_METADATA;
1660
1433
  goto done_with_error;
1661
1434
  }
1662
1435
  stream_op->send_initial_metadata = true;
1663
1436
  call->sent_initial_metadata = true;
1664
- if (call->is_client) {
1665
- // TODO(ctiller): this will turn into explicit Set() calls once we
1666
- // migrate :path, :authority.
1667
- for (int i = 0; i < call->send_extra_metadata_count; i++) {
1668
- GRPC_LOG_IF_ERROR("prepare_client_metadata",
1669
- call->send_initial_metadata.LinkTail(
1670
- &call->send_extra_metadata[i]));
1671
- }
1672
- call->send_extra_metadata_count = 0;
1673
- }
1674
1437
  if (!prepare_application_metadata(
1675
1438
  call, static_cast<int>(op->data.send_initial_metadata.count),
1676
- op->data.send_initial_metadata.metadata, 0, &compression_md,
1677
- static_cast<int>(additional_metadata_count))) {
1439
+ op->data.send_initial_metadata.metadata, 0)) {
1678
1440
  error = GRPC_CALL_ERROR_INVALID_METADATA;
1679
1441
  goto done_with_error;
1680
1442
  }
@@ -1771,8 +1533,7 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
1771
1533
  call,
1772
1534
  static_cast<int>(
1773
1535
  op->data.send_status_from_server.trailing_metadata_count),
1774
- op->data.send_status_from_server.trailing_metadata, 1, nullptr,
1775
- 0)) {
1536
+ op->data.send_status_from_server.trailing_metadata, 1)) {
1776
1537
  error = GRPC_CALL_ERROR_INVALID_METADATA;
1777
1538
  goto done_with_error;
1778
1539
  }
@@ -1802,10 +1563,9 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
1802
1563
  call->status_error.set(status_error);
1803
1564
  GRPC_ERROR_UNREF(status_error);
1804
1565
 
1805
- GRPC_LOG_IF_ERROR(
1806
- "set call status",
1807
- call->send_trailing_metadata.Append(grpc_get_reffed_status_elem(
1808
- op->data.send_status_from_server.status)));
1566
+ call->send_trailing_metadata.Set(
1567
+ grpc_core::GrpcStatusMetadata(),
1568
+ op->data.send_status_from_server.status);
1809
1569
 
1810
1570
  stream_op_payload->send_trailing_metadata.send_trailing_metadata =
1811
1571
  &call->send_trailing_metadata;
@@ -2028,9 +1788,7 @@ uint8_t grpc_call_is_client(grpc_call* call) { return call->is_client; }
2028
1788
 
2029
1789
  grpc_compression_algorithm grpc_call_compression_for_level(
2030
1790
  grpc_call* call, grpc_compression_level level) {
2031
- grpc_compression_algorithm algo =
2032
- compression_algorithm_for_level_locked(call, level);
2033
- return algo;
1791
+ return call->encodings_accepted_by_peer.CompressionAlgorithmForLevel(level);
2034
1792
  }
2035
1793
 
2036
1794
  bool grpc_call_is_trailers_only(const grpc_call* call) {