grpc 1.56.0 → 1.57.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (398) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +31 -22
  3. data/include/grpc/event_engine/event_engine.h +22 -32
  4. data/include/grpc/grpc_security.h +19 -0
  5. data/include/grpc/impl/grpc_types.h +3 -0
  6. data/include/grpc/support/port_platform.h +29 -23
  7. data/src/core/ext/filters/client_channel/client_channel.cc +44 -8
  8. data/src/core/ext/filters/client_channel/dynamic_filters.h +3 -3
  9. data/src/core/ext/filters/client_channel/http_proxy.cc +5 -0
  10. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +21 -52
  11. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +19 -7
  12. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +25 -35
  13. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +78 -132
  14. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +2 -1
  15. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +4 -3
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +3 -1
  17. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +38 -15
  18. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.h +3 -5
  19. data/src/core/ext/filters/client_channel/lb_policy/health_check_client_internal.h +22 -6
  20. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric_internal.h +2 -0
  21. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +98 -72
  22. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +2 -16
  23. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +56 -11
  24. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.h +25 -0
  25. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +6 -32
  26. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +4 -6
  27. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +20 -79
  28. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +1 -1
  29. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +31 -19
  30. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +11 -2
  31. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +7 -41
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +3 -67
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +8 -0
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +31 -74
  35. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +7 -51
  36. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +16 -87
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +16 -50
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +12 -74
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +1 -4
  40. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +69 -59
  41. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +7 -2
  42. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +1 -0
  43. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +25 -13
  44. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +366 -311
  45. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +17 -1
  46. data/src/core/ext/filters/client_channel/retry_filter.cc +39 -2498
  47. data/src/core/ext/filters/client_channel/retry_filter.h +91 -1
  48. data/src/core/ext/filters/client_channel/retry_filter_legacy_call_data.cc +2052 -0
  49. data/src/core/ext/filters/client_channel/retry_filter_legacy_call_data.h +442 -0
  50. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +38 -58
  51. data/src/core/ext/filters/client_channel/subchannel.h +3 -3
  52. data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +3 -0
  53. data/src/core/ext/filters/rbac/rbac_filter.cc +40 -111
  54. data/src/core/ext/filters/rbac/rbac_filter.h +12 -30
  55. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +162 -86
  56. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +0 -6
  57. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +7 -4
  58. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +131 -186
  59. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +6569 -174
  60. data/src/core/ext/transport/chttp2/transport/decode_huff.h +2278 -441
  61. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -3
  62. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.cc +176 -0
  63. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +326 -0
  64. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +569 -544
  65. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +150 -9
  66. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +47 -33
  67. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +19 -5
  68. data/src/core/ext/transport/chttp2/transport/internal.h +8 -4
  69. data/src/core/ext/transport/chttp2/transport/parsing.cc +27 -15
  70. data/src/core/ext/transport/chttp2/transport/writing.cc +2 -3
  71. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +27 -6
  72. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +143 -0
  73. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +2 -9
  74. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +0 -39
  75. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +13 -8
  76. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +35 -6
  77. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +17 -13
  78. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +85 -20
  79. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +26 -7
  80. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +45 -3
  81. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +4 -3
  82. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +21 -0
  83. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +30 -6
  84. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +180 -0
  85. data/src/core/ext/upb-generated/envoy/data/accesslog/v3/accesslog.upb.c +558 -0
  86. data/src/core/ext/upb-generated/envoy/data/accesslog/v3/accesslog.upb.h +2710 -0
  87. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +30 -11
  88. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +53 -24
  89. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +30 -5
  90. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +110 -0
  91. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +41 -15
  92. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +150 -27
  93. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.c +1 -0
  94. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/pick_first/v3/pick_first.upb.c +47 -0
  95. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/pick_first/v3/pick_first.upb.h +93 -0
  96. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +88 -76
  97. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h +5 -0
  98. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +11 -12
  99. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +0 -5
  100. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +162 -160
  101. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +129 -118
  102. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +141 -135
  103. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/metrics_service.upbdefs.c +19 -12
  104. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +38 -30
  105. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +5 -0
  106. data/src/core/ext/upbdefs-generated/envoy/data/accesslog/v3/accesslog.upbdefs.c +402 -0
  107. data/src/core/ext/upbdefs-generated/envoy/data/accesslog/v3/accesslog.upbdefs.h +111 -0
  108. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +80 -74
  109. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +63 -47
  110. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +5 -0
  111. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +315 -293
  112. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +5 -0
  113. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +29 -29
  114. data/src/core/ext/xds/xds_bootstrap_grpc.cc +33 -30
  115. data/src/core/ext/xds/xds_bootstrap_grpc.h +5 -13
  116. data/src/core/ext/xds/xds_client_grpc.cc +11 -6
  117. data/src/core/ext/xds/xds_client_grpc.h +16 -2
  118. data/src/core/ext/xds/xds_client_stats.h +10 -0
  119. data/src/core/ext/xds/xds_cluster.cc +26 -16
  120. data/src/core/ext/xds/xds_endpoint.cc +4 -7
  121. data/src/core/ext/xds/xds_health_status.cc +0 -17
  122. data/src/core/ext/xds/xds_health_status.h +5 -25
  123. data/src/core/ext/xds/xds_lb_policy_registry.cc +39 -0
  124. data/src/core/ext/xds/xds_route_config.cc +4 -0
  125. data/src/core/ext/xds/xds_transport_grpc.cc +1 -3
  126. data/src/core/lib/address_utils/parse_address.cc +63 -1
  127. data/src/core/lib/address_utils/parse_address.h +8 -0
  128. data/src/core/lib/address_utils/sockaddr_utils.cc +46 -1
  129. data/src/core/lib/address_utils/sockaddr_utils.h +2 -2
  130. data/src/core/lib/backoff/random_early_detection.h +5 -0
  131. data/src/core/lib/channel/channel_args.cc +21 -10
  132. data/src/core/lib/channel/channel_args.h +3 -0
  133. data/src/core/lib/channel/connected_channel.cc +4 -1
  134. data/src/core/lib/channel/promise_based_filter.h +1 -0
  135. data/src/core/lib/debug/trace.cc +1 -4
  136. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +2 -1
  137. data/src/core/lib/event_engine/cf_engine/cf_engine.h +1 -1
  138. data/src/core/lib/event_engine/event_engine.cc +0 -12
  139. data/src/core/lib/event_engine/forkable.cc +47 -42
  140. data/src/core/lib/event_engine/handle_containers.h +0 -4
  141. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +4 -6
  142. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +4 -6
  143. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +25 -11
  144. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +3 -1
  145. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +2 -1
  146. data/src/core/lib/event_engine/posix_engine/posix_engine.h +9 -12
  147. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +66 -27
  148. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +5 -0
  149. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +4 -2
  150. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +42 -2
  151. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +6 -0
  152. data/src/core/lib/event_engine/posix_engine/timer.h +10 -37
  153. data/src/core/lib/event_engine/tcp_socket_utils.cc +67 -7
  154. data/src/core/lib/event_engine/tcp_socket_utils.h +3 -0
  155. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +90 -37
  156. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +32 -12
  157. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.cc +12 -21
  158. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.h +8 -12
  159. data/src/core/lib/event_engine/windows/windows_endpoint.cc +55 -54
  160. data/src/core/lib/event_engine/windows/windows_endpoint.h +15 -12
  161. data/src/core/lib/event_engine/windows/windows_engine.cc +2 -1
  162. data/src/core/lib/event_engine/windows/windows_engine.h +8 -12
  163. data/src/core/lib/experiments/config.cc +60 -22
  164. data/src/core/lib/experiments/config.h +20 -8
  165. data/src/core/lib/experiments/experiments.cc +278 -0
  166. data/src/core/lib/experiments/experiments.h +59 -1
  167. data/src/core/lib/gprpp/dual_ref_counted.h +9 -9
  168. data/src/core/lib/gprpp/fork.cc +8 -9
  169. data/src/core/lib/gprpp/fork.h +6 -5
  170. data/src/core/lib/gprpp/if_list.h +4530 -0
  171. data/src/core/lib/gprpp/orphanable.h +3 -3
  172. data/src/core/lib/gprpp/ref_counted.h +6 -6
  173. data/src/core/lib/gprpp/sorted_pack.h +3 -12
  174. data/src/core/lib/gprpp/status_helper.h +16 -15
  175. data/src/core/lib/gprpp/time.h +12 -0
  176. data/src/core/lib/gprpp/type_list.h +32 -0
  177. data/src/core/lib/http/httpcli.h +6 -9
  178. data/src/core/lib/iomgr/error.cc +32 -2
  179. data/src/core/lib/iomgr/error.h +9 -10
  180. data/src/core/lib/iomgr/ev_epoll1_linux.cc +5 -7
  181. data/src/core/lib/iomgr/ev_poll_posix.cc +6 -5
  182. data/src/core/lib/iomgr/exec_ctx.h +11 -0
  183. data/src/core/lib/iomgr/pollset.h +4 -5
  184. data/src/core/lib/iomgr/port.h +10 -0
  185. data/src/core/lib/iomgr/resolve_address.cc +13 -1
  186. data/src/core/lib/iomgr/resolve_address.h +17 -3
  187. data/src/core/lib/iomgr/sockaddr_posix.h +7 -0
  188. data/src/core/lib/iomgr/socket_utils_common_posix.cc +29 -0
  189. data/src/core/lib/iomgr/socket_utils_posix.cc +2 -0
  190. data/src/core/lib/iomgr/socket_utils_posix.h +6 -0
  191. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -1
  192. data/src/core/lib/iomgr/tcp_posix.cc +21 -4
  193. data/src/core/lib/iomgr/tcp_server_posix.cc +37 -14
  194. data/src/core/lib/iomgr/tcp_server_utils_posix.h +12 -0
  195. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +26 -2
  196. data/src/core/lib/iomgr/tcp_windows.cc +1 -3
  197. data/src/core/lib/iomgr/vsock.cc +59 -0
  198. data/src/core/lib/iomgr/vsock.h +38 -0
  199. data/src/core/lib/iomgr/wakeup_fd_posix.h +3 -6
  200. data/src/core/lib/load_balancing/delegating_helper.h +115 -0
  201. data/src/core/lib/load_balancing/lb_policy.h +20 -0
  202. data/src/core/lib/load_balancing/subchannel_interface.h +6 -0
  203. data/src/core/lib/promise/party.h +1 -1
  204. data/src/core/lib/resolver/resolver_factory.h +3 -2
  205. data/src/core/lib/resolver/server_address.cc +9 -94
  206. data/src/core/lib/resolver/server_address.h +10 -64
  207. data/src/core/lib/resource_quota/memory_quota.h +1 -1
  208. data/src/core/lib/security/credentials/channel_creds_registry.h +51 -27
  209. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +169 -9
  210. data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
  211. data/src/core/lib/security/credentials/composite/composite_credentials.h +3 -1
  212. data/src/core/lib/security/credentials/external/external_account_credentials.cc +40 -1
  213. data/src/core/lib/security/credentials/external/external_account_credentials.h +6 -0
  214. data/src/core/lib/security/credentials/fake/fake_credentials.cc +30 -38
  215. data/src/core/lib/security/credentials/fake/fake_credentials.h +28 -0
  216. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +8 -0
  217. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +5 -1
  218. data/src/core/lib/security/credentials/tls/tls_credentials.cc +1 -1
  219. data/src/core/lib/security/credentials/tls/tls_credentials.h +3 -1
  220. data/src/core/lib/security/security_connector/ssl_utils.cc +2 -1
  221. data/src/core/lib/security/security_connector/ssl_utils.h +1 -1
  222. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +1 -1
  223. data/src/core/lib/service_config/service_config_call_data.h +5 -0
  224. data/src/core/lib/slice/slice.h +16 -0
  225. data/src/core/lib/surface/call.cc +31 -29
  226. data/src/core/lib/surface/server.h +2 -2
  227. data/src/core/lib/surface/validate_metadata.cc +37 -22
  228. data/src/core/lib/surface/validate_metadata.h +13 -3
  229. data/src/core/lib/surface/version.cc +2 -2
  230. data/src/core/lib/transport/metadata_batch.cc +7 -7
  231. data/src/core/lib/transport/metadata_batch.h +86 -48
  232. data/src/core/lib/transport/parsed_metadata.h +34 -20
  233. data/src/core/lib/transport/simple_slice_based_metadata.h +9 -2
  234. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +4 -6
  235. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +1 -2
  236. data/src/core/tsi/ssl_transport_security.cc +33 -9
  237. data/src/core/tsi/ssl_transport_security.h +13 -1
  238. data/src/ruby/bin/math_pb.rb +24 -18
  239. data/src/ruby/ext/grpc/extconf.rb +19 -18
  240. data/src/ruby/ext/grpc/rb_call.c +62 -39
  241. data/src/ruby/ext/grpc/rb_call_credentials.c +0 -1
  242. data/src/ruby/ext/grpc/rb_channel.c +126 -49
  243. data/src/ruby/ext/grpc/rb_channel.h +1 -0
  244. data/src/ruby/ext/grpc/rb_channel_args.c +16 -2
  245. data/src/ruby/ext/grpc/rb_channel_args.h +4 -0
  246. data/src/ruby/ext/grpc/rb_channel_credentials.c +0 -1
  247. data/src/ruby/ext/grpc/rb_compression_options.c +0 -1
  248. data/src/ruby/ext/grpc/rb_event_thread.c +22 -6
  249. data/src/ruby/ext/grpc/rb_event_thread.h +1 -0
  250. data/src/ruby/ext/grpc/rb_grpc.c +192 -30
  251. data/src/ruby/ext/grpc/rb_grpc.h +8 -2
  252. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  253. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
  254. data/src/ruby/ext/grpc/rb_server.c +62 -45
  255. data/src/ruby/ext/grpc/rb_server_credentials.c +0 -1
  256. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +0 -1
  257. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +0 -1
  258. data/src/ruby/lib/grpc/generic/bidi_call.rb +2 -0
  259. data/src/ruby/lib/grpc/version.rb +1 -1
  260. data/src/ruby/pb/grpc/health/v1/health_pb.rb +24 -13
  261. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +24 -3
  262. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +25 -111
  263. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +25 -2
  264. data/third_party/boringssl-with-bazel/err_data.c +552 -552
  265. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +5 -5
  266. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +34 -1
  267. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +4 -1
  268. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +3 -3
  269. data/third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c +7 -8
  270. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +2 -2
  271. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +2 -2
  272. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +8 -8
  273. data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +2 -2
  274. data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +2 -2
  275. data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +19 -1
  276. data/third_party/boringssl-with-bazel/src/crypto/chacha/internal.h +8 -1
  277. data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +28 -185
  278. data/third_party/boringssl-with-bazel/src/crypto/conf/conf_def.h +3 -7
  279. data/third_party/boringssl-with-bazel/src/crypto/conf/internal.h +8 -0
  280. data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_apple.c +3 -0
  281. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c +49 -46
  282. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_64_adx.c +18 -0
  283. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_tables.h +2809 -7417
  284. data/third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h +27 -5
  285. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +20 -0
  286. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c +110 -72
  287. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_derive.c +4 -3
  288. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +15 -14
  289. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +13 -10
  290. data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +35 -12
  291. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c +2 -4
  292. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c +3 -7
  293. data/third_party/boringssl-with-bazel/src/crypto/evp/pbkdf.c +3 -3
  294. data/third_party/boringssl-with-bazel/src/crypto/evp/print.c +7 -6
  295. data/third_party/boringssl-with-bazel/src/crypto/ex_data.c +34 -72
  296. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -1
  297. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +12 -5
  298. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd.c +5 -6
  299. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +12 -6
  300. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +17 -18
  301. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery_inv.c +51 -15
  302. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/rsaz_exp.c +7 -7
  303. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/delocate.h +5 -6
  304. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/internal.h +2 -0
  305. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/builtin_curves.h +277 -0
  306. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +180 -404
  307. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +3 -3
  308. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +24 -57
  309. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/felem.c +17 -13
  310. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +33 -71
  311. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +18 -17
  312. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +5 -7
  313. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-nistz.c +15 -18
  314. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +9 -11
  315. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c +24 -24
  316. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +11 -27
  317. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +8 -8
  318. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +4 -4
  319. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +9 -3
  320. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/hkdf/hkdf.c +1 -1
  321. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +40 -26
  322. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +21 -7
  323. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +38 -19
  324. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +2 -29
  325. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +55 -0
  326. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +33 -52
  327. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +3 -8
  328. data/third_party/boringssl-with-bazel/src/crypto/internal.h +198 -79
  329. data/third_party/boringssl-with-bazel/src/crypto/kyber/kyber.c +5 -4
  330. data/third_party/boringssl-with-bazel/src/crypto/mem.c +7 -8
  331. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +19 -23
  332. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +3 -3
  333. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/p5_pbev2.c +3 -3
  334. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +7 -7
  335. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +8 -5
  336. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +1 -0
  337. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +7 -6
  338. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c +6 -12
  339. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/getentropy.c +48 -0
  340. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/{fuchsia.c → ios.c} +8 -8
  341. data/third_party/boringssl-with-bazel/src/crypto/{refcount_no_threads.c → rand_extra/trusty.c} +15 -19
  342. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +41 -19
  343. data/third_party/boringssl-with-bazel/src/crypto/{refcount_c11.c → refcount.c} +11 -17
  344. data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +147 -72
  345. data/third_party/boringssl-with-bazel/src/crypto/thread_none.c +0 -8
  346. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +6 -35
  347. data/third_party/boringssl-with-bazel/src/crypto/thread_win.c +5 -26
  348. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +14 -18
  349. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +54 -143
  350. data/third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c +7 -13
  351. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +1 -1
  352. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +1 -1
  353. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +2 -4
  354. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +2 -2
  355. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +1 -1
  356. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +8 -12
  357. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +19 -20
  358. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +11 -15
  359. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +5 -5
  360. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +1 -1
  361. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +7 -7
  362. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +2 -3
  363. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +4 -6
  364. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +4 -119
  365. data/third_party/boringssl-with-bazel/src/include/openssl/asm_base.h +207 -0
  366. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +5 -0
  367. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +2 -116
  368. data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +0 -2
  369. data/third_party/boringssl-with-bazel/src/include/openssl/chacha.h +6 -0
  370. data/third_party/boringssl-with-bazel/src/include/openssl/conf.h +5 -1
  371. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +0 -21
  372. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +21 -2
  373. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +19 -6
  374. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +11 -7
  375. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +13 -14
  376. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +0 -61
  377. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +127 -81
  378. data/third_party/boringssl-with-bazel/src/include/openssl/stack.h +224 -209
  379. data/third_party/boringssl-with-bazel/src/include/openssl/target.h +154 -0
  380. data/third_party/boringssl-with-bazel/src/include/openssl/thread.h +1 -29
  381. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +4 -4
  382. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +3 -2
  383. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +9 -65
  384. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +20 -20
  385. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +1 -1
  386. data/third_party/boringssl-with-bazel/src/ssl/internal.h +4 -11
  387. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +24 -18
  388. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +37 -30
  389. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +125 -26
  390. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +2 -3
  391. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64_adx.h +691 -0
  392. data/third_party/upb/upb/collections/map.c +3 -3
  393. metadata +30 -13
  394. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +0 -42
  395. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.h +0 -64
  396. data/src/core/ext/transport/chttp2/transport/stream_map.cc +0 -177
  397. data/src/core/ext/transport/chttp2/transport/stream_map.h +0 -68
  398. data/third_party/boringssl-with-bazel/src/crypto/refcount_win.c +0 -89
@@ -25,6 +25,7 @@
25
25
  #include <algorithm>
26
26
  #include <initializer_list>
27
27
 
28
+ #include "absl/container/flat_hash_map.h"
28
29
  #include "absl/status/status.h"
29
30
  #include "absl/strings/str_format.h"
30
31
 
@@ -32,7 +33,6 @@
32
33
  #include <grpc/support/log.h>
33
34
 
34
35
  #include "src/core/ext/transport/chttp2/transport/internal.h"
35
- #include "src/core/ext/transport/chttp2/transport/stream_map.h"
36
36
  #include "src/core/lib/gprpp/time.h"
37
37
 
38
38
  grpc_slice grpc_chttp2_ping_create(uint8_t ack, uint64_t opaque_8bytes) {
@@ -99,8 +99,7 @@ grpc_error_handle grpc_chttp2_ping_parser_parse(void* parser,
99
99
  t->ping_recv_state.last_ping_recv_time +
100
100
  t->ping_policy.min_recv_ping_interval_without_data;
101
101
 
102
- if (t->keepalive_permit_without_calls == 0 &&
103
- grpc_chttp2_stream_map_size(&t->stream_map) == 0) {
102
+ if (t->keepalive_permit_without_calls == 0 && t->stream_map.empty()) {
104
103
  // According to RFC1122, the interval of TCP Keep-Alive is default to
105
104
  // no less than two hours. When there is no outstanding streams, we
106
105
  // restrict the number of PINGS equivalent to TCP Keep-Alive.
@@ -0,0 +1,176 @@
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/hpack_parse_result.h"
18
+
19
+ #include <stddef.h>
20
+
21
+ #include <initializer_list>
22
+
23
+ #include "absl/strings/str_format.h"
24
+
25
+ #include "src/core/ext/transport/chttp2/transport/hpack_constants.h"
26
+ #include "src/core/lib/gprpp/status_helper.h"
27
+ #include "src/core/lib/iomgr/error.h"
28
+ #include "src/core/lib/slice/slice.h"
29
+
30
+ namespace grpc_core {
31
+
32
+ namespace {
33
+ class MetadataSizeLimitExceededEncoder {
34
+ public:
35
+ explicit MetadataSizeLimitExceededEncoder(std::string& summary)
36
+ : summary_(summary) {}
37
+
38
+ void Encode(const Slice& key, const Slice& value) {
39
+ AddToSummary(key.as_string_view(), value.size());
40
+ }
41
+
42
+ template <typename Key, typename Value>
43
+ void Encode(Key, const Value& value) {
44
+ AddToSummary(Key::key(), EncodedSizeOfKey(Key(), value));
45
+ }
46
+
47
+ private:
48
+ void AddToSummary(absl::string_view key,
49
+ size_t value_length) GPR_ATTRIBUTE_NOINLINE {
50
+ absl::StrAppend(&summary_, " ", key, ":",
51
+ hpack_constants::SizeForEntry(key.size(), value_length),
52
+ "B");
53
+ }
54
+ std::string& summary_;
55
+ };
56
+
57
+ absl::Status MakeStreamError(absl::Status error) {
58
+ GPR_DEBUG_ASSERT(!error.ok());
59
+ return grpc_error_set_int(std::move(error), StatusIntProperty::kStreamId, 0);
60
+ }
61
+ } // namespace
62
+
63
+ absl::Status HpackParseResult::Materialize() const {
64
+ if (materialized_status_.has_value()) return *materialized_status_;
65
+ materialized_status_ = BuildMaterialized();
66
+ return *materialized_status_;
67
+ }
68
+
69
+ absl::Status HpackParseResult::BuildMaterialized() const {
70
+ switch (status_.get()) {
71
+ case HpackParseStatus::kOk:
72
+ return absl::OkStatus();
73
+ case HpackParseStatus::kEof:
74
+ Crash("Materialize() called on EOF");
75
+ break;
76
+ case HpackParseStatus::kMovedFrom:
77
+ Crash("Materialize() called on moved-from object");
78
+ break;
79
+ case HpackParseStatus::kInvalidMetadata:
80
+ if (key_.empty()) {
81
+ return MakeStreamError(absl::InternalError(
82
+ ValidateMetadataResultToString(validate_metadata_result_)));
83
+ } else {
84
+ return MakeStreamError(absl::InternalError(absl::StrCat(
85
+ ValidateMetadataResultToString(validate_metadata_result_), ": ",
86
+ key_)));
87
+ }
88
+ case HpackParseStatus::kSoftMetadataLimitExceeded:
89
+ case HpackParseStatus::kHardMetadataLimitExceeded: {
90
+ const auto& e = metadata_limit_exceeded_;
91
+ // Collect a summary of sizes so far for debugging
92
+ // Do not collect contents, for fear of exposing PII.
93
+ std::string summary;
94
+ if (e.prior != nullptr) {
95
+ MetadataSizeLimitExceededEncoder encoder(summary);
96
+ e.prior->Encode(&encoder);
97
+ }
98
+ return MakeStreamError(absl::ResourceExhaustedError(absl::StrCat(
99
+ "received metadata size exceeds ",
100
+ status_.get() == HpackParseStatus::kSoftMetadataLimitExceeded
101
+ ? "soft"
102
+ : "hard",
103
+ " limit (", e.frame_length, " vs. ", e.limit, ")",
104
+ summary.empty() ? "" : "; ", summary)));
105
+ }
106
+ case HpackParseStatus::kHardMetadataLimitExceededByKey: {
107
+ const auto& e = metadata_limit_exceeded_by_atom_;
108
+ return MakeStreamError(absl::ResourceExhaustedError(
109
+ absl::StrCat("received metadata size exceeds hard limit (key length ",
110
+ e.atom_length, " vs. ", e.limit, ")")));
111
+ }
112
+ case HpackParseStatus::kHardMetadataLimitExceededByValue: {
113
+ const auto& e = metadata_limit_exceeded_by_atom_;
114
+ return MakeStreamError(absl::ResourceExhaustedError(absl::StrCat(
115
+ "received metadata size exceeds hard limit (value length ",
116
+ e.atom_length, " vs. ", e.limit, ")")));
117
+ }
118
+ case HpackParseStatus::kMetadataParseError:
119
+ if (!key_.empty()) {
120
+ return MakeStreamError(absl::InternalError(
121
+ absl::StrCat("Error parsing '", key_, "' metadata")));
122
+ } else {
123
+ return MakeStreamError(absl::InternalError("Error parsing metadata"));
124
+ }
125
+ case HpackParseStatus::kUnbase64Failed:
126
+ if (!key_.empty()) {
127
+ return MakeStreamError(absl::InternalError(absl::StrCat(
128
+ "Error parsing '", key_, "' metadata: illegal base64 encoding")));
129
+ } else {
130
+ return MakeStreamError(absl::InternalError(
131
+ absl::StrCat("Failed base64 decoding metadata")));
132
+ }
133
+ case HpackParseStatus::kIncompleteHeaderAtBoundary:
134
+ return absl::InternalError(
135
+ "Incomplete header at the end of a header/continuation sequence");
136
+ case HpackParseStatus::kVarintOutOfRange:
137
+ return absl::InternalError(absl::StrFormat(
138
+ "integer overflow in hpack integer decoding: have 0x%08x, "
139
+ "got byte 0x%02x",
140
+ varint_out_of_range_.value, varint_out_of_range_.last_byte));
141
+ case HpackParseStatus::kIllegalTableSizeChange:
142
+ return absl::InternalError(absl::StrCat(
143
+ "Attempt to make hpack table ", illegal_table_size_change_.new_size,
144
+ " bytes when max is ", illegal_table_size_change_.max_size,
145
+ " bytes"));
146
+ case HpackParseStatus::kAddBeforeTableSizeUpdated:
147
+ return absl::InternalError(
148
+ absl::StrCat("HPACK max table size reduced to ",
149
+ illegal_table_size_change_.new_size,
150
+ " but not reflected by hpack stream (still at ",
151
+ illegal_table_size_change_.max_size, ")"));
152
+ case HpackParseStatus::kParseHuffFailed:
153
+ if (!key_.empty()) {
154
+ return absl::InternalError(
155
+ absl::StrCat("Failed huffman decoding '", key_, "' metadata"));
156
+ } else {
157
+ return absl::InternalError(
158
+ absl::StrCat("Failed huffman decoding metadata"));
159
+ }
160
+ break;
161
+ case HpackParseStatus::kTooManyDynamicTableSizeChanges:
162
+ return absl::InternalError(
163
+ "More than two max table size changes in a single frame");
164
+ case HpackParseStatus::kMaliciousVarintEncoding:
165
+ return absl::InternalError(
166
+ "Malicious varint encoding detected in HPACK stream");
167
+ case HpackParseStatus::kInvalidHpackIndex:
168
+ return absl::InternalError(absl::StrFormat(
169
+ "Invalid HPACK index received (%d)", invalid_hpack_index_));
170
+ case HpackParseStatus::kIllegalHpackOpCode:
171
+ return absl::InternalError("Illegal hpack op code");
172
+ }
173
+ GPR_UNREACHABLE_CODE(return absl::UnknownError("Should never reach here"));
174
+ }
175
+
176
+ } // namespace grpc_core
@@ -0,0 +1,326 @@
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
+ #ifndef GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_PARSE_RESULT_H
16
+ #define GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_PARSE_RESULT_H
17
+
18
+ #include <grpc/support/port_platform.h>
19
+
20
+ #include <stdint.h>
21
+
22
+ #include <memory>
23
+ #include <string>
24
+ #include <utility>
25
+
26
+ #include "absl/status/status.h"
27
+ #include "absl/strings/str_cat.h"
28
+ #include "absl/strings/string_view.h"
29
+ #include "absl/types/optional.h"
30
+
31
+ #include <grpc/support/log.h>
32
+
33
+ #include "src/core/lib/gprpp/crash.h"
34
+ #include "src/core/lib/surface/validate_metadata.h"
35
+ #include "src/core/lib/transport/metadata_batch.h"
36
+
37
+ namespace grpc_core {
38
+
39
+ // Result of parsing
40
+ // Makes it trivial to identify stream vs connection errors (via a range check)
41
+ enum class HpackParseStatus : uint8_t {
42
+ ///////////////////////////////////////////////////////
43
+ // Non-Errors
44
+
45
+ // Parsed OK
46
+ kOk,
47
+ // Parse reached end of the current frame
48
+ kEof,
49
+ // Moved from - used to denote a HpackParseResult that has been moved into a
50
+ // different object, and so the original should be deemed invalid.
51
+ kMovedFrom,
52
+
53
+ ///////////////////////////////////////////////////////////////////
54
+ // Stream Errors - result in a stream cancellation
55
+
56
+ // Sentinel value used to denote the first error that is a stream error.
57
+ // All stream errors are hence >= kFirstStreamError and <
58
+ // kFirstConnectionError.
59
+ // Should not be used in switch statements, instead the first error message
60
+ // after this one should be assigned the same value.
61
+ kFirstStreamError,
62
+ kInvalidMetadata = kFirstStreamError,
63
+ // Hard metadata limit exceeded by the total set of metadata
64
+ kHardMetadataLimitExceeded,
65
+ kSoftMetadataLimitExceeded,
66
+ // Hard metadata limit exceeded by a single key string
67
+ kHardMetadataLimitExceededByKey,
68
+ // Hard metadata limit exceeded by a single value string
69
+ kHardMetadataLimitExceededByValue,
70
+ kMetadataParseError,
71
+ // Parse failed due to a base64 decode error
72
+ kUnbase64Failed,
73
+
74
+ ///////////////////////////////////////////////////////////////////
75
+ // Connection Errors - result in the tcp connection closing
76
+
77
+ // Sentinel value used to denote the first error that is a connection error.
78
+ // All connection errors are hence >= kFirstConnectionError.
79
+ // Should not be used in switch statements, instead the first error message
80
+ // after this one should be assigned the same value.
81
+ kFirstConnectionError,
82
+ // Incomplete header at end of header boundary
83
+ kIncompleteHeaderAtBoundary = kFirstConnectionError,
84
+ // Varint out of range
85
+ kVarintOutOfRange,
86
+ // Invalid HPACK index
87
+ kInvalidHpackIndex,
88
+ // Illegal HPACK table size change
89
+ kIllegalTableSizeChange,
90
+ // Trying to add to the hpack table prior to reducing after a settings change
91
+ kAddBeforeTableSizeUpdated,
92
+ // Parse failed due to a huffman decode error
93
+ kParseHuffFailed,
94
+ // Too many dynamic table size changes in one frame
95
+ kTooManyDynamicTableSizeChanges,
96
+ // Maliciously long varint encoding
97
+ // We don't read past 16 repeated 0x80 prefixes on a varint (all zeros)
98
+ // because no reasonable varint encoder would emit that (16 is already quite
99
+ // generous!)
100
+ // Because we stop reading we don't parse the rest of the bytes and so we
101
+ // can't recover parsing and would end up with a hpack table desync if we
102
+ // tried, so this is a connection error.
103
+ kMaliciousVarintEncoding,
104
+ // Illegal hpack op code
105
+ kIllegalHpackOpCode,
106
+ };
107
+
108
+ inline bool IsStreamError(HpackParseStatus status) {
109
+ return status >= HpackParseStatus::kFirstStreamError &&
110
+ status < HpackParseStatus::kFirstConnectionError;
111
+ }
112
+
113
+ inline bool IsConnectionError(HpackParseStatus status) {
114
+ return status >= HpackParseStatus::kFirstConnectionError;
115
+ }
116
+
117
+ inline bool IsEphemeralError(HpackParseStatus status) {
118
+ switch (status) {
119
+ case HpackParseStatus::kSoftMetadataLimitExceeded:
120
+ case HpackParseStatus::kHardMetadataLimitExceeded:
121
+ return true;
122
+ default:
123
+ return false;
124
+ }
125
+ }
126
+
127
+ class HpackParseResult {
128
+ public:
129
+ HpackParseResult() : HpackParseResult{HpackParseStatus::kOk} {}
130
+
131
+ bool ok() const { return status_.get() == HpackParseStatus::kOk; }
132
+ bool stream_error() const { return IsStreamError(status_.get()); }
133
+ bool connection_error() const { return IsConnectionError(status_.get()); }
134
+ bool ephemeral() const { return IsEphemeralError(status_.get()); }
135
+
136
+ std::unique_ptr<HpackParseResult> PersistentStreamErrorOrNullptr() const {
137
+ if (ok() || connection_error() || ephemeral()) return nullptr;
138
+ return std::make_unique<HpackParseResult>(*this);
139
+ }
140
+
141
+ static HpackParseResult FromStatus(HpackParseStatus status) {
142
+ // Most statuses need some payloads, and we only need this functionality
143
+ // rarely - so allow list the statuses that we can include here.
144
+ switch (status) {
145
+ case HpackParseStatus::kUnbase64Failed:
146
+ case HpackParseStatus::kParseHuffFailed:
147
+ return HpackParseResult{status};
148
+ default:
149
+ Crash(
150
+ absl::StrCat("Invalid HpackParseStatus for FromStatus: ", status));
151
+ }
152
+ }
153
+
154
+ static HpackParseResult FromStatusWithKey(HpackParseStatus status,
155
+ absl::string_view key) {
156
+ auto r = FromStatus(status);
157
+ r.key_ = std::string(key);
158
+ return r;
159
+ }
160
+
161
+ static HpackParseResult MetadataParseError(absl::string_view key) {
162
+ HpackParseResult r{HpackParseStatus::kMetadataParseError};
163
+ r.key_ = std::string(key);
164
+ return r;
165
+ }
166
+
167
+ static HpackParseResult AddBeforeTableSizeUpdated(uint32_t current_size,
168
+ uint32_t max_size) {
169
+ HpackParseResult p{HpackParseStatus::kAddBeforeTableSizeUpdated};
170
+ p.illegal_table_size_change_ =
171
+ IllegalTableSizeChange{current_size, max_size};
172
+ return p;
173
+ }
174
+
175
+ static HpackParseResult MaliciousVarintEncodingError() {
176
+ return HpackParseResult{HpackParseStatus::kMaliciousVarintEncoding};
177
+ }
178
+
179
+ static HpackParseResult IllegalHpackOpCode() {
180
+ return HpackParseResult{HpackParseStatus::kIllegalHpackOpCode};
181
+ }
182
+
183
+ static HpackParseResult InvalidMetadataError(ValidateMetadataResult result,
184
+ absl::string_view key) {
185
+ GPR_DEBUG_ASSERT(result != ValidateMetadataResult::kOk);
186
+ HpackParseResult p{HpackParseStatus::kInvalidMetadata};
187
+ p.key_ = std::string(key);
188
+ p.validate_metadata_result_ = result;
189
+ return p;
190
+ }
191
+
192
+ static HpackParseResult IncompleteHeaderAtBoundaryError() {
193
+ return HpackParseResult{HpackParseStatus::kIncompleteHeaderAtBoundary};
194
+ }
195
+
196
+ static HpackParseResult VarintOutOfRangeError(uint32_t value,
197
+ uint8_t last_byte) {
198
+ HpackParseResult p{HpackParseStatus::kVarintOutOfRange};
199
+ p.varint_out_of_range_ = VarintOutOfRange{last_byte, value};
200
+ return p;
201
+ }
202
+
203
+ static HpackParseResult InvalidHpackIndexError(uint32_t index) {
204
+ HpackParseResult p{HpackParseStatus::kInvalidHpackIndex};
205
+ p.invalid_hpack_index_ = index;
206
+ return p;
207
+ }
208
+
209
+ static HpackParseResult IllegalTableSizeChangeError(uint32_t new_size,
210
+ uint32_t max_size) {
211
+ HpackParseResult p{HpackParseStatus::kIllegalTableSizeChange};
212
+ p.illegal_table_size_change_ = IllegalTableSizeChange{new_size, max_size};
213
+ return p;
214
+ }
215
+
216
+ static HpackParseResult TooManyDynamicTableSizeChangesError() {
217
+ return HpackParseResult{HpackParseStatus::kTooManyDynamicTableSizeChanges};
218
+ }
219
+
220
+ static HpackParseResult SoftMetadataLimitExceededError(
221
+ grpc_metadata_batch* metadata, uint32_t frame_length, uint32_t limit) {
222
+ HpackParseResult p{HpackParseStatus::kSoftMetadataLimitExceeded};
223
+ p.metadata_limit_exceeded_ =
224
+ MetadataLimitExceeded{frame_length, limit, metadata};
225
+ return p;
226
+ }
227
+
228
+ static HpackParseResult HardMetadataLimitExceededError(
229
+ grpc_metadata_batch* metadata, uint32_t frame_length, uint32_t limit) {
230
+ HpackParseResult p{HpackParseStatus::kHardMetadataLimitExceeded};
231
+ p.metadata_limit_exceeded_ =
232
+ MetadataLimitExceeded{frame_length, limit, metadata};
233
+ return p;
234
+ }
235
+
236
+ static HpackParseResult HardMetadataLimitExceededByKeyError(
237
+ uint32_t key_length, uint32_t limit) {
238
+ HpackParseResult p{HpackParseStatus::kHardMetadataLimitExceededByKey};
239
+ p.metadata_limit_exceeded_by_atom_ =
240
+ MetadataLimitExceededByAtom{key_length, limit};
241
+ return p;
242
+ }
243
+
244
+ static HpackParseResult HardMetadataLimitExceededByValueError(
245
+ absl::string_view key, uint32_t value_length, uint32_t limit) {
246
+ HpackParseResult p{HpackParseStatus::kHardMetadataLimitExceededByValue};
247
+ p.metadata_limit_exceeded_by_atom_ =
248
+ MetadataLimitExceededByAtom{value_length, limit};
249
+ p.key_ = std::string(key);
250
+ return p;
251
+ }
252
+
253
+ // Compute the absl::Status that goes along with this HpackParseResult.
254
+ // (may be cached, so this is not thread safe)
255
+ absl::Status Materialize() const;
256
+
257
+ private:
258
+ explicit HpackParseResult(HpackParseStatus status) : status_(status) {}
259
+ absl::Status BuildMaterialized() const;
260
+
261
+ struct VarintOutOfRange {
262
+ uint8_t last_byte;
263
+ uint32_t value;
264
+ };
265
+
266
+ struct MetadataLimitExceeded {
267
+ uint32_t frame_length;
268
+ uint32_t limit;
269
+ grpc_metadata_batch* prior;
270
+ };
271
+
272
+ // atom here means one of either a key or a value - so this is used for when a
273
+ // metadata limit is consumed by either of these.
274
+ struct MetadataLimitExceededByAtom {
275
+ uint32_t atom_length;
276
+ uint32_t limit;
277
+ };
278
+
279
+ struct IllegalTableSizeChange {
280
+ uint32_t new_size;
281
+ uint32_t max_size;
282
+ };
283
+
284
+ class StatusWrapper {
285
+ public:
286
+ explicit StatusWrapper(HpackParseStatus status) : status_(status) {}
287
+
288
+ StatusWrapper(const StatusWrapper&) = default;
289
+ StatusWrapper& operator=(const StatusWrapper&) = default;
290
+ StatusWrapper(StatusWrapper&& other) noexcept
291
+ : status_(std::exchange(other.status_, HpackParseStatus::kMovedFrom)) {}
292
+ StatusWrapper& operator=(StatusWrapper&& other) noexcept {
293
+ status_ = std::exchange(other.status_, HpackParseStatus::kMovedFrom);
294
+ return *this;
295
+ }
296
+
297
+ HpackParseStatus get() const { return status_; }
298
+
299
+ private:
300
+ HpackParseStatus status_;
301
+ };
302
+
303
+ StatusWrapper status_;
304
+ union {
305
+ // Set if status == kInvalidMetadata
306
+ ValidateMetadataResult validate_metadata_result_;
307
+ // Set if status == kVarintOutOfRange
308
+ VarintOutOfRange varint_out_of_range_;
309
+ // Set if status == kInvalidHpackIndex
310
+ uint32_t invalid_hpack_index_;
311
+ // Set if status == kHardMetadataLimitExceeded or
312
+ // kSoftMetadataLimitExceeded
313
+ MetadataLimitExceeded metadata_limit_exceeded_;
314
+ // Set if status == kHardMetadataLimitExceededByKey or
315
+ // kHardMetadataLimitExceededByValue
316
+ MetadataLimitExceededByAtom metadata_limit_exceeded_by_atom_;
317
+ // Set if status == kIllegalTableSizeChange
318
+ IllegalTableSizeChange illegal_table_size_change_;
319
+ };
320
+ std::string key_;
321
+ mutable absl::optional<absl::Status> materialized_status_;
322
+ };
323
+
324
+ } // namespace grpc_core
325
+
326
+ #endif // GRPC_SRC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_PARSE_RESULT_H