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
@@ -31,5 +31,7 @@ void DestroySliceValue(const Buffer& value) {
31
31
  grpc_slice_unref_internal(value.slice);
32
32
  }
33
33
 
34
+ void DestroyTrivialMemento(const Buffer&) {}
35
+
34
36
  } // namespace metadata_detail
35
37
  } // namespace grpc_core
@@ -26,10 +26,12 @@
26
26
  #include "src/core/lib/iomgr/error.h"
27
27
  #include "src/core/lib/slice/slice.h"
28
28
  #include "src/core/lib/surface/validate_metadata.h"
29
- #include "src/core/lib/transport/metadata.h"
30
29
 
31
30
  namespace grpc_core {
32
31
 
32
+ using MetadataParseErrorFn =
33
+ absl::FunctionRef<void(absl::string_view error, const Slice& value)>;
34
+
33
35
  namespace metadata_detail {
34
36
 
35
37
  // Helper to determine whether a traits metadata is inlinable inside a memento,
@@ -38,15 +40,14 @@ template <typename Which>
38
40
  struct HasSimpleMemento {
39
41
  static constexpr bool value =
40
42
  std::is_trivial<typename Which::MementoType>::value &&
41
- sizeof(typename Which::MementoType) <= sizeof(uint64_t);
43
+ sizeof(typename Which::MementoType) <= sizeof(grpc_slice);
42
44
  };
43
45
 
44
46
  // Storage type for a single metadata entry.
45
47
  union Buffer {
46
- uint64_t trivial;
48
+ char trivial[sizeof(grpc_slice)];
47
49
  void* pointer;
48
50
  grpc_slice slice;
49
- grpc_mdelem mdelem;
50
51
  };
51
52
 
52
53
  // Given a key and a value, concatenate together to make a debug string.
@@ -71,7 +72,9 @@ GPR_ATTRIBUTE_NOINLINE std::string MakeDebugStringPipeline(
71
72
  // Extract a trivial field value from a Buffer - for MakeDebugStringPipeline.
72
73
  template <typename Field>
73
74
  Field FieldFromTrivial(const Buffer& value) {
74
- return static_cast<Field>(value.trivial);
75
+ Field x;
76
+ memcpy(&x, value.trivial, sizeof(x));
77
+ return x;
75
78
  }
76
79
 
77
80
  // Extract a pointer field value from a Buffer - for MakeDebugStringPipeline.
@@ -86,6 +89,9 @@ Slice SliceFromBuffer(const Buffer& buffer);
86
89
  // Unref the grpc_slice part of a Buffer (assumes it is in fact a grpc_slice).
87
90
  void DestroySliceValue(const Buffer& value);
88
91
 
92
+ // Destroy a trivial memento (empty function).
93
+ void DestroyTrivialMemento(const Buffer& value);
94
+
89
95
  } // namespace metadata_detail
90
96
 
91
97
  // A parsed metadata value.
@@ -107,7 +113,7 @@ class ParsedMetadata {
107
113
  uint32_t transport_size)
108
114
  : vtable_(ParsedMetadata::template TrivialTraitVTable<Which>()),
109
115
  transport_size_(transport_size) {
110
- value_.trivial = static_cast<uint64_t>(value);
116
+ memcpy(value_.trivial, &value, sizeof(value));
111
117
  }
112
118
  template <typename Which>
113
119
  ParsedMetadata(
@@ -129,13 +135,12 @@ class ParsedMetadata {
129
135
  transport_size_(transport_size) {
130
136
  value_.slice = value.TakeCSlice();
131
137
  }
132
- // Takes ownership of elem
133
- explicit ParsedMetadata(grpc_mdelem elem)
134
- : vtable_(grpc_is_binary_header_internal(GRPC_MDKEY(elem))
135
- ? MdelemVtable<true>()
136
- : MdelemVtable<false>()),
137
- transport_size_(GRPC_MDELEM_LENGTH(elem)) {
138
- value_.mdelem = elem;
138
+ // Construct metadata from a string key, slice value pair.
139
+ ParsedMetadata(Slice key, Slice value)
140
+ : vtable_(ParsedMetadata::KeyValueVTable(key.as_string_view())),
141
+ transport_size_(key.size() + value.size() + 32) {
142
+ value_.pointer =
143
+ new std::pair<Slice, Slice>(std::move(key), std::move(value));
139
144
  }
140
145
  ParsedMetadata() : vtable_(EmptyVTable()), transport_size_(0) {}
141
146
  ~ParsedMetadata() { vtable_->destroy(value_); }
@@ -158,9 +163,8 @@ class ParsedMetadata {
158
163
  }
159
164
 
160
165
  // Set this parsed value on a container.
161
- GRPC_MUST_USE_RESULT grpc_error_handle
162
- SetOnContainer(MetadataContainer* container) const {
163
- return vtable_->set(value_, container);
166
+ void SetOnContainer(MetadataContainer* container) const {
167
+ vtable_->set(value_, container);
164
168
  }
165
169
 
166
170
  // Is this a binary header or not?
@@ -168,16 +172,18 @@ class ParsedMetadata {
168
172
  // HTTP2 defined storage size of this metadatum.
169
173
  uint32_t transport_size() const { return transport_size_; }
170
174
  // Create a new parsed metadata with the same key but a different value.
171
- ParsedMetadata WithNewValue(Slice value) const {
175
+ ParsedMetadata WithNewValue(Slice value,
176
+ MetadataParseErrorFn on_error) const {
172
177
  ParsedMetadata result;
173
178
  result.vtable_ = vtable_;
174
179
  result.value_ = value_;
175
180
  result.transport_size_ =
176
- TransportSize(vtable_->key_length(value_), value.length());
177
- vtable_->with_new_value(&value, &result);
181
+ TransportSize(vtable_->key(value_).length(), value.length());
182
+ vtable_->with_new_value(&value, on_error, &result);
178
183
  return result;
179
184
  }
180
185
  std::string DebugString() const { return vtable_->debug_string(value_); }
186
+ absl::string_view key() const { return vtable_->key(value_); }
181
187
 
182
188
  // TODO(ctiller): move to transport
183
189
  static uint32_t TransportSize(uint32_t key_size, uint32_t value_size) {
@@ -191,29 +197,36 @@ class ParsedMetadata {
191
197
  struct VTable {
192
198
  const bool is_binary_header;
193
199
  void (*const destroy)(const Buffer& value);
194
- grpc_error_handle (*const set)(const Buffer& value,
195
- MetadataContainer* container);
200
+ void (*const set)(const Buffer& value, MetadataContainer* container);
196
201
  // result is a bitwise copy of the originating ParsedMetadata.
197
- void (*const with_new_value)(Slice* new_value, ParsedMetadata* result);
202
+ void (*const with_new_value)(Slice* new_value,
203
+ MetadataParseErrorFn on_error,
204
+ ParsedMetadata* result);
198
205
  std::string (*const debug_string)(const Buffer& value);
199
- // TODO(ctiller): when we delete mdelem, make this a simple integer constant
200
- // on the vtable
201
- size_t (*const key_length)(const Buffer& value);
206
+ absl::string_view (*const key)(const Buffer& value);
202
207
  };
203
208
 
204
209
  static const VTable* EmptyVTable();
210
+ static const VTable* KeyValueVTable(absl::string_view key);
205
211
  template <typename Which>
206
212
  static const VTable* TrivialTraitVTable();
207
213
  template <typename Which>
208
214
  static const VTable* NonTrivialTraitVTable();
209
215
  template <typename Which>
210
216
  static const VTable* SliceTraitVTable();
211
- template <bool kIsBinaryHeader>
212
- static const VTable* MdelemVtable();
213
217
 
214
- template <Slice (*ParseMemento)(Slice)>
215
- GPR_ATTRIBUTE_NOINLINE void WithNewValueSetSlice(Slice* slice) {
216
- value_.slice = ParseMemento(std::move(*slice)).TakeCSlice();
218
+ template <Slice (*ParseMemento)(Slice, MetadataParseErrorFn)>
219
+ GPR_ATTRIBUTE_NOINLINE static void WithNewValueSetSlice(
220
+ Slice* slice, MetadataParseErrorFn on_error, ParsedMetadata* result) {
221
+ result->value_.slice =
222
+ ParseMemento(std::move(*slice), on_error).TakeCSlice();
223
+ }
224
+
225
+ template <typename T, T (*ParseMemento)(Slice, MetadataParseErrorFn)>
226
+ GPR_ATTRIBUTE_NOINLINE static void WithNewValueSetTrivial(
227
+ Slice* slice, MetadataParseErrorFn on_error, ParsedMetadata* result) {
228
+ T memento = ParseMemento(std::move(*slice), on_error);
229
+ memcpy(result->value_.trivial, &memento, sizeof(memento));
217
230
  }
218
231
 
219
232
  const VTable* vtable_;
@@ -229,15 +242,15 @@ ParsedMetadata<MetadataContainer>::EmptyVTable() {
229
242
  static const VTable vtable = {
230
243
  false,
231
244
  // destroy
232
- [](const Buffer&) {},
245
+ metadata_detail::DestroyTrivialMemento,
233
246
  // set
234
- [](const Buffer&, MetadataContainer*) { return GRPC_ERROR_NONE; },
247
+ [](const Buffer&, MetadataContainer*) {},
235
248
  // with_new_value
236
- [](Slice*, ParsedMetadata*) {},
249
+ [](Slice*, MetadataParseErrorFn, ParsedMetadata*) {},
237
250
  // debug_string
238
251
  [](const Buffer&) -> std::string { return "empty"; },
239
- // key_length
240
- [](const Buffer&) -> size_t { return 0; },
252
+ // key
253
+ [](const Buffer&) -> absl::string_view { return ""; },
241
254
  };
242
255
  return &vtable;
243
256
  }
@@ -249,18 +262,17 @@ ParsedMetadata<MetadataContainer>::TrivialTraitVTable() {
249
262
  static const VTable vtable = {
250
263
  absl::EndsWith(Which::key(), "-bin"),
251
264
  // destroy
252
- [](const Buffer&) {},
265
+ metadata_detail::DestroyTrivialMemento,
253
266
  // set
254
267
  [](const Buffer& value, MetadataContainer* map) {
255
- map->Set(Which(),
256
- Which::MementoToValue(
257
- static_cast<typename Which::MementoType>(value.trivial)));
258
- return GRPC_ERROR_NONE;
268
+ map->Set(
269
+ Which(),
270
+ Which::MementoToValue(
271
+ metadata_detail::FieldFromTrivial<typename Which::MementoType>(
272
+ value)));
259
273
  },
260
274
  // with_new_value
261
- [](Slice* value, ParsedMetadata* result) {
262
- result->value_.trivial = Which::ParseMemento(std::move(*value));
263
- },
275
+ WithNewValueSetTrivial<typename Which::MementoType, Which::ParseMemento>,
264
276
  // debug_string
265
277
  [](const Buffer& value) {
266
278
  return metadata_detail::MakeDebugStringPipeline(
@@ -268,8 +280,8 @@ ParsedMetadata<MetadataContainer>::TrivialTraitVTable() {
268
280
  metadata_detail::FieldFromTrivial<typename Which::MementoType>,
269
281
  Which::DisplayValue);
270
282
  },
271
- // key_length
272
- [](const Buffer&) { return Which::key().size(); },
283
+ // key
284
+ [](const Buffer&) { return Which::key(); },
273
285
  };
274
286
  return &vtable;
275
287
  }
@@ -288,12 +300,11 @@ ParsedMetadata<MetadataContainer>::NonTrivialTraitVTable() {
288
300
  [](const Buffer& value, MetadataContainer* map) {
289
301
  auto* p = static_cast<typename Which::MementoType*>(value.pointer);
290
302
  map->Set(Which(), Which::MementoToValue(*p));
291
- return GRPC_ERROR_NONE;
292
303
  },
293
304
  // with_new_value
294
- [](Slice* value, ParsedMetadata* result) {
295
- result->value_.pointer = new
296
- typename Which::MementoType(Which::ParseMemento(std::move(*value)));
305
+ [](Slice* value, MetadataParseErrorFn on_error, ParsedMetadata* result) {
306
+ result->value_.pointer = new typename Which::MementoType(
307
+ Which::ParseMemento(std::move(*value), on_error));
297
308
  },
298
309
  // debug_string
299
310
  [](const Buffer& value) {
@@ -302,8 +313,8 @@ ParsedMetadata<MetadataContainer>::NonTrivialTraitVTable() {
302
313
  metadata_detail::FieldFromPointer<typename Which::MementoType>,
303
314
  Which::DisplayValue);
304
315
  },
305
- // key_length
306
- [](const Buffer&) { return Which::key().size(); },
316
+ // key
317
+ [](const Buffer&) { return Which::key(); },
307
318
  };
308
319
  return &vtable;
309
320
  }
@@ -320,61 +331,53 @@ ParsedMetadata<MetadataContainer>::SliceTraitVTable() {
320
331
  [](const Buffer& value, MetadataContainer* map) {
321
332
  map->Set(Which(), Which::MementoToValue(
322
333
  metadata_detail::SliceFromBuffer(value)));
323
- return GRPC_ERROR_NONE;
324
334
  },
325
335
  // with_new_value
326
- [](Slice* value, ParsedMetadata* result) {
327
- result->WithNewValueSetSlice<Which::ParseMemento>(value);
328
- },
336
+ WithNewValueSetSlice<Which::ParseMemento>,
329
337
  // debug_string
330
338
  [](const Buffer& value) {
331
339
  return metadata_detail::MakeDebugStringPipeline(
332
340
  Which::key(), value, metadata_detail::SliceFromBuffer,
333
341
  Which::DisplayValue);
334
342
  },
335
- // key_length
336
- [](const Buffer&) { return Which::key().size(); },
343
+ // key
344
+ [](const Buffer&) { return Which::key(); },
337
345
  };
338
346
  return &vtable;
339
347
  }
340
348
 
341
349
  template <typename MetadataContainer>
342
- template <bool kIsBinaryHeader>
343
350
  const typename ParsedMetadata<MetadataContainer>::VTable*
344
- ParsedMetadata<MetadataContainer>::MdelemVtable() {
345
- static const VTable vtable = {
346
- kIsBinaryHeader,
347
- // destroy
348
- [](const Buffer& value) { GRPC_MDELEM_UNREF(value.mdelem); },
349
- // set
350
- [](const Buffer& value, MetadataContainer* map) {
351
- auto md = GRPC_MDELEM_REF(value.mdelem);
352
- auto err = map->Append(md);
353
- // If an error occurs, md is not consumed and we need to.
354
- // This is an awful API, but that's why we're replacing it.
355
- if (err != GRPC_ERROR_NONE) {
356
- GRPC_MDELEM_UNREF(md);
357
- }
358
- return err;
359
- },
360
- // with_new_value
361
- [](Slice* value_slice, ParsedMetadata* result) {
362
- result->value_.mdelem = grpc_mdelem_from_slices(
363
- static_cast<const ManagedMemorySlice&>(
364
- grpc_slice_ref_internal(GRPC_MDKEY(result->value_.mdelem))),
365
- value_slice->TakeCSlice());
366
- },
367
- // debug_string
368
- [](const Buffer& value) {
369
- return metadata_detail::MakeDebugString(
370
- StringViewFromSlice(GRPC_MDKEY(value.mdelem)),
371
- StringViewFromSlice(GRPC_MDVALUE(value.mdelem)));
372
- },
373
- // key_length
374
- [](const Buffer& value) {
375
- return GRPC_SLICE_LENGTH(GRPC_MDKEY(value.mdelem));
376
- }};
377
- return &vtable;
351
+ ParsedMetadata<MetadataContainer>::KeyValueVTable(absl::string_view key) {
352
+ using KV = std::pair<Slice, Slice>;
353
+ static const auto destroy = [](const Buffer& value) {
354
+ delete static_cast<KV*>(value.pointer);
355
+ };
356
+ static const auto set = [](const Buffer& value, MetadataContainer* map) {
357
+ auto* p = static_cast<KV*>(value.pointer);
358
+ map->AppendUnknown(p->first.as_string_view(), p->second.Ref());
359
+ };
360
+ static const auto with_new_value = [](Slice* value, MetadataParseErrorFn,
361
+ ParsedMetadata* result) {
362
+ auto* p = new KV{
363
+ static_cast<KV*>(result->value_.pointer)->first.Ref(),
364
+ std::move(*value),
365
+ };
366
+ result->value_.pointer = p;
367
+ };
368
+ static const auto debug_string = [](const Buffer& value) {
369
+ auto* p = static_cast<KV*>(value.pointer);
370
+ return absl::StrCat(p->first.as_string_view(), ": ",
371
+ p->second.as_string_view());
372
+ };
373
+ static const auto key_fn = [](const Buffer& value) {
374
+ return static_cast<KV*>(value.pointer)->first.as_string_view();
375
+ };
376
+ static const VTable vtable[2] = {
377
+ {false, destroy, set, with_new_value, debug_string, key_fn},
378
+ {true, destroy, set, with_new_value, debug_string, key_fn},
379
+ };
380
+ return &vtable[absl::EndsWith(key, "-bin")];
378
381
  }
379
382
 
380
383
  } // namespace grpc_core
@@ -23,83 +23,215 @@
23
23
  #include <stdio.h>
24
24
  #include <string.h>
25
25
 
26
+ #include <grpc/support/log.h>
27
+
26
28
  #include "src/core/lib/gpr/string.h"
27
29
 
28
- static int64_t round_up(int64_t x, int64_t divisor) {
29
- return (x / divisor + (x % divisor != 0)) * divisor;
30
+ namespace grpc_core {
31
+
32
+ namespace {
33
+
34
+ int64_t DivideRoundingUp(int64_t dividend, int64_t divisor) {
35
+ return (dividend + divisor - 1) / divisor;
30
36
  }
31
37
 
32
- /* round an integer up to the next value with three significant figures */
33
- static int64_t round_up_to_three_sig_figs(int64_t x) {
34
- if (x < 1000) return x;
35
- if (x < 10000) return round_up(x, 10);
36
- if (x < 100000) return round_up(x, 100);
37
- if (x < 1000000) return round_up(x, 1000);
38
- if (x < 10000000) return round_up(x, 10000);
39
- if (x < 100000000) return round_up(x, 100000);
40
- if (x < 1000000000) return round_up(x, 1000000);
41
- return round_up(x, 10000000);
38
+ constexpr int64_t kSecondsPerMinute = 60;
39
+ constexpr int64_t kMinutesPerHour = 60;
40
+ constexpr int64_t kSecondsPerHour = kSecondsPerMinute * kMinutesPerHour;
41
+ constexpr int64_t kMaxHours = 27000;
42
+
43
+ bool IsAllSpace(const uint8_t* p, const uint8_t* end) {
44
+ while (p != end && *p == ' ') p++;
45
+ return p == end;
42
46
  }
43
47
 
44
- /* encode our minimum viable timeout value */
45
- static void enc_tiny(char* buffer) { memcpy(buffer, "1n", 3); }
48
+ } // namespace
46
49
 
47
- /* encode our maximum timeout value, about 1157 days */
48
- static void enc_huge(char* buffer) { memcpy(buffer, "99999999S", 10); }
50
+ Timeout Timeout::FromDuration(grpc_millis duration) {
51
+ return Timeout::FromMillis(duration);
52
+ }
49
53
 
50
- static void enc_ext(char* buffer, int64_t value, char ext) {
51
- int n = int64_ttoa(value, buffer);
52
- buffer[n] = ext;
53
- buffer[n + 1] = 0;
54
+ double Timeout::RatioVersus(Timeout other) const {
55
+ double a = AsDuration();
56
+ double b = other.AsDuration();
57
+ if (b == 0) {
58
+ if (a > 0) return 100;
59
+ if (a < 0) return -100;
60
+ return 0;
61
+ }
62
+ return 100 * (a / b - 1);
54
63
  }
55
64
 
56
- static void enc_seconds(char* buffer, int64_t sec) {
57
- sec = round_up_to_three_sig_figs(sec);
58
- if (sec % 3600 == 0) {
59
- enc_ext(buffer, sec / 3600, 'H');
60
- } else if (sec % 60 == 0) {
61
- enc_ext(buffer, sec / 60, 'M');
62
- } else {
63
- enc_ext(buffer, sec, 'S');
65
+ grpc_millis Timeout::AsDuration() const {
66
+ grpc_millis value = value_;
67
+ switch (unit_) {
68
+ case Unit::kNanoseconds:
69
+ return 0;
70
+ case Unit::kMilliseconds:
71
+ return value;
72
+ case Unit::kTenMilliseconds:
73
+ return value * 10;
74
+ case Unit::kHundredMilliseconds:
75
+ return value * 100;
76
+ case Unit::kSeconds:
77
+ return value * 1000;
78
+ case Unit::kTenSeconds:
79
+ return value * 10000;
80
+ case Unit::kHundredSeconds:
81
+ return value * 100000;
82
+ case Unit::kMinutes:
83
+ return value * 1000 * kSecondsPerMinute;
84
+ case Unit::kTenMinutes:
85
+ return value * 10000 * kSecondsPerMinute;
86
+ case Unit::kHundredMinutes:
87
+ return value * 100000 * kSecondsPerMinute;
88
+ case Unit::kHours:
89
+ return value * 1000 * kSecondsPerHour;
64
90
  }
91
+ GPR_UNREACHABLE_CODE(return -1);
65
92
  }
66
93
 
67
- static void enc_millis(char* buffer, int64_t x) {
68
- x = round_up_to_three_sig_figs(x);
69
- if (x < GPR_MS_PER_SEC) {
70
- enc_ext(buffer, x, 'm');
94
+ Slice Timeout::Encode() const {
95
+ char buf[10];
96
+ char* p = buf;
97
+ uint16_t n = value_;
98
+ int digits;
99
+ if (n >= 10000) {
100
+ digits = 5;
101
+ } else if (n >= 1000) {
102
+ digits = 4;
103
+ } else if (n >= 100) {
104
+ digits = 3;
105
+ } else if (n >= 10) {
106
+ digits = 2;
71
107
  } else {
72
- if (x % GPR_MS_PER_SEC == 0) {
73
- enc_seconds(buffer, x / GPR_MS_PER_SEC);
74
- } else {
75
- enc_ext(buffer, x, 'm');
108
+ digits = 1;
109
+ }
110
+ switch (digits) {
111
+ case 5:
112
+ *p++ = '0' + n / 10000;
113
+ n %= 10000;
114
+ ABSL_FALLTHROUGH_INTENDED;
115
+ case 4:
116
+ *p++ = '0' + n / 1000;
117
+ n %= 1000;
118
+ ABSL_FALLTHROUGH_INTENDED;
119
+ case 3:
120
+ *p++ = '0' + n / 100;
121
+ n %= 100;
122
+ ABSL_FALLTHROUGH_INTENDED;
123
+ case 2:
124
+ *p++ = '0' + n / 10;
125
+ n %= 10;
126
+ ABSL_FALLTHROUGH_INTENDED;
127
+ case 1:
128
+ *p++ = '0' + n;
129
+ }
130
+ switch (unit_) {
131
+ case Unit::kNanoseconds:
132
+ *p++ = 'n';
133
+ break;
134
+ case Unit::kHundredMilliseconds:
135
+ *p++ = '0';
136
+ ABSL_FALLTHROUGH_INTENDED;
137
+ case Unit::kTenMilliseconds:
138
+ *p++ = '0';
139
+ ABSL_FALLTHROUGH_INTENDED;
140
+ case Unit::kMilliseconds:
141
+ *p++ = 'm';
142
+ break;
143
+ case Unit::kHundredSeconds:
144
+ *p++ = '0';
145
+ ABSL_FALLTHROUGH_INTENDED;
146
+ case Unit::kTenSeconds:
147
+ *p++ = '0';
148
+ ABSL_FALLTHROUGH_INTENDED;
149
+ case Unit::kSeconds:
150
+ *p++ = 'S';
151
+ break;
152
+ case Unit::kHundredMinutes:
153
+ *p++ = '0';
154
+ ABSL_FALLTHROUGH_INTENDED;
155
+ case Unit::kTenMinutes:
156
+ *p++ = '0';
157
+ ABSL_FALLTHROUGH_INTENDED;
158
+ case Unit::kMinutes:
159
+ *p++ = 'M';
160
+ break;
161
+ case Unit::kHours:
162
+ *p++ = 'H';
163
+ break;
164
+ }
165
+ return Slice::FromCopiedBuffer(buf, p - buf);
166
+ }
167
+
168
+ Timeout Timeout::FromMillis(int64_t millis) {
169
+ if (millis <= 0) {
170
+ return Timeout(1, Unit::kNanoseconds);
171
+ } else if (millis < 1000) {
172
+ return Timeout(millis, Unit::kMilliseconds);
173
+ } else if (millis < 10000) {
174
+ int64_t value = DivideRoundingUp(millis, 10);
175
+ if (value % 100 != 0) return Timeout(value, Unit::kTenMilliseconds);
176
+ } else if (millis < 100000) {
177
+ int64_t value = DivideRoundingUp(millis, 100);
178
+ if (value % 10 != 0) return Timeout(value, Unit::kHundredMilliseconds);
179
+ }
180
+ return Timeout::FromSeconds(DivideRoundingUp(millis, 1000));
181
+ }
182
+
183
+ Timeout Timeout::FromSeconds(int64_t seconds) {
184
+ GPR_DEBUG_ASSERT(seconds != 0);
185
+ if (seconds < 1000) {
186
+ if (seconds % kSecondsPerMinute != 0) {
187
+ return Timeout(seconds, Unit::kSeconds);
188
+ }
189
+ } else if (seconds < 10000) {
190
+ int64_t value = DivideRoundingUp(seconds, 10);
191
+ if ((value * 10) % kSecondsPerMinute != 0) {
192
+ return Timeout(value, Unit::kTenSeconds);
193
+ }
194
+ } else if (seconds < 100000) {
195
+ int64_t value = DivideRoundingUp(seconds, 100);
196
+ if ((value * 100) % kSecondsPerMinute != 0) {
197
+ return Timeout(value, Unit::kHundredSeconds);
76
198
  }
77
199
  }
200
+ return Timeout::FromMinutes(DivideRoundingUp(seconds, kSecondsPerMinute));
78
201
  }
79
202
 
80
- void grpc_http2_encode_timeout(grpc_millis timeout, char* buffer) {
81
- const grpc_millis kMaxTimeout = 99999999000;
82
- if (timeout <= 0) {
83
- enc_tiny(buffer);
84
- } else if (timeout < 1000 * GPR_MS_PER_SEC) {
85
- enc_millis(buffer, timeout);
86
- } else if (timeout >= kMaxTimeout) {
87
- enc_huge(buffer);
88
- } else {
89
- enc_seconds(buffer,
90
- timeout / GPR_MS_PER_SEC + (timeout % GPR_MS_PER_SEC != 0));
203
+ Timeout Timeout::FromMinutes(int64_t minutes) {
204
+ GPR_DEBUG_ASSERT(minutes != 0);
205
+ if (minutes < 1000) {
206
+ if (minutes % kMinutesPerHour != 0) {
207
+ return Timeout(minutes, Unit::kMinutes);
208
+ }
209
+ } else if (minutes < 10000) {
210
+ int64_t value = DivideRoundingUp(minutes, 10);
211
+ if ((value * 10) % kMinutesPerHour != 0) {
212
+ return Timeout(value, Unit::kTenMinutes);
213
+ }
214
+ } else if (minutes < 100000) {
215
+ int64_t value = DivideRoundingUp(minutes, 100);
216
+ if ((value * 100) % kMinutesPerHour != 0) {
217
+ return Timeout(value, Unit::kHundredMinutes);
218
+ }
91
219
  }
220
+ return Timeout::FromHours(DivideRoundingUp(minutes, kMinutesPerHour));
92
221
  }
93
222
 
94
- static int is_all_whitespace(const char* p, const char* end) {
95
- while (p != end && *p == ' ') p++;
96
- return p == end;
223
+ Timeout Timeout::FromHours(int64_t hours) {
224
+ GPR_DEBUG_ASSERT(hours != 0);
225
+ if (hours < kMaxHours) {
226
+ return Timeout(hours, Unit::kHours);
227
+ }
228
+ return Timeout(kMaxHours, Unit::kHours);
97
229
  }
98
230
 
99
- int grpc_http2_decode_timeout(const grpc_slice& text, grpc_millis* timeout) {
231
+ absl::optional<grpc_millis> ParseTimeout(const Slice& text) {
100
232
  grpc_millis x = 0;
101
- const uint8_t* p = GRPC_SLICE_START_PTR(text);
102
- const uint8_t* end = GRPC_SLICE_END_PTR(text);
233
+ const uint8_t* p = text.begin();
234
+ const uint8_t* end = text.end();
103
235
  int have_digit = 0;
104
236
  /* skip whitespace */
105
237
  for (; p != end && *p == ' '; p++) {
@@ -111,41 +243,43 @@ int grpc_http2_decode_timeout(const grpc_slice& text, grpc_millis* timeout) {
111
243
  /* spec allows max. 8 digits, but we allow values up to 1,000,000,000 */
112
244
  if (x >= (100 * 1000 * 1000)) {
113
245
  if (x != (100 * 1000 * 1000) || digit != 0) {
114
- *timeout = GRPC_MILLIS_INF_FUTURE;
115
- return 1;
246
+ return GRPC_MILLIS_INF_FUTURE;
116
247
  }
117
248
  }
118
249
  x = x * 10 + digit;
119
250
  }
120
- if (!have_digit) return 0;
251
+ if (!have_digit) return absl::nullopt;
121
252
  /* skip whitespace */
122
253
  for (; p != end && *p == ' '; p++) {
123
254
  }
124
- if (p == end) return 0;
255
+ if (p == end) return absl::nullopt;
125
256
  /* decode unit specifier */
257
+ int64_t timeout;
126
258
  switch (*p) {
127
259
  case 'n':
128
- *timeout = x / GPR_NS_PER_MS + (x % GPR_NS_PER_MS != 0);
260
+ timeout = x / GPR_NS_PER_MS + (x % GPR_NS_PER_MS != 0);
129
261
  break;
130
262
  case 'u':
131
- *timeout = x / GPR_US_PER_MS + (x % GPR_US_PER_MS != 0);
263
+ timeout = x / GPR_US_PER_MS + (x % GPR_US_PER_MS != 0);
132
264
  break;
133
265
  case 'm':
134
- *timeout = x;
266
+ timeout = x;
135
267
  break;
136
268
  case 'S':
137
- *timeout = x * GPR_MS_PER_SEC;
269
+ timeout = x * GPR_MS_PER_SEC;
138
270
  break;
139
271
  case 'M':
140
- *timeout = x * 60 * GPR_MS_PER_SEC;
272
+ timeout = x * 60 * GPR_MS_PER_SEC;
141
273
  break;
142
274
  case 'H':
143
- *timeout = x * 60 * 60 * GPR_MS_PER_SEC;
275
+ timeout = x * 60 * 60 * GPR_MS_PER_SEC;
144
276
  break;
145
277
  default:
146
- return 0;
278
+ return absl::nullopt;
147
279
  }
148
280
  p++;
149
- return is_all_whitespace(reinterpret_cast<const char*>(p),
150
- reinterpret_cast<const char*>(end));
281
+ if (!IsAllSpace(p, end)) return absl::nullopt;
282
+ return timeout;
151
283
  }
284
+
285
+ } // namespace grpc_core