grpc 1.60.2 → 1.61.0.pre2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +208 -165
  3. data/include/grpc/event_engine/event_engine.h +59 -12
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +6 -0
  5. data/include/grpc/event_engine/internal/slice_cast.h +12 -0
  6. data/include/grpc/event_engine/memory_allocator.h +3 -1
  7. data/include/grpc/event_engine/slice.h +5 -0
  8. data/include/grpc/grpc_security.h +22 -1
  9. data/include/grpc/impl/call.h +29 -0
  10. data/include/grpc/impl/channel_arg_names.h +12 -1
  11. data/include/grpc/impl/slice_type.h +1 -1
  12. data/include/grpc/module.modulemap +1 -0
  13. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +54 -7
  14. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +20 -6
  15. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +10 -13
  16. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +18 -10
  17. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +326 -0
  18. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +143 -0
  19. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -2
  20. data/src/core/ext/filters/client_channel/client_channel.cc +32 -6
  21. data/src/core/ext/filters/client_channel/client_channel_internal.h +2 -0
  22. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +54 -21
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +3 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +2 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.cc +12 -15
  27. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.h +8 -5
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +139 -92
  29. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +9 -4
  30. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +9 -4
  31. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +10 -11
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +94 -93
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +5 -3
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +12 -15
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +38 -16
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +25 -28
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +10 -10
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +37 -35
  39. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -9
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +504 -461
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +232 -122
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -6
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +642 -251
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +2 -6
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +7 -8
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +2 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +3 -1
  48. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
  49. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -2
  50. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +6 -8
  51. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.cc +1031 -0
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.h +277 -0
  53. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +128 -270
  54. data/src/core/ext/filters/client_channel/resolver/xds/{xds_resolver.h → xds_resolver_attributes.h} +5 -4
  55. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.cc +25 -0
  56. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.h +30 -0
  57. data/src/core/ext/filters/client_channel/retry_filter.cc +1 -0
  58. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +35 -17
  59. data/src/core/ext/filters/deadline/deadline_filter.cc +12 -0
  60. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +17 -13
  61. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +13 -4
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +23 -32
  63. data/src/core/ext/filters/http/client/http_client_filter.h +10 -5
  64. data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
  65. data/src/core/ext/filters/http/client_authority_filter.h +12 -4
  66. data/src/core/ext/filters/http/http_filters_plugin.cc +42 -20
  67. data/src/core/ext/filters/http/message_compress/compression_filter.cc +55 -80
  68. data/src/core/ext/filters/http/message_compress/compression_filter.h +54 -12
  69. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.cc +325 -0
  70. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.h +139 -0
  71. data/src/core/ext/filters/http/server/http_server_filter.cc +41 -41
  72. data/src/core/ext/filters/http/server/http_server_filter.h +11 -4
  73. data/src/core/ext/filters/message_size/message_size_filter.cc +56 -76
  74. data/src/core/ext/filters/message_size/message_size_filter.h +35 -23
  75. data/src/core/ext/filters/rbac/rbac_filter.cc +15 -11
  76. data/src/core/ext/filters/rbac/rbac_filter.h +11 -4
  77. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +25 -13
  78. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +47 -50
  79. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +21 -4
  80. data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
  81. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
  82. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +11 -2
  83. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +68 -145
  84. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -3
  85. data/src/core/ext/transport/chttp2/transport/flow_control.cc +21 -82
  86. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -8
  87. data/src/core/ext/transport/chttp2/transport/frame.cc +506 -0
  88. data/src/core/ext/transport/chttp2/transport/frame.h +214 -0
  89. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -1
  90. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +33 -79
  91. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -7
  92. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -36
  93. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -2
  94. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +122 -32
  95. data/src/core/ext/transport/chttp2/transport/http2_settings.h +142 -37
  96. data/src/core/ext/transport/chttp2/transport/internal.h +1 -22
  97. data/src/core/ext/transport/chttp2/transport/parsing.cc +23 -37
  98. data/src/core/ext/transport/chttp2/transport/writing.cc +26 -58
  99. data/src/core/ext/transport/inproc/inproc_transport.cc +172 -13
  100. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +712 -0
  101. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +151 -0
  102. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +33 -0
  103. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +133 -0
  104. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +50 -0
  105. data/src/core/ext/xds/certificate_provider_store.cc +2 -1
  106. data/src/core/ext/xds/certificate_provider_store.h +0 -5
  107. data/src/core/ext/xds/xds_api.cc +31 -18
  108. data/src/core/ext/xds/xds_api.h +2 -2
  109. data/src/core/ext/xds/xds_bootstrap.h +3 -0
  110. data/src/core/ext/xds/xds_certificate_provider.cc +88 -287
  111. data/src/core/ext/xds/xds_certificate_provider.h +44 -111
  112. data/src/core/ext/xds/xds_client.cc +420 -414
  113. data/src/core/ext/xds/xds_client.h +31 -22
  114. data/src/core/ext/xds/xds_client_grpc.cc +3 -1
  115. data/src/core/ext/xds/xds_cluster.cc +104 -11
  116. data/src/core/ext/xds/xds_cluster.h +9 -1
  117. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +9 -5
  118. data/src/core/ext/xds/xds_common_types.cc +14 -10
  119. data/src/core/ext/xds/xds_endpoint.cc +9 -4
  120. data/src/core/ext/xds/xds_endpoint.h +5 -1
  121. data/src/core/ext/xds/xds_health_status.cc +12 -2
  122. data/src/core/ext/xds/xds_health_status.h +4 -2
  123. data/src/core/ext/xds/xds_http_rbac_filter.cc +5 -3
  124. data/src/core/ext/xds/xds_listener.cc +14 -8
  125. data/src/core/ext/xds/xds_resource_type_impl.h +6 -4
  126. data/src/core/ext/xds/xds_route_config.cc +34 -22
  127. data/src/core/ext/xds/xds_route_config.h +1 -0
  128. data/src/core/ext/xds/xds_server_config_fetcher.cc +61 -57
  129. data/src/core/ext/xds/xds_transport.h +3 -0
  130. data/src/core/ext/xds/xds_transport_grpc.cc +47 -50
  131. data/src/core/ext/xds/xds_transport_grpc.h +4 -0
  132. data/src/core/lib/channel/call_tracer.cc +12 -0
  133. data/src/core/lib/channel/call_tracer.h +17 -3
  134. data/src/core/lib/channel/channel_args.cc +24 -14
  135. data/src/core/lib/channel/channel_args.h +74 -13
  136. data/src/core/lib/channel/channel_stack.cc +27 -0
  137. data/src/core/lib/channel/channel_stack.h +10 -10
  138. data/src/core/lib/channel/connected_channel.cc +64 -18
  139. data/src/core/lib/channel/promise_based_filter.h +1041 -1
  140. data/src/core/lib/channel/server_call_tracer_filter.cc +43 -35
  141. data/src/core/lib/compression/compression_internal.cc +0 -3
  142. data/src/core/lib/event_engine/ares_resolver.cc +35 -14
  143. data/src/core/lib/event_engine/ares_resolver.h +9 -10
  144. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +8 -1
  145. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +132 -0
  146. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +61 -0
  147. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +52 -36
  148. data/src/core/lib/event_engine/posix_engine/posix_engine.h +4 -9
  149. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +11 -3
  150. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +9 -2
  151. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +7 -0
  152. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +17 -27
  153. data/src/core/lib/event_engine/posix_engine/timer_manager.h +0 -3
  154. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +55 -0
  155. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +114 -0
  156. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.h +51 -0
  157. data/src/core/lib/event_engine/windows/windows_engine.cc +7 -7
  158. data/src/core/lib/experiments/config.cc +13 -0
  159. data/src/core/lib/experiments/config.h +3 -0
  160. data/src/core/lib/experiments/experiments.cc +245 -366
  161. data/src/core/lib/experiments/experiments.h +50 -156
  162. data/src/core/lib/gprpp/debug_location.h +13 -0
  163. data/src/core/lib/gprpp/dual_ref_counted.h +36 -7
  164. data/src/core/lib/gprpp/orphanable.h +27 -0
  165. data/src/core/lib/gprpp/ref_counted.h +63 -22
  166. data/src/core/lib/gprpp/ref_counted_ptr.h +70 -27
  167. data/src/core/lib/gprpp/ref_counted_string.h +13 -0
  168. data/src/core/lib/gprpp/status_helper.cc +1 -2
  169. data/src/core/lib/iomgr/combiner.cc +15 -51
  170. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +31 -0
  171. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +16 -0
  172. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -3
  173. data/src/core/lib/load_balancing/lb_policy.h +1 -1
  174. data/src/core/lib/promise/activity.cc +17 -2
  175. data/src/core/lib/promise/activity.h +5 -4
  176. data/src/core/lib/promise/all_ok.h +80 -0
  177. data/src/core/lib/promise/detail/join_state.h +2077 -0
  178. data/src/core/lib/promise/detail/promise_factory.h +1 -0
  179. data/src/core/lib/promise/detail/promise_like.h +8 -1
  180. data/src/core/lib/promise/detail/seq_state.h +3458 -150
  181. data/src/core/lib/promise/detail/status.h +42 -5
  182. data/src/core/lib/promise/for_each.h +13 -1
  183. data/src/core/lib/promise/if.h +4 -0
  184. data/src/core/lib/promise/latch.h +6 -3
  185. data/src/core/lib/promise/party.cc +33 -31
  186. data/src/core/lib/promise/party.h +142 -6
  187. data/src/core/lib/promise/poll.h +39 -13
  188. data/src/core/lib/promise/promise.h +4 -0
  189. data/src/core/lib/promise/seq.h +107 -7
  190. data/src/core/lib/promise/status_flag.h +196 -0
  191. data/src/core/lib/promise/try_join.h +132 -0
  192. data/src/core/lib/promise/try_seq.h +132 -10
  193. data/src/core/lib/resolver/endpoint_addresses.cc +0 -1
  194. data/src/core/lib/resolver/endpoint_addresses.h +48 -0
  195. data/src/core/lib/resource_quota/arena.h +2 -2
  196. data/src/core/lib/resource_quota/memory_quota.cc +57 -8
  197. data/src/core/lib/resource_quota/memory_quota.h +6 -0
  198. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +14 -11
  199. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +14 -5
  200. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -0
  201. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +4 -0
  202. data/src/core/lib/security/credentials/external/external_account_credentials.cc +28 -20
  203. data/src/core/lib/security/credentials/external/external_account_credentials.h +4 -0
  204. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +4 -0
  205. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -0
  206. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -0
  207. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +4 -0
  208. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -1
  209. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +0 -3
  210. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +12 -0
  211. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +22 -5
  212. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.h +1 -5
  213. data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -0
  214. data/src/core/lib/security/credentials/xds/xds_credentials.cc +21 -28
  215. data/src/core/lib/security/credentials/xds/xds_credentials.h +2 -4
  216. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -3
  217. data/src/core/lib/security/transport/auth_filters.h +71 -4
  218. data/src/core/lib/security/transport/client_auth_filter.cc +2 -4
  219. data/src/core/lib/security/transport/legacy_server_auth_filter.cc +244 -0
  220. data/src/core/lib/security/transport/server_auth_filter.cc +70 -90
  221. data/src/core/lib/slice/slice_buffer.h +3 -0
  222. data/src/core/lib/surface/builtins.cc +1 -1
  223. data/src/core/lib/surface/call.cc +683 -196
  224. data/src/core/lib/surface/call.h +26 -13
  225. data/src/core/lib/surface/call_trace.cc +42 -1
  226. data/src/core/lib/surface/channel.cc +0 -1
  227. data/src/core/lib/surface/channel.h +0 -6
  228. data/src/core/lib/surface/channel_init.h +26 -0
  229. data/src/core/lib/surface/init.cc +14 -8
  230. data/src/core/lib/surface/server.cc +256 -237
  231. data/src/core/lib/surface/server.h +26 -54
  232. data/src/core/lib/surface/version.cc +2 -2
  233. data/src/core/lib/surface/wait_for_cq_end_op.h +94 -0
  234. data/src/core/lib/transport/call_final_info.cc +38 -0
  235. data/src/core/lib/transport/call_final_info.h +54 -0
  236. data/src/core/lib/transport/connectivity_state.cc +3 -2
  237. data/src/core/lib/transport/connectivity_state.h +4 -0
  238. data/src/core/lib/transport/metadata_batch.h +4 -4
  239. data/src/core/lib/transport/transport.cc +70 -19
  240. data/src/core/lib/transport/transport.h +395 -25
  241. data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -0
  242. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +0 -3
  243. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  244. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  245. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  246. data/src/core/tsi/ssl_transport_security.cc +65 -43
  247. data/src/ruby/ext/grpc/rb_channel_args.c +3 -1
  248. data/src/ruby/ext/grpc/rb_grpc.c +0 -1
  249. data/src/ruby/ext/grpc/rb_grpc.h +0 -2
  250. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  251. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  252. data/src/ruby/lib/grpc/version.rb +1 -1
  253. data/third_party/upb/upb/reflection/def_pool.h +2 -2
  254. data/third_party/zlib/adler32.c +5 -27
  255. data/third_party/zlib/compress.c +5 -16
  256. data/third_party/zlib/crc32.c +86 -162
  257. data/third_party/zlib/deflate.c +233 -336
  258. data/third_party/zlib/deflate.h +8 -8
  259. data/third_party/zlib/gzguts.h +11 -12
  260. data/third_party/zlib/infback.c +7 -23
  261. data/third_party/zlib/inffast.c +1 -4
  262. data/third_party/zlib/inffast.h +1 -1
  263. data/third_party/zlib/inflate.c +30 -99
  264. data/third_party/zlib/inftrees.c +6 -11
  265. data/third_party/zlib/inftrees.h +3 -3
  266. data/third_party/zlib/trees.c +224 -302
  267. data/third_party/zlib/uncompr.c +4 -12
  268. data/third_party/zlib/zconf.h +6 -2
  269. data/third_party/zlib/zlib.h +191 -188
  270. data/third_party/zlib/zutil.c +16 -44
  271. data/third_party/zlib/zutil.h +10 -10
  272. metadata +35 -13
  273. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +0 -1173
  274. data/src/core/lib/event_engine/memory_allocator.cc +0 -74
  275. data/src/core/lib/transport/pid_controller.cc +0 -51
  276. data/src/core/lib/transport/pid_controller.h +0 -116
  277. data/third_party/upb/upb/collections/array.h +0 -17
  278. data/third_party/upb/upb/collections/map.h +0 -17
  279. data/third_party/upb/upb/upb.hpp +0 -18
@@ -0,0 +1,506 @@
1
+ // Copyright 2023 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include <grpc/support/port_platform.h>
16
+
17
+ #include "src/core/ext/transport/chttp2/transport/frame.h"
18
+
19
+ #include <stddef.h>
20
+
21
+ #include <cstdint>
22
+ #include <utility>
23
+
24
+ #include "absl/status/status.h"
25
+ #include "absl/strings/str_cat.h"
26
+
27
+ #include <grpc/support/log.h>
28
+
29
+ #include "src/core/lib/gprpp/crash.h"
30
+
31
+ namespace grpc_core {
32
+
33
+ namespace {
34
+
35
+ constexpr uint8_t kFrameTypeData = 0;
36
+ constexpr uint8_t kFrameTypeHeader = 1;
37
+ constexpr uint8_t kFrameTypeContinuation = 9;
38
+ constexpr uint8_t kFrameTypeRstStream = 3;
39
+ constexpr uint8_t kFrameTypeSettings = 4;
40
+ constexpr uint8_t kFrameTypePing = 6;
41
+ constexpr uint8_t kFrameTypeGoaway = 7;
42
+ constexpr uint8_t kFrameTypeWindowUpdate = 8;
43
+ constexpr uint8_t kFrameTypePushPromise = 5;
44
+
45
+ constexpr uint8_t kFlagEndStream = 1;
46
+ constexpr uint8_t kFlagAck = 1;
47
+ constexpr uint8_t kFlagEndHeaders = 4;
48
+ constexpr uint8_t kFlagPadded = 8;
49
+ constexpr uint8_t kFlagPriority = 0x20;
50
+
51
+ constexpr size_t kFrameHeaderSize = 9;
52
+
53
+ void Write2b(uint16_t x, uint8_t* output) {
54
+ output[0] = static_cast<uint8_t>(x >> 8);
55
+ output[1] = static_cast<uint8_t>(x);
56
+ }
57
+
58
+ uint16_t Read2b(const uint8_t* input) {
59
+ return static_cast<uint16_t>(input[0]) << 8 | static_cast<uint16_t>(input[1]);
60
+ }
61
+
62
+ void Write3b(uint32_t x, uint8_t* output) {
63
+ GPR_ASSERT(x < 16777216);
64
+ output[0] = static_cast<uint8_t>(x >> 16);
65
+ output[1] = static_cast<uint8_t>(x >> 8);
66
+ output[2] = static_cast<uint8_t>(x);
67
+ }
68
+
69
+ uint32_t Read3b(const uint8_t* input) {
70
+ return static_cast<uint32_t>(input[0]) << 16 |
71
+ static_cast<uint32_t>(input[1]) << 8 | static_cast<uint32_t>(input[2]);
72
+ }
73
+
74
+ void Write4b(uint32_t x, uint8_t* output) {
75
+ output[0] = static_cast<uint8_t>(x >> 24);
76
+ output[1] = static_cast<uint8_t>(x >> 16);
77
+ output[2] = static_cast<uint8_t>(x >> 8);
78
+ output[3] = static_cast<uint8_t>(x);
79
+ }
80
+
81
+ uint32_t Read4b(const uint8_t* input) {
82
+ return static_cast<uint32_t>(input[0]) << 24 |
83
+ static_cast<uint32_t>(input[1]) << 16 |
84
+ static_cast<uint32_t>(input[2]) << 8 | static_cast<uint32_t>(input[3]);
85
+ }
86
+
87
+ void Write8b(uint64_t x, uint8_t* output) {
88
+ output[0] = static_cast<uint8_t>(x >> 56);
89
+ output[1] = static_cast<uint8_t>(x >> 48);
90
+ output[2] = static_cast<uint8_t>(x >> 40);
91
+ output[3] = static_cast<uint8_t>(x >> 32);
92
+ output[4] = static_cast<uint8_t>(x >> 24);
93
+ output[5] = static_cast<uint8_t>(x >> 16);
94
+ output[6] = static_cast<uint8_t>(x >> 8);
95
+ output[7] = static_cast<uint8_t>(x);
96
+ }
97
+
98
+ uint64_t Read8b(const uint8_t* input) {
99
+ return static_cast<uint64_t>(input[0]) << 56 |
100
+ static_cast<uint64_t>(input[1]) << 48 |
101
+ static_cast<uint64_t>(input[2]) << 40 |
102
+ static_cast<uint64_t>(input[3]) << 32 |
103
+ static_cast<uint64_t>(input[4]) << 24 |
104
+ static_cast<uint64_t>(input[5]) << 16 |
105
+ static_cast<uint64_t>(input[6]) << 8 | static_cast<uint64_t>(input[7]);
106
+ }
107
+
108
+ uint8_t MaybeFlag(bool condition, uint8_t flag_mask) {
109
+ return condition ? flag_mask : 0;
110
+ }
111
+
112
+ bool ExtractFlag(uint8_t flags, uint8_t flag_mask) {
113
+ return (flags & flag_mask) != 0;
114
+ }
115
+
116
+ class SerializeExtraBytesRequired {
117
+ public:
118
+ size_t operator()(const Http2DataFrame&) { return 0; }
119
+ size_t operator()(const Http2HeaderFrame&) { return 0; }
120
+ size_t operator()(const Http2ContinuationFrame&) { return 0; }
121
+ size_t operator()(const Http2RstStreamFrame&) { return 4; }
122
+ size_t operator()(const Http2SettingsFrame& f) {
123
+ return 6 * f.settings.size();
124
+ }
125
+ size_t operator()(const Http2PingFrame&) { return 8; }
126
+ size_t operator()(const Http2GoawayFrame&) { return 8; }
127
+ size_t operator()(const Http2WindowUpdateFrame&) { return 4; }
128
+ size_t operator()(const Http2UnknownFrame&) { Crash("unreachable"); }
129
+ };
130
+
131
+ class SerializeHeaderAndPayload {
132
+ public:
133
+ SerializeHeaderAndPayload(size_t extra_bytes, SliceBuffer& out)
134
+ : out_(out),
135
+ extra_bytes_(MutableSlice::CreateUninitialized(extra_bytes)) {}
136
+
137
+ void operator()(Http2DataFrame& frame) {
138
+ auto hdr = extra_bytes_.TakeFirst(kFrameHeaderSize);
139
+ Http2FrameHeader{
140
+ static_cast<uint32_t>(frame.payload.Length()), kFrameTypeData,
141
+ MaybeFlag(frame.end_stream, kFlagEndStream), frame.stream_id}
142
+ .Serialize(hdr.begin());
143
+ out_.AppendIndexed(Slice(std::move(hdr)));
144
+ out_.TakeAndAppend(frame.payload);
145
+ }
146
+
147
+ void operator()(Http2HeaderFrame& frame) {
148
+ auto hdr = extra_bytes_.TakeFirst(kFrameHeaderSize);
149
+ Http2FrameHeader{
150
+ static_cast<uint32_t>(frame.payload.Length()), kFrameTypeHeader,
151
+ static_cast<uint8_t>(MaybeFlag(frame.end_headers, kFlagEndHeaders) |
152
+ MaybeFlag(frame.end_stream, kFlagEndStream)),
153
+ frame.stream_id}
154
+ .Serialize(hdr.begin());
155
+ out_.AppendIndexed(Slice(std::move(hdr)));
156
+ out_.TakeAndAppend(frame.payload);
157
+ }
158
+
159
+ void operator()(Http2ContinuationFrame& frame) {
160
+ auto hdr = extra_bytes_.TakeFirst(kFrameHeaderSize);
161
+ Http2FrameHeader{
162
+ static_cast<uint32_t>(frame.payload.Length()), kFrameTypeContinuation,
163
+ static_cast<uint8_t>(MaybeFlag(frame.end_headers, kFlagEndHeaders)),
164
+ frame.stream_id}
165
+ .Serialize(hdr.begin());
166
+ out_.AppendIndexed(Slice(std::move(hdr)));
167
+ out_.TakeAndAppend(frame.payload);
168
+ }
169
+
170
+ void operator()(Http2RstStreamFrame& frame) {
171
+ auto hdr_and_payload = extra_bytes_.TakeFirst(kFrameHeaderSize + 4);
172
+ Http2FrameHeader{4, kFrameTypeRstStream, 0, frame.stream_id}.Serialize(
173
+ hdr_and_payload.begin());
174
+ Write4b(frame.error_code, hdr_and_payload.begin() + kFrameHeaderSize);
175
+ out_.AppendIndexed(Slice(std::move(hdr_and_payload)));
176
+ }
177
+
178
+ void operator()(Http2SettingsFrame& frame) {
179
+ // Six bytes per setting (u16 id, u32 value)
180
+ const size_t payload_size = 6 * frame.settings.size();
181
+ auto hdr_and_payload =
182
+ extra_bytes_.TakeFirst(kFrameHeaderSize + payload_size);
183
+ Http2FrameHeader{static_cast<uint32_t>(payload_size), kFrameTypeSettings,
184
+ MaybeFlag(frame.ack, kFlagAck), 0}
185
+ .Serialize(hdr_and_payload.begin());
186
+ size_t offset = kFrameHeaderSize;
187
+ for (auto& setting : frame.settings) {
188
+ Write2b(setting.id, hdr_and_payload.begin() + offset);
189
+ Write4b(setting.value, hdr_and_payload.begin() + offset + 2);
190
+ offset += 6;
191
+ }
192
+ out_.AppendIndexed(Slice(std::move(hdr_and_payload)));
193
+ }
194
+
195
+ void operator()(Http2PingFrame& frame) {
196
+ auto hdr_and_payload = extra_bytes_.TakeFirst(kFrameHeaderSize + 8);
197
+ Http2FrameHeader{8, kFrameTypePing, MaybeFlag(frame.ack, kFlagAck), 0}
198
+ .Serialize(hdr_and_payload.begin());
199
+ Write8b(frame.opaque, hdr_and_payload.begin() + kFrameHeaderSize);
200
+ out_.AppendIndexed(Slice(std::move(hdr_and_payload)));
201
+ }
202
+
203
+ void operator()(Http2GoawayFrame& frame) {
204
+ auto hdr_and_fixed_payload = extra_bytes_.TakeFirst(kFrameHeaderSize + 8);
205
+ Http2FrameHeader{static_cast<uint32_t>(8 + frame.debug_data.length()),
206
+ kFrameTypeGoaway, 0, 0}
207
+ .Serialize(hdr_and_fixed_payload.begin());
208
+ Write4b(frame.last_stream_id,
209
+ hdr_and_fixed_payload.begin() + kFrameHeaderSize);
210
+ Write4b(frame.error_code,
211
+ hdr_and_fixed_payload.begin() + kFrameHeaderSize + 4);
212
+ out_.AppendIndexed(Slice(std::move(hdr_and_fixed_payload)));
213
+ out_.AppendIndexed(std::move(frame.debug_data));
214
+ }
215
+
216
+ void operator()(Http2WindowUpdateFrame& frame) {
217
+ auto hdr_and_payload = extra_bytes_.TakeFirst(kFrameHeaderSize + 4);
218
+ Http2FrameHeader{4, kFrameTypeWindowUpdate, 0, frame.stream_id}.Serialize(
219
+ hdr_and_payload.begin());
220
+ Write4b(frame.increment, hdr_and_payload.begin() + kFrameHeaderSize);
221
+ out_.AppendIndexed(Slice(std::move(hdr_and_payload)));
222
+ }
223
+
224
+ void operator()(Http2UnknownFrame&) { Crash("unreachable"); }
225
+
226
+ private:
227
+ SliceBuffer& out_;
228
+ MutableSlice extra_bytes_;
229
+ };
230
+
231
+ absl::Status StripPadding(SliceBuffer& payload) {
232
+ if (payload.Length() < 1) {
233
+ return absl::InternalError("padding flag set but no padding byte");
234
+ }
235
+ uint8_t padding_bytes;
236
+ payload.MoveFirstNBytesIntoBuffer(1, &padding_bytes);
237
+ if (payload.Length() < padding_bytes) {
238
+ return absl::InternalError("padding flag set but not enough padding bytes");
239
+ }
240
+ payload.RemoveLastNBytes(padding_bytes);
241
+ return absl::OkStatus();
242
+ }
243
+
244
+ absl::StatusOr<Http2DataFrame> ParseDataFrame(const Http2FrameHeader& hdr,
245
+ SliceBuffer& payload) {
246
+ if (hdr.stream_id == 0) {
247
+ return absl::InternalError(
248
+ absl::StrCat("invalid stream id: ", hdr.ToString()));
249
+ }
250
+
251
+ if (hdr.flags & kFlagPadded) {
252
+ auto s = StripPadding(payload);
253
+ if (!s.ok()) return s;
254
+ }
255
+
256
+ return Http2DataFrame{hdr.stream_id, ExtractFlag(hdr.flags, kFlagEndStream),
257
+ std::move(payload)};
258
+ }
259
+
260
+ absl::StatusOr<Http2HeaderFrame> ParseHeaderFrame(const Http2FrameHeader& hdr,
261
+ SliceBuffer& payload) {
262
+ if (hdr.stream_id == 0) {
263
+ return absl::InternalError(
264
+ absl::StrCat("invalid stream id: ", hdr.ToString()));
265
+ }
266
+
267
+ if (hdr.flags & kFlagPadded) {
268
+ auto s = StripPadding(payload);
269
+ if (!s.ok()) return s;
270
+ }
271
+
272
+ if (hdr.flags & kFlagPriority) {
273
+ if (payload.Length() < 5) {
274
+ return absl::InternalError(
275
+ absl::StrCat("invalid priority payload: ", hdr.ToString()));
276
+ }
277
+ uint8_t trash[5];
278
+ payload.MoveFirstNBytesIntoBuffer(5, trash);
279
+ }
280
+
281
+ return Http2HeaderFrame{
282
+ hdr.stream_id, ExtractFlag(hdr.flags, kFlagEndHeaders),
283
+ ExtractFlag(hdr.flags, kFlagEndStream), std::move(payload)};
284
+ }
285
+
286
+ absl::StatusOr<Http2ContinuationFrame> ParseContinuationFrame(
287
+ const Http2FrameHeader& hdr, SliceBuffer& payload) {
288
+ if (hdr.stream_id == 0) {
289
+ return absl::InternalError(
290
+ absl::StrCat("invalid stream id: ", hdr.ToString()));
291
+ }
292
+
293
+ return Http2ContinuationFrame{hdr.stream_id,
294
+ ExtractFlag(hdr.flags, kFlagEndHeaders),
295
+ std::move(payload)};
296
+ }
297
+
298
+ absl::StatusOr<Http2RstStreamFrame> ParseRstStreamFrame(
299
+ const Http2FrameHeader& hdr, SliceBuffer& payload) {
300
+ if (payload.Length() != 4) {
301
+ return absl::InternalError(
302
+ absl::StrCat("invalid rst stream payload: ", hdr.ToString()));
303
+ }
304
+
305
+ if (hdr.stream_id == 0) {
306
+ return absl::InternalError(
307
+ absl::StrCat("invalid stream id: ", hdr.ToString()));
308
+ }
309
+
310
+ uint8_t buffer[4];
311
+ payload.CopyToBuffer(buffer);
312
+
313
+ return Http2RstStreamFrame{hdr.stream_id, Read4b(buffer)};
314
+ }
315
+
316
+ absl::StatusOr<Http2SettingsFrame> ParseSettingsFrame(
317
+ const Http2FrameHeader& hdr, SliceBuffer& payload) {
318
+ if (hdr.stream_id != 0) {
319
+ return absl::InternalError(
320
+ absl::StrCat("invalid stream id: ", hdr.ToString()));
321
+ }
322
+ if (hdr.flags == kFlagAck) {
323
+ if (payload.Length() != 0) {
324
+ return absl::InternalError(
325
+ absl::StrCat("invalid settings ack length: ", hdr.ToString()));
326
+ }
327
+ return Http2SettingsFrame{true, {}};
328
+ }
329
+
330
+ if (payload.Length() % 6 != 0) {
331
+ return absl::InternalError(
332
+ absl::StrCat("invalid settings payload: ", hdr.ToString(),
333
+ " -- settings must be multiples of 6 bytes long"));
334
+ }
335
+
336
+ Http2SettingsFrame frame{false, {}};
337
+ while (payload.Length() != 0) {
338
+ uint8_t buffer[6];
339
+ payload.MoveFirstNBytesIntoBuffer(6, buffer);
340
+ frame.settings.push_back({
341
+ Read2b(buffer),
342
+ Read4b(buffer + 2),
343
+ });
344
+ }
345
+ return std::move(frame);
346
+ }
347
+
348
+ absl::StatusOr<Http2PingFrame> ParsePingFrame(const Http2FrameHeader& hdr,
349
+ SliceBuffer& payload) {
350
+ if (payload.Length() != 8) {
351
+ return absl::InternalError(
352
+ absl::StrCat("invalid ping payload: ", hdr.ToString()));
353
+ }
354
+
355
+ if (hdr.stream_id != 0) {
356
+ return absl::InternalError(
357
+ absl::StrCat("invalid ping stream id: ", hdr.ToString()));
358
+ }
359
+
360
+ bool ack;
361
+ switch (hdr.flags) {
362
+ case 0:
363
+ ack = false;
364
+ break;
365
+ case kFlagAck:
366
+ ack = true;
367
+ break;
368
+ default:
369
+ return absl::InternalError(
370
+ absl::StrCat("invalid ping flags: ", hdr.ToString()));
371
+ }
372
+
373
+ uint8_t buffer[8];
374
+ payload.CopyToBuffer(buffer);
375
+
376
+ return Http2PingFrame{ack, Read8b(buffer)};
377
+ }
378
+
379
+ absl::StatusOr<Http2GoawayFrame> ParseGoawayFrame(const Http2FrameHeader& hdr,
380
+ SliceBuffer& payload) {
381
+ if (payload.Length() < 8) {
382
+ return absl::InternalError(
383
+ absl::StrCat("invalid goaway payload: ", hdr.ToString(),
384
+ " -- must be at least 8 bytes"));
385
+ }
386
+
387
+ if (hdr.stream_id != 0) {
388
+ return absl::InternalError(
389
+ absl::StrCat("invalid goaway stream id: ", hdr.ToString()));
390
+ }
391
+
392
+ if (hdr.flags != 0) {
393
+ return absl::InternalError(
394
+ absl::StrCat("invalid goaway flags: ", hdr.ToString()));
395
+ }
396
+
397
+ uint8_t buffer[8];
398
+ payload.MoveFirstNBytesIntoBuffer(8, buffer);
399
+ return Http2GoawayFrame{Read4b(buffer), Read4b(buffer + 4),
400
+ payload.JoinIntoSlice()};
401
+ }
402
+
403
+ absl::StatusOr<Http2WindowUpdateFrame> ParseWindowUpdateFrame(
404
+ const Http2FrameHeader& hdr, SliceBuffer& payload) {
405
+ if (payload.Length() != 4) {
406
+ return absl::InternalError(
407
+ absl::StrCat("invalid window update payload: ", hdr.ToString(),
408
+ " -- must be 4 bytes"));
409
+ }
410
+
411
+ if (hdr.flags != 0) {
412
+ return absl::InternalError(
413
+ absl::StrCat("invalid window update flags: ", hdr.ToString()));
414
+ }
415
+
416
+ uint8_t buffer[4];
417
+ payload.CopyToBuffer(buffer);
418
+ return Http2WindowUpdateFrame{hdr.stream_id, Read4b(buffer)};
419
+ }
420
+
421
+ } // namespace
422
+
423
+ void Http2FrameHeader::Serialize(uint8_t* output) const {
424
+ Write3b(length, output);
425
+ output[3] = type;
426
+ output[4] = flags;
427
+ Write4b(stream_id, output + 5);
428
+ }
429
+
430
+ Http2FrameHeader Http2FrameHeader::Parse(const uint8_t* input) {
431
+ return Http2FrameHeader{Read3b(input), input[3], input[4], Read4b(input + 5)};
432
+ }
433
+
434
+ namespace {
435
+ std::string Http2FrameTypeString(uint8_t frame_type) {
436
+ switch (frame_type) {
437
+ case kFrameTypeData:
438
+ return "DATA";
439
+ case kFrameTypeHeader:
440
+ return "HEADER";
441
+ case kFrameTypeContinuation:
442
+ return "CONTINUATION";
443
+ case kFrameTypeRstStream:
444
+ return "RST_STREAM";
445
+ case kFrameTypeSettings:
446
+ return "SETTINGS";
447
+ case kFrameTypeGoaway:
448
+ return "GOAWAY";
449
+ case kFrameTypeWindowUpdate:
450
+ return "WINDOW_UPDATE";
451
+ case kFrameTypePing:
452
+ return "PING";
453
+ }
454
+ return absl::StrCat("UNKNOWN(", frame_type, ")");
455
+ }
456
+ } // namespace
457
+
458
+ std::string Http2FrameHeader::ToString() const {
459
+ return absl::StrCat("{", Http2FrameTypeString(type), ": flags=", flags,
460
+ ", stream_id=", stream_id, ", length=", length, "}");
461
+ }
462
+
463
+ void Serialize(absl::Span<Http2Frame> frames, SliceBuffer& out) {
464
+ size_t buffer_needed = 0;
465
+ for (auto& frame : frames) {
466
+ // Bytes needed for framing
467
+ buffer_needed += kFrameHeaderSize;
468
+ // Bytes needed for frame payload
469
+ buffer_needed += absl::visit(SerializeExtraBytesRequired(), frame);
470
+ }
471
+ SerializeHeaderAndPayload serialize(buffer_needed, out);
472
+ for (auto& frame : frames) {
473
+ absl::visit(serialize, frame);
474
+ }
475
+ }
476
+
477
+ absl::StatusOr<Http2Frame> ParseFramePayload(const Http2FrameHeader& hdr,
478
+ SliceBuffer payload) {
479
+ GPR_ASSERT(payload.Length() == hdr.length);
480
+ switch (hdr.type) {
481
+ case kFrameTypeData:
482
+ return ParseDataFrame(hdr, payload);
483
+ case kFrameTypeHeader:
484
+ return ParseHeaderFrame(hdr, payload);
485
+ case kFrameTypeContinuation:
486
+ return ParseContinuationFrame(hdr, payload);
487
+ case kFrameTypeRstStream:
488
+ return ParseRstStreamFrame(hdr, payload);
489
+ case kFrameTypeSettings:
490
+ return ParseSettingsFrame(hdr, payload);
491
+ case kFrameTypePing:
492
+ return ParsePingFrame(hdr, payload);
493
+ case kFrameTypeGoaway:
494
+ return ParseGoawayFrame(hdr, payload);
495
+ case kFrameTypeWindowUpdate:
496
+ return ParseWindowUpdateFrame(hdr, payload);
497
+ case kFrameTypePushPromise:
498
+ return absl::InternalError(
499
+ "push promise not supported (and SETTINGS_ENABLE_PUSH explicitly "
500
+ "disabled).");
501
+ default:
502
+ return Http2UnknownFrame{};
503
+ }
504
+ }
505
+
506
+ } // namespace grpc_core