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,7 +39,6 @@
39
39
  #include "src/core/lib/slice/percent_encoding.h"
40
40
  #include "src/core/lib/slice/slice_internal.h"
41
41
  #include "src/core/lib/slice/slice_string_helpers.h"
42
- #include "src/core/lib/transport/static_metadata.h"
43
42
  #include "src/core/lib/transport/status_conversion.h"
44
43
  #include "src/core/lib/transport/transport_impl.h"
45
44
 
@@ -75,10 +74,6 @@ struct call_data {
75
74
  ~call_data() { GRPC_ERROR_UNREF(recv_initial_metadata_error); }
76
75
 
77
76
  grpc_core::CallCombiner* call_combiner;
78
- // State for handling send_initial_metadata ops.
79
- grpc_linked_mdelem method;
80
- grpc_linked_mdelem scheme;
81
- grpc_linked_mdelem content_type;
82
77
  // State for handling recv_initial_metadata ops.
83
78
  grpc_metadata_batch* recv_initial_metadata;
84
79
  grpc_error_handle recv_initial_metadata_error = GRPC_ERROR_NONE;
@@ -102,7 +97,7 @@ struct call_data {
102
97
  };
103
98
 
104
99
  struct channel_data {
105
- grpc_mdelem static_scheme;
100
+ grpc_core::HttpSchemeMetadata::ValueType static_scheme;
106
101
  grpc_core::Slice user_agent;
107
102
  size_t max_payload_size_for_get;
108
103
  };
@@ -110,30 +105,27 @@ struct channel_data {
110
105
 
111
106
  static grpc_error_handle client_filter_incoming_metadata(
112
107
  grpc_metadata_batch* b) {
113
- if (b->legacy_index()->named.status != nullptr) {
108
+ if (auto* status = b->get_pointer(grpc_core::HttpStatusMetadata())) {
114
109
  /* If both gRPC status and HTTP status are provided in the response, we
115
110
  * should prefer the gRPC status code, as mentioned in
116
111
  * https://github.com/grpc/grpc/blob/master/doc/http-grpc-status-mapping.md.
117
112
  */
118
- if (b->legacy_index()->named.grpc_status != nullptr ||
119
- grpc_mdelem_static_value_eq(b->legacy_index()->named.status->md,
120
- GRPC_MDELEM_STATUS_200)) {
121
- b->Remove(GRPC_BATCH_STATUS);
113
+ const grpc_status_code* grpc_status =
114
+ b->get_pointer(grpc_core::GrpcStatusMetadata());
115
+ if (grpc_status != nullptr || *status == 200) {
116
+ b->Remove(grpc_core::HttpStatusMetadata());
122
117
  } else {
123
- char* val = grpc_dump_slice(
124
- GRPC_MDVALUE(b->legacy_index()->named.status->md), GPR_DUMP_ASCII);
125
118
  std::string msg =
126
- absl::StrCat("Received http2 header with status: ", val);
119
+ absl::StrCat("Received http2 header with status: ", *status);
127
120
  grpc_error_handle e = grpc_error_set_str(
128
121
  grpc_error_set_int(
129
122
  grpc_error_set_str(
130
123
  GRPC_ERROR_CREATE_FROM_STATIC_STRING(
131
124
  "Received http2 :status header with non-200 OK status"),
132
- GRPC_ERROR_STR_VALUE, val),
125
+ GRPC_ERROR_STR_VALUE, std::to_string(*status)),
133
126
  GRPC_ERROR_INT_GRPC_STATUS,
134
- grpc_http2_status_to_grpc_status(atoi(val))),
127
+ grpc_http2_status_to_grpc_status(*status)),
135
128
  GRPC_ERROR_STR_GRPC_MESSAGE, msg);
136
- gpr_free(val);
137
129
  return e;
138
130
  }
139
131
  }
@@ -144,38 +136,7 @@ static grpc_error_handle client_filter_incoming_metadata(
144
136
  grpc_core::PermissivePercentDecodeSlice(std::move(*grpc_message));
145
137
  }
146
138
 
147
- if (b->legacy_index()->named.content_type != nullptr) {
148
- if (!grpc_mdelem_static_value_eq(
149
- b->legacy_index()->named.content_type->md,
150
- GRPC_MDELEM_CONTENT_TYPE_APPLICATION_SLASH_GRPC)) {
151
- if (grpc_slice_buf_start_eq(
152
- GRPC_MDVALUE(b->legacy_index()->named.content_type->md),
153
- EXPECTED_CONTENT_TYPE, EXPECTED_CONTENT_TYPE_LENGTH) &&
154
- (GRPC_SLICE_START_PTR(GRPC_MDVALUE(
155
- b->legacy_index()
156
- ->named.content_type->md))[EXPECTED_CONTENT_TYPE_LENGTH] ==
157
- '+' ||
158
- GRPC_SLICE_START_PTR(GRPC_MDVALUE(
159
- b->legacy_index()
160
- ->named.content_type->md))[EXPECTED_CONTENT_TYPE_LENGTH] ==
161
- ';')) {
162
- /* Although the C implementation doesn't (currently) generate them,
163
- any custom +-suffix is explicitly valid. */
164
- /* TODO(klempner): We should consider preallocating common values such
165
- as +proto or +json, or at least stashing them if we see them. */
166
- /* TODO(klempner): Should we be surfacing this to application code? */
167
- } else {
168
- /* TODO(klempner): We're currently allowing this, but we shouldn't
169
- see it without a proxy so log for now. */
170
- char* val = grpc_dump_slice(
171
- GRPC_MDVALUE(b->legacy_index()->named.content_type->md),
172
- GPR_DUMP_ASCII);
173
- gpr_log(GPR_INFO, "Unexpected content-type '%s'", val);
174
- gpr_free(val);
175
- }
176
- }
177
- b->Remove(GRPC_BATCH_CONTENT_TYPE);
178
- }
139
+ b->Remove(grpc_core::ContentTypeMetadata());
179
140
 
180
141
  return GRPC_ERROR_NONE;
181
142
  }
@@ -306,53 +267,41 @@ static char* slice_buffer_to_string(grpc_slice_buffer* slice_buffer) {
306
267
 
307
268
  // Modifies the path entry in the batch's send_initial_metadata to
308
269
  // append the base64-encoded query for a GET request.
309
- static grpc_error_handle update_path_for_get(
310
- grpc_call_element* elem, grpc_transport_stream_op_batch* batch) {
270
+ static void update_path_for_get(grpc_call_element* elem,
271
+ grpc_transport_stream_op_batch* batch) {
272
+ grpc_metadata_batch* b =
273
+ batch->payload->send_initial_metadata.send_initial_metadata;
311
274
  call_data* calld = static_cast<call_data*>(elem->call_data);
312
- grpc_slice path_slice =
313
- GRPC_MDVALUE(batch->payload->send_initial_metadata.send_initial_metadata
314
- ->legacy_index()
315
- ->named.path->md);
275
+ const grpc_core::Slice& path_slice =
276
+ *b->get_pointer(grpc_core::HttpPathMetadata());
316
277
  /* sum up individual component's lengths and allocate enough memory to
317
278
  * hold combined path+query */
318
- size_t estimated_len = GRPC_SLICE_LENGTH(path_slice);
279
+ size_t estimated_len = path_slice.size();
319
280
  estimated_len++; /* for the '?' */
320
281
  estimated_len += grpc_base64_estimate_encoded_size(
321
282
  batch->payload->send_message.send_message->length(),
322
283
  false /* multi_line */);
323
- grpc_core::UnmanagedMemorySlice path_with_query_slice(estimated_len);
284
+ grpc_core::MutableSlice path_with_query_slice =
285
+ grpc_core::MutableSlice::CreateUninitialized(estimated_len);
324
286
  /* memcopy individual pieces into this slice */
325
- char* write_ptr =
326
- reinterpret_cast<char*> GRPC_SLICE_START_PTR(path_with_query_slice);
327
- char* original_path =
328
- reinterpret_cast<char*> GRPC_SLICE_START_PTR(path_slice);
329
- memcpy(write_ptr, original_path, GRPC_SLICE_LENGTH(path_slice));
330
- write_ptr += GRPC_SLICE_LENGTH(path_slice);
287
+ uint8_t* write_ptr = path_with_query_slice.begin();
288
+ const uint8_t* original_path = path_slice.data();
289
+ memcpy(write_ptr, original_path, path_slice.size());
290
+ write_ptr += path_slice.size();
331
291
  *write_ptr++ = '?';
332
292
  char* payload_bytes =
333
293
  slice_buffer_to_string(calld->send_message_cache->cache_buffer());
334
- grpc_base64_encode_core(write_ptr, payload_bytes,
294
+ grpc_base64_encode_core(reinterpret_cast<char*>(write_ptr), payload_bytes,
335
295
  batch->payload->send_message.send_message->length(),
336
296
  true /* url_safe */, false /* multi_line */);
337
297
  gpr_free(payload_bytes);
338
- /* remove trailing unused memory and add trailing 0 to terminate string */
339
- char* t =
340
- reinterpret_cast<char*> GRPC_SLICE_START_PTR(path_with_query_slice) +
341
- GRPC_SLICE_LENGTH(path_slice);
298
+ char* t = reinterpret_cast<char*>(path_with_query_slice.begin()) +
299
+ path_slice.size();
342
300
  /* safe to use strlen since base64_encode will always add '\0' */
343
- path_with_query_slice = grpc_slice_sub_no_ref(
344
- path_with_query_slice, 0, GRPC_SLICE_LENGTH(path_slice) + strlen(t));
345
301
  /* substitute previous path with the new path+query */
346
- grpc_mdelem mdelem_path_and_query =
347
- grpc_mdelem_from_slices(GRPC_MDSTR_PATH, path_with_query_slice);
348
- grpc_metadata_batch* b =
349
- batch->payload->send_initial_metadata.send_initial_metadata;
350
- return b->Substitute(b->legacy_index()->named.path, mdelem_path_and_query);
351
- }
352
-
353
- static void remove_if_present(grpc_metadata_batch* batch,
354
- grpc_metadata_batch_callouts_index idx) {
355
- batch->Remove(idx);
302
+ b->Set(grpc_core::HttpPathMetadata(),
303
+ grpc_core::Slice(path_with_query_slice.TakeSubSlice(
304
+ 0, path_slice.size() + strlen(t))));
356
305
  }
357
306
 
358
307
  static void http_client_start_transport_stream_op_batch(
@@ -388,7 +337,8 @@ static void http_client_start_transport_stream_op_batch(
388
337
  // cacheable, and the operation contains both initial metadata and send
389
338
  // message, and the payload is below the size threshold, and all the data
390
339
  // for this request is immediately available.
391
- grpc_mdelem method = GRPC_MDELEM_METHOD_POST;
340
+ grpc_core::HttpMethodMetadata::ValueType method =
341
+ grpc_core::HttpMethodMetadata::kPost;
392
342
  if (batch->send_message &&
393
343
  (batch->payload->send_initial_metadata.send_initial_metadata_flags &
394
344
  GRPC_INITIAL_METADATA_CACHEABLE_REQUEST) &&
@@ -408,9 +358,8 @@ static void http_client_start_transport_stream_op_batch(
408
358
  // If all the data has been read, then we can use GET.
409
359
  if (calld->send_message_bytes_read ==
410
360
  calld->send_message_caching_stream->length()) {
411
- method = GRPC_MDELEM_METHOD_GET;
412
- error = update_path_for_get(elem, batch);
413
- if (error != GRPC_ERROR_NONE) goto done;
361
+ method = grpc_core::HttpMethodMetadata::kGet;
362
+ update_path_for_get(elem, batch);
414
363
  batch->send_message = false;
415
364
  calld->send_message_caching_stream->Orphan();
416
365
  } else {
@@ -425,36 +374,20 @@ static void http_client_start_transport_stream_op_batch(
425
374
  } else if (batch->payload->send_initial_metadata
426
375
  .send_initial_metadata_flags &
427
376
  GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST) {
428
- method = GRPC_MDELEM_METHOD_PUT;
377
+ method = grpc_core::HttpMethodMetadata::kPut;
429
378
  }
430
379
 
431
- remove_if_present(
432
- batch->payload->send_initial_metadata.send_initial_metadata,
433
- GRPC_BATCH_METHOD);
434
- remove_if_present(
435
- batch->payload->send_initial_metadata.send_initial_metadata,
436
- GRPC_BATCH_SCHEME);
437
- remove_if_present(
438
- batch->payload->send_initial_metadata.send_initial_metadata,
439
- GRPC_BATCH_CONTENT_TYPE);
440
-
441
380
  /* Send : prefixed headers, which have to be before any application
442
381
  layer headers. */
443
- error = grpc_metadata_batch_add_head(
444
- batch->payload->send_initial_metadata.send_initial_metadata,
445
- &calld->method, method, GRPC_BATCH_METHOD);
446
- if (error != GRPC_ERROR_NONE) goto done;
447
- error = grpc_metadata_batch_add_head(
448
- batch->payload->send_initial_metadata.send_initial_metadata,
449
- &calld->scheme, channeld->static_scheme, GRPC_BATCH_SCHEME);
450
- if (error != GRPC_ERROR_NONE) goto done;
382
+ batch->payload->send_initial_metadata.send_initial_metadata->Set(
383
+ grpc_core::HttpMethodMetadata(), method);
384
+ batch->payload->send_initial_metadata.send_initial_metadata->Set(
385
+ grpc_core::HttpSchemeMetadata(), channeld->static_scheme);
451
386
  batch->payload->send_initial_metadata.send_initial_metadata->Set(
452
387
  grpc_core::TeMetadata(), grpc_core::TeMetadata::kTrailers);
453
- error = grpc_metadata_batch_add_tail(
454
- batch->payload->send_initial_metadata.send_initial_metadata,
455
- &calld->content_type, GRPC_MDELEM_CONTENT_TYPE_APPLICATION_SLASH_GRPC,
456
- GRPC_BATCH_CONTENT_TYPE);
457
- if (error != GRPC_ERROR_NONE) goto done;
388
+ batch->payload->send_initial_metadata.send_initial_metadata->Set(
389
+ grpc_core::ContentTypeMetadata(),
390
+ grpc_core::ContentTypeMetadata::kApplicationGrpc);
458
391
  batch->payload->send_initial_metadata.send_initial_metadata->Set(
459
392
  grpc_core::UserAgentMetadata(), channeld->user_agent.Ref());
460
393
  }
@@ -483,25 +416,21 @@ static void http_client_destroy_call_elem(
483
416
  calld->~call_data();
484
417
  }
485
418
 
486
- static grpc_mdelem scheme_from_args(const grpc_channel_args* args) {
487
- unsigned i;
488
- size_t j;
489
- grpc_mdelem valid_schemes[] = {GRPC_MDELEM_SCHEME_HTTP,
490
- GRPC_MDELEM_SCHEME_HTTPS};
419
+ static grpc_core::HttpSchemeMetadata::ValueType scheme_from_args(
420
+ const grpc_channel_args* args) {
491
421
  if (args != nullptr) {
492
- for (i = 0; i < args->num_args; ++i) {
422
+ for (size_t i = 0; i < args->num_args; ++i) {
493
423
  if (args->args[i].type == GRPC_ARG_STRING &&
494
- strcmp(args->args[i].key, GRPC_ARG_HTTP2_SCHEME) == 0) {
495
- for (j = 0; j < GPR_ARRAY_SIZE(valid_schemes); j++) {
496
- if (0 == grpc_slice_str_cmp(GRPC_MDVALUE(valid_schemes[j]),
497
- args->args[i].value.string)) {
498
- return valid_schemes[j];
499
- }
500
- }
424
+ 0 == strcmp(args->args[i].key, GRPC_ARG_HTTP2_SCHEME)) {
425
+ grpc_core::HttpSchemeMetadata::ValueType scheme =
426
+ grpc_core::HttpSchemeMetadata::Parse(
427
+ args->args[i].value.string,
428
+ [](absl::string_view, const grpc_core::Slice&) {});
429
+ if (scheme != grpc_core::HttpSchemeMetadata::kInvalid) return scheme;
501
430
  }
502
431
  }
503
432
  }
504
- return GRPC_MDELEM_SCHEME_HTTP;
433
+ return grpc_core::HttpSchemeMetadata::kHttp;
505
434
  }
506
435
 
507
436
  static size_t max_payload_size_from_args(const grpc_channel_args* args) {
@@ -36,39 +36,27 @@
36
36
  #include "src/core/lib/slice/slice_string_helpers.h"
37
37
  #include "src/core/lib/surface/call.h"
38
38
  #include "src/core/lib/surface/channel_stack_type.h"
39
- #include "src/core/lib/transport/static_metadata.h"
40
39
 
41
40
  namespace {
42
41
 
43
42
  struct call_data {
44
- grpc_linked_mdelem authority_storage;
45
43
  grpc_core::CallCombiner* call_combiner;
46
44
  };
47
45
 
48
46
  struct channel_data {
49
- grpc_core::ManagedMemorySlice default_authority;
50
- grpc_mdelem default_authority_mdelem;
47
+ grpc_core::Slice default_authority;
51
48
  };
52
49
 
53
50
  void client_authority_start_transport_stream_op_batch(
54
51
  grpc_call_element* elem, grpc_transport_stream_op_batch* batch) {
55
52
  channel_data* chand = static_cast<channel_data*>(elem->channel_data);
56
- call_data* calld = static_cast<call_data*>(elem->call_data);
57
53
  // Handle send_initial_metadata.
58
54
  // If the initial metadata doesn't already contain :authority, add it.
59
55
  if (batch->send_initial_metadata &&
60
- batch->payload->send_initial_metadata.send_initial_metadata
61
- ->legacy_index()
62
- ->named.authority == nullptr) {
63
- grpc_error_handle error = grpc_metadata_batch_add_head(
64
- batch->payload->send_initial_metadata.send_initial_metadata,
65
- &calld->authority_storage,
66
- GRPC_MDELEM_REF(chand->default_authority_mdelem), GRPC_BATCH_AUTHORITY);
67
- if (error != GRPC_ERROR_NONE) {
68
- grpc_transport_stream_op_batch_finish_with_failure(batch, error,
69
- calld->call_combiner);
70
- return;
71
- }
56
+ batch->payload->send_initial_metadata.send_initial_metadata->get_pointer(
57
+ grpc_core::HttpAuthorityMetadata()) == nullptr) {
58
+ batch->payload->send_initial_metadata.send_initial_metadata->Set(
59
+ grpc_core::HttpAuthorityMetadata(), chand->default_authority.Ref());
72
60
  }
73
61
  // Pass control down the stack.
74
62
  grpc_call_next_op(elem, batch);
@@ -90,7 +78,7 @@ void client_authority_destroy_call_elem(
90
78
  /* Constructor for channel_data */
91
79
  grpc_error_handle client_authority_init_channel_elem(
92
80
  grpc_channel_element* elem, grpc_channel_element_args* args) {
93
- channel_data* chand = static_cast<channel_data*>(elem->channel_data);
81
+ channel_data* chand = new (elem->channel_data) channel_data;
94
82
  const grpc_arg* default_authority_arg =
95
83
  grpc_channel_args_find(args->channel_args, GRPC_ARG_DEFAULT_AUTHORITY);
96
84
  if (default_authority_arg == nullptr) {
@@ -105,18 +93,14 @@ grpc_error_handle client_authority_init_channel_elem(
105
93
  "GRPC_ARG_DEFAULT_AUTHORITY channel arg. must be a string");
106
94
  }
107
95
  chand->default_authority =
108
- grpc_core::ManagedMemorySlice(default_authority_str);
109
- chand->default_authority_mdelem = grpc_mdelem_create(
110
- GRPC_MDSTR_AUTHORITY, chand->default_authority, nullptr);
96
+ grpc_core::Slice::FromCopiedString(default_authority_str);
111
97
  GPR_ASSERT(!args->is_last);
112
98
  return GRPC_ERROR_NONE;
113
99
  }
114
100
 
115
101
  /* Destructor for channel data */
116
102
  void client_authority_destroy_channel_elem(grpc_channel_element* elem) {
117
- channel_data* chand = static_cast<channel_data*>(elem->channel_data);
118
- grpc_slice_unref_internal(chand->default_authority);
119
- GRPC_MDELEM_UNREF(chand->default_authority_mdelem);
103
+ static_cast<channel_data*>(elem->channel_data)->~channel_data();
120
104
  }
121
105
  } // namespace
122
106
 
@@ -31,8 +31,6 @@
31
31
  #include <grpc/support/log.h>
32
32
 
33
33
  #include "src/core/lib/channel/channel_args.h"
34
- #include "src/core/lib/compression/algorithm_metadata.h"
35
- #include "src/core/lib/compression/compression_args.h"
36
34
  #include "src/core/lib/compression/compression_internal.h"
37
35
  #include "src/core/lib/compression/message_compress.h"
38
36
  #include "src/core/lib/gpr/string.h"
@@ -41,7 +39,6 @@
41
39
  #include "src/core/lib/slice/slice_internal.h"
42
40
  #include "src/core/lib/slice/slice_string_helpers.h"
43
41
  #include "src/core/lib/surface/call.h"
44
- #include "src/core/lib/transport/static_metadata.h"
45
42
 
46
43
  namespace {
47
44
 
@@ -49,15 +46,15 @@ class ChannelData {
49
46
  public:
50
47
  explicit ChannelData(grpc_channel_element_args* args) {
51
48
  // Get the enabled and the default algorithms from channel args.
52
- enabled_compression_algorithms_bitset_ =
53
- grpc_channel_args_compression_algorithm_get_states(args->channel_args);
49
+ enabled_compression_algorithms_ =
50
+ grpc_core::CompressionAlgorithmSet::FromChannelArgs(args->channel_args);
54
51
  default_compression_algorithm_ =
55
- grpc_channel_args_get_channel_default_compression_algorithm(
56
- args->channel_args);
52
+ grpc_core::DefaultCompressionAlgorithmFromChannelArgs(
53
+ args->channel_args)
54
+ .value_or(GRPC_COMPRESS_NONE);
57
55
  // Make sure the default is enabled.
58
- if (size_t(default_compression_algorithm_) >= 32 ||
59
- !grpc_core::GetBit(enabled_compression_algorithms_bitset_,
60
- default_compression_algorithm_)) {
56
+ if (!enabled_compression_algorithms_.IsSet(
57
+ default_compression_algorithm_)) {
61
58
  const char* name;
62
59
  if (!grpc_compression_algorithm_name(default_compression_algorithm_,
63
60
  &name)) {
@@ -68,12 +65,6 @@ class ChannelData {
68
65
  name);
69
66
  default_compression_algorithm_ = GRPC_COMPRESS_NONE;
70
67
  }
71
- enabled_message_compression_algorithms_bitset_ =
72
- grpc_compression_bitset_to_message_bitset(
73
- enabled_compression_algorithms_bitset_);
74
- enabled_stream_compression_algorithms_bitset_ =
75
- grpc_compression_bitset_to_stream_bitset(
76
- enabled_compression_algorithms_bitset_);
77
68
  GPR_ASSERT(!args->is_last);
78
69
  }
79
70
 
@@ -81,27 +72,15 @@ class ChannelData {
81
72
  return default_compression_algorithm_;
82
73
  }
83
74
 
84
- uint32_t enabled_compression_algorithms_bitset() const {
85
- return enabled_compression_algorithms_bitset_;
86
- }
87
-
88
- uint32_t enabled_message_compression_algorithms_bitset() const {
89
- return enabled_message_compression_algorithms_bitset_;
90
- }
91
-
92
- uint32_t enabled_stream_compression_algorithms_bitset() const {
93
- return enabled_stream_compression_algorithms_bitset_;
75
+ grpc_core::CompressionAlgorithmSet enabled_compression_algorithms() const {
76
+ return enabled_compression_algorithms_;
94
77
  }
95
78
 
96
79
  private:
97
80
  /** The default, channel-level, compression algorithm */
98
81
  grpc_compression_algorithm default_compression_algorithm_;
99
- /** Bitset of enabled compression algorithms */
100
- uint32_t enabled_compression_algorithms_bitset_;
101
- /** Bitset of enabled message compression algorithms */
102
- uint32_t enabled_message_compression_algorithms_bitset_;
103
- /** Bitset of enabled stream compression algorithms */
104
- uint32_t enabled_stream_compression_algorithms_bitset_;
82
+ /** Enabled compression algorithms */
83
+ grpc_core::CompressionAlgorithmSet enabled_compression_algorithms_;
105
84
  };
106
85
 
107
86
  class CallData {
@@ -111,12 +90,9 @@ class CallData {
111
90
  ChannelData* channeld = static_cast<ChannelData*>(elem->channel_data);
112
91
  // The call's message compression algorithm is set to channel's default
113
92
  // setting. It can be overridden later by initial metadata.
114
- if (GPR_LIKELY(
115
- grpc_core::GetBit(channeld->enabled_compression_algorithms_bitset(),
116
- channeld->default_compression_algorithm()))) {
117
- message_compression_algorithm_ =
118
- grpc_compression_algorithm_to_message_compression_algorithm(
119
- channeld->default_compression_algorithm());
93
+ if (GPR_LIKELY(channeld->enabled_compression_algorithms().IsSet(
94
+ channeld->default_compression_algorithm()))) {
95
+ compression_algorithm_ = channeld->default_compression_algorithm();
120
96
  }
121
97
  GRPC_CLOSURE_INIT(&start_send_message_batch_in_call_combiner_,
122
98
  StartSendMessageBatch, elem, grpc_schedule_on_exec_ctx);
@@ -136,8 +112,8 @@ class CallData {
136
112
  bool SkipMessageCompression();
137
113
  void InitializeState(grpc_call_element* elem);
138
114
 
139
- grpc_error_handle ProcessSendInitialMetadata(
140
- grpc_call_element* elem, grpc_metadata_batch* initial_metadata);
115
+ void ProcessSendInitialMetadata(grpc_call_element* elem,
116
+ grpc_metadata_batch* initial_metadata);
141
117
 
142
118
  // Methods for processing a send_message batch
143
119
  static void StartSendMessageBatch(void* elem_arg, grpc_error_handle unused);
@@ -152,8 +128,7 @@ class CallData {
152
128
  static void SendMessageOnComplete(void* calld_arg, grpc_error_handle error);
153
129
 
154
130
  grpc_core::CallCombiner* call_combiner_;
155
- grpc_message_compression_algorithm message_compression_algorithm_ =
156
- GRPC_MESSAGE_COMPRESS_NONE;
131
+ grpc_compression_algorithm compression_algorithm_ = GRPC_COMPRESS_NONE;
157
132
  grpc_error_handle cancel_error_ = GRPC_ERROR_NONE;
158
133
  grpc_transport_stream_op_batch* send_message_batch_ = nullptr;
159
134
  bool seen_initial_metadata_ = false;
@@ -163,10 +138,6 @@ class CallData {
163
138
  /* The fields below are only initialized when we compress the payload.
164
139
  * Keep them at the bottom of the struct, so they don't pollute the
165
140
  * cache-lines. */
166
- grpc_linked_mdelem message_compression_algorithm_storage_;
167
- grpc_linked_mdelem stream_compression_algorithm_storage_;
168
- grpc_linked_mdelem accept_encoding_storage_;
169
- grpc_linked_mdelem accept_stream_encoding_storage_;
170
141
  grpc_slice_buffer slices_; /**< Buffers up input slices to be compressed */
171
142
  // Allocate space for the replacement stream
172
143
  std::aligned_storage<sizeof(grpc_core::SliceBufferByteStream),
@@ -188,44 +159,7 @@ bool CallData::SkipMessageCompression() {
188
159
  }
189
160
  // If this call doesn't have any message compression algorithm set, skip
190
161
  // message compression.
191
- return message_compression_algorithm_ == GRPC_MESSAGE_COMPRESS_NONE;
192
- }
193
-
194
- // Determines the compression algorithm from the initial metadata and the
195
- // channel's default setting.
196
- grpc_compression_algorithm FindCompressionAlgorithm(
197
- grpc_metadata_batch* initial_metadata, ChannelData* channeld) {
198
- if (initial_metadata->legacy_index()->named.grpc_internal_encoding_request ==
199
- nullptr) {
200
- return channeld->default_compression_algorithm();
201
- }
202
- grpc_compression_algorithm compression_algorithm;
203
- // Parse the compression algorithm from the initial metadata.
204
- grpc_mdelem md = initial_metadata->legacy_index()
205
- ->named.grpc_internal_encoding_request->md;
206
- GPR_ASSERT(grpc_compression_algorithm_parse(GRPC_MDVALUE(md),
207
- &compression_algorithm));
208
- // Remove this metadata since it's an internal one (i.e., it won't be
209
- // transmitted out).
210
- initial_metadata->Remove(GRPC_BATCH_GRPC_INTERNAL_ENCODING_REQUEST);
211
- // Check if that algorithm is enabled. Note that GRPC_COMPRESS_NONE is always
212
- // enabled.
213
- // TODO(juanlishen): Maybe use channel default or abort() if the algorithm
214
- // from the initial metadata is disabled.
215
- if (GPR_LIKELY(
216
- grpc_core::GetBit(channeld->enabled_compression_algorithms_bitset(),
217
- compression_algorithm))) {
218
- return compression_algorithm;
219
- }
220
- const char* algorithm_name;
221
- GPR_ASSERT(
222
- grpc_compression_algorithm_name(compression_algorithm, &algorithm_name));
223
- gpr_log(GPR_ERROR,
224
- "Invalid compression algorithm from initial metadata: '%s' "
225
- "(previously disabled). "
226
- "Will not compress.",
227
- algorithm_name);
228
- return GRPC_COMPRESS_NONE;
162
+ return compression_algorithm_ == GRPC_COMPRESS_NONE;
229
163
  }
230
164
 
231
165
  void CallData::InitializeState(grpc_call_element* elem) {
@@ -238,53 +172,28 @@ void CallData::InitializeState(grpc_call_element* elem) {
238
172
  grpc_schedule_on_exec_ctx);
239
173
  }
240
174
 
241
- grpc_error_handle CallData::ProcessSendInitialMetadata(
175
+ void CallData::ProcessSendInitialMetadata(
242
176
  grpc_call_element* elem, grpc_metadata_batch* initial_metadata) {
243
177
  ChannelData* channeld = static_cast<ChannelData*>(elem->channel_data);
244
178
  // Find the compression algorithm.
245
- grpc_compression_algorithm compression_algorithm =
246
- FindCompressionAlgorithm(initial_metadata, channeld);
247
- // Note that at most one of the following algorithms can be set.
248
- message_compression_algorithm_ =
249
- grpc_compression_algorithm_to_message_compression_algorithm(
250
- compression_algorithm);
251
- grpc_stream_compression_algorithm stream_compression_algorithm =
252
- grpc_compression_algorithm_to_stream_compression_algorithm(
253
- compression_algorithm);
254
- // Hint compression algorithm.
255
- grpc_error_handle error = GRPC_ERROR_NONE;
256
- if (message_compression_algorithm_ != GRPC_MESSAGE_COMPRESS_NONE) {
257
- InitializeState(elem);
258
- error = grpc_metadata_batch_add_tail(
259
- initial_metadata, &message_compression_algorithm_storage_,
260
- grpc_message_compression_encoding_mdelem(
261
- message_compression_algorithm_),
262
- GRPC_BATCH_GRPC_ENCODING);
263
- } else if (stream_compression_algorithm != GRPC_STREAM_COMPRESS_NONE) {
264
- InitializeState(elem);
265
- error = grpc_metadata_batch_add_tail(
266
- initial_metadata, &stream_compression_algorithm_storage_,
267
- grpc_stream_compression_encoding_mdelem(stream_compression_algorithm),
268
- GRPC_BATCH_CONTENT_ENCODING);
179
+ compression_algorithm_ =
180
+ initial_metadata->Take(grpc_core::GrpcInternalEncodingRequest())
181
+ .value_or(channeld->default_compression_algorithm());
182
+ switch (compression_algorithm_) {
183
+ case GRPC_COMPRESS_NONE:
184
+ break;
185
+ case GRPC_COMPRESS_DEFLATE:
186
+ case GRPC_COMPRESS_GZIP:
187
+ InitializeState(elem);
188
+ initial_metadata->Set(grpc_core::GrpcEncodingMetadata(),
189
+ compression_algorithm_);
190
+ break;
191
+ case GRPC_COMPRESS_ALGORITHMS_COUNT:
192
+ abort();
269
193
  }
270
- if (error != GRPC_ERROR_NONE) return error;
271
194
  // Convey supported compression algorithms.
272
- error = grpc_metadata_batch_add_tail(
273
- initial_metadata, &accept_encoding_storage_,
274
- GRPC_MDELEM_ACCEPT_ENCODING_FOR_ALGORITHMS(
275
- channeld->enabled_message_compression_algorithms_bitset()),
276
- GRPC_BATCH_GRPC_ACCEPT_ENCODING);
277
- if (error != GRPC_ERROR_NONE) return error;
278
- // Do not overwrite accept-encoding header if it already presents (e.g., added
279
- // by some proxy).
280
- if (!initial_metadata->legacy_index()->named.accept_encoding) {
281
- error = grpc_metadata_batch_add_tail(
282
- initial_metadata, &accept_stream_encoding_storage_,
283
- GRPC_MDELEM_ACCEPT_STREAM_ENCODING_FOR_ALGORITHMS(
284
- channeld->enabled_stream_compression_algorithms_bitset()),
285
- GRPC_BATCH_ACCEPT_ENCODING);
286
- }
287
- return error;
195
+ initial_metadata->Set(grpc_core::GrpcAcceptEncodingMetadata(),
196
+ channeld->enabled_compression_algorithms());
288
197
  }
289
198
 
290
199
  void CallData::SendMessageOnComplete(void* calld_arg, grpc_error_handle error) {
@@ -304,15 +213,13 @@ void CallData::SendMessageBatchContinue(grpc_call_element* elem) {
304
213
  }
305
214
 
306
215
  void CallData::FinishSendMessage(grpc_call_element* elem) {
307
- GPR_DEBUG_ASSERT(message_compression_algorithm_ !=
308
- GRPC_MESSAGE_COMPRESS_NONE);
216
+ GPR_DEBUG_ASSERT(compression_algorithm_ != GRPC_COMPRESS_NONE);
309
217
  // Compress the data if appropriate.
310
218
  grpc_slice_buffer tmp;
311
219
  grpc_slice_buffer_init(&tmp);
312
220
  uint32_t send_flags =
313
221
  send_message_batch_->payload->send_message.send_message->flags();
314
- bool did_compress =
315
- grpc_msg_compress(message_compression_algorithm_, &slices_, &tmp);
222
+ bool did_compress = grpc_msg_compress(compression_algorithm_, &slices_, &tmp);
316
223
  if (did_compress) {
317
224
  if (GRPC_TRACE_FLAG_ENABLED(grpc_compression_trace)) {
318
225
  const char* algo_name;
@@ -320,8 +227,8 @@ void CallData::FinishSendMessage(grpc_call_element* elem) {
320
227
  const size_t after_size = tmp.length;
321
228
  const float savings_ratio = 1.0f - static_cast<float>(after_size) /
322
229
  static_cast<float>(before_size);
323
- GPR_ASSERT(grpc_message_compression_algorithm_name(
324
- message_compression_algorithm_, &algo_name));
230
+ GPR_ASSERT(
231
+ grpc_compression_algorithm_name(compression_algorithm_, &algo_name));
325
232
  gpr_log(GPR_INFO,
326
233
  "Compressed[%s] %" PRIuPTR " bytes vs. %" PRIuPTR
327
234
  " bytes (%.2f%% savings)",
@@ -332,8 +239,8 @@ void CallData::FinishSendMessage(grpc_call_element* elem) {
332
239
  } else {
333
240
  if (GRPC_TRACE_FLAG_ENABLED(grpc_compression_trace)) {
334
241
  const char* algo_name;
335
- GPR_ASSERT(grpc_message_compression_algorithm_name(
336
- message_compression_algorithm_, &algo_name));
242
+ GPR_ASSERT(
243
+ grpc_compression_algorithm_name(compression_algorithm_, &algo_name));
337
244
  gpr_log(GPR_INFO,
338
245
  "Algorithm '%s' enabled but decided not to compress. Input size: "
339
246
  "%" PRIuPTR,
@@ -465,13 +372,8 @@ void CallData::CompressStartTransportStreamOpBatch(
465
372
  // Handle send_initial_metadata.
466
373
  if (batch->send_initial_metadata) {
467
374
  GPR_ASSERT(!seen_initial_metadata_);
468
- grpc_error_handle error = ProcessSendInitialMetadata(
375
+ ProcessSendInitialMetadata(
469
376
  elem, batch->payload->send_initial_metadata.send_initial_metadata);
470
- if (error != GRPC_ERROR_NONE) {
471
- grpc_transport_stream_op_batch_finish_with_failure(batch, error,
472
- call_combiner_);
473
- return;
474
- }
475
377
  seen_initial_metadata_ = true;
476
378
  // If we had previously received a batch containing a send_message op,
477
379
  // handle it now. Note that we need to re-enter the call combiner