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
@@ -23,181 +23,51 @@
23
23
  #include <stdlib.h>
24
24
  #include <string.h>
25
25
 
26
+ #include <cstdint>
27
+
28
+ #include "absl/container/inlined_vector.h"
29
+ #include "absl/strings/str_join.h"
30
+ #include "absl/strings/str_split.h"
31
+
26
32
  #include <grpc/compression.h>
27
33
 
28
- #include "src/core/lib/compression/algorithm_metadata.h"
34
+ #include "src/core/lib/channel/channel_args.h"
29
35
  #include "src/core/lib/gpr/useful.h"
30
36
  #include "src/core/lib/slice/slice_utils.h"
31
37
  #include "src/core/lib/surface/api_trace.h"
32
- #include "src/core/lib/transport/static_metadata.h"
33
-
34
- /* Interfaces related to MD */
35
-
36
- grpc_message_compression_algorithm
37
- grpc_message_compression_algorithm_from_slice(const grpc_slice& str) {
38
- if (grpc_slice_eq_static_interned(str, GRPC_MDSTR_IDENTITY)) {
39
- return GRPC_MESSAGE_COMPRESS_NONE;
40
- }
41
- if (grpc_slice_eq_static_interned(str, GRPC_MDSTR_DEFLATE)) {
42
- return GRPC_MESSAGE_COMPRESS_DEFLATE;
43
- }
44
- if (grpc_slice_eq_static_interned(str, GRPC_MDSTR_GZIP)) {
45
- return GRPC_MESSAGE_COMPRESS_GZIP;
46
- }
47
- return GRPC_MESSAGE_COMPRESS_ALGORITHMS_COUNT;
48
- }
49
-
50
- grpc_stream_compression_algorithm grpc_stream_compression_algorithm_from_slice(
51
- const grpc_slice& str) {
52
- if (grpc_slice_eq_static_interned(str, GRPC_MDSTR_IDENTITY)) {
53
- return GRPC_STREAM_COMPRESS_NONE;
54
- }
55
- if (grpc_slice_eq_static_interned(str, GRPC_MDSTR_GZIP)) {
56
- return GRPC_STREAM_COMPRESS_GZIP;
57
- }
58
- return GRPC_STREAM_COMPRESS_ALGORITHMS_COUNT;
59
- }
60
38
 
61
- grpc_mdelem grpc_message_compression_encoding_mdelem(
62
- grpc_message_compression_algorithm algorithm) {
63
- switch (algorithm) {
64
- case GRPC_MESSAGE_COMPRESS_NONE:
65
- return GRPC_MDELEM_GRPC_ENCODING_IDENTITY;
66
- case GRPC_MESSAGE_COMPRESS_DEFLATE:
67
- return GRPC_MDELEM_GRPC_ENCODING_DEFLATE;
68
- case GRPC_MESSAGE_COMPRESS_GZIP:
69
- return GRPC_MDELEM_GRPC_ENCODING_GZIP;
70
- default:
71
- break;
72
- }
73
- return GRPC_MDNULL;
74
- }
39
+ namespace grpc_core {
75
40
 
76
- grpc_mdelem grpc_stream_compression_encoding_mdelem(
77
- grpc_stream_compression_algorithm algorithm) {
41
+ const char* CompressionAlgorithmAsString(grpc_compression_algorithm algorithm) {
78
42
  switch (algorithm) {
79
- case GRPC_STREAM_COMPRESS_NONE:
80
- return GRPC_MDELEM_CONTENT_ENCODING_IDENTITY;
81
- case GRPC_STREAM_COMPRESS_GZIP:
82
- return GRPC_MDELEM_CONTENT_ENCODING_GZIP;
83
- default:
84
- break;
85
- }
86
- return GRPC_MDNULL;
87
- }
88
-
89
- /* Interfaces performing transformation between compression algorithms and
90
- * levels. */
91
- grpc_message_compression_algorithm
92
- grpc_compression_algorithm_to_message_compression_algorithm(
93
- grpc_compression_algorithm algo) {
94
- switch (algo) {
43
+ case GRPC_COMPRESS_NONE:
44
+ return "identity";
95
45
  case GRPC_COMPRESS_DEFLATE:
96
- return GRPC_MESSAGE_COMPRESS_DEFLATE;
46
+ return "deflate";
97
47
  case GRPC_COMPRESS_GZIP:
98
- return GRPC_MESSAGE_COMPRESS_GZIP;
48
+ return "gzip";
49
+ case GRPC_COMPRESS_ALGORITHMS_COUNT:
99
50
  default:
100
- return GRPC_MESSAGE_COMPRESS_NONE;
51
+ return nullptr;
101
52
  }
102
53
  }
103
54
 
104
- grpc_stream_compression_algorithm
105
- grpc_compression_algorithm_to_stream_compression_algorithm(
106
- grpc_compression_algorithm algo) {
107
- switch (algo) {
108
- case GRPC_COMPRESS_STREAM_GZIP:
109
- return GRPC_STREAM_COMPRESS_GZIP;
110
- default:
111
- return GRPC_STREAM_COMPRESS_NONE;
112
- }
113
- }
114
-
115
- uint32_t grpc_compression_bitset_to_message_bitset(uint32_t bitset) {
116
- return bitset & ((1u << GRPC_MESSAGE_COMPRESS_ALGORITHMS_COUNT) - 1);
117
- }
118
-
119
- uint32_t grpc_compression_bitset_to_stream_bitset(uint32_t bitset) {
120
- uint32_t identity = (bitset & 1u);
121
- uint32_t other_bits =
122
- (bitset >> (GRPC_MESSAGE_COMPRESS_ALGORITHMS_COUNT - 1)) &
123
- ((1u << GRPC_STREAM_COMPRESS_ALGORITHMS_COUNT) - 2);
124
- return identity | other_bits;
125
- }
126
-
127
- uint32_t grpc_compression_bitset_from_message_stream_compression_bitset(
128
- uint32_t message_bitset, uint32_t stream_bitset) {
129
- uint32_t offset_stream_bitset =
130
- (stream_bitset & 1u) |
131
- ((stream_bitset & (~1u)) << (GRPC_MESSAGE_COMPRESS_ALGORITHMS_COUNT - 1));
132
- return message_bitset | offset_stream_bitset;
133
- }
134
-
135
- int grpc_compression_algorithm_from_message_stream_compression_algorithm(
136
- grpc_compression_algorithm* algorithm,
137
- grpc_message_compression_algorithm message_algorithm,
138
- grpc_stream_compression_algorithm stream_algorithm) {
139
- if (message_algorithm != GRPC_MESSAGE_COMPRESS_NONE &&
140
- stream_algorithm != GRPC_STREAM_COMPRESS_NONE) {
141
- *algorithm = GRPC_COMPRESS_NONE;
142
- return 0;
143
- }
144
- if (message_algorithm == GRPC_MESSAGE_COMPRESS_NONE) {
145
- switch (stream_algorithm) {
146
- case GRPC_STREAM_COMPRESS_NONE:
147
- *algorithm = GRPC_COMPRESS_NONE;
148
- return 1;
149
- case GRPC_STREAM_COMPRESS_GZIP:
150
- *algorithm = GRPC_COMPRESS_STREAM_GZIP;
151
- return 1;
152
- default:
153
- *algorithm = GRPC_COMPRESS_NONE;
154
- return 0;
155
- }
55
+ absl::optional<grpc_compression_algorithm> ParseCompressionAlgorithm(
56
+ absl::string_view algorithm) {
57
+ if (algorithm == "identity") {
58
+ return GRPC_COMPRESS_NONE;
59
+ } else if (algorithm == "deflate") {
60
+ return GRPC_COMPRESS_DEFLATE;
61
+ } else if (algorithm == "gzip") {
62
+ return GRPC_COMPRESS_GZIP;
156
63
  } else {
157
- switch (message_algorithm) {
158
- case GRPC_MESSAGE_COMPRESS_NONE:
159
- *algorithm = GRPC_COMPRESS_NONE;
160
- return 1;
161
- case GRPC_MESSAGE_COMPRESS_DEFLATE:
162
- *algorithm = GRPC_COMPRESS_DEFLATE;
163
- return 1;
164
- case GRPC_MESSAGE_COMPRESS_GZIP:
165
- *algorithm = GRPC_COMPRESS_GZIP;
166
- return 1;
167
- default:
168
- *algorithm = GRPC_COMPRESS_NONE;
169
- return 0;
170
- }
171
- }
172
- }
173
-
174
- /* Interfaces for message compression. */
175
-
176
- int grpc_message_compression_algorithm_name(
177
- grpc_message_compression_algorithm algorithm, const char** name) {
178
- GRPC_API_TRACE(
179
- "grpc_message_compression_algorithm_name(algorithm=%d, name=%p)", 2,
180
- ((int)algorithm, name));
181
- switch (algorithm) {
182
- case GRPC_MESSAGE_COMPRESS_NONE:
183
- *name = "identity";
184
- return 1;
185
- case GRPC_MESSAGE_COMPRESS_DEFLATE:
186
- *name = "deflate";
187
- return 1;
188
- case GRPC_MESSAGE_COMPRESS_GZIP:
189
- *name = "gzip";
190
- return 1;
191
- case GRPC_MESSAGE_COMPRESS_ALGORITHMS_COUNT:
192
- return 0;
64
+ return absl::nullopt;
193
65
  }
194
- return 0;
195
66
  }
196
67
 
197
- /* TODO(dgq): Add the ability to specify parameters to the individual
198
- * compression algorithms */
199
- grpc_message_compression_algorithm grpc_message_compression_algorithm_for_level(
200
- grpc_compression_level level, uint32_t accepted_encodings) {
68
+ grpc_compression_algorithm
69
+ CompressionAlgorithmSet::CompressionAlgorithmForLevel(
70
+ grpc_compression_level level) const {
201
71
  GRPC_API_TRACE("grpc_message_compression_algorithm_for_level(level=%d)", 1,
202
72
  ((int)level));
203
73
  if (level > GRPC_COMPRESS_LEVEL_HIGH) {
@@ -206,10 +76,8 @@ grpc_message_compression_algorithm grpc_message_compression_algorithm_for_level(
206
76
  abort();
207
77
  }
208
78
 
209
- const size_t num_supported =
210
- grpc_core::BitCount(accepted_encodings) - 1; /* discard NONE */
211
- if (level == GRPC_COMPRESS_LEVEL_NONE || num_supported == 0) {
212
- return GRPC_MESSAGE_COMPRESS_NONE;
79
+ if (level == GRPC_COMPRESS_LEVEL_NONE) {
80
+ return GRPC_COMPRESS_NONE;
213
81
  }
214
82
 
215
83
  GPR_ASSERT(level > 0);
@@ -218,66 +86,138 @@ grpc_message_compression_algorithm grpc_message_compression_algorithm_for_level(
218
86
  * compression.
219
87
  * This is simplistic and we will probably want to introduce other dimensions
220
88
  * in the future (cpu/memory cost, etc). */
221
- const grpc_message_compression_algorithm algos_ranking[] = {
222
- GRPC_MESSAGE_COMPRESS_GZIP, GRPC_MESSAGE_COMPRESS_DEFLATE};
223
-
224
- /* intersect algos_ranking with the supported ones keeping the ranked order */
225
- grpc_message_compression_algorithm
226
- sorted_supported_algos[GRPC_MESSAGE_COMPRESS_ALGORITHMS_COUNT];
227
- size_t algos_supported_idx = 0;
228
- for (size_t i = 0; i < GPR_ARRAY_SIZE(algos_ranking); i++) {
229
- const grpc_message_compression_algorithm alg = algos_ranking[i];
230
- for (size_t j = 0; j < num_supported; j++) {
231
- if (grpc_core::GetBit(accepted_encodings, alg) == 1) {
232
- /* if \a alg in supported */
233
- sorted_supported_algos[algos_supported_idx++] = alg;
234
- break;
235
- }
89
+ absl::InlinedVector<grpc_compression_algorithm,
90
+ GRPC_COMPRESS_ALGORITHMS_COUNT>
91
+ algos;
92
+ for (auto algo : {GRPC_COMPRESS_GZIP, GRPC_COMPRESS_DEFLATE}) {
93
+ if (set_.is_set(algo)) {
94
+ algos.push_back(algo);
236
95
  }
237
- if (algos_supported_idx == num_supported) break;
96
+ }
97
+
98
+ if (algos.empty()) {
99
+ return GRPC_COMPRESS_NONE;
238
100
  }
239
101
 
240
102
  switch (level) {
241
103
  case GRPC_COMPRESS_LEVEL_NONE:
242
104
  abort(); /* should have been handled already */
243
105
  case GRPC_COMPRESS_LEVEL_LOW:
244
- return sorted_supported_algos[0];
106
+ return algos[0];
245
107
  case GRPC_COMPRESS_LEVEL_MED:
246
- return sorted_supported_algos[num_supported / 2];
108
+ return algos[algos.size() / 2];
247
109
  case GRPC_COMPRESS_LEVEL_HIGH:
248
- return sorted_supported_algos[num_supported - 1];
110
+ return algos.back();
249
111
  default:
250
112
  abort();
251
113
  };
252
114
  }
253
115
 
254
- int grpc_message_compression_algorithm_parse(
255
- grpc_slice value, grpc_message_compression_algorithm* algorithm) {
256
- if (grpc_slice_eq_static_interned(value, GRPC_MDSTR_IDENTITY)) {
257
- *algorithm = GRPC_MESSAGE_COMPRESS_NONE;
258
- return 1;
259
- } else if (grpc_slice_eq_static_interned(value, GRPC_MDSTR_DEFLATE)) {
260
- *algorithm = GRPC_MESSAGE_COMPRESS_DEFLATE;
261
- return 1;
262
- } else if (grpc_slice_eq_static_interned(value, GRPC_MDSTR_GZIP)) {
263
- *algorithm = GRPC_MESSAGE_COMPRESS_GZIP;
264
- return 1;
116
+ CompressionAlgorithmSet CompressionAlgorithmSet::FromUint32(uint32_t value) {
117
+ CompressionAlgorithmSet set;
118
+ for (size_t i = 0; i < GRPC_COMPRESS_ALGORITHMS_COUNT; i++) {
119
+ if (value & (1u << i)) {
120
+ set.set_.set(i);
121
+ }
122
+ }
123
+ return set;
124
+ }
125
+
126
+ CompressionAlgorithmSet CompressionAlgorithmSet::FromChannelArgs(
127
+ const grpc_channel_args* args) {
128
+ CompressionAlgorithmSet set;
129
+ static const uint32_t kEverything =
130
+ (1u << GRPC_COMPRESS_ALGORITHMS_COUNT) - 1;
131
+ if (args != nullptr) {
132
+ set = CompressionAlgorithmSet::FromUint32(grpc_channel_args_find_integer(
133
+ args, GRPC_COMPRESSION_CHANNEL_ENABLED_ALGORITHMS_BITSET,
134
+ grpc_integer_options{kEverything, 0, kEverything}));
135
+ set.Set(GRPC_COMPRESS_NONE);
265
136
  } else {
266
- return 0;
137
+ set = CompressionAlgorithmSet::FromUint32(kEverything);
267
138
  }
139
+ return set;
268
140
  }
269
141
 
270
- /* Interfaces for stream compression. */
142
+ CompressionAlgorithmSet::CompressionAlgorithmSet() = default;
271
143
 
272
- int grpc_stream_compression_algorithm_parse(
273
- grpc_slice value, grpc_stream_compression_algorithm* algorithm) {
274
- if (grpc_slice_eq_static_interned(value, GRPC_MDSTR_IDENTITY)) {
275
- *algorithm = GRPC_STREAM_COMPRESS_NONE;
276
- return 1;
277
- } else if (grpc_slice_eq_static_interned(value, GRPC_MDSTR_GZIP)) {
278
- *algorithm = GRPC_STREAM_COMPRESS_GZIP;
279
- return 1;
144
+ CompressionAlgorithmSet::CompressionAlgorithmSet(
145
+ std::initializer_list<grpc_compression_algorithm> algorithms) {
146
+ for (auto algorithm : algorithms) {
147
+ Set(algorithm);
148
+ }
149
+ }
150
+
151
+ bool CompressionAlgorithmSet::IsSet(
152
+ grpc_compression_algorithm algorithm) const {
153
+ size_t i = static_cast<size_t>(algorithm);
154
+ if (i < GRPC_COMPRESS_ALGORITHMS_COUNT) {
155
+ return set_.is_set(i);
280
156
  } else {
281
- return 0;
157
+ return false;
158
+ }
159
+ }
160
+
161
+ void CompressionAlgorithmSet::Set(grpc_compression_algorithm algorithm) {
162
+ size_t i = static_cast<size_t>(algorithm);
163
+ if (i < GRPC_COMPRESS_ALGORITHMS_COUNT) {
164
+ set_.set(i);
165
+ }
166
+ }
167
+
168
+ std::string CompressionAlgorithmSet::ToString() const {
169
+ absl::InlinedVector<const char*, GRPC_COMPRESS_ALGORITHMS_COUNT> segments;
170
+ for (size_t i = 0; i < GRPC_COMPRESS_ALGORITHMS_COUNT; i++) {
171
+ if (set_.is_set(i)) {
172
+ segments.push_back(CompressionAlgorithmAsString(
173
+ static_cast<grpc_compression_algorithm>(i)));
174
+ }
175
+ }
176
+ return absl::StrJoin(segments, ", ");
177
+ }
178
+
179
+ Slice CompressionAlgorithmSet::ToSlice() const {
180
+ return Slice::FromCopiedString(ToString());
181
+ }
182
+
183
+ CompressionAlgorithmSet CompressionAlgorithmSet::FromString(
184
+ absl::string_view str) {
185
+ CompressionAlgorithmSet set{GRPC_COMPRESS_NONE};
186
+ for (auto algorithm : absl::StrSplit(str, ',')) {
187
+ auto parsed =
188
+ ParseCompressionAlgorithm(absl::StripAsciiWhitespace(algorithm));
189
+ if (parsed.has_value()) {
190
+ set.Set(*parsed);
191
+ }
192
+ }
193
+ return set;
194
+ }
195
+
196
+ uint32_t CompressionAlgorithmSet::ToLegacyBitmask() const {
197
+ uint32_t x = 0;
198
+ for (size_t i = 0; i < GRPC_COMPRESS_ALGORITHMS_COUNT; i++) {
199
+ if (set_.is_set(i)) {
200
+ x |= (1u << i);
201
+ }
282
202
  }
203
+ return x;
283
204
  }
205
+
206
+ absl::optional<grpc_compression_algorithm>
207
+ DefaultCompressionAlgorithmFromChannelArgs(const grpc_channel_args* args) {
208
+ if (args == nullptr) return absl::nullopt;
209
+ for (size_t i = 0; i < args->num_args; i++) {
210
+ if (strcmp(args->args[i].key, GRPC_COMPRESSION_CHANNEL_DEFAULT_ALGORITHM) ==
211
+ 0) {
212
+ if (args->args[i].type == GRPC_ARG_INTEGER) {
213
+ return static_cast<grpc_compression_algorithm>(
214
+ args->args[i].value.integer);
215
+ } else if (args->args[i].type == GRPC_ARG_STRING) {
216
+ return ParseCompressionAlgorithm(args->args[i].value.string);
217
+ }
218
+ }
219
+ }
220
+ return absl::nullopt;
221
+ }
222
+
223
+ } // namespace grpc_core
@@ -21,77 +21,72 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
- #include <grpc/compression.h>
25
- #include <grpc/slice.h>
26
-
27
- #include "src/core/lib/gpr/useful.h"
28
-
29
- #ifdef __cplusplus
30
- extern "C" {
31
- #endif
32
-
33
- typedef enum {
34
- GRPC_MESSAGE_COMPRESS_NONE = 0,
35
- GRPC_MESSAGE_COMPRESS_DEFLATE,
36
- GRPC_MESSAGE_COMPRESS_GZIP,
37
- /* TODO(ctiller): snappy */
38
- GRPC_MESSAGE_COMPRESS_ALGORITHMS_COUNT
39
- } grpc_message_compression_algorithm;
40
-
41
- /** Stream compression algorithms supported by gRPC */
42
- typedef enum {
43
- GRPC_STREAM_COMPRESS_NONE = 0,
44
- GRPC_STREAM_COMPRESS_GZIP,
45
- GRPC_STREAM_COMPRESS_ALGORITHMS_COUNT
46
- } grpc_stream_compression_algorithm;
47
-
48
- /* Interfaces performing transformation between compression algorithms and
49
- * levels. */
50
-
51
- grpc_message_compression_algorithm
52
- grpc_compression_algorithm_to_message_compression_algorithm(
53
- grpc_compression_algorithm algo);
54
-
55
- grpc_stream_compression_algorithm
56
- grpc_compression_algorithm_to_stream_compression_algorithm(
57
- grpc_compression_algorithm algo);
58
-
59
- uint32_t grpc_compression_bitset_to_message_bitset(uint32_t bitset);
24
+ #include <initializer_list>
60
25
 
61
- uint32_t grpc_compression_bitset_to_stream_bitset(uint32_t bitset);
26
+ #include "absl/strings/string_view.h"
27
+ #include "absl/types/optional.h"
62
28
 
63
- uint32_t grpc_compression_bitset_from_message_stream_compression_bitset(
64
- uint32_t message_bitset, uint32_t stream_bitset);
65
-
66
- int grpc_compression_algorithm_from_message_stream_compression_algorithm(
67
- grpc_compression_algorithm* algorithm,
68
- grpc_message_compression_algorithm message_algorithm,
69
- grpc_stream_compression_algorithm stream_algorithm);
70
-
71
- /* Interfaces for message compression. */
72
-
73
- int grpc_message_compression_algorithm_name(
74
- grpc_message_compression_algorithm algorithm, const char** name);
75
-
76
- grpc_message_compression_algorithm grpc_message_compression_algorithm_for_level(
77
- grpc_compression_level level, uint32_t accepted_encodings);
78
-
79
- int grpc_message_compression_algorithm_parse(
80
- grpc_slice value, grpc_message_compression_algorithm* algorithm);
81
-
82
- /* Interfaces for stream compression. */
83
-
84
- int grpc_stream_compression_algorithm_parse(
85
- grpc_slice value, grpc_stream_compression_algorithm* algorithm);
86
-
87
- #ifdef __cplusplus
88
- }
89
- #endif
29
+ #include <grpc/compression.h>
30
+ #include <grpc/impl/codegen/grpc_types.h>
31
+ #include <grpc/slice.h>
90
32
 
91
- inline int grpc_compression_options_is_algorithm_enabled_internal(
92
- const grpc_compression_options* opts,
93
- grpc_compression_algorithm algorithm) {
94
- return grpc_core::GetBit(opts->enabled_algorithms_bitset, algorithm);
95
- }
33
+ #include "src/core/lib/gprpp/bitset.h"
34
+ #include "src/core/lib/slice/slice.h"
35
+
36
+ namespace grpc_core {
37
+
38
+ // Given a string naming a compression algorithm, return the corresponding enum
39
+ // or nullopt on error.
40
+ absl::optional<grpc_compression_algorithm> ParseCompressionAlgorithm(
41
+ absl::string_view algorithm);
42
+ // Convert a compression algorithm to a string. Returns nullptr if a name is not
43
+ // known.
44
+ const char* CompressionAlgorithmAsString(grpc_compression_algorithm algorithm);
45
+ // Retrieve the default compression algorithm from channel args, return nullopt
46
+ // if not found.
47
+ absl::optional<grpc_compression_algorithm>
48
+ DefaultCompressionAlgorithmFromChannelArgs(const grpc_channel_args* args);
49
+
50
+ // A set of grpc_compression_algorithm values.
51
+ class CompressionAlgorithmSet {
52
+ public:
53
+ // Construct from a uint32_t bitmask - bit 0 => algorithm 0, bit 1 =>
54
+ // algorithm 1, etc.
55
+ static CompressionAlgorithmSet FromUint32(uint32_t value);
56
+ // Locate in channel args and construct from the found value.
57
+ static CompressionAlgorithmSet FromChannelArgs(const grpc_channel_args* args);
58
+ // Parse a string of comma-separated compression algorithms.
59
+ static CompressionAlgorithmSet FromString(absl::string_view str);
60
+ // Construct an empty set.
61
+ CompressionAlgorithmSet();
62
+ // Construct from a std::initializer_list of grpc_compression_algorithm
63
+ // values.
64
+ CompressionAlgorithmSet(
65
+ std::initializer_list<grpc_compression_algorithm> algorithms);
66
+
67
+ // Given a compression level, choose an appropriate algorithm from this set.
68
+ grpc_compression_algorithm CompressionAlgorithmForLevel(
69
+ grpc_compression_level level) const;
70
+ // Return true if this set contains algorithm, false otherwise.
71
+ bool IsSet(grpc_compression_algorithm algorithm) const;
72
+ // Add algorithm to this set.
73
+ void Set(grpc_compression_algorithm algorithm);
74
+
75
+ // Return a comma separated string of the algorithms in this set.
76
+ std::string ToString() const;
77
+ Slice ToSlice() const;
78
+
79
+ // Return a bitmask of the algorithms in this set.
80
+ uint32_t ToLegacyBitmask() const;
81
+
82
+ bool operator==(const CompressionAlgorithmSet& other) const {
83
+ return set_ == other.set_;
84
+ }
85
+
86
+ private:
87
+ BitSet<GRPC_COMPRESS_ALGORITHMS_COUNT> set_;
88
+ };
89
+
90
+ } // namespace grpc_core
96
91
 
97
92
  #endif /* GRPC_CORE_LIB_COMPRESSION_COMPRESSION_INTERNAL_H */
@@ -148,25 +148,25 @@ static int copy(grpc_slice_buffer* input, grpc_slice_buffer* output) {
148
148
  return 1;
149
149
  }
150
150
 
151
- static int compress_inner(grpc_message_compression_algorithm algorithm,
151
+ static int compress_inner(grpc_compression_algorithm algorithm,
152
152
  grpc_slice_buffer* input, grpc_slice_buffer* output) {
153
153
  switch (algorithm) {
154
- case GRPC_MESSAGE_COMPRESS_NONE:
154
+ case GRPC_COMPRESS_NONE:
155
155
  /* the fallback path always needs to be send uncompressed: we simply
156
156
  rely on that here */
157
157
  return 0;
158
- case GRPC_MESSAGE_COMPRESS_DEFLATE:
158
+ case GRPC_COMPRESS_DEFLATE:
159
159
  return zlib_compress(input, output, 0);
160
- case GRPC_MESSAGE_COMPRESS_GZIP:
160
+ case GRPC_COMPRESS_GZIP:
161
161
  return zlib_compress(input, output, 1);
162
- case GRPC_MESSAGE_COMPRESS_ALGORITHMS_COUNT:
162
+ case GRPC_COMPRESS_ALGORITHMS_COUNT:
163
163
  break;
164
164
  }
165
165
  gpr_log(GPR_ERROR, "invalid compression algorithm %d", algorithm);
166
166
  return 0;
167
167
  }
168
168
 
169
- int grpc_msg_compress(grpc_message_compression_algorithm algorithm,
169
+ int grpc_msg_compress(grpc_compression_algorithm algorithm,
170
170
  grpc_slice_buffer* input, grpc_slice_buffer* output) {
171
171
  if (!compress_inner(algorithm, input, output)) {
172
172
  copy(input, output);
@@ -175,16 +175,16 @@ int grpc_msg_compress(grpc_message_compression_algorithm algorithm,
175
175
  return 1;
176
176
  }
177
177
 
178
- int grpc_msg_decompress(grpc_message_compression_algorithm algorithm,
178
+ int grpc_msg_decompress(grpc_compression_algorithm algorithm,
179
179
  grpc_slice_buffer* input, grpc_slice_buffer* output) {
180
180
  switch (algorithm) {
181
- case GRPC_MESSAGE_COMPRESS_NONE:
181
+ case GRPC_COMPRESS_NONE:
182
182
  return copy(input, output);
183
- case GRPC_MESSAGE_COMPRESS_DEFLATE:
183
+ case GRPC_COMPRESS_DEFLATE:
184
184
  return zlib_decompress(input, output, 0);
185
- case GRPC_MESSAGE_COMPRESS_GZIP:
185
+ case GRPC_COMPRESS_GZIP:
186
186
  return zlib_decompress(input, output, 1);
187
- case GRPC_MESSAGE_COMPRESS_ALGORITHMS_COUNT:
187
+ case GRPC_COMPRESS_ALGORITHMS_COUNT:
188
188
  break;
189
189
  }
190
190
  gpr_log(GPR_ERROR, "invalid compression algorithm %d", algorithm);
@@ -28,13 +28,13 @@
28
28
  /* compress 'input' to 'output' using 'algorithm'.
29
29
  On success, appends compressed slices to output and returns 1.
30
30
  On failure, appends uncompressed slices to output and returns 0. */
31
- int grpc_msg_compress(grpc_message_compression_algorithm algorithm,
31
+ int grpc_msg_compress(grpc_compression_algorithm algorithm,
32
32
  grpc_slice_buffer* input, grpc_slice_buffer* output);
33
33
 
34
34
  /* decompress 'input' to 'output' using 'algorithm'.
35
35
  On success, appends slices to output and returns 1.
36
36
  On failure, output is unchanged, and returns 0. */
37
- int grpc_msg_decompress(grpc_message_compression_algorithm algorithm,
37
+ int grpc_msg_decompress(grpc_compression_algorithm algorithm,
38
38
  grpc_slice_buffer* input, grpc_slice_buffer* output);
39
39
 
40
40
  #endif /* GRPC_CORE_LIB_COMPRESSION_MESSAGE_COMPRESS_H */
@@ -106,6 +106,10 @@ constexpr size_t HashPointer(T* p, size_t range) {
106
106
  range;
107
107
  }
108
108
 
109
+ inline uint32_t MixHash32(uint32_t a, uint32_t b) {
110
+ return RotateLeft(a, 2u) ^ b;
111
+ }
112
+
109
113
  } // namespace grpc_core
110
114
 
111
115
  #define GPR_ARRAY_SIZE(array) (sizeof(array) / sizeof(*(array)))
@@ -146,6 +146,13 @@ class BitSet {
146
146
  return count;
147
147
  }
148
148
 
149
+ bool operator==(const BitSet& other) const {
150
+ for (size_t i = 0; i < kUnits; i++) {
151
+ if (units_[i] != other.units_[i]) return false;
152
+ }
153
+ return true;
154
+ }
155
+
149
156
  private:
150
157
  // Given a bit index, return which unit it's stored in.
151
158
  static constexpr size_t unit_for(size_t bit) { return bit / kUnitBits; }