grpc 1.40.0 → 1.43.1

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 (1362) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +137 -82
  3. data/etc/roots.pem +335 -326
  4. data/include/grpc/byte_buffer.h +1 -1
  5. data/include/grpc/byte_buffer_reader.h +1 -1
  6. data/include/grpc/event_engine/endpoint_config.h +6 -11
  7. data/include/grpc/event_engine/event_engine.h +164 -95
  8. data/include/grpc/event_engine/internal/memory_allocator_impl.h +68 -0
  9. data/include/grpc/event_engine/memory_allocator.h +226 -0
  10. data/include/grpc/event_engine/memory_request.h +57 -0
  11. data/include/grpc/event_engine/port.h +1 -3
  12. data/include/grpc/fork.h +1 -1
  13. data/include/grpc/grpc.h +14 -4
  14. data/include/grpc/grpc_posix.h +5 -2
  15. data/include/grpc/grpc_security.h +294 -145
  16. data/include/grpc/grpc_security_constants.h +2 -14
  17. data/include/grpc/impl/codegen/atm.h +5 -3
  18. data/include/grpc/impl/codegen/atm_gcc_atomic.h +2 -0
  19. data/include/grpc/impl/codegen/atm_gcc_sync.h +2 -0
  20. data/include/grpc/impl/codegen/atm_windows.h +2 -0
  21. data/include/grpc/impl/codegen/byte_buffer.h +2 -0
  22. data/include/grpc/impl/codegen/byte_buffer_reader.h +2 -0
  23. data/include/grpc/impl/codegen/compression_types.h +2 -0
  24. data/include/grpc/impl/codegen/connectivity_state.h +2 -0
  25. data/include/grpc/impl/codegen/fork.h +2 -0
  26. data/include/grpc/impl/codegen/gpr_slice.h +2 -0
  27. data/include/grpc/impl/codegen/gpr_types.h +2 -0
  28. data/include/grpc/impl/codegen/grpc_types.h +4 -5
  29. data/include/grpc/impl/codegen/log.h +2 -0
  30. data/include/grpc/impl/codegen/port_platform.h +37 -22
  31. data/include/grpc/impl/codegen/propagation_bits.h +2 -0
  32. data/include/grpc/impl/codegen/slice.h +2 -0
  33. data/include/grpc/impl/codegen/status.h +2 -0
  34. data/include/grpc/impl/codegen/sync.h +8 -5
  35. data/include/grpc/impl/codegen/sync_abseil.h +2 -0
  36. data/include/grpc/impl/codegen/sync_custom.h +2 -0
  37. data/include/grpc/impl/codegen/sync_generic.h +3 -0
  38. data/include/grpc/impl/codegen/sync_posix.h +4 -2
  39. data/include/grpc/impl/codegen/sync_windows.h +2 -0
  40. data/include/grpc/slice.h +1 -1
  41. data/include/grpc/status.h +1 -1
  42. data/include/grpc/support/atm.h +1 -1
  43. data/include/grpc/support/atm_gcc_atomic.h +1 -1
  44. data/include/grpc/support/atm_gcc_sync.h +1 -1
  45. data/include/grpc/support/atm_windows.h +1 -1
  46. data/include/grpc/support/log.h +1 -1
  47. data/include/grpc/support/port_platform.h +1 -1
  48. data/include/grpc/support/sync.h +1 -1
  49. data/include/grpc/support/sync_abseil.h +1 -1
  50. data/include/grpc/support/sync_custom.h +1 -1
  51. data/include/grpc/support/sync_generic.h +1 -1
  52. data/include/grpc/support/sync_posix.h +1 -1
  53. data/include/grpc/support/sync_windows.h +1 -1
  54. data/include/grpc/support/time.h +2 -2
  55. data/src/core/ext/filters/census/grpc_context.cc +1 -0
  56. data/src/core/ext/filters/client_channel/backend_metric.cc +21 -24
  57. data/src/core/ext/filters/client_channel/backend_metric.h +3 -2
  58. data/src/core/ext/filters/client_channel/backup_poller.cc +2 -1
  59. data/src/core/ext/filters/client_channel/backup_poller.h +1 -0
  60. data/src/core/ext/filters/client_channel/channel_connectivity.cc +72 -91
  61. data/src/core/ext/filters/client_channel/client_channel.cc +256 -308
  62. data/src/core/ext/filters/client_channel/client_channel.h +80 -32
  63. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +6 -5
  64. data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -1
  65. data/src/core/ext/filters/client_channel/client_channel_factory.cc +2 -1
  66. data/src/core/ext/filters/client_channel/client_channel_factory.h +17 -19
  67. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +15 -15
  68. data/src/core/ext/filters/client_channel/config_selector.cc +2 -1
  69. data/src/core/ext/filters/client_channel/config_selector.h +4 -5
  70. data/src/core/ext/filters/client_channel/connector.h +18 -18
  71. data/src/core/ext/filters/client_channel/dynamic_filters.cc +5 -5
  72. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +0 -1
  73. data/src/core/ext/filters/client_channel/health/health_check_client.cc +19 -17
  74. data/src/core/ext/filters/client_channel/health/health_check_client.h +5 -4
  75. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +20 -21
  76. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +10 -2
  77. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +6 -2
  78. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -15
  79. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +169 -92
  80. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +4 -0
  81. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
  82. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -2
  83. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +3 -4
  84. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +4 -4
  85. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -3
  86. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +23 -7
  87. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +29 -33
  88. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +5 -6
  89. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +2502 -0
  90. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +6 -1
  91. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +2 -2
  92. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +9 -9
  93. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +47 -99
  94. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +1 -1
  95. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +97 -41
  96. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +10 -9
  97. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +55 -109
  98. data/src/core/ext/filters/client_channel/lb_policy.h +96 -103
  99. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -0
  100. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -7
  101. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +139 -0
  102. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +16 -18
  103. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +3 -2
  104. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -3
  105. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +17 -20
  106. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +26 -58
  107. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +21 -1
  108. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +10 -5
  109. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +5 -3
  110. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +11 -17
  111. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +283 -349
  112. data/src/core/ext/filters/client_channel/resolver.h +1 -1
  113. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -0
  114. data/src/core/ext/filters/client_channel/resolver_registry.cc +12 -15
  115. data/src/core/ext/filters/client_channel/resolver_registry.h +1 -2
  116. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +3 -4
  117. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +1 -1
  118. data/src/core/ext/filters/client_channel/retry_filter.cc +48 -86
  119. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  120. data/src/core/ext/filters/client_channel/retry_throttle.cc +17 -48
  121. data/src/core/ext/filters/client_channel/server_address.h +1 -1
  122. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +49 -36
  123. data/src/core/ext/filters/client_channel/subchannel.cc +89 -147
  124. data/src/core/ext/filters/client_channel/subchannel.h +29 -49
  125. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +22 -7
  126. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +11 -2
  127. data/src/core/ext/filters/client_idle/client_idle_filter.cc +29 -206
  128. data/src/core/ext/filters/client_idle/idle_filter_state.cc +96 -0
  129. data/src/core/ext/filters/client_idle/idle_filter_state.h +66 -0
  130. data/src/core/ext/filters/deadline/deadline_filter.cc +23 -26
  131. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +28 -26
  132. data/src/core/ext/filters/fault_injection/service_config_parser.cc +6 -14
  133. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  134. data/src/core/ext/filters/http/client/http_client_filter.cc +50 -68
  135. data/src/core/ext/filters/http/client_authority_filter.cc +16 -16
  136. data/src/core/ext/filters/http/http_filters_plugin.cc +51 -71
  137. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +19 -13
  138. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +8 -9
  139. data/src/core/ext/filters/http/server/http_server_filter.cc +72 -84
  140. data/src/core/ext/filters/max_age/max_age_filter.cc +24 -26
  141. data/src/core/ext/filters/message_size/message_size_filter.cc +28 -29
  142. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  143. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +67 -0
  144. data/src/core/ext/filters/server_config_selector/server_config_selector.h +70 -0
  145. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +265 -0
  146. data/src/core/ext/filters/{workarounds/workaround_cronet_compression_filter.h → server_config_selector/server_config_selector_filter.h} +11 -6
  147. data/src/core/ext/{filters/client_channel → service_config}/service_config.cc +2 -2
  148. data/src/core/ext/{filters/client_channel → service_config}/service_config.h +4 -4
  149. data/src/core/ext/service_config/service_config_call_data.h +72 -0
  150. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.cc +3 -3
  151. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.h +8 -6
  152. data/src/core/ext/transport/chttp2/alpn/alpn.cc +2 -1
  153. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +10 -12
  154. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +26 -29
  155. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +9 -8
  156. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +33 -54
  157. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +66 -70
  158. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +2 -4
  159. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +7 -5
  160. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +11 -15
  161. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +3 -1
  162. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +2 -1
  163. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +1 -0
  164. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +120 -134
  165. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +4 -2
  166. data/src/core/ext/transport/chttp2/transport/context_list.cc +2 -3
  167. data/src/core/ext/transport/chttp2/transport/context_list.h +3 -5
  168. data/src/core/ext/transport/chttp2/transport/flow_control.cc +62 -43
  169. data/src/core/ext/transport/chttp2/transport/flow_control.h +15 -9
  170. data/src/core/ext/transport/chttp2/transport/frame_data.cc +11 -11
  171. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -0
  172. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +6 -4
  173. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +1 -0
  174. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +6 -5
  175. data/src/core/ext/transport/chttp2/transport/frame_ping.h +1 -0
  176. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +5 -8
  177. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +1 -0
  178. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +38 -7
  179. data/src/core/ext/transport/chttp2/transport/frame_settings.h +1 -0
  180. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +12 -7
  181. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +1 -0
  182. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +41 -0
  183. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +378 -668
  184. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +272 -70
  185. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +107 -0
  186. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +86 -0
  187. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +69 -0
  188. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +792 -1041
  189. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +75 -177
  190. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +146 -0
  191. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +137 -0
  192. data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +46 -0
  193. data/src/core/ext/transport/chttp2/transport/hpack_utils.h +30 -0
  194. data/src/core/ext/transport/chttp2/transport/internal.h +14 -9
  195. data/src/core/ext/transport/chttp2/transport/parsing.cc +50 -203
  196. data/src/core/ext/transport/chttp2/transport/popularity_count.h +60 -0
  197. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +2 -2
  198. data/src/core/ext/transport/chttp2/transport/varint.cc +7 -3
  199. data/src/core/ext/transport/chttp2/transport/varint.h +39 -28
  200. data/src/core/ext/transport/chttp2/transport/writing.cc +61 -50
  201. data/src/core/ext/transport/inproc/inproc_transport.cc +126 -119
  202. data/src/core/ext/transport/inproc/inproc_transport.h +1 -1
  203. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +198 -166
  204. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +223 -89
  205. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +42 -1
  206. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +19 -1
  207. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +27 -3
  208. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +18 -5
  209. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +108 -83
  210. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +153 -61
  211. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +189 -161
  212. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +173 -69
  213. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +36 -23
  214. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +33 -13
  215. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +279 -211
  216. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +370 -102
  217. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +17 -6
  218. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +13 -5
  219. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +37 -26
  220. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +13 -5
  221. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +57 -40
  222. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +73 -29
  223. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +17 -6
  224. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +13 -5
  225. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +172 -126
  226. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +256 -85
  227. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +52 -37
  228. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +53 -21
  229. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +16 -5
  230. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +13 -5
  231. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +26 -14
  232. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +23 -9
  233. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +115 -91
  234. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +133 -53
  235. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +91 -72
  236. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +98 -33
  237. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +18 -7
  238. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +13 -5
  239. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +122 -93
  240. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +166 -57
  241. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +14 -3
  242. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +13 -5
  243. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +22 -10
  244. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +23 -9
  245. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +19 -8
  246. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +13 -5
  247. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +23 -12
  248. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +13 -5
  249. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +18 -7
  250. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +13 -5
  251. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +42 -28
  252. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +33 -13
  253. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +82 -32
  254. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +176 -17
  255. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +59 -44
  256. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +53 -21
  257. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +16 -5
  258. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +13 -5
  259. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +74 -58
  260. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +63 -25
  261. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +82 -65
  262. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +73 -29
  263. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +26 -15
  264. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +13 -5
  265. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +20 -8
  266. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +23 -9
  267. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +64 -46
  268. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +83 -33
  269. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +76 -45
  270. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +143 -43
  271. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +101 -77
  272. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +107 -29
  273. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +42 -29
  274. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +33 -13
  275. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +516 -446
  276. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +620 -267
  277. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +27 -14
  278. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +33 -13
  279. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +22 -10
  280. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +23 -9
  281. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +14 -3
  282. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +13 -5
  283. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +36 -21
  284. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +53 -21
  285. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +45 -32
  286. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +33 -13
  287. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +23 -12
  288. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +13 -5
  289. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +211 -183
  290. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +193 -77
  291. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +8 -1
  292. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +6 -4
  293. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +75 -45
  294. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +120 -34
  295. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +34 -21
  296. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +33 -13
  297. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +88 -70
  298. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +110 -55
  299. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +13 -2
  300. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +13 -5
  301. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +13 -2
  302. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +13 -5
  303. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +76 -59
  304. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +63 -25
  305. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +13 -2
  306. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +13 -5
  307. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +13 -2
  308. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +13 -5
  309. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +26 -14
  310. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +23 -9
  311. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +13 -2
  312. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +13 -5
  313. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +13 -2
  314. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +13 -5
  315. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +62 -47
  316. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +53 -21
  317. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +27 -13
  318. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +43 -17
  319. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +24 -11
  320. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +27 -9
  321. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +18 -7
  322. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +13 -5
  323. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +17 -6
  324. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +13 -5
  325. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +16 -5
  326. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +13 -5
  327. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +28 -15
  328. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +33 -13
  329. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +26 -14
  330. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +23 -9
  331. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +21 -9
  332. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +23 -9
  333. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +31 -18
  334. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +33 -13
  335. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +39 -22
  336. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +73 -29
  337. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +42 -27
  338. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +53 -21
  339. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.c +8 -1
  340. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +3 -1
  341. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +18 -6
  342. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +23 -9
  343. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +23 -10
  344. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +33 -13
  345. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +16 -5
  346. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +13 -5
  347. data/src/core/ext/upb-generated/google/api/annotations.upb.c +21 -1
  348. data/src/core/ext/upb-generated/google/api/annotations.upb.h +8 -1
  349. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +117 -94
  350. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +113 -45
  351. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.c +102 -0
  352. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.h +306 -0
  353. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.c +56 -0
  354. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.h +135 -0
  355. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +123 -99
  356. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +123 -49
  357. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.c +115 -0
  358. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.h +371 -0
  359. data/src/core/ext/upb-generated/google/api/http.upb.c +36 -23
  360. data/src/core/ext/upb-generated/google/api/http.upb.h +33 -13
  361. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +15 -4
  362. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +13 -5
  363. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +248 -211
  364. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +273 -109
  365. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +15 -4
  366. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +13 -5
  367. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +13 -2
  368. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +13 -5
  369. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +38 -24
  370. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +33 -13
  371. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +15 -4
  372. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +13 -5
  373. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +38 -19
  374. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +93 -37
  375. data/src/core/ext/upb-generated/google/rpc/status.upb.c +18 -7
  376. data/src/core/ext/upb-generated/google/rpc/status.upb.h +13 -5
  377. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +27 -15
  378. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +13 -5
  379. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +106 -84
  380. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +103 -41
  381. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +21 -9
  382. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +23 -9
  383. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +17 -5
  384. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +23 -9
  385. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +66 -48
  386. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +115 -63
  387. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +68 -0
  388. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +156 -0
  389. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +68 -8
  390. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +58 -13
  391. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +28 -6
  392. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +18 -5
  393. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +20 -1
  394. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +8 -1
  395. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +28 -4
  396. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +18 -5
  397. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +27 -3
  398. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +18 -5
  399. data/src/core/ext/upb-generated/validate/validate.upb.c +321 -252
  400. data/src/core/ext/upb-generated/validate/validate.upb.h +251 -93
  401. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +103 -0
  402. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +199 -0
  403. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +15 -4
  404. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +13 -5
  405. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +26 -14
  406. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +23 -9
  407. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +21 -9
  408. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +13 -5
  409. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +20 -9
  410. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +13 -5
  411. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +29 -17
  412. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +23 -9
  413. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +20 -9
  414. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +13 -5
  415. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +71 -0
  416. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +132 -0
  417. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +44 -0
  418. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +85 -0
  419. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +2 -49
  420. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +2 -2
  421. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +2 -7
  422. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +2 -35
  423. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +2 -41
  424. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +2 -11
  425. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +407 -434
  426. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +10 -0
  427. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +2 -7
  428. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +2 -7
  429. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +2 -19
  430. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +2 -7
  431. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +100 -138
  432. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +5 -0
  433. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +2 -15
  434. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +2 -7
  435. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +2 -9
  436. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +2 -33
  437. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +61 -77
  438. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +2 -7
  439. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +61 -79
  440. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +2 -7
  441. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c +2 -9
  442. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +2 -7
  443. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +2 -7
  444. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c +2 -7
  445. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +2 -13
  446. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +87 -75
  447. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +10 -0
  448. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +2 -15
  449. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +2 -7
  450. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +2 -17
  451. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +2 -19
  452. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +2 -7
  453. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +2 -9
  454. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +2 -21
  455. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +29 -39
  456. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +5 -0
  457. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +2 -11
  458. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +803 -894
  459. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +2 -11
  460. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +2 -9
  461. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +2 -7
  462. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +2 -15
  463. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +2 -11
  464. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +2 -7
  465. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +98 -143
  466. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +2 -2
  467. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +132 -129
  468. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +5 -0
  469. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +2 -11
  470. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +180 -190
  471. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +2 -7
  472. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +2 -7
  473. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +2 -19
  474. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +2 -7
  475. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +2 -7
  476. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +2 -9
  477. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +2 -7
  478. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +2 -7
  479. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +2 -15
  480. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c +2 -13
  481. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +16 -22
  482. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +2 -7
  483. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +2 -7
  484. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +2 -7
  485. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +2 -11
  486. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +2 -9
  487. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +2 -9
  488. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +2 -11
  489. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +2 -19
  490. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +2 -15
  491. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +2 -2
  492. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +2 -9
  493. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +2 -11
  494. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +2 -7
  495. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +2 -2
  496. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +2 -11
  497. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +2 -7
  498. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +105 -162
  499. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +2 -7
  500. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +2 -7
  501. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +2 -13
  502. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +2 -7
  503. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +2 -23
  504. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +2 -7
  505. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +7 -15
  506. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +21 -30
  507. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +6 -5
  508. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +7 -10
  509. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +7 -11
  510. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +2 -51
  511. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +64 -0
  512. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +50 -0
  513. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +15 -19
  514. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +27 -33
  515. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +18 -24
  516. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +19 -23
  517. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +35 -41
  518. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +21 -25
  519. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +40 -0
  520. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +35 -0
  521. data/src/core/ext/xds/certificate_provider_registry.cc +3 -3
  522. data/src/core/ext/xds/certificate_provider_store.h +1 -1
  523. data/src/core/ext/xds/xds_api.cc +1386 -1440
  524. data/src/core/ext/xds/xds_api.h +152 -115
  525. data/src/core/ext/xds/xds_bootstrap.cc +33 -55
  526. data/src/core/ext/xds/xds_bootstrap.h +10 -0
  527. data/src/core/ext/xds/xds_certificate_provider.cc +3 -3
  528. data/src/core/ext/xds/xds_certificate_provider.h +1 -2
  529. data/src/core/ext/xds/xds_channel_stack_modifier.cc +112 -0
  530. data/src/core/ext/xds/xds_channel_stack_modifier.h +52 -0
  531. data/src/core/ext/xds/xds_client.cc +793 -437
  532. data/src/core/ext/xds/xds_client.h +83 -69
  533. data/src/core/ext/xds/xds_client_stats.cc +16 -15
  534. data/src/core/ext/xds/xds_client_stats.h +7 -7
  535. data/src/core/ext/xds/xds_http_fault_filter.cc +4 -3
  536. data/src/core/ext/xds/xds_http_fault_filter.h +3 -2
  537. data/src/core/ext/xds/xds_http_filters.cc +1 -0
  538. data/src/core/ext/xds/xds_routing.cc +247 -0
  539. data/src/core/ext/xds/xds_routing.h +98 -0
  540. data/src/core/ext/xds/xds_server_config_fetcher.cc +976 -264
  541. data/src/core/lib/address_utils/parse_address.cc +6 -8
  542. data/src/core/lib/address_utils/sockaddr_utils.cc +2 -2
  543. data/src/core/lib/avl/avl.h +389 -88
  544. data/src/core/lib/backoff/backoff.cc +3 -3
  545. data/src/core/lib/channel/channel_args.cc +27 -8
  546. data/src/core/lib/channel/channel_args.h +11 -1
  547. data/src/core/lib/channel/channel_args_preconditioning.cc +47 -0
  548. data/src/core/lib/channel/channel_args_preconditioning.h +62 -0
  549. data/src/core/lib/channel/channel_stack.cc +5 -3
  550. data/src/core/lib/channel/channel_stack_builder.cc +3 -15
  551. data/src/core/lib/channel/channel_stack_builder.h +0 -8
  552. data/src/core/lib/channel/channel_trace.cc +11 -10
  553. data/src/core/lib/channel/channel_trace.h +2 -1
  554. data/src/core/lib/channel/channelz.cc +43 -39
  555. data/src/core/lib/channel/channelz.h +29 -29
  556. data/src/core/lib/channel/channelz_registry.cc +8 -7
  557. data/src/core/lib/channel/channelz_registry.h +1 -1
  558. data/src/core/lib/channel/connected_channel.cc +2 -3
  559. data/src/core/lib/channel/connected_channel.h +1 -2
  560. data/src/core/lib/channel/handshaker.cc +2 -1
  561. data/src/core/lib/channel/handshaker.h +1 -2
  562. data/src/core/lib/channel/handshaker_factory.h +10 -2
  563. data/src/core/lib/channel/handshaker_registry.cc +15 -70
  564. data/src/core/lib/channel/handshaker_registry.h +29 -12
  565. data/src/core/lib/channel/status_util.h +2 -2
  566. data/src/core/lib/compression/algorithm_metadata.h +1 -0
  567. data/src/core/lib/compression/compression.cc +2 -2
  568. data/src/core/lib/compression/compression_args.cc +15 -10
  569. data/src/core/lib/compression/compression_args.h +6 -4
  570. data/src/core/lib/compression/compression_internal.cc +4 -6
  571. data/src/core/lib/compression/compression_internal.h +1 -1
  572. data/src/core/lib/compression/message_compress.cc +2 -2
  573. data/src/core/lib/compression/stream_compression.cc +2 -1
  574. data/src/core/lib/compression/stream_compression.h +2 -1
  575. data/src/core/lib/compression/stream_compression_gzip.cc +2 -1
  576. data/src/core/lib/compression/stream_compression_identity.cc +2 -1
  577. data/src/core/lib/config/core_configuration.cc +98 -0
  578. data/src/core/lib/config/core_configuration.h +157 -0
  579. data/src/core/lib/debug/stats.cc +1 -1
  580. data/src/core/lib/debug/stats.h +1 -0
  581. data/src/core/lib/debug/stats_data.cc +15 -14
  582. data/src/core/lib/debug/stats_data.h +1 -0
  583. data/src/core/lib/debug/trace.cc +1 -0
  584. data/src/core/lib/debug/trace.h +4 -3
  585. data/src/core/lib/event_engine/{endpoint_config.cc → channel_args_endpoint_config.cc} +2 -2
  586. data/src/core/lib/event_engine/{endpoint_config_internal.h → channel_args_endpoint_config.h} +3 -3
  587. data/src/core/lib/event_engine/event_engine.cc +0 -13
  588. data/src/core/lib/event_engine/event_engine_factory.cc +49 -0
  589. data/src/core/lib/event_engine/event_engine_factory.h +33 -0
  590. data/src/core/lib/event_engine/memory_allocator.cc +70 -0
  591. data/src/core/lib/event_engine/sockaddr.cc +3 -3
  592. data/src/core/lib/gpr/alloc.cc +4 -3
  593. data/src/core/lib/gpr/atm.cc +1 -1
  594. data/src/core/lib/gpr/cpu_posix.cc +1 -1
  595. data/src/core/lib/gpr/env_linux.cc +1 -2
  596. data/src/core/lib/gpr/env_posix.cc +2 -3
  597. data/src/core/lib/gpr/log.cc +3 -3
  598. data/src/core/lib/gpr/log_android.cc +3 -2
  599. data/src/core/lib/gpr/log_linux.cc +7 -4
  600. data/src/core/lib/gpr/log_posix.cc +6 -3
  601. data/src/core/lib/gpr/string.cc +2 -2
  602. data/src/core/lib/gpr/string.h +2 -2
  603. data/src/core/lib/gpr/sync.cc +2 -2
  604. data/src/core/lib/gpr/sync_abseil.cc +7 -6
  605. data/src/core/lib/gpr/sync_posix.cc +3 -3
  606. data/src/core/lib/gpr/time.cc +3 -2
  607. data/src/core/lib/gpr/time_windows.cc +3 -2
  608. data/src/core/lib/gpr/tls.h +125 -40
  609. data/src/core/lib/gpr/tmpfile_posix.cc +1 -2
  610. data/src/core/lib/gpr/useful.h +79 -32
  611. data/src/core/lib/gprpp/arena.cc +2 -1
  612. data/src/core/lib/gprpp/arena.h +15 -5
  613. data/src/core/lib/gprpp/atomic_utils.h +47 -0
  614. data/src/core/lib/gprpp/bitset.h +188 -0
  615. data/src/core/lib/gprpp/chunked_vector.h +211 -0
  616. data/src/core/lib/{transport/authority_override.cc → gprpp/construct_destruct.h} +16 -17
  617. data/src/core/lib/gprpp/cpp_impl_of.h +45 -0
  618. data/src/core/lib/gprpp/dual_ref_counted.h +25 -26
  619. data/src/core/lib/gprpp/fork.cc +14 -12
  620. data/src/core/lib/gprpp/fork.h +4 -4
  621. data/src/core/lib/gprpp/global_config.h +1 -2
  622. data/src/core/lib/gprpp/global_config_env.cc +14 -14
  623. data/src/core/lib/gprpp/global_config_env.h +2 -2
  624. data/src/core/lib/gprpp/global_config_generic.h +2 -2
  625. data/src/core/lib/gprpp/manual_constructor.h +10 -8
  626. data/src/core/lib/gprpp/memory.h +9 -3
  627. data/src/core/lib/gprpp/mpscq.cc +7 -7
  628. data/src/core/lib/gprpp/mpscq.h +6 -5
  629. data/src/core/lib/gprpp/orphanable.h +4 -4
  630. data/src/core/lib/gprpp/ref_counted.h +19 -19
  631. data/src/core/lib/gprpp/ref_counted_ptr.h +2 -4
  632. data/src/core/lib/gprpp/status_helper.cc +27 -7
  633. data/src/core/lib/gprpp/status_helper.h +13 -2
  634. data/src/core/lib/gprpp/sync.h +3 -1
  635. data/src/core/lib/gprpp/table.h +423 -0
  636. data/src/core/lib/gprpp/thd_posix.cc +5 -5
  637. data/src/core/lib/gprpp/thd_windows.cc +4 -11
  638. data/src/core/lib/gprpp/time_util.cc +2 -2
  639. data/src/core/lib/gprpp/time_util.h +2 -2
  640. data/src/core/lib/http/format_request.cc +1 -0
  641. data/src/core/lib/http/format_request.h +1 -0
  642. data/src/core/lib/http/httpcli.cc +219 -197
  643. data/src/core/lib/http/httpcli.h +14 -9
  644. data/src/core/lib/http/httpcli_security_connector.cc +5 -8
  645. data/src/core/lib/http/parser.cc +2 -2
  646. data/src/core/lib/http/parser.h +1 -0
  647. data/src/core/lib/iomgr/buffer_list.cc +11 -10
  648. data/src/core/lib/iomgr/buffer_list.h +14 -15
  649. data/src/core/lib/iomgr/call_combiner.cc +30 -12
  650. data/src/core/lib/iomgr/cfstream_handle.cc +1 -1
  651. data/src/core/lib/iomgr/combiner.cc +9 -23
  652. data/src/core/lib/iomgr/combiner.h +1 -0
  653. data/src/core/lib/iomgr/dualstack_socket_posix.cc +1 -0
  654. data/src/core/lib/iomgr/endpoint.cc +0 -4
  655. data/src/core/lib/iomgr/endpoint.h +1 -4
  656. data/src/core/lib/iomgr/endpoint_cfstream.cc +15 -42
  657. data/src/core/lib/iomgr/endpoint_cfstream.h +4 -4
  658. data/src/core/lib/iomgr/endpoint_pair.h +1 -0
  659. data/src/core/lib/iomgr/endpoint_pair_event_engine.cc +1 -2
  660. data/src/core/lib/iomgr/endpoint_pair_posix.cc +11 -9
  661. data/src/core/lib/iomgr/endpoint_pair_windows.cc +5 -6
  662. data/src/core/lib/iomgr/error.cc +113 -52
  663. data/src/core/lib/iomgr/error.h +73 -18
  664. data/src/core/lib/iomgr/error_cfstream.cc +7 -2
  665. data/src/core/lib/iomgr/error_internal.h +1 -0
  666. data/src/core/lib/iomgr/ev_epoll1_linux.cc +17 -24
  667. data/src/core/lib/iomgr/ev_epollex_linux.cc +22 -29
  668. data/src/core/lib/iomgr/ev_poll_posix.cc +42 -45
  669. data/src/core/lib/iomgr/ev_posix.cc +1 -2
  670. data/src/core/lib/iomgr/event_engine/closure.cc +41 -18
  671. data/src/core/lib/iomgr/event_engine/closure.h +10 -1
  672. data/src/core/lib/iomgr/event_engine/endpoint.cc +7 -27
  673. data/src/core/lib/iomgr/event_engine/endpoint.h +1 -2
  674. data/src/core/lib/iomgr/event_engine/iomgr.cc +7 -28
  675. data/src/core/lib/iomgr/event_engine/pollset.cc +5 -4
  676. data/src/core/lib/iomgr/event_engine/resolver.cc +14 -9
  677. data/src/core/lib/iomgr/event_engine/tcp.cc +66 -34
  678. data/src/core/lib/iomgr/event_engine/timer.cc +10 -4
  679. data/src/core/lib/iomgr/exec_ctx.cc +4 -13
  680. data/src/core/lib/iomgr/exec_ctx.h +22 -30
  681. data/src/core/lib/iomgr/executor/mpmcqueue.cc +15 -16
  682. data/src/core/lib/iomgr/executor/mpmcqueue.h +7 -11
  683. data/src/core/lib/iomgr/executor/threadpool.cc +2 -2
  684. data/src/core/lib/iomgr/executor/threadpool.h +2 -1
  685. data/src/core/lib/iomgr/executor.cc +20 -38
  686. data/src/core/lib/iomgr/executor.h +1 -1
  687. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +2 -2
  688. data/src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc +2 -2
  689. data/src/core/lib/iomgr/internal_errqueue.cc +3 -2
  690. data/src/core/lib/iomgr/iocp_windows.cc +1 -0
  691. data/src/core/lib/iomgr/iomgr.cc +3 -1
  692. data/src/core/lib/iomgr/iomgr.h +2 -2
  693. data/src/core/lib/iomgr/iomgr_custom.cc +2 -2
  694. data/src/core/lib/iomgr/iomgr_custom.h +2 -2
  695. data/src/core/lib/iomgr/iomgr_internal.cc +6 -10
  696. data/src/core/lib/iomgr/iomgr_internal.h +3 -2
  697. data/src/core/lib/iomgr/iomgr_windows.cc +1 -2
  698. data/src/core/lib/iomgr/is_epollexclusive_available.cc +4 -4
  699. data/src/core/lib/iomgr/load_file.cc +2 -2
  700. data/src/core/lib/iomgr/lockfree_event.cc +18 -0
  701. data/src/core/lib/iomgr/polling_entity.cc +2 -2
  702. data/src/core/lib/iomgr/pollset_custom.cc +4 -5
  703. data/src/core/lib/iomgr/pollset_custom.h +3 -3
  704. data/src/core/lib/iomgr/pollset_set_custom.cc +1 -2
  705. data/src/core/lib/iomgr/pollset_set_windows.cc +1 -0
  706. data/src/core/lib/iomgr/port.h +0 -5
  707. data/src/core/lib/iomgr/python_util.h +1 -0
  708. data/src/core/lib/iomgr/resolve_address.cc +2 -1
  709. data/src/core/lib/iomgr/resolve_address.h +0 -4
  710. data/src/core/lib/iomgr/resolve_address_custom.cc +4 -4
  711. data/src/core/lib/iomgr/resolve_address_custom.h +0 -1
  712. data/src/core/lib/iomgr/resolve_address_posix.cc +7 -11
  713. data/src/core/lib/iomgr/resolve_address_windows.cc +6 -8
  714. data/src/core/lib/iomgr/sockaddr.h +1 -1
  715. data/src/core/lib/iomgr/socket_factory_posix.cc +5 -5
  716. data/src/core/lib/iomgr/socket_factory_posix.h +1 -0
  717. data/src/core/lib/iomgr/socket_mutator.cc +2 -2
  718. data/src/core/lib/iomgr/socket_mutator.h +2 -2
  719. data/src/core/lib/iomgr/socket_utils_common_posix.cc +4 -5
  720. data/src/core/lib/iomgr/socket_utils_linux.cc +4 -4
  721. data/src/core/lib/iomgr/socket_utils_posix.cc +2 -2
  722. data/src/core/lib/iomgr/socket_utils_posix.h +2 -2
  723. data/src/core/lib/iomgr/socket_utils_windows.cc +2 -2
  724. data/src/core/lib/iomgr/tcp_client.h +2 -0
  725. data/src/core/lib/iomgr/tcp_client_cfstream.cc +7 -23
  726. data/src/core/lib/iomgr/tcp_client_custom.cc +6 -20
  727. data/src/core/lib/iomgr/tcp_client_posix.cc +14 -24
  728. data/src/core/lib/iomgr/tcp_client_posix.h +3 -1
  729. data/src/core/lib/iomgr/tcp_client_windows.cc +7 -9
  730. data/src/core/lib/iomgr/tcp_custom.cc +12 -51
  731. data/src/core/lib/iomgr/tcp_custom.h +1 -1
  732. data/src/core/lib/iomgr/tcp_posix.cc +51 -87
  733. data/src/core/lib/iomgr/tcp_posix.h +9 -12
  734. data/src/core/lib/iomgr/tcp_server.h +4 -3
  735. data/src/core/lib/iomgr/tcp_server_custom.cc +7 -34
  736. data/src/core/lib/iomgr/tcp_server_posix.cc +15 -13
  737. data/src/core/lib/iomgr/tcp_server_utils_posix.h +21 -17
  738. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -2
  739. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +3 -4
  740. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +4 -4
  741. data/src/core/lib/iomgr/tcp_server_windows.cc +6 -10
  742. data/src/core/lib/iomgr/tcp_windows.cc +5 -29
  743. data/src/core/lib/iomgr/tcp_windows.h +1 -1
  744. data/src/core/lib/iomgr/timer.cc +1 -0
  745. data/src/core/lib/iomgr/timer.h +1 -2
  746. data/src/core/lib/iomgr/timer_custom.cc +2 -2
  747. data/src/core/lib/iomgr/timer_generic.cc +21 -51
  748. data/src/core/lib/iomgr/timer_generic.h +1 -0
  749. data/src/core/lib/iomgr/timer_heap.cc +2 -3
  750. data/src/core/lib/iomgr/unix_sockets_posix.cc +4 -6
  751. data/src/core/lib/iomgr/unix_sockets_posix.h +3 -4
  752. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +1 -1
  753. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +1 -0
  754. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -3
  755. data/src/core/lib/iomgr/wakeup_fd_posix.cc +1 -0
  756. data/src/core/lib/iomgr/work_serializer.cc +115 -44
  757. data/src/core/lib/iomgr/work_serializer.h +17 -5
  758. data/src/core/lib/json/json_reader.cc +92 -52
  759. data/src/core/lib/json/json_util.cc +69 -1
  760. data/src/core/lib/json/json_util.h +65 -115
  761. data/src/core/lib/json/json_writer.cc +0 -3
  762. data/src/core/lib/matchers/matchers.h +0 -1
  763. data/src/core/lib/profiling/basic_timers.cc +8 -6
  764. data/src/core/lib/profiling/stap_timers.cc +2 -2
  765. data/src/core/lib/promise/activity.cc +115 -0
  766. data/src/core/lib/promise/activity.h +499 -0
  767. data/src/core/lib/promise/context.h +86 -0
  768. data/src/core/lib/promise/detail/basic_seq.h +407 -0
  769. data/src/core/lib/promise/detail/promise_factory.h +189 -0
  770. data/src/core/lib/promise/detail/promise_like.h +85 -0
  771. data/src/core/lib/promise/detail/status.h +44 -0
  772. data/src/core/lib/promise/detail/switch.h +1455 -0
  773. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +48 -0
  774. data/src/core/lib/promise/loop.h +108 -0
  775. data/src/core/lib/promise/map.h +88 -0
  776. data/src/core/lib/promise/poll.h +60 -0
  777. data/src/core/lib/promise/race.h +84 -0
  778. data/src/core/lib/promise/seq.h +71 -0
  779. data/src/core/lib/resource_quota/api.cc +108 -0
  780. data/src/core/lib/resource_quota/api.h +41 -0
  781. data/src/core/lib/resource_quota/memory_quota.cc +454 -0
  782. data/src/core/lib/resource_quota/memory_quota.h +421 -0
  783. data/src/core/lib/resource_quota/resource_quota.cc +33 -0
  784. data/src/core/lib/resource_quota/resource_quota.h +58 -0
  785. data/src/core/lib/{transport/authority_override.h → resource_quota/thread_quota.cc} +22 -16
  786. data/src/core/lib/resource_quota/thread_quota.h +57 -0
  787. data/src/core/lib/{iomgr/event_engine/iomgr.h → resource_quota/trace.cc} +4 -9
  788. data/src/core/lib/resource_quota/trace.h +24 -0
  789. data/src/core/lib/security/authorization/authorization_policy_provider.h +5 -4
  790. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
  791. data/src/core/lib/security/authorization/evaluate_args.cc +22 -24
  792. data/src/core/lib/security/authorization/evaluate_args.h +2 -1
  793. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +173 -0
  794. data/src/core/lib/security/authorization/sdk_server_authz_filter.h +67 -0
  795. data/src/core/lib/security/context/security_context.cc +11 -8
  796. data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +2 -2
  797. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -2
  798. data/src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc +2 -2
  799. data/src/core/lib/security/credentials/composite/composite_credentials.cc +5 -4
  800. data/src/core/lib/security/credentials/credentials.cc +10 -8
  801. data/src/core/lib/security/credentials/credentials.h +7 -2
  802. data/src/core/lib/security/credentials/credentials_metadata.cc +2 -3
  803. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +24 -38
  804. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +1 -2
  805. data/src/core/lib/security/credentials/external/aws_request_signer.cc +3 -3
  806. data/src/core/lib/security/credentials/external/external_account_credentials.cc +69 -43
  807. data/src/core/lib/security/credentials/external/external_account_credentials.h +1 -0
  808. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +5 -8
  809. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +1 -2
  810. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +60 -10
  811. data/src/core/lib/security/credentials/iam/iam_credentials.cc +2 -1
  812. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  813. data/src/core/lib/security/credentials/jwt/json_token.h +2 -1
  814. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +31 -14
  815. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +11 -3
  816. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +9 -17
  817. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +3 -3
  818. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +21 -29
  819. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -0
  820. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +4 -6
  821. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +4 -4
  822. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +0 -1
  823. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +3 -2
  824. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +10 -6
  825. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +13 -13
  826. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +13 -12
  827. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +201 -0
  828. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +106 -0
  829. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +11 -90
  830. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +21 -84
  831. data/src/core/lib/security/credentials/tls/tls_credentials.cc +21 -10
  832. data/src/core/lib/security/credentials/xds/xds_credentials.cc +28 -33
  833. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +3 -3
  834. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +2 -2
  835. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +9 -12
  836. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  837. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +7 -7
  838. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +1 -0
  839. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +4 -5
  840. data/src/core/lib/security/security_connector/local/local_security_connector.cc +4 -1
  841. data/src/core/lib/security/security_connector/security_connector.cc +9 -4
  842. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  843. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +4 -7
  844. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +1 -2
  845. data/src/core/lib/security/security_connector/ssl_utils.cc +13 -6
  846. data/src/core/lib/security/security_connector/ssl_utils.h +1 -1
  847. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +345 -200
  848. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +64 -43
  849. data/src/core/lib/security/transport/auth_filters.h +1 -0
  850. data/src/core/lib/security/transport/client_auth_filter.cc +9 -11
  851. data/src/core/lib/security/transport/secure_endpoint.cc +4 -14
  852. data/src/core/lib/security/transport/secure_endpoint.h +1 -0
  853. data/src/core/lib/security/transport/security_handshaker.cc +80 -49
  854. data/src/core/lib/security/transport/security_handshaker.h +2 -1
  855. data/src/core/lib/security/transport/server_auth_filter.cc +3 -5
  856. data/src/core/lib/security/transport/tsi_error.cc +3 -5
  857. data/src/core/lib/security/util/json_util.cc +6 -8
  858. data/src/core/lib/slice/percent_encoding.cc +84 -97
  859. data/src/core/lib/slice/percent_encoding.h +23 -28
  860. data/src/core/lib/slice/slice.cc +9 -26
  861. data/src/core/lib/slice/slice.h +341 -0
  862. data/src/core/lib/{gpr/tls_pthread.cc → slice/slice_api.cc} +15 -6
  863. data/src/core/lib/slice/slice_buffer.cc +10 -7
  864. data/src/core/lib/slice/slice_intern.cc +11 -17
  865. data/src/core/lib/slice/slice_internal.h +3 -246
  866. data/src/core/lib/slice/slice_refcount.cc +17 -0
  867. data/src/core/lib/slice/slice_refcount.h +125 -0
  868. data/src/core/lib/slice/slice_refcount_base.h +181 -0
  869. data/src/core/lib/slice/slice_split.cc +100 -0
  870. data/src/core/lib/slice/slice_split.h +40 -0
  871. data/src/core/lib/slice/slice_string_helpers.cc +0 -83
  872. data/src/core/lib/slice/slice_string_helpers.h +0 -11
  873. data/src/core/lib/slice/static_slice.cc +377 -0
  874. data/src/core/lib/slice/static_slice.h +300 -0
  875. data/src/core/lib/surface/api_trace.cc +2 -1
  876. data/src/core/lib/surface/api_trace.h +1 -0
  877. data/src/core/lib/surface/builtins.cc +49 -0
  878. data/src/core/lib/surface/builtins.h +26 -0
  879. data/src/core/lib/surface/byte_buffer_reader.cc +1 -1
  880. data/src/core/lib/surface/call.cc +180 -170
  881. data/src/core/lib/surface/call.h +3 -9
  882. data/src/core/lib/surface/call_details.cc +2 -2
  883. data/src/core/lib/surface/call_log_batch.cc +2 -2
  884. data/src/core/lib/surface/channel.cc +20 -45
  885. data/src/core/lib/surface/channel.h +6 -13
  886. data/src/core/lib/surface/channel_init.cc +23 -76
  887. data/src/core/lib/surface/channel_init.h +52 -44
  888. data/src/core/lib/surface/channel_ping.cc +1 -2
  889. data/src/core/lib/surface/channel_stack_type.cc +2 -1
  890. data/src/core/lib/surface/completion_queue.cc +60 -69
  891. data/src/core/lib/surface/completion_queue_factory.cc +2 -1
  892. data/src/core/lib/surface/completion_queue_factory.h +1 -0
  893. data/src/core/lib/surface/event_string.cc +1 -0
  894. data/src/core/lib/surface/init.cc +4 -49
  895. data/src/core/lib/surface/init.h +0 -1
  896. data/src/core/lib/surface/init_secure.cc +36 -14
  897. data/src/core/lib/surface/lame_client.cc +46 -31
  898. data/src/core/lib/surface/lame_client.h +1 -1
  899. data/src/core/lib/surface/metadata_array.cc +2 -2
  900. data/src/core/lib/surface/server.cc +57 -65
  901. data/src/core/lib/surface/server.h +34 -30
  902. data/src/core/lib/surface/validate_metadata.cc +49 -18
  903. data/src/core/lib/surface/version.cc +2 -2
  904. data/src/core/lib/transport/bdp_estimator.cc +2 -2
  905. data/src/core/lib/transport/byte_stream.cc +4 -0
  906. data/src/core/lib/transport/byte_stream.h +1 -0
  907. data/src/core/lib/transport/connectivity_state.cc +8 -5
  908. data/src/core/lib/transport/connectivity_state.h +2 -2
  909. data/src/core/lib/transport/error_utils.cc +43 -17
  910. data/src/core/lib/transport/error_utils.h +1 -1
  911. data/src/core/lib/transport/metadata.cc +41 -20
  912. data/src/core/lib/transport/metadata.h +19 -16
  913. data/src/core/lib/transport/metadata_batch.cc +40 -371
  914. data/src/core/lib/transport/metadata_batch.h +986 -69
  915. data/src/core/lib/transport/parsed_metadata.cc +35 -0
  916. data/src/core/lib/transport/parsed_metadata.h +382 -0
  917. data/src/core/lib/transport/pid_controller.cc +4 -4
  918. data/src/core/lib/transport/static_metadata.cc +632 -849
  919. data/src/core/lib/transport/static_metadata.h +115 -397
  920. data/src/core/lib/transport/status_metadata.cc +1 -0
  921. data/src/core/lib/transport/transport.cc +8 -31
  922. data/src/core/lib/transport/transport.h +0 -1
  923. data/src/core/lib/transport/transport_op_string.cc +40 -20
  924. data/src/core/lib/uri/uri_parser.cc +19 -19
  925. data/src/core/lib/uri/uri_parser.h +2 -0
  926. data/src/core/plugin_registry/grpc_plugin_registry.cc +78 -41
  927. data/src/core/tsi/alts/crypt/aes_gcm.cc +6 -3
  928. data/src/core/tsi/alts/crypt/gsec.h +2 -3
  929. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +13 -12
  930. data/src/core/tsi/alts/frame_protector/frame_handler.cc +10 -11
  931. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +4 -5
  932. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +2 -3
  933. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +12 -2
  934. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +2 -2
  935. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  936. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +2 -2
  937. data/src/core/tsi/fake_transport_security.cc +15 -7
  938. data/src/core/tsi/local_transport_security.cc +43 -80
  939. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +20 -53
  940. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -3
  941. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +2 -2
  942. data/src/core/tsi/ssl_transport_security.cc +51 -12
  943. data/src/core/tsi/ssl_transport_security.h +4 -1
  944. data/src/core/tsi/transport_security.cc +15 -3
  945. data/src/core/tsi/transport_security.h +16 -1
  946. data/src/core/tsi/transport_security_grpc.h +1 -0
  947. data/src/core/tsi/transport_security_interface.h +26 -0
  948. data/src/ruby/ext/grpc/extconf.rb +12 -9
  949. data/src/ruby/ext/grpc/rb_byte_buffer.c +2 -1
  950. data/src/ruby/ext/grpc/rb_call.c +5 -5
  951. data/src/ruby/ext/grpc/rb_call_credentials.c +5 -5
  952. data/src/ruby/ext/grpc/rb_channel.c +10 -8
  953. data/src/ruby/ext/grpc/rb_channel_args.c +2 -2
  954. data/src/ruby/ext/grpc/rb_channel_credentials.c +4 -4
  955. data/src/ruby/ext/grpc/rb_channel_credentials.h +1 -0
  956. data/src/ruby/ext/grpc/rb_completion_queue.c +3 -2
  957. data/src/ruby/ext/grpc/rb_compression_options.c +5 -4
  958. data/src/ruby/ext/grpc/rb_event_thread.c +4 -4
  959. data/src/ruby/ext/grpc/rb_grpc.c +5 -4
  960. data/src/ruby/ext/grpc/rb_grpc.h +1 -0
  961. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +10 -10
  962. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +15 -15
  963. data/src/ruby/ext/grpc/rb_server.c +6 -5
  964. data/src/ruby/ext/grpc/rb_server_credentials.c +3 -3
  965. data/src/ruby/ext/grpc/rb_server_credentials.h +1 -0
  966. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +8 -5
  967. data/src/ruby/ext/grpc/rb_xds_channel_credentials.h +3 -1
  968. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +6 -5
  969. data/src/ruby/ext/grpc/rb_xds_server_credentials.h +3 -1
  970. data/src/ruby/lib/grpc/version.rb +1 -1
  971. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -2
  972. data/src/ruby/spec/client_server_spec.rb +1 -1
  973. data/third_party/abseil-cpp/absl/algorithm/container.h +101 -91
  974. data/third_party/abseil-cpp/absl/base/attributes.h +64 -31
  975. data/third_party/abseil-cpp/absl/base/config.h +67 -37
  976. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +1 -26
  977. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -1
  978. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +2 -0
  979. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +69 -0
  980. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +4 -4
  981. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +15 -10
  982. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +16 -0
  983. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +4 -4
  984. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  985. data/third_party/abseil-cpp/absl/container/fixed_array.h +0 -5
  986. data/third_party/abseil-cpp/absl/container/inlined_vector.h +105 -97
  987. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +17 -15
  988. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +18 -102
  989. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +37 -78
  990. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +388 -423
  991. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +3 -2
  992. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -8
  993. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +251 -120
  994. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +11 -1
  995. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +12 -11
  996. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +6 -2
  997. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +12 -5
  998. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +110 -0
  999. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +234 -0
  1000. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +25 -7
  1001. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +8 -2
  1002. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +21 -3
  1003. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +2 -0
  1004. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +2 -0
  1005. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +14 -0
  1006. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +72 -0
  1007. data/third_party/abseil-cpp/absl/functional/function_ref.h +4 -1
  1008. data/third_party/abseil-cpp/absl/hash/hash.h +22 -0
  1009. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +15 -16
  1010. data/third_party/abseil-cpp/absl/hash/internal/hash.h +88 -37
  1011. data/third_party/abseil-cpp/absl/hash/internal/{wyhash.cc → low_level_hash.cc} +23 -11
  1012. data/third_party/abseil-cpp/absl/hash/internal/{wyhash.h → low_level_hash.h} +14 -12
  1013. data/third_party/abseil-cpp/absl/memory/memory.h +1 -1
  1014. data/third_party/abseil-cpp/absl/meta/type_traits.h +32 -2
  1015. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -10
  1016. data/third_party/abseil-cpp/absl/numeric/int128.h +146 -73
  1017. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +19 -25
  1018. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +73 -70
  1019. data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.cc +4 -4
  1020. data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.h +6 -6
  1021. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +230 -0
  1022. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +5 -5
  1023. data/third_party/abseil-cpp/absl/status/status.cc +9 -17
  1024. data/third_party/abseil-cpp/absl/status/status.h +19 -15
  1025. data/third_party/abseil-cpp/absl/status/statusor.cc +34 -2
  1026. data/third_party/abseil-cpp/absl/status/statusor.h +31 -21
  1027. data/third_party/abseil-cpp/absl/strings/charconv.cc +3 -3
  1028. data/third_party/abseil-cpp/absl/strings/charconv.h +3 -2
  1029. data/third_party/abseil-cpp/absl/strings/cord.cc +453 -359
  1030. data/third_party/abseil-cpp/absl/strings/cord.h +197 -70
  1031. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +1 -1
  1032. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +6 -0
  1033. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +140 -63
  1034. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +1128 -0
  1035. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +939 -0
  1036. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +185 -0
  1037. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +265 -0
  1038. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +68 -0
  1039. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +211 -0
  1040. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +129 -0
  1041. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.h +50 -0
  1042. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +7 -7
  1043. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +55 -181
  1044. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +42 -24
  1045. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +4 -0
  1046. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc +96 -0
  1047. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +85 -0
  1048. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +139 -0
  1049. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +131 -0
  1050. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +445 -0
  1051. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +298 -0
  1052. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +87 -0
  1053. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_scope.h +71 -0
  1054. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +121 -0
  1055. data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +48 -2
  1056. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +8 -0
  1057. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +3 -4
  1058. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +1 -1
  1059. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +6 -6
  1060. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +36 -18
  1061. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +62 -73
  1062. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +24 -16
  1063. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +35 -35
  1064. data/third_party/abseil-cpp/absl/strings/numbers.cc +1 -1
  1065. data/third_party/abseil-cpp/absl/strings/numbers.h +34 -0
  1066. data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
  1067. data/third_party/abseil-cpp/absl/strings/str_format.h +1 -2
  1068. data/third_party/abseil-cpp/absl/strings/string_view.cc +16 -21
  1069. data/third_party/abseil-cpp/absl/strings/string_view.h +120 -39
  1070. data/third_party/abseil-cpp/absl/strings/substitute.cc +2 -1
  1071. data/third_party/abseil-cpp/absl/strings/substitute.h +99 -74
  1072. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +25 -15
  1073. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +5 -3
  1074. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -1
  1075. data/third_party/abseil-cpp/absl/synchronization/mutex.h +3 -3
  1076. data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -3
  1077. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +93 -20
  1078. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +1 -1
  1079. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +2 -1
  1080. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +83 -21
  1081. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +49 -0
  1082. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +1 -1
  1083. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -3
  1084. data/third_party/abseil-cpp/absl/time/time.h +67 -36
  1085. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +1 -1
  1086. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +2 -2
  1087. data/third_party/abseil-cpp/absl/types/span.h +3 -3
  1088. data/third_party/address_sorting/address_sorting_posix.c +1 -0
  1089. data/third_party/boringssl-with-bazel/err_data.c +685 -673
  1090. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +67 -54
  1091. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +21 -22
  1092. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c +0 -2
  1093. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +6 -1
  1094. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +16 -23
  1095. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +55 -37
  1096. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c +19 -29
  1097. data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/a_strex.c +269 -272
  1098. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +106 -153
  1099. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +4 -4
  1100. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +1 -1
  1101. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +1 -40
  1102. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utf8.c +1 -1
  1103. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +59 -47
  1104. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c +1 -1
  1105. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +24 -28
  1106. data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/charmap.h +0 -0
  1107. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +5 -0
  1108. data/third_party/boringssl-with-bazel/src/crypto/asn1/{asn1_locl.h → internal.h} +86 -1
  1109. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +57 -281
  1110. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +290 -199
  1111. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +9 -9
  1112. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +10 -14
  1113. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +8 -6
  1114. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +2 -1
  1115. data/third_party/boringssl-with-bazel/src/crypto/asn1/time_support.c +1 -1
  1116. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +11 -8
  1117. data/third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c +1 -7
  1118. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +1 -5
  1119. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +0 -4
  1120. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +1 -7
  1121. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +1 -6
  1122. data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +3 -17
  1123. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +4 -6
  1124. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +3 -1
  1125. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c +9 -0
  1126. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +8 -0
  1127. data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +38 -47
  1128. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c +45 -65
  1129. data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +14 -3
  1130. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +6 -3
  1131. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +2 -2
  1132. data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +32 -34
  1133. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +26 -9
  1134. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c +3 -2
  1135. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +5 -2
  1136. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +5 -9
  1137. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +10 -0
  1138. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c +10 -11
  1139. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h +1 -3
  1140. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +2 -0
  1141. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +4 -7
  1142. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +4 -7
  1143. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +1 -1
  1144. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +5 -9
  1145. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +2 -2
  1146. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +4 -6
  1147. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +24 -9
  1148. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +4 -2
  1149. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +7 -7
  1150. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +35 -35
  1151. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +11 -10
  1152. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +10 -37
  1153. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +34 -0
  1154. data/third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c +219 -121
  1155. data/third_party/boringssl-with-bazel/src/crypto/hrss/internal.h +9 -2
  1156. data/third_party/boringssl-with-bazel/src/crypto/internal.h +62 -2
  1157. data/third_party/boringssl-with-bazel/src/crypto/lhash/internal.h +253 -0
  1158. data/third_party/boringssl-with-bazel/src/crypto/lhash/lhash.c +28 -23
  1159. data/third_party/boringssl-with-bazel/src/crypto/mem.c +32 -9
  1160. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +7 -3
  1161. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c +0 -9
  1162. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c +0 -2
  1163. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +0 -8
  1164. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c +0 -2
  1165. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c +0 -4
  1166. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/internal.h +16 -7
  1167. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +9 -4
  1168. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +151 -12
  1169. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  1170. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +1 -1
  1171. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +5 -1
  1172. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +59 -22
  1173. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +4 -0
  1174. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c +4 -0
  1175. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +4 -0
  1176. data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +6 -6
  1177. data/third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c +15 -11
  1178. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +1 -1
  1179. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +2 -18
  1180. data/third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c +1 -0
  1181. data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +2 -0
  1182. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +233 -4
  1183. data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +246 -0
  1184. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +15 -4
  1185. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +10 -5
  1186. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +0 -179
  1187. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c +4 -2
  1188. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +6 -23
  1189. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +2 -2
  1190. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +1 -5
  1191. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +1 -0
  1192. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +25 -22
  1193. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +11 -54
  1194. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +1 -1
  1195. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +1 -0
  1196. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +2 -4
  1197. data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +1 -3
  1198. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +0 -16
  1199. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +9 -11
  1200. data/third_party/boringssl-with-bazel/src/crypto/x509/x_exten.c +2 -0
  1201. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +23 -21
  1202. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +12 -11
  1203. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +232 -11
  1204. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +2 -1
  1205. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +2 -2
  1206. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c +1 -1
  1207. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +2 -1
  1208. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c +1 -1
  1209. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +5 -4
  1210. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +24 -5
  1211. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +18 -8
  1212. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -0
  1213. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +1 -0
  1214. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +6 -7
  1215. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c +4 -2
  1216. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +5 -0
  1217. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +23 -4
  1218. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c +112 -55
  1219. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c +2 -1
  1220. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +14 -13
  1221. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
  1222. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +76 -31
  1223. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +1504 -561
  1224. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +5 -12
  1225. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +10 -6
  1226. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +3 -1
  1227. data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +3 -3
  1228. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +9 -0
  1229. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +8 -2
  1230. data/third_party/boringssl-with-bazel/src/include/openssl/conf.h +8 -5
  1231. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +4 -12
  1232. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +3 -0
  1233. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +17 -41
  1234. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +12 -27
  1235. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +8 -10
  1236. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +35 -55
  1237. data/third_party/boringssl-with-bazel/src/include/openssl/hkdf.h +4 -0
  1238. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +25 -0
  1239. data/third_party/boringssl-with-bazel/src/include/openssl/hrss.h +14 -12
  1240. data/third_party/boringssl-with-bazel/src/include/openssl/lhash.h +4 -205
  1241. data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +12 -3
  1242. data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +5 -4
  1243. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +0 -20
  1244. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +15 -14
  1245. data/third_party/boringssl-with-bazel/src/include/openssl/pool.h +7 -1
  1246. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +29 -28
  1247. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +37 -15
  1248. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +87 -24
  1249. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +31 -32
  1250. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +725 -189
  1251. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +16 -695
  1252. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +52 -16
  1253. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +9 -16
  1254. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +310 -359
  1255. data/third_party/boringssl-with-bazel/src/ssl/{t1_lib.cc → extensions.cc} +110 -159
  1256. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +24 -13
  1257. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +145 -142
  1258. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +106 -99
  1259. data/third_party/boringssl-with-bazel/src/ssl/internal.h +90 -51
  1260. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +1 -2
  1261. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +2 -2
  1262. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +11 -5
  1263. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +2 -51
  1264. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +121 -65
  1265. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +6 -12
  1266. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +4 -0
  1267. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +28 -23
  1268. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +14 -27
  1269. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +210 -212
  1270. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +30 -41
  1271. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +48 -34
  1272. data/third_party/re2/re2/compile.cc +91 -109
  1273. data/third_party/re2/re2/dfa.cc +27 -39
  1274. data/third_party/re2/re2/filtered_re2.cc +18 -2
  1275. data/third_party/re2/re2/filtered_re2.h +10 -5
  1276. data/third_party/re2/re2/nfa.cc +1 -1
  1277. data/third_party/re2/re2/parse.cc +42 -23
  1278. data/third_party/re2/re2/perl_groups.cc +34 -34
  1279. data/third_party/re2/re2/prefilter.cc +3 -2
  1280. data/third_party/re2/re2/prog.cc +182 -4
  1281. data/third_party/re2/re2/prog.h +28 -9
  1282. data/third_party/re2/re2/re2.cc +87 -118
  1283. data/third_party/re2/re2/re2.h +156 -141
  1284. data/third_party/re2/re2/regexp.cc +12 -5
  1285. data/third_party/re2/re2/regexp.h +8 -2
  1286. data/third_party/re2/re2/set.cc +31 -9
  1287. data/third_party/re2/re2/set.h +9 -4
  1288. data/third_party/re2/re2/simplify.cc +11 -3
  1289. data/third_party/re2/re2/tostring.cc +1 -1
  1290. data/third_party/re2/re2/walker-inl.h +1 -1
  1291. data/third_party/re2/util/mutex.h +2 -2
  1292. data/third_party/re2/util/pcre.h +3 -3
  1293. data/third_party/upb/upb/decode.c +383 -183
  1294. data/third_party/upb/upb/decode.h +32 -4
  1295. data/third_party/upb/upb/decode_fast.c +513 -500
  1296. data/third_party/upb/upb/decode_fast.h +27 -0
  1297. data/third_party/upb/upb/{decode.int.h → decode_internal.h} +39 -8
  1298. data/third_party/upb/upb/def.c +489 -254
  1299. data/third_party/upb/upb/def.h +86 -33
  1300. data/third_party/upb/upb/def.hpp +46 -4
  1301. data/third_party/upb/upb/encode.c +137 -44
  1302. data/third_party/upb/upb/encode.h +29 -2
  1303. data/third_party/upb/upb/msg.c +182 -28
  1304. data/third_party/upb/upb/msg.h +75 -580
  1305. data/third_party/upb/upb/msg_internal.h +769 -0
  1306. data/third_party/upb/upb/port_def.inc +85 -24
  1307. data/third_party/upb/upb/port_undef.inc +38 -1
  1308. data/third_party/upb/upb/reflection.c +126 -94
  1309. data/third_party/upb/upb/reflection.h +42 -10
  1310. data/third_party/upb/upb/reflection.hpp +37 -0
  1311. data/third_party/upb/upb/table.c +211 -86
  1312. data/third_party/upb/upb/{table.int.h → table_internal.h} +56 -180
  1313. data/third_party/upb/upb/text_encode.c +35 -7
  1314. data/third_party/upb/upb/text_encode.h +26 -0
  1315. data/third_party/upb/upb/upb.c +67 -8
  1316. data/third_party/upb/upb/upb.h +36 -6
  1317. data/third_party/upb/upb/upb.hpp +24 -0
  1318. data/third_party/upb/upb/upb_internal.h +58 -0
  1319. metadata +182 -107
  1320. data/include/grpc/event_engine/slice_allocator.h +0 -66
  1321. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +0 -179
  1322. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +0 -38
  1323. data/src/core/ext/filters/client_channel/service_config_call_data.h +0 -126
  1324. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +0 -211
  1325. data/src/core/ext/filters/workarounds/workaround_utils.cc +0 -53
  1326. data/src/core/ext/filters/workarounds/workaround_utils.h +0 -39
  1327. data/src/core/ext/transport/chttp2/client/authority.cc +0 -42
  1328. data/src/core/ext/transport/chttp2/client/authority.h +0 -36
  1329. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +0 -66
  1330. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +0 -74
  1331. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +0 -243
  1332. data/src/core/ext/transport/chttp2/transport/hpack_table.h +0 -148
  1333. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +0 -66
  1334. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +0 -58
  1335. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +0 -58
  1336. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +0 -124
  1337. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.c +0 -33
  1338. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +0 -77
  1339. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +0 -44
  1340. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +0 -35
  1341. data/src/core/lib/avl/avl.cc +0 -306
  1342. data/src/core/lib/gpr/tls_gcc.h +0 -52
  1343. data/src/core/lib/gpr/tls_msvc.h +0 -54
  1344. data/src/core/lib/gpr/tls_pthread.h +0 -56
  1345. data/src/core/lib/gpr/tls_stdcpp.h +0 -48
  1346. data/src/core/lib/gprpp/atomic.h +0 -104
  1347. data/src/core/lib/iomgr/endpoint_pair_uv.cc +0 -40
  1348. data/src/core/lib/iomgr/iomgr_uv.cc +0 -43
  1349. data/src/core/lib/iomgr/pollset_uv.cc +0 -95
  1350. data/src/core/lib/iomgr/pollset_uv.h +0 -36
  1351. data/src/core/lib/iomgr/resource_quota.cc +0 -1019
  1352. data/src/core/lib/iomgr/resource_quota.h +0 -177
  1353. data/src/core/lib/iomgr/sockaddr_custom.h +0 -54
  1354. data/src/core/lib/iomgr/socket_utils_uv.cc +0 -49
  1355. data/src/core/lib/iomgr/tcp_uv.cc +0 -421
  1356. data/src/core/lib/iomgr/timer_uv.cc +0 -66
  1357. data/src/core/lib/iomgr/udp_server.cc +0 -748
  1358. data/src/core/lib/iomgr/udp_server.h +0 -103
  1359. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +0 -93
  1360. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +0 -217
  1361. data/third_party/upb/third_party/wyhash/wyhash.h +0 -145
  1362. data/third_party/upb/upb/upb.int.h +0 -29
@@ -19,7 +19,6 @@
19
19
  #include <grpc/support/port_platform.h>
20
20
 
21
21
  #include "src/core/ext/transport/chttp2/transport/hpack_parser.h"
22
- #include "src/core/ext/transport/chttp2/transport/internal.h"
23
22
 
24
23
  #include <assert.h>
25
24
  #include <stddef.h>
@@ -32,6 +31,7 @@
32
31
  #include <grpc/support/log.h>
33
32
 
34
33
  #include "src/core/ext/transport/chttp2/transport/bin_encoder.h"
34
+ #include "src/core/ext/transport/chttp2/transport/internal.h"
35
35
  #include "src/core/lib/debug/stats.h"
36
36
  #include "src/core/lib/gpr/string.h"
37
37
  #include "src/core/lib/profiling/timers.h"
@@ -50,21 +50,7 @@
50
50
 
51
51
  namespace grpc_core {
52
52
 
53
- DebugOnlyTraceFlag grpc_trace_chttp2_hpack_parser(false, "chttp2_hpack_parser");
54
-
55
- /* How parsing works:
56
-
57
- The parser object keeps track of a function pointer which represents the
58
- current parse state.
59
-
60
- Each time new bytes are presented, we call into the current state, which
61
- recursively parses until all bytes in the given chunk are exhausted.
62
-
63
- The parse state that terminates then saves its function pointer to be the
64
- current state so that it can resume when more bytes are available.
65
-
66
- It's expected that most optimizing compilers will turn this code into
67
- a set of indirect jumps, and so not waste stack space. */
53
+ TraceFlag grpc_trace_chttp2_hpack_parser(false, "chttp2_hpack_parser");
68
54
 
69
55
  /* state table for huffman decoding: given a state, gives an index/16 into
70
56
  next_sub_tbl. Taking that index and adding the value of the nibble being
@@ -441,7 +427,7 @@ static const int16_t emit_sub_tbl[249 * 16] = {
441
427
 
442
428
  namespace {
443
429
  // The alphabet used for base64 encoding binary metadata.
444
- static constexpr char kBase64Alphabet[] =
430
+ constexpr char kBase64Alphabet[] =
445
431
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
446
432
 
447
433
  // An inverted table: for each value in kBase64Alphabet, table contains the
@@ -461,1124 +447,892 @@ struct Base64InverseTable {
461
447
  }
462
448
  };
463
449
 
464
- static GRPC_HPACK_CONSTEXPR_VALUE Base64InverseTable kBase64InverseTable;
450
+ GRPC_HPACK_CONSTEXPR_VALUE Base64InverseTable kBase64InverseTable;
465
451
  } // namespace
466
452
 
467
- void HPackParser::FinishFrame() {
468
- sink_ = Sink();
469
- dynamic_table_updates_allowed_ = 2;
470
- }
471
-
472
- void GPR_ATTRIBUTE_NOINLINE HPackParser::LogHeader(grpc_mdelem md) {
473
- char* k = grpc_slice_to_c_string(GRPC_MDKEY(md));
474
- char* v = nullptr;
475
- if (grpc_is_binary_header_internal(GRPC_MDKEY(md))) {
476
- v = grpc_dump_slice(GRPC_MDVALUE(md), GPR_DUMP_HEX);
477
- } else {
478
- v = grpc_slice_to_c_string(GRPC_MDVALUE(md));
453
+ // Input tracks the current byte through the input data and provides it
454
+ // via a simple stream interface.
455
+ class HPackParser::Input {
456
+ public:
457
+ Input(grpc_slice_refcount* current_slice_refcount, const uint8_t* begin,
458
+ const uint8_t* end)
459
+ : current_slice_refcount_(current_slice_refcount),
460
+ begin_(begin),
461
+ end_(end),
462
+ frontier_(begin) {}
463
+
464
+ // If input is backed by a slice, retrieve its refcount. If not, return
465
+ // nullptr.
466
+ grpc_slice_refcount* slice_refcount() { return current_slice_refcount_; }
467
+
468
+ // Have we reached the end of input?
469
+ bool end_of_stream() const { return begin_ == end_; }
470
+ // How many bytes until end of input
471
+ size_t remaining() const { return end_ - begin_; }
472
+ // Current position, as a pointer
473
+ const uint8_t* cur_ptr() const { return begin_; }
474
+ // End position, as a pointer
475
+ const uint8_t* end_ptr() const { return end_; }
476
+ // Move read position forward by n, unchecked
477
+ void Advance(size_t n) { begin_ += n; }
478
+
479
+ // Retrieve the current character, or nullopt if end of stream
480
+ // Do not advance
481
+ absl::optional<uint8_t> peek() const {
482
+ if (end_of_stream()) {
483
+ return {};
484
+ }
485
+ return *begin_;
479
486
  }
480
- gpr_log(
481
- GPR_INFO,
482
- "Decode: '%s: %s', elem_interned=%d [%d], k_interned=%d, v_interned=%d",
483
- k, v, GRPC_MDELEM_IS_INTERNED(md), GRPC_MDELEM_STORAGE(md),
484
- grpc_slice_is_interned(GRPC_MDKEY(md)),
485
- grpc_slice_is_interned(GRPC_MDVALUE(md)));
486
- gpr_free(k);
487
- gpr_free(v);
488
- }
489
487
 
490
- /* emission helpers */
491
- template <HPackParser::TableAction action>
492
- grpc_error_handle HPackParser::FinishHeader(grpc_mdelem md) {
493
- if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_chttp2_hpack_parser)) {
494
- LogHeader(md);
495
- }
496
- if (action == TableAction::kAddToTable) {
497
- GPR_DEBUG_ASSERT(GRPC_MDELEM_STORAGE(md) == GRPC_MDELEM_STORAGE_INTERNED ||
498
- GRPC_MDELEM_STORAGE(md) == GRPC_MDELEM_STORAGE_STATIC);
499
- grpc_error_handle err = grpc_chttp2_hptbl_add(&table_, md);
500
- if (GPR_UNLIKELY(err != GRPC_ERROR_NONE)) return err;
488
+ // Retrieve and advance past the current character, or return nullopt if end
489
+ // of stream
490
+ absl::optional<uint8_t> Next() {
491
+ if (end_of_stream()) {
492
+ return UnexpectedEOF(absl::optional<uint8_t>());
493
+ }
494
+ return *begin_++;
501
495
  }
502
- return sink_(md);
503
- }
504
496
 
505
- UnmanagedMemorySlice HPackParser::String::TakeExtern() {
506
- UnmanagedMemorySlice s;
507
- if (!copied_) {
508
- GPR_DEBUG_ASSERT(!grpc_slice_is_interned(data_.referenced));
509
- s = static_cast<UnmanagedMemorySlice&>(data_.referenced);
510
- copied_ = true;
511
- data_.referenced = UnmanagedMemorySlice();
512
- } else {
513
- s = UnmanagedMemorySlice(data_.copied.str, data_.copied.length);
497
+ // Helper to parse a varint delta on top of value, return nullopt on failure
498
+ // (setting error)
499
+ absl::optional<uint32_t> ParseVarint(uint32_t value) {
500
+ // TODO(ctiller): break out a variant of this when we know there are at
501
+ // least 5 bytes in input_
502
+ auto cur = Next();
503
+ if (!cur) return {};
504
+ value += *cur & 0x7f;
505
+ if ((*cur & 0x80) == 0) return value;
506
+
507
+ cur = Next();
508
+ if (!cur) return {};
509
+ value += (*cur & 0x7f) << 7;
510
+ if ((*cur & 0x80) == 0) return value;
511
+
512
+ cur = Next();
513
+ if (!cur) return {};
514
+ value += (*cur & 0x7f) << 14;
515
+ if ((*cur & 0x80) == 0) return value;
516
+
517
+ cur = Next();
518
+ if (!cur) return {};
519
+ value += (*cur & 0x7f) << 21;
520
+ if ((*cur & 0x80) == 0) return value;
521
+
522
+ cur = Next();
523
+ if (!cur) return {};
524
+ uint32_t c = (*cur) & 0x7f;
525
+ // We might overflow here, so we need to be a little careful about the
526
+ // addition
527
+ if (c > 0xf) return ParseVarintOutOfRange(value, *cur);
528
+ const uint32_t add = c << 28;
529
+ if (add > 0xffffffffu - value) {
530
+ return ParseVarintOutOfRange(value, *cur);
531
+ }
532
+ value += add;
533
+ if ((*cur & 0x80) == 0) return value;
534
+
535
+ // Spec weirdness: we can add an infinite stream of 0x80 at the end of a
536
+ // varint and still end up with a correctly encoded varint.
537
+ do {
538
+ cur = Next();
539
+ if (!cur.has_value()) return {};
540
+ } while (*cur == 0x80);
541
+
542
+ // BUT... the last byte needs to be 0x00 or we'll overflow dramatically!
543
+ if (*cur == 0) return value;
544
+ return ParseVarintOutOfRange(value, *cur);
514
545
  }
515
- data_.copied.length = 0;
516
- return s;
517
- }
518
546
 
519
- ManagedMemorySlice HPackParser::String::TakeIntern() {
520
- ManagedMemorySlice s;
521
- if (!copied_) {
522
- s = ManagedMemorySlice(&data_.referenced);
523
- grpc_slice_unref_internal(data_.referenced);
524
- copied_ = true;
525
- data_.referenced = grpc_empty_slice();
526
- } else {
527
- s = ManagedMemorySlice(data_.copied.str, data_.copied.length);
547
+ // Prefix for a string
548
+ struct StringPrefix {
549
+ // Number of bytes in input for string
550
+ uint32_t length;
551
+ // Is it huffman compressed
552
+ bool huff;
553
+ };
554
+
555
+ // Parse a string prefix
556
+ absl::optional<StringPrefix> ParseStringPrefix() {
557
+ auto cur = Next();
558
+ if (!cur.has_value()) return {};
559
+ // Huffman if the top bit is 1
560
+ const bool huff = (*cur & 0x80) != 0;
561
+ // String length
562
+ uint32_t strlen = (*cur & 0x7f);
563
+ if (strlen == 0x7f) {
564
+ // all ones ==> varint string length
565
+ auto v = ParseVarint(0x7f);
566
+ if (!v.has_value()) return {};
567
+ strlen = *v;
568
+ }
569
+ return StringPrefix{strlen, huff};
528
570
  }
529
- data_.copied.length = 0;
530
- return s;
531
- }
532
571
 
533
- grpc_error_handle HPackParser::parse_next(const uint8_t* cur,
534
- const uint8_t* end) {
535
- state_ = *next_state_++;
536
- return (this->*state_)(cur, end);
537
- }
572
+ // Check if we saw an EOF.. must be verified before looking at TakeError
573
+ bool eof_error() const { return eof_error_; }
538
574
 
539
- /* begin parsing a header: all functionality is encoded into lookup tables
540
- above */
541
- grpc_error_handle HPackParser::parse_begin(const uint8_t* cur,
542
- const uint8_t* end) {
543
- if (cur == end) {
544
- state_ = &HPackParser::parse_begin;
545
- return GRPC_ERROR_NONE;
575
+ // Extract the parse error, leaving the current error as NONE.
576
+ grpc_error_handle TakeError() {
577
+ grpc_error_handle out = error_;
578
+ error_ = GRPC_ERROR_NONE;
579
+ return out;
546
580
  }
547
581
 
548
- switch (*cur >> 4) {
549
- // Literal header not indexed.
550
- // First byte format: 0000xxxx
551
- // Where xxxx:
552
- // 0000 - literal key
553
- // 1111 - indexed key, varint encoded index
554
- // other - indexed key, inline encoded index
555
- case 0:
556
- switch (*cur & 0xf) {
557
- case 0: // literal key
558
- return parse_lithdr_notidx_v(cur, end);
559
- case 0xf: // varint encoded key index
560
- return parse_lithdr_notidx_x(cur, end);
561
- default: // inline encoded key index
562
- return parse_lithdr_notidx(cur, end);
563
- }
564
- // Literal header never indexed.
565
- // First byte format: 0001xxxx
566
- // Where xxxx:
567
- // 0000 - literal key
568
- // 1111 - indexed key, varint encoded index
569
- // other - indexed key, inline encoded index
570
- case 1:
571
- switch (*cur & 0xf) {
572
- case 0: // literal key
573
- return parse_lithdr_nvridx_v(cur, end);
574
- case 0xf: // varint encoded key index
575
- return parse_lithdr_nvridx_x(cur, end);
576
- default: // inline encoded key index
577
- return parse_lithdr_nvridx(cur, end);
578
- }
579
- // Update max table size.
580
- // First byte format: 001xxxxx
581
- // Where xxxxx:
582
- // 11111 - max size is varint encoded
583
- // other - max size is stored inline
584
- case 2:
585
- // inline encoded max table size
586
- return parse_max_tbl_size(cur, end);
587
- case 3:
588
- if (*cur == 0x3f) {
589
- // varint encoded max table size
590
- return parse_max_tbl_size_x(cur, end);
591
- } else {
592
- // inline encoded max table size
593
- return parse_max_tbl_size(cur, end);
594
- }
595
- // Literal header with incremental indexing.
596
- // First byte format: 01xxxxxx
597
- // Where xxxxxx:
598
- // 000000 - literal key
599
- // 111111 - indexed key, varint encoded index
600
- // other - indexed key, inline encoded index
601
- case 4:
602
- if (*cur == 0x40) {
603
- // literal key
604
- return parse_lithdr_incidx_v(cur, end);
605
- }
606
- ABSL_FALLTHROUGH_INTENDED;
607
- case 5:
608
- case 6:
609
- // inline encoded key index
610
- return parse_lithdr_incidx(cur, end);
611
- case 7:
612
- if (*cur == 0x7f) {
613
- // varint encoded key index
614
- return parse_lithdr_incidx_x(cur, end);
615
- } else {
616
- // inline encoded key index
617
- return parse_lithdr_incidx(cur, end);
618
- }
619
- // Indexed Header Field Representation
620
- // First byte format: 1xxxxxxx
621
- // Where xxxxxxx:
622
- // 0000000 - illegal
623
- // 1111111 - varint encoded field index
624
- // other - inline encoded field index
625
- case 8:
626
- if (*cur == 0x80) {
627
- // illegal value.
628
- return parse_illegal_op(cur, end);
629
- }
630
- ABSL_FALLTHROUGH_INTENDED;
631
- case 9:
632
- case 10:
633
- case 11:
634
- case 12:
635
- case 13:
636
- case 14:
637
- // inline encoded field index
638
- return parse_indexed_field(cur, end);
639
- case 15:
640
- if (*cur == 0xff) {
641
- // varint encoded field index
642
- return parse_indexed_field_x(cur, end);
643
- } else {
644
- // inline encoded field index
645
- return parse_indexed_field(cur, end);
646
- }
582
+ // Set the current error - allows the rest of the code not to need to pass
583
+ // around StatusOr<> which would be prohibitive here.
584
+ GPR_ATTRIBUTE_NOINLINE void SetError(grpc_error_handle error) {
585
+ if (error_ != GRPC_ERROR_NONE || eof_error_) {
586
+ GRPC_ERROR_UNREF(error);
587
+ return;
588
+ }
589
+ error_ = error;
590
+ begin_ = end_;
647
591
  }
648
- GPR_UNREACHABLE_CODE(abort());
649
- }
650
592
 
651
- /* stream dependency and prioritization data: we just skip it */
652
- grpc_error_handle HPackParser::parse_stream_weight(const uint8_t* cur,
653
- const uint8_t* end) {
654
- if (cur == end) {
655
- state_ = &HPackParser::parse_stream_weight;
656
- return GRPC_ERROR_NONE;
593
+ // If no error is set, set it to the value produced by error_factory.
594
+ // Return return_value unchanged.
595
+ template <typename F, typename T>
596
+ GPR_ATTRIBUTE_NOINLINE T MaybeSetErrorAndReturn(F error_factory,
597
+ T return_value) {
598
+ if (error_ != GRPC_ERROR_NONE || eof_error_) return return_value;
599
+ error_ = error_factory();
600
+ begin_ = end_;
601
+ return return_value;
657
602
  }
658
603
 
659
- return (this->*after_prioritization_)(cur + 1, end);
660
- }
661
-
662
- grpc_error_handle HPackParser::parse_stream_dep3(const uint8_t* cur,
663
- const uint8_t* end) {
664
- if (cur == end) {
665
- state_ = &HPackParser::parse_stream_dep3;
666
- return GRPC_ERROR_NONE;
604
+ // Set the error to an unexpected eof, and return result (code golfed as this
605
+ // is a common case)
606
+ template <typename T>
607
+ T UnexpectedEOF(T return_value) {
608
+ if (error_ != GRPC_ERROR_NONE) return return_value;
609
+ eof_error_ = true;
610
+ return return_value;
667
611
  }
668
612
 
669
- return parse_stream_weight(cur + 1, end);
670
- }
671
-
672
- grpc_error_handle HPackParser::parse_stream_dep2(const uint8_t* cur,
673
- const uint8_t* end) {
674
- if (cur == end) {
675
- state_ = &HPackParser::parse_stream_dep2;
676
- return GRPC_ERROR_NONE;
613
+ // Update the frontier - signifies we've successfully parsed another element
614
+ void UpdateFrontier() { frontier_ = begin_; }
615
+
616
+ // Get the frontier - for buffering should we fail due to eof
617
+ const uint8_t* frontier() const { return frontier_; }
618
+
619
+ private:
620
+ // Helper to set the error to out of range for ParseVarint
621
+ absl::optional<uint32_t> ParseVarintOutOfRange(uint32_t value,
622
+ uint8_t last_byte) {
623
+ return MaybeSetErrorAndReturn(
624
+ [value, last_byte] {
625
+ return GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrFormat(
626
+ "integer overflow in hpack integer decoding: have 0x%08x, "
627
+ "got byte 0x%02x on byte 5",
628
+ value, last_byte));
629
+ },
630
+ absl::optional<uint32_t>());
677
631
  }
678
632
 
679
- return parse_stream_dep3(cur + 1, end);
680
- }
633
+ // Refcount if we are backed by a slice
634
+ grpc_slice_refcount* current_slice_refcount_;
635
+ // Current input point
636
+ const uint8_t* begin_;
637
+ // End of stream point
638
+ const uint8_t* const end_;
639
+ // Frontier denotes the first byte past successfully processed input
640
+ const uint8_t* frontier_;
641
+ // Current error
642
+ grpc_error_handle error_ = GRPC_ERROR_NONE;
643
+ // If the error was EOF, we flag it here..
644
+ bool eof_error_ = false;
645
+ };
681
646
 
682
- grpc_error_handle HPackParser::parse_stream_dep1(const uint8_t* cur,
683
- const uint8_t* end) {
684
- if (cur == end) {
685
- state_ = &HPackParser::parse_stream_dep1;
686
- return GRPC_ERROR_NONE;
647
+ // Helper to parse a string and turn it into a slice with appropriate memory
648
+ // management characteristics
649
+ class HPackParser::String {
650
+ public:
651
+ // Helper to specify a string should be internalized
652
+ struct Intern {};
653
+ // Helper to specify a string should be externalized
654
+ struct Extern {};
655
+
656
+ private:
657
+ // Forward declare take functions... we'll need them in the public interface
658
+ Slice Take(Extern);
659
+ Slice Take(Intern);
660
+
661
+ public:
662
+ String(const String&) = delete;
663
+ String& operator=(const String&) = delete;
664
+ String(String&& other) noexcept : value_(std::move(other.value_)) {
665
+ other.value_ = absl::Span<const uint8_t>();
687
666
  }
688
-
689
- return parse_stream_dep2(cur + 1, end);
690
- }
691
-
692
- grpc_error_handle HPackParser::parse_stream_dep0(const uint8_t* cur,
693
- const uint8_t* end) {
694
- if (cur == end) {
695
- state_ = &HPackParser::parse_stream_dep0;
696
- return GRPC_ERROR_NONE;
667
+ String& operator=(String&& other) noexcept {
668
+ value_ = std::move(other.value_);
669
+ other.value_ = absl::Span<const uint8_t>();
670
+ return *this;
697
671
  }
698
672
 
699
- return parse_stream_dep1(cur + 1, end);
700
- }
701
-
702
- grpc_error_handle HPackParser::InvalidHPackIndexError() {
703
- return grpc_error_set_int(
704
- grpc_error_set_int(
705
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Invalid HPACK index received"),
706
- GRPC_ERROR_INT_INDEX, static_cast<intptr_t>(index_)),
707
- GRPC_ERROR_INT_SIZE, static_cast<intptr_t>(table_.num_ents));
708
- }
709
-
710
- /* emit an indexed field; jumps to begin the next field on completion */
711
- grpc_error_handle HPackParser::finish_indexed_field(const uint8_t* cur,
712
- const uint8_t* end) {
713
- grpc_mdelem md = grpc_chttp2_hptbl_lookup<true>(&table_, index_);
714
- if (GPR_UNLIKELY(GRPC_MDISNULL(md))) {
715
- return InvalidHPackIndexError();
673
+ // Take the value and leave this empty
674
+ // Use Intern/Extern to choose memory management
675
+ template <typename T>
676
+ auto Take() -> decltype(this->Take(T())) {
677
+ return Take(T());
716
678
  }
717
- GRPC_STATS_INC_HPACK_RECV_INDEXED();
718
- grpc_error_handle err = FinishHeader<TableAction::kOmitFromTable>(md);
719
- if (GPR_UNLIKELY(err != GRPC_ERROR_NONE)) return err;
720
- return parse_begin(cur, end);
721
- }
722
-
723
- /* parse an indexed field with index < 127 */
724
- grpc_error_handle HPackParser::parse_indexed_field(const uint8_t* cur,
725
- const uint8_t* end) {
726
- dynamic_table_updates_allowed_ = 0;
727
- index_ = (*cur) & 0x7f;
728
- md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
729
- return finish_indexed_field(cur + 1, end);
730
- }
731
-
732
- /* parse an indexed field with index >= 127 */
733
- grpc_error_handle HPackParser::parse_indexed_field_x(const uint8_t* cur,
734
- const uint8_t* end) {
735
- static const State and_then[] = {&HPackParser::finish_indexed_field};
736
- dynamic_table_updates_allowed_ = 0;
737
- next_state_ = and_then;
738
- index_ = 0x7f;
739
- md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
740
- parsing_.value = &index_;
741
- return parse_value0(cur + 1, end);
742
- }
743
-
744
- /* When finishing with a header, get the cached md element for this index.
745
- This is set in parse_value_string(). We ensure (in debug mode) that the
746
- cached metadata corresponds with the index we are examining. */
747
- grpc_mdelem HPackParser::GetPrecomputedMDForIndex() {
748
- GPR_DEBUG_ASSERT(md_for_index_.payload != 0);
749
- GPR_DEBUG_ASSERT(static_cast<int64_t>(index_) == precomputed_md_index_);
750
- grpc_mdelem md = md_for_index_;
751
- GPR_DEBUG_ASSERT(!GRPC_MDISNULL(md)); /* handled in string parsing */
752
- md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
753
- #ifndef NDEBUG
754
- precomputed_md_index_ = -1;
755
- #endif
756
- return md;
757
- }
758
-
759
- static const grpc_core::ManagedMemorySlice& get_indexed_key(grpc_mdelem md) {
760
- GPR_DEBUG_ASSERT(GRPC_MDELEM_IS_INTERNED(md));
761
- return static_cast<const grpc_core::ManagedMemorySlice&>(
762
- grpc_slice_ref_internal(GRPC_MDKEY(md)));
763
- }
764
-
765
- /* finish a literal header with incremental indexing */
766
- grpc_error_handle HPackParser::finish_lithdr_incidx(const uint8_t* cur,
767
- const uint8_t* end) {
768
- GRPC_STATS_INC_HPACK_RECV_LITHDR_INCIDX();
769
- grpc_mdelem md = GetPrecomputedMDForIndex();
770
- grpc_error_handle err = FinishHeader<TableAction::kAddToTable>(
771
- grpc_mdelem_from_slices(get_indexed_key(md), value_.TakeIntern()));
772
- if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
773
- return parse_begin(cur, end);
774
- }
775
-
776
- /* finish a literal header with incremental indexing with no index */
777
- grpc_error_handle HPackParser::finish_lithdr_incidx_v(const uint8_t* cur,
778
- const uint8_t* end) {
779
- GRPC_STATS_INC_HPACK_RECV_LITHDR_INCIDX_V();
780
- grpc_error_handle err = FinishHeader<TableAction::kAddToTable>(
781
- grpc_mdelem_from_slices(key_.TakeIntern(), value_.TakeIntern()));
782
- if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
783
- return parse_begin(cur, end);
784
- }
785
-
786
- /* parse a literal header with incremental indexing; index < 63 */
787
- grpc_error_handle HPackParser::parse_lithdr_incidx(const uint8_t* cur,
788
- const uint8_t* end) {
789
- static const State and_then[] = {
790
- &HPackParser::parse_value_string_with_indexed_key,
791
- &HPackParser::finish_lithdr_incidx};
792
- dynamic_table_updates_allowed_ = 0;
793
- next_state_ = and_then;
794
- index_ = (*cur) & 0x3f;
795
- md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
796
- return parse_string_prefix(cur + 1, end);
797
- }
798
-
799
- /* parse a literal header with incremental indexing; index >= 63 */
800
- grpc_error_handle HPackParser::parse_lithdr_incidx_x(const uint8_t* cur,
801
- const uint8_t* end) {
802
- static const State and_then[] = {
803
- &HPackParser::parse_string_prefix,
804
- &HPackParser::parse_value_string_with_indexed_key,
805
- &HPackParser::finish_lithdr_incidx};
806
- dynamic_table_updates_allowed_ = 0;
807
- next_state_ = and_then;
808
- index_ = 0x3f;
809
- md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
810
- parsing_.value = &index_;
811
- return parse_value0(cur + 1, end);
812
- }
813
-
814
- /* parse a literal header with incremental indexing; index = 0 */
815
- grpc_error_handle HPackParser::parse_lithdr_incidx_v(const uint8_t* cur,
816
- const uint8_t* end) {
817
- static const State and_then[] = {
818
- &HPackParser::parse_key_string, &HPackParser::parse_string_prefix,
819
- &HPackParser::parse_value_string_with_literal_key,
820
- &HPackParser::finish_lithdr_incidx_v};
821
- dynamic_table_updates_allowed_ = 0;
822
- next_state_ = and_then;
823
- return parse_string_prefix(cur + 1, end);
824
- }
825
-
826
- /* finish a literal header without incremental indexing */
827
- grpc_error_handle HPackParser::finish_lithdr_notidx(const uint8_t* cur,
828
- const uint8_t* end) {
829
- GRPC_STATS_INC_HPACK_RECV_LITHDR_NOTIDX();
830
- grpc_mdelem md = GetPrecomputedMDForIndex();
831
- grpc_error_handle err = FinishHeader<TableAction::kOmitFromTable>(
832
- grpc_mdelem_from_slices(get_indexed_key(md), value_.TakeExtern()));
833
- if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
834
- return parse_begin(cur, end);
835
- }
836
-
837
- /* finish a literal header without incremental indexing with index = 0 */
838
- grpc_error_handle HPackParser::finish_lithdr_notidx_v(const uint8_t* cur,
839
- const uint8_t* end) {
840
- GRPC_STATS_INC_HPACK_RECV_LITHDR_NOTIDX_V();
841
- grpc_error_handle err = FinishHeader<TableAction::kOmitFromTable>(
842
- grpc_mdelem_from_slices(key_.TakeIntern(), value_.TakeExtern()));
843
- if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
844
- return parse_begin(cur, end);
845
- }
846
-
847
- /* parse a literal header without incremental indexing; index < 15 */
848
- grpc_error_handle HPackParser::parse_lithdr_notidx(const uint8_t* cur,
849
- const uint8_t* end) {
850
- static const State and_then[] = {
851
- &HPackParser::parse_value_string_with_indexed_key,
852
- &HPackParser::finish_lithdr_notidx};
853
- dynamic_table_updates_allowed_ = 0;
854
- next_state_ = and_then;
855
- index_ = (*cur) & 0xf;
856
- md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
857
- return parse_string_prefix(cur + 1, end);
858
- }
859
-
860
- /* parse a literal header without incremental indexing; index >= 15 */
861
- grpc_error_handle HPackParser::parse_lithdr_notidx_x(const uint8_t* cur,
862
- const uint8_t* end) {
863
- static const State and_then[] = {
864
- &HPackParser::parse_string_prefix,
865
- &HPackParser::parse_value_string_with_indexed_key,
866
- &HPackParser::finish_lithdr_notidx};
867
- dynamic_table_updates_allowed_ = 0;
868
- next_state_ = and_then;
869
- index_ = 0xf;
870
- md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
871
- parsing_.value = &index_;
872
- return parse_value0(cur + 1, end);
873
- }
874
-
875
- /* parse a literal header without incremental indexing; index == 0 */
876
- grpc_error_handle HPackParser::parse_lithdr_notidx_v(const uint8_t* cur,
877
- const uint8_t* end) {
878
- static const State and_then[] = {
879
- &HPackParser::parse_key_string, &HPackParser::parse_string_prefix,
880
- &HPackParser::parse_value_string_with_literal_key,
881
- &HPackParser::finish_lithdr_notidx_v};
882
- dynamic_table_updates_allowed_ = 0;
883
- next_state_ = and_then;
884
- return parse_string_prefix(cur + 1, end);
885
- }
886
-
887
- /* finish a literal header that is never indexed */
888
- grpc_error_handle HPackParser::finish_lithdr_nvridx(const uint8_t* cur,
889
- const uint8_t* end) {
890
- GRPC_STATS_INC_HPACK_RECV_LITHDR_NVRIDX();
891
- grpc_mdelem md = GetPrecomputedMDForIndex();
892
- grpc_error_handle err = FinishHeader<TableAction::kOmitFromTable>(
893
- grpc_mdelem_from_slices(get_indexed_key(md), value_.TakeExtern()));
894
- if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
895
- return parse_begin(cur, end);
896
- }
897
-
898
- /* finish a literal header that is never indexed with an extra value */
899
- grpc_error_handle HPackParser::finish_lithdr_nvridx_v(const uint8_t* cur,
900
- const uint8_t* end) {
901
- GRPC_STATS_INC_HPACK_RECV_LITHDR_NVRIDX_V();
902
- grpc_error_handle err = FinishHeader<TableAction::kOmitFromTable>(
903
- grpc_mdelem_from_slices(key_.TakeIntern(), value_.TakeExtern()));
904
- if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
905
- return parse_begin(cur, end);
906
- }
907
-
908
- /* parse a literal header that is never indexed; index < 15 */
909
- grpc_error_handle HPackParser::parse_lithdr_nvridx(const uint8_t* cur,
910
- const uint8_t* end) {
911
- static const State and_then[] = {
912
- &HPackParser::parse_value_string_with_indexed_key,
913
- &HPackParser::finish_lithdr_nvridx};
914
- dynamic_table_updates_allowed_ = 0;
915
- next_state_ = and_then;
916
- index_ = (*cur) & 0xf;
917
- md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
918
- return parse_string_prefix(cur + 1, end);
919
- }
920
-
921
- /* parse a literal header that is never indexed; index >= 15 */
922
- grpc_error_handle HPackParser::parse_lithdr_nvridx_x(const uint8_t* cur,
923
- const uint8_t* end) {
924
- static const State and_then[] = {
925
- &HPackParser::parse_string_prefix,
926
- &HPackParser::parse_value_string_with_indexed_key,
927
- &HPackParser::finish_lithdr_nvridx};
928
- dynamic_table_updates_allowed_ = 0;
929
- next_state_ = and_then;
930
- index_ = 0xf;
931
- md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
932
- parsing_.value = &index_;
933
- return parse_value0(cur + 1, end);
934
- }
935
679
 
936
- /* parse a literal header that is never indexed; index == 0 */
937
- grpc_error_handle HPackParser::parse_lithdr_nvridx_v(const uint8_t* cur,
938
- const uint8_t* end) {
939
- static const State and_then[] = {
940
- &HPackParser::parse_key_string, &HPackParser::parse_string_prefix,
941
- &HPackParser::parse_value_string_with_literal_key,
942
- &HPackParser::finish_lithdr_nvridx_v};
943
- dynamic_table_updates_allowed_ = 0;
944
- next_state_ = and_then;
945
- return parse_string_prefix(cur + 1, end);
946
- }
680
+ // Return a reference to the value as a string view
681
+ absl::string_view string_view() const {
682
+ if (auto* p = absl::get_if<Slice>(&value_)) {
683
+ return p->as_string_view();
684
+ } else if (auto* p = absl::get_if<absl::Span<const uint8_t>>(&value_)) {
685
+ return absl::string_view(reinterpret_cast<const char*>(p->data()),
686
+ p->size());
687
+ } else if (auto* p = absl::get_if<std::vector<uint8_t>>(&value_)) {
688
+ return absl::string_view(reinterpret_cast<const char*>(p->data()),
689
+ p->size());
690
+ }
691
+ GPR_UNREACHABLE_CODE(return absl::string_view());
692
+ }
947
693
 
948
- /* finish parsing a max table size change */
949
- grpc_error_handle HPackParser::finish_max_tbl_size(const uint8_t* cur,
950
- const uint8_t* end) {
951
- if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_chttp2_hpack_parser)) {
952
- gpr_log(GPR_INFO, "MAX TABLE SIZE: %d", index_);
694
+ // Parse a non-binary string
695
+ static absl::optional<String> Parse(Input* input) {
696
+ auto pfx = input->ParseStringPrefix();
697
+ if (!pfx.has_value()) return {};
698
+ if (pfx->huff) {
699
+ // Huffman coded
700
+ std::vector<uint8_t> output;
701
+ auto v = ParseHuff(input, pfx->length,
702
+ [&output](uint8_t c) { output.push_back(c); });
703
+ if (!v) return {};
704
+ return String(std::move(output));
705
+ }
706
+ return ParseUncompressed(input, pfx->length);
953
707
  }
954
- grpc_error_handle err =
955
- grpc_chttp2_hptbl_set_current_table_size(&table_, index_);
956
- if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
957
- return parse_begin(cur, end);
958
- }
959
708
 
960
- /* parse a max table size change, max size < 15 */
961
- grpc_error_handle HPackParser::parse_max_tbl_size(const uint8_t* cur,
962
- const uint8_t* end) {
963
- if (dynamic_table_updates_allowed_ == 0) {
964
- return parse_error(
965
- cur, end,
966
- GRPC_ERROR_CREATE_FROM_STATIC_STRING(
967
- "More than two max table size changes in a single frame"));
709
+ // Parse a binary string
710
+ static absl::optional<String> ParseBinary(Input* input) {
711
+ auto pfx = input->ParseStringPrefix();
712
+ if (!pfx.has_value()) return {};
713
+ if (!pfx->huff) {
714
+ if (pfx->length > 0 && input->peek() == 0) {
715
+ // 'true-binary'
716
+ input->Advance(1);
717
+ return ParseUncompressed(input, pfx->length - 1);
718
+ }
719
+ // Base64 encoded... pull out the string, then unbase64 it
720
+ auto base64 = ParseUncompressed(input, pfx->length);
721
+ if (!base64.has_value()) return {};
722
+ return Unbase64(input, std::move(*base64));
723
+ } else {
724
+ // Huffman encoded...
725
+ std::vector<uint8_t> decompressed;
726
+ // State here says either we don't know if it's base64 or binary, or we do
727
+ // and what is it.
728
+ enum class State { kUnsure, kBinary, kBase64 };
729
+ State state = State::kUnsure;
730
+ auto decompressed_ok =
731
+ ParseHuff(input, pfx->length, [&state, &decompressed](uint8_t c) {
732
+ if (state == State::kUnsure) {
733
+ // First byte... if it's zero it's binary
734
+ if (c == 0) {
735
+ // Save the type, and skip the zero
736
+ state = State::kBinary;
737
+ return;
738
+ } else {
739
+ // Flag base64, store this value
740
+ state = State::kBase64;
741
+ }
742
+ }
743
+ // Non-first byte, or base64 first byte
744
+ decompressed.push_back(c);
745
+ });
746
+ if (!decompressed_ok) return {};
747
+ switch (state) {
748
+ case State::kUnsure:
749
+ // No bytes, empty span
750
+ return String(absl::Span<const uint8_t>());
751
+ case State::kBinary:
752
+ // Binary, we're done
753
+ return String(std::move(decompressed));
754
+ case State::kBase64:
755
+ // Base64 - unpack it
756
+ return Unbase64(input, String(std::move(decompressed)));
757
+ }
758
+ GPR_UNREACHABLE_CODE(abort(););
759
+ }
968
760
  }
969
- dynamic_table_updates_allowed_--;
970
- index_ = (*cur) & 0x1f;
971
- md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
972
- return finish_max_tbl_size(cur + 1, end);
973
- }
974
761
 
975
- /* parse a max table size change, max size >= 15 */
976
- grpc_error_handle HPackParser::parse_max_tbl_size_x(const uint8_t* cur,
977
- const uint8_t* end) {
978
- static const State and_then[] = {&HPackParser::finish_max_tbl_size};
979
- if (dynamic_table_updates_allowed_ == 0) {
980
- return parse_error(
981
- cur, end,
982
- GRPC_ERROR_CREATE_FROM_STATIC_STRING(
983
- "More than two max table size changes in a single frame"));
762
+ private:
763
+ void AppendBytes(const uint8_t* data, size_t length);
764
+ explicit String(std::vector<uint8_t> v) : value_(std::move(v)) {}
765
+ explicit String(absl::Span<const uint8_t> v) : value_(v) {}
766
+ String(grpc_slice_refcount* r, const uint8_t* begin, const uint8_t* end)
767
+ : value_(Slice::FromRefcountAndBytes(r, begin, end)) {}
768
+
769
+ // Parse some huffman encoded bytes, using output(uint8_t b) to emit each
770
+ // decoded byte.
771
+ template <typename Out>
772
+ static bool ParseHuff(Input* input, uint32_t length, Out output) {
773
+ GRPC_STATS_INC_HPACK_RECV_HUFFMAN();
774
+ int16_t state = 0;
775
+ // Parse one half byte... we leverage some lookup tables to keep the logic
776
+ // here really simple.
777
+ auto nibble = [&output, &state](uint8_t nibble) {
778
+ int16_t emit = emit_sub_tbl[16 * emit_tbl[state] + nibble];
779
+ int16_t next = next_sub_tbl[16 * next_tbl[state] + nibble];
780
+ if (emit != -1) {
781
+ if (emit >= 0 && emit < 256) {
782
+ output(static_cast<uint8_t>(emit));
783
+ } else {
784
+ assert(emit == 256);
785
+ }
786
+ }
787
+ state = next;
788
+ };
789
+ // If there's insufficient bytes remaining, return now.
790
+ if (input->remaining() < length) {
791
+ return input->UnexpectedEOF(false);
792
+ }
793
+ // Grab the byte range, and iterate through it.
794
+ const uint8_t* p = input->cur_ptr();
795
+ input->Advance(length);
796
+ for (uint32_t i = 0; i < length; i++) {
797
+ nibble(p[i] >> 4);
798
+ nibble(p[i] & 0xf);
799
+ }
800
+ return true;
984
801
  }
985
- dynamic_table_updates_allowed_--;
986
- next_state_ = and_then;
987
- index_ = 0x1f;
988
- md_for_index_.payload = 0; /* Invalidate cached md when index changes. */
989
- parsing_.value = &index_;
990
- return parse_value0(cur + 1, end);
991
- }
992
802
 
993
- /* a parse error: jam the parse state into parse_error, and return error */
994
- grpc_error_handle HPackParser::parse_error(const uint8_t* /*cur*/,
995
- const uint8_t* /*end*/,
996
- grpc_error_handle err) {
997
- GPR_ASSERT(err != GRPC_ERROR_NONE);
998
- if (last_error_ == GRPC_ERROR_NONE) {
999
- last_error_ = GRPC_ERROR_REF(err);
803
+ // Parse some uncompressed string bytes.
804
+ static absl::optional<String> ParseUncompressed(Input* input,
805
+ uint32_t length) {
806
+ GRPC_STATS_INC_HPACK_RECV_UNCOMPRESSED();
807
+ // Check there's enough bytes
808
+ if (input->remaining() < length) {
809
+ return input->UnexpectedEOF(absl::optional<String>());
810
+ }
811
+ auto* refcount = input->slice_refcount();
812
+ auto* p = input->cur_ptr();
813
+ input->Advance(length);
814
+ if (refcount != nullptr) {
815
+ return String(refcount, p, p + length);
816
+ } else {
817
+ return String(absl::Span<const uint8_t>(p, length));
818
+ }
1000
819
  }
1001
- state_ = &HPackParser::still_parse_error;
1002
- return err;
1003
- }
1004
820
 
1005
- grpc_error_handle HPackParser::still_parse_error(const uint8_t* /*cur*/,
1006
- const uint8_t* /*end*/) {
1007
- return GRPC_ERROR_REF(last_error_);
1008
- }
821
+ // Turn base64 encoded bytes into not base64 encoded bytes.
822
+ // Only takes input to set an error on failure.
823
+ static absl::optional<String> Unbase64(Input* input, String s) {
824
+ absl::optional<std::vector<uint8_t>> result;
825
+ if (auto* p = absl::get_if<Slice>(&s.value_)) {
826
+ result = Unbase64Loop(p->begin(), p->end());
827
+ }
828
+ if (auto* p = absl::get_if<absl::Span<const uint8_t>>(&s.value_)) {
829
+ result = Unbase64Loop(p->begin(), p->end());
830
+ }
831
+ if (auto* p = absl::get_if<std::vector<uint8_t>>(&s.value_)) {
832
+ result = Unbase64Loop(p->data(), p->data() + p->size());
833
+ }
834
+ if (!result.has_value()) {
835
+ return input->MaybeSetErrorAndReturn(
836
+ [] {
837
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
838
+ "illegal base64 encoding");
839
+ },
840
+ absl::optional<String>());
841
+ }
842
+ return String(std::move(*result));
843
+ }
1009
844
 
1010
- grpc_error_handle HPackParser::parse_illegal_op(const uint8_t* cur,
1011
- const uint8_t* end) {
1012
- GPR_ASSERT(cur != end);
1013
- grpc_error_handle err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1014
- absl::StrCat("Illegal hpack op code ", *cur).c_str());
1015
- return parse_error(cur, end, err);
1016
- }
845
+ // Main loop for Unbase64
846
+ static absl::optional<std::vector<uint8_t>> Unbase64Loop(const uint8_t* cur,
847
+ const uint8_t* end) {
848
+ while (cur != end && end[-1] == '=') {
849
+ --end;
850
+ }
1017
851
 
1018
- /* parse the 1st byte of a varint into parsing_.value
1019
- no overflow is possible */
1020
- grpc_error_handle HPackParser::parse_value0(const uint8_t* cur,
1021
- const uint8_t* end) {
1022
- if (cur == end) {
1023
- state_ = &HPackParser::parse_value0;
1024
- return GRPC_ERROR_NONE;
1025
- }
852
+ std::vector<uint8_t> out;
853
+ out.reserve(3 * (end - cur) / 4 + 3);
1026
854
 
1027
- *parsing_.value += (*cur) & 0x7f;
855
+ // Decode 4 bytes at a time while we can
856
+ while (end - cur >= 4) {
857
+ uint32_t bits = kBase64InverseTable.table[*cur];
858
+ if (bits > 63) return {};
859
+ uint32_t buffer = bits << 18;
860
+ ++cur;
1028
861
 
1029
- if ((*cur) & 0x80) {
1030
- return parse_value1(cur + 1, end);
1031
- } else {
1032
- return parse_next(cur + 1, end);
1033
- }
1034
- }
862
+ bits = kBase64InverseTable.table[*cur];
863
+ if (bits > 63) return {};
864
+ buffer |= bits << 12;
865
+ ++cur;
1035
866
 
1036
- /* parse the 2nd byte of a varint into parsing_.value
1037
- no overflow is possible */
1038
- grpc_error_handle HPackParser::parse_value1(const uint8_t* cur,
1039
- const uint8_t* end) {
1040
- if (cur == end) {
1041
- state_ = &HPackParser::parse_value1;
1042
- return GRPC_ERROR_NONE;
1043
- }
867
+ bits = kBase64InverseTable.table[*cur];
868
+ if (bits > 63) return {};
869
+ buffer |= bits << 6;
870
+ ++cur;
1044
871
 
1045
- *parsing_.value += ((static_cast<uint32_t>(*cur)) & 0x7f) << 7;
872
+ bits = kBase64InverseTable.table[*cur];
873
+ if (bits > 63) return {};
874
+ buffer |= bits;
875
+ ++cur;
1046
876
 
1047
- if ((*cur) & 0x80) {
1048
- return parse_value2(cur + 1, end);
1049
- } else {
1050
- return parse_next(cur + 1, end);
1051
- }
1052
- }
877
+ out.insert(out.end(), {static_cast<uint8_t>(buffer >> 16),
878
+ static_cast<uint8_t>(buffer >> 8),
879
+ static_cast<uint8_t>(buffer)});
880
+ }
881
+ // Deal with the last 0, 1, 2, or 3 bytes.
882
+ switch (end - cur) {
883
+ case 0:
884
+ return out;
885
+ case 1:
886
+ return {};
887
+ case 2: {
888
+ uint32_t bits = kBase64InverseTable.table[*cur];
889
+ if (bits > 63) return {};
890
+ uint32_t buffer = bits << 18;
1053
891
 
1054
- /* parse the 3rd byte of a varint into parsing_.value
1055
- no overflow is possible */
1056
- grpc_error_handle HPackParser::parse_value2(const uint8_t* cur,
1057
- const uint8_t* end) {
1058
- if (cur == end) {
1059
- state_ = &HPackParser::parse_value2;
1060
- return GRPC_ERROR_NONE;
1061
- }
892
+ ++cur;
893
+ bits = kBase64InverseTable.table[*cur];
894
+ if (bits > 63) return {};
895
+ buffer |= bits << 12;
1062
896
 
1063
- *parsing_.value += ((static_cast<uint32_t>(*cur)) & 0x7f) << 14;
897
+ if (buffer & 0xffff) return {};
898
+ out.push_back(static_cast<uint8_t>(buffer >> 16));
899
+ return out;
900
+ }
901
+ case 3: {
902
+ uint32_t bits = kBase64InverseTable.table[*cur];
903
+ if (bits > 63) return {};
904
+ uint32_t buffer = bits << 18;
1064
905
 
1065
- if ((*cur) & 0x80) {
1066
- return parse_value3(cur + 1, end);
1067
- } else {
1068
- return parse_next(cur + 1, end);
1069
- }
1070
- }
906
+ ++cur;
907
+ bits = kBase64InverseTable.table[*cur];
908
+ if (bits > 63) return {};
909
+ buffer |= bits << 12;
1071
910
 
1072
- /* parse the 4th byte of a varint into parsing_.value
1073
- no overflow is possible */
1074
- grpc_error_handle HPackParser::parse_value3(const uint8_t* cur,
1075
- const uint8_t* end) {
1076
- if (cur == end) {
1077
- state_ = &HPackParser::parse_value3;
1078
- return GRPC_ERROR_NONE;
1079
- }
911
+ ++cur;
912
+ bits = kBase64InverseTable.table[*cur];
913
+ if (bits > 63) return {};
914
+ buffer |= bits << 6;
1080
915
 
1081
- *parsing_.value += ((static_cast<uint32_t>(*cur)) & 0x7f) << 21;
916
+ ++cur;
917
+ if (buffer & 0xff) return {};
918
+ out.push_back(static_cast<uint8_t>(buffer >> 16));
919
+ out.push_back(static_cast<uint8_t>(buffer >> 8));
920
+ return out;
921
+ }
922
+ }
1082
923
 
1083
- if ((*cur) & 0x80) {
1084
- return parse_value4(cur + 1, end);
1085
- } else {
1086
- return parse_next(cur + 1, end);
924
+ GPR_UNREACHABLE_CODE(return out;);
1087
925
  }
1088
- }
1089
926
 
1090
- /* parse the 5th byte of a varint into parsing_.value
1091
- depending on the byte, we may overflow, and care must be taken */
1092
- grpc_error_handle HPackParser::parse_value4(const uint8_t* cur,
1093
- const uint8_t* end) {
1094
- uint8_t c;
1095
- uint32_t cur_value;
1096
- uint32_t add_value;
927
+ absl::variant<Slice, absl::Span<const uint8_t>, std::vector<uint8_t>> value_;
928
+ };
1097
929
 
1098
- if (cur == end) {
1099
- state_ = &HPackParser::parse_value4;
1100
- return GRPC_ERROR_NONE;
930
+ // Parser parses one key/value pair from a byte stream.
931
+ class HPackParser::Parser {
932
+ public:
933
+ Parser(Input* input, grpc_metadata_batch* metadata_buffer,
934
+ uint32_t metadata_size_limit, HPackTable* table,
935
+ uint8_t* dynamic_table_updates_allowed, uint32_t* frame_length,
936
+ LogInfo log_info)
937
+ : input_(input),
938
+ metadata_buffer_(metadata_buffer),
939
+ table_(table),
940
+ dynamic_table_updates_allowed_(dynamic_table_updates_allowed),
941
+ frame_length_(frame_length),
942
+ metadata_size_limit_(metadata_size_limit),
943
+ log_info_(log_info) {}
944
+
945
+ // Skip any priority bits, or return false on failure
946
+ bool SkipPriority() {
947
+ if (input_->remaining() < 5) return input_->UnexpectedEOF(false);
948
+ input_->Advance(5);
949
+ return true;
1101
950
  }
1102
951
 
1103
- c = (*cur) & 0x7f;
1104
- if (c > 0xf) {
1105
- goto error;
952
+ bool Parse() {
953
+ auto cur = *input_->Next();
954
+ switch (cur >> 4) {
955
+ // Literal header not indexed - First byte format: 0000xxxx
956
+ // Literal header never indexed - First byte format: 0001xxxx
957
+ // Where xxxx:
958
+ // 0000 - literal key
959
+ // 1111 - indexed key, varint encoded index
960
+ // other - indexed key, inline encoded index
961
+ case 0:
962
+ case 1:
963
+ switch (cur & 0xf) {
964
+ case 0: // literal key
965
+ return FinishHeaderOmitFromTable(ParseLiteralKey<String::Extern>());
966
+ case 0xf: // varint encoded key index
967
+ return FinishHeaderOmitFromTable(
968
+ ParseVarIdxKey<String::Extern>(0xf));
969
+ default: // inline encoded key index
970
+ return FinishHeaderOmitFromTable(
971
+ ParseIdxKey<String::Extern>(cur & 0xf));
972
+ }
973
+ // Update max table size.
974
+ // First byte format: 001xxxxx
975
+ // Where xxxxx:
976
+ // 11111 - max size is varint encoded
977
+ // other - max size is stored inline
978
+ case 2:
979
+ // inline encoded max table size
980
+ return FinishMaxTableSize(cur & 0x1f);
981
+ case 3:
982
+ if (cur == 0x3f) {
983
+ // varint encoded max table size
984
+ return FinishMaxTableSize(input_->ParseVarint(0x1f));
985
+ } else {
986
+ // inline encoded max table size
987
+ return FinishMaxTableSize(cur & 0x1f);
988
+ }
989
+ // Literal header with incremental indexing.
990
+ // First byte format: 01xxxxxx
991
+ // Where xxxxxx:
992
+ // 000000 - literal key
993
+ // 111111 - indexed key, varint encoded index
994
+ // other - indexed key, inline encoded index
995
+ case 4:
996
+ if (cur == 0x40) {
997
+ // literal key
998
+ return FinishHeaderAndAddToTable(ParseLiteralKey<String::Intern>());
999
+ }
1000
+ ABSL_FALLTHROUGH_INTENDED;
1001
+ case 5:
1002
+ case 6:
1003
+ // inline encoded key index
1004
+ return FinishHeaderAndAddToTable(
1005
+ ParseIdxKey<String::Intern>(cur & 0x3f));
1006
+ case 7:
1007
+ if (cur == 0x7f) {
1008
+ // varint encoded key index
1009
+ return FinishHeaderAndAddToTable(
1010
+ ParseVarIdxKey<String::Intern>(0x3f));
1011
+ } else {
1012
+ // inline encoded key index
1013
+ return FinishHeaderAndAddToTable(
1014
+ ParseIdxKey<String::Intern>(cur & 0x3f));
1015
+ }
1016
+ // Indexed Header Field Representation
1017
+ // First byte format: 1xxxxxxx
1018
+ // Where xxxxxxx:
1019
+ // 0000000 - illegal
1020
+ // 1111111 - varint encoded field index
1021
+ // other - inline encoded field index
1022
+ case 8:
1023
+ if (cur == 0x80) {
1024
+ // illegal value.
1025
+ return input_->MaybeSetErrorAndReturn(
1026
+ [] {
1027
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1028
+ "Illegal hpack op code");
1029
+ },
1030
+ false);
1031
+ }
1032
+ ABSL_FALLTHROUGH_INTENDED;
1033
+ case 9:
1034
+ case 10:
1035
+ case 11:
1036
+ case 12:
1037
+ case 13:
1038
+ case 14:
1039
+ // inline encoded field index
1040
+ return FinishIndexed(cur & 0x7f);
1041
+ case 15:
1042
+ if (cur == 0xff) {
1043
+ // varint encoded field index
1044
+ return FinishIndexed(input_->ParseVarint(0x7f));
1045
+ } else {
1046
+ // inline encoded field index
1047
+ return FinishIndexed(cur & 0x7f);
1048
+ }
1049
+ }
1050
+ GPR_UNREACHABLE_CODE(abort());
1106
1051
  }
1107
1052
 
1108
- cur_value = *parsing_.value;
1109
- add_value = (static_cast<uint32_t>(c)) << 28;
1110
- if (add_value > 0xffffffffu - cur_value) {
1111
- goto error;
1053
+ private:
1054
+ void GPR_ATTRIBUTE_NOINLINE LogHeader(const HPackTable::Memento& memento) {
1055
+ const char* type;
1056
+ switch (log_info_.type) {
1057
+ case LogInfo::kHeaders:
1058
+ type = "HDR";
1059
+ break;
1060
+ case LogInfo::kTrailers:
1061
+ type = "TRL";
1062
+ break;
1063
+ case LogInfo::kDontKnow:
1064
+ type = "???";
1065
+ break;
1066
+ }
1067
+ gpr_log(GPR_DEBUG, "HTTP:%d:%s:%s: %s", log_info_.stream_id, type,
1068
+ log_info_.is_client ? "CLI" : "SVR", memento.DebugString().c_str());
1112
1069
  }
1113
1070
 
1114
- *parsing_.value = cur_value + add_value;
1071
+ bool EmitHeader(const HPackTable::Memento& md) {
1072
+ // Pass up to the transport
1073
+ if (GPR_UNLIKELY(metadata_buffer_ == nullptr)) return true;
1074
+ *frame_length_ += md.transport_size();
1075
+ if (GPR_UNLIKELY(*frame_length_ > metadata_size_limit_)) {
1076
+ return HandleMetadataSizeLimitExceeded(md);
1077
+ }
1115
1078
 
1116
- if ((*cur) & 0x80) {
1117
- return parse_value5up(cur + 1, end);
1118
- } else {
1119
- return parse_next(cur + 1, end);
1079
+ grpc_error_handle err = metadata_buffer_->Set(md);
1080
+ if (GPR_UNLIKELY(err != GRPC_ERROR_NONE)) {
1081
+ input_->SetError(err);
1082
+ return false;
1083
+ }
1084
+ return true;
1120
1085
  }
1121
1086
 
1122
- error:
1123
- grpc_error_handle err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1124
- absl::StrFormat(
1125
- "integer overflow in hpack integer decoding: have 0x%08x, "
1126
- "got byte 0x%02x on byte 5",
1127
- *parsing_.value, *cur)
1128
- .c_str());
1129
- return parse_error(cur, end, err);
1130
- }
1131
-
1132
- /* parse any trailing bytes in a varint: it's possible to append an arbitrary
1133
- number of 0x80's and not affect the value - a zero will terminate - and
1134
- anything else will overflow */
1135
- grpc_error_handle HPackParser::parse_value5up(const uint8_t* cur,
1136
- const uint8_t* end) {
1137
- while (cur != end && *cur == 0x80) {
1138
- ++cur;
1087
+ bool FinishHeaderAndAddToTable(absl::optional<HPackTable::Memento> md) {
1088
+ // Allow higher code to just pass in failures ... simplifies things a bit.
1089
+ if (!md.has_value()) return false;
1090
+ // Log if desired
1091
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_chttp2_hpack_parser)) {
1092
+ LogHeader(*md);
1093
+ }
1094
+ // Emit whilst we own the metadata.
1095
+ auto r = EmitHeader(*md);
1096
+ // Add to the hpack table
1097
+ grpc_error_handle err = table_->Add(std::move(*md));
1098
+ if (GPR_UNLIKELY(err != GRPC_ERROR_NONE)) {
1099
+ input_->SetError(err);
1100
+ return false;
1101
+ };
1102
+ return r;
1139
1103
  }
1140
1104
 
1141
- if (cur == end) {
1142
- state_ = &HPackParser::parse_value5up;
1143
- return GRPC_ERROR_NONE;
1105
+ bool FinishHeaderOmitFromTable(absl::optional<HPackTable::Memento> md) {
1106
+ // Allow higher code to just pass in failures ... simplifies things a bit.
1107
+ if (!md.has_value()) return false;
1108
+ return FinishHeaderOmitFromTable(*md);
1144
1109
  }
1145
1110
 
1146
- if (*cur == 0) {
1147
- return parse_next(cur + 1, end);
1111
+ bool FinishHeaderOmitFromTable(const HPackTable::Memento& md) {
1112
+ // Log if desired
1113
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_chttp2_hpack_parser)) {
1114
+ LogHeader(md);
1115
+ }
1116
+ return EmitHeader(md);
1148
1117
  }
1149
1118
 
1150
- grpc_error_handle err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1151
- absl::StrFormat(
1152
- "integer overflow in hpack integer decoding: have 0x%08x, "
1153
- "got byte 0x%02x sometime after byte 5",
1154
- *parsing_.value, *cur)
1155
- .c_str());
1156
- return parse_error(cur, end, err);
1157
- }
1158
-
1159
- /* parse a string prefix */
1160
- grpc_error_handle HPackParser::parse_string_prefix(const uint8_t* cur,
1161
- const uint8_t* end) {
1162
- if (cur == end) {
1163
- state_ = &HPackParser::parse_string_prefix;
1164
- return GRPC_ERROR_NONE;
1119
+ // Parse a string encoded key and a string encoded value
1120
+ template <typename TakeValueType>
1121
+ absl::optional<HPackTable::Memento> ParseLiteralKey() {
1122
+ auto key = String::Parse(input_);
1123
+ if (!key.has_value()) return {};
1124
+ auto value = ParseValueString(absl::EndsWith(key->string_view(), "-bin"));
1125
+ if (GPR_UNLIKELY(!value.has_value())) {
1126
+ return {};
1127
+ }
1128
+ auto key_string = key->string_view();
1129
+ auto value_slice = value->Take<TakeValueType>();
1130
+ const auto transport_size = key_string.size() + value_slice.size() +
1131
+ hpack_constants::kEntryOverhead;
1132
+ return grpc_metadata_batch::Parse(key->string_view(),
1133
+ std::move(value_slice), transport_size);
1165
1134
  }
1166
1135
 
1167
- strlen_ = (*cur) & 0x7f;
1168
- huff_ = (*cur) >> 7;
1169
- if (strlen_ == 0x7f) {
1170
- parsing_.value = &strlen_;
1171
- return parse_value0(cur + 1, end);
1172
- } else {
1173
- return parse_next(cur + 1, end);
1136
+ // Parse an index encoded key and a string encoded value
1137
+ template <typename TakeValueType>
1138
+ absl::optional<HPackTable::Memento> ParseIdxKey(uint32_t index) {
1139
+ const auto* elem = table_->Lookup(index);
1140
+ if (GPR_UNLIKELY(elem == nullptr)) {
1141
+ return InvalidHPackIndexError(index,
1142
+ absl::optional<HPackTable::Memento>());
1143
+ }
1144
+ auto value = ParseValueString(elem->is_binary_header());
1145
+ if (GPR_UNLIKELY(!value.has_value())) return {};
1146
+ return elem->WithNewValue(value->Take<TakeValueType>());
1174
1147
  }
1175
- }
1176
1148
 
1177
- /* append some bytes to a string */
1178
- void HPackParser::String::AppendBytes(const uint8_t* data, size_t length) {
1179
- if (length == 0) return;
1180
- if (length + data_.copied.length > data_.copied.capacity) {
1181
- GPR_ASSERT(data_.copied.length + length <= UINT32_MAX);
1182
- data_.copied.capacity = static_cast<uint32_t>(data_.copied.length + length);
1183
- data_.copied.str = static_cast<char*>(
1184
- gpr_realloc(data_.copied.str, data_.copied.capacity));
1149
+ // Parse a varint index encoded key and a string encoded value
1150
+ template <typename TakeValueType>
1151
+ absl::optional<HPackTable::Memento> ParseVarIdxKey(uint32_t offset) {
1152
+ auto index = input_->ParseVarint(offset);
1153
+ if (GPR_UNLIKELY(!index.has_value())) return {};
1154
+ return ParseIdxKey<TakeValueType>(*index);
1185
1155
  }
1186
- memcpy(data_.copied.str + data_.copied.length, data, length);
1187
- GPR_ASSERT(length <= UINT32_MAX - data_.copied.length);
1188
- data_.copied.length += static_cast<uint32_t>(length);
1189
- }
1190
1156
 
1191
- grpc_error_handle HPackParser::AppendString(const uint8_t* cur,
1192
- const uint8_t* end) {
1193
- String* str = parsing_.str;
1194
- uint32_t bits;
1195
- uint8_t decoded[3];
1196
- switch (binary_) {
1197
- case BinaryState::kNotBinary:
1198
- str->AppendBytes(cur, static_cast<size_t>(end - cur));
1199
- return GRPC_ERROR_NONE;
1200
- case BinaryState::kBinaryBegin:
1201
- if (cur == end) {
1202
- binary_ = BinaryState::kBinaryBegin;
1203
- return GRPC_ERROR_NONE;
1204
- }
1205
- if (*cur == 0) {
1206
- /* 'true-binary' case */
1207
- ++cur;
1208
- binary_ = BinaryState::kNotBinary;
1209
- GRPC_STATS_INC_HPACK_RECV_BINARY();
1210
- str->AppendBytes(cur, static_cast<size_t>(end - cur));
1211
- return GRPC_ERROR_NONE;
1212
- }
1213
- GRPC_STATS_INC_HPACK_RECV_BINARY_BASE64();
1214
- b64_byte0:
1215
- ABSL_FALLTHROUGH_INTENDED;
1216
- case BinaryState::kBase64Byte0:
1217
- if (cur == end) {
1218
- binary_ = BinaryState::kBase64Byte0;
1219
- return GRPC_ERROR_NONE;
1220
- }
1221
- bits = kBase64InverseTable.table[*cur];
1222
- ++cur;
1223
- if (bits == 255) {
1224
- return parse_error(
1225
- cur, end,
1226
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Illegal base64 character"));
1227
- } else if (bits == 64) {
1228
- goto b64_byte0;
1229
- }
1230
- base64_buffer_ = bits << 18;
1231
- b64_byte1:
1232
- ABSL_FALLTHROUGH_INTENDED;
1233
- case BinaryState::kBase64Byte1:
1234
- if (cur == end) {
1235
- binary_ = BinaryState::kBase64Byte1;
1236
- return GRPC_ERROR_NONE;
1237
- }
1238
- bits = kBase64InverseTable.table[*cur];
1239
- ++cur;
1240
- if (bits == 255) {
1241
- return parse_error(
1242
- cur, end,
1243
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Illegal base64 character"));
1244
- } else if (bits == 64) {
1245
- goto b64_byte1;
1246
- }
1247
- base64_buffer_ |= bits << 12;
1248
- b64_byte2:
1249
- ABSL_FALLTHROUGH_INTENDED;
1250
- case BinaryState::kBase64Byte2:
1251
- if (cur == end) {
1252
- binary_ = BinaryState::kBase64Byte2;
1253
- return GRPC_ERROR_NONE;
1254
- }
1255
- bits = kBase64InverseTable.table[*cur];
1256
- ++cur;
1257
- if (bits == 255) {
1258
- return parse_error(
1259
- cur, end,
1260
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Illegal base64 character"));
1261
- } else if (bits == 64) {
1262
- goto b64_byte2;
1263
- }
1264
- base64_buffer_ |= bits << 6;
1265
- b64_byte3:
1266
- ABSL_FALLTHROUGH_INTENDED;
1267
- case BinaryState::kBase64Byte3:
1268
- if (cur == end) {
1269
- binary_ = BinaryState::kBase64Byte3;
1270
- return GRPC_ERROR_NONE;
1271
- }
1272
- bits = kBase64InverseTable.table[*cur];
1273
- ++cur;
1274
- if (bits == 255) {
1275
- return parse_error(
1276
- cur, end,
1277
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Illegal base64 character"));
1278
- } else if (bits == 64) {
1279
- goto b64_byte3;
1280
- }
1281
- base64_buffer_ |= bits;
1282
- bits = base64_buffer_;
1283
- decoded[0] = static_cast<uint8_t>(bits >> 16);
1284
- decoded[1] = static_cast<uint8_t>(bits >> 8);
1285
- decoded[2] = static_cast<uint8_t>(bits);
1286
- str->AppendBytes(decoded, 3);
1287
- goto b64_byte0;
1157
+ // Parse a string, figuring out if it's binary or not by the key name.
1158
+ absl::optional<String> ParseValueString(bool is_binary) {
1159
+ if (is_binary) {
1160
+ return String::ParseBinary(input_);
1161
+ } else {
1162
+ return String::Parse(input_);
1163
+ }
1288
1164
  }
1289
- GPR_UNREACHABLE_CODE(return parse_error(
1290
- cur, end,
1291
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Should never reach here")));
1292
- }
1293
1165
 
1294
- grpc_error_handle HPackParser::finish_str(const uint8_t* cur,
1295
- const uint8_t* end) {
1296
- uint8_t decoded[2];
1297
- uint32_t bits;
1298
- String* str = parsing_.str;
1299
- switch (binary_) {
1300
- case BinaryState::kNotBinary:
1301
- break;
1302
- case BinaryState::kBinaryBegin:
1303
- break;
1304
- case BinaryState::kBase64Byte0:
1305
- break;
1306
- case BinaryState::kBase64Byte1:
1307
- return parse_error(cur, end,
1308
- GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1309
- "illegal base64 encoding")); /* illegal encoding */
1310
- case BinaryState::kBase64Byte2:
1311
- bits = base64_buffer_;
1312
- if (bits & 0xffff) {
1313
- grpc_error_handle err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1314
- absl::StrFormat("trailing bits in base64 encoding: 0x%04x",
1315
- bits & 0xffff)
1316
- .c_str());
1317
- return parse_error(cur, end, err);
1318
- }
1319
- decoded[0] = static_cast<uint8_t>(bits >> 16);
1320
- str->AppendBytes(decoded, 1);
1321
- break;
1322
- case BinaryState::kBase64Byte3:
1323
- bits = base64_buffer_;
1324
- if (bits & 0xff) {
1325
- grpc_error_handle err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1326
- absl::StrFormat("trailing bits in base64 encoding: 0x%02x",
1327
- bits & 0xff)
1328
- .c_str());
1329
- return parse_error(cur, end, err);
1330
- }
1331
- decoded[0] = static_cast<uint8_t>(bits >> 16);
1332
- decoded[1] = static_cast<uint8_t>(bits >> 8);
1333
- str->AppendBytes(decoded, 2);
1334
- break;
1166
+ // Emit an indexed field
1167
+ bool FinishIndexed(absl::optional<uint32_t> index) {
1168
+ *dynamic_table_updates_allowed_ = 0;
1169
+ if (!index.has_value()) return false;
1170
+ const auto* elem = table_->Lookup(*index);
1171
+ if (GPR_UNLIKELY(elem == nullptr)) {
1172
+ return InvalidHPackIndexError(*index, false);
1173
+ }
1174
+ GRPC_STATS_INC_HPACK_RECV_INDEXED();
1175
+ return FinishHeaderOmitFromTable(*elem);
1335
1176
  }
1336
- return GRPC_ERROR_NONE;
1337
- }
1338
1177
 
1339
- /* decode a nibble from a huffman encoded stream */
1340
- grpc_error_handle HPackParser::AppendHuffNibble(uint8_t nibble) {
1341
- int16_t emit = emit_sub_tbl[16 * emit_tbl[huff_state_] + nibble];
1342
- int16_t next = next_sub_tbl[16 * next_tbl[huff_state_] + nibble];
1343
- if (emit != -1) {
1344
- if (emit >= 0 && emit < 256) {
1345
- uint8_t c = static_cast<uint8_t>(emit);
1346
- grpc_error_handle err = AppendString(&c, (&c) + 1);
1347
- if (err != GRPC_ERROR_NONE) return err;
1348
- } else {
1349
- assert(emit == 256);
1178
+ // finish parsing a max table size change
1179
+ bool FinishMaxTableSize(absl::optional<uint32_t> size) {
1180
+ if (!size.has_value()) return false;
1181
+ if (*dynamic_table_updates_allowed_ == 0) {
1182
+ return input_->MaybeSetErrorAndReturn(
1183
+ [] {
1184
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1185
+ "More than two max table size changes in a single frame");
1186
+ },
1187
+ false);
1188
+ }
1189
+ (*dynamic_table_updates_allowed_)--;
1190
+ grpc_error_handle err = table_->SetCurrentTableSize(*size);
1191
+ if (err != GRPC_ERROR_NONE) {
1192
+ input_->SetError(err);
1193
+ return false;
1350
1194
  }
1195
+ return true;
1351
1196
  }
1352
- huff_state_ = next;
1353
- return GRPC_ERROR_NONE;
1354
- }
1355
1197
 
1356
- /* decode full bytes from a huffman encoded stream */
1357
- grpc_error_handle HPackParser::AppendHuffBytes(const uint8_t* cur,
1358
- const uint8_t* end) {
1359
- for (; cur != end; ++cur) {
1360
- grpc_error_handle err = AppendHuffNibble(*cur >> 4);
1361
- if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
1362
- err = AppendHuffNibble(*cur & 0xf);
1363
- if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
1198
+ // Set an invalid hpack index error if no error has been set. Returns result
1199
+ // unmodified.
1200
+ template <typename R>
1201
+ R InvalidHPackIndexError(uint32_t index, R result) {
1202
+ return input_->MaybeSetErrorAndReturn(
1203
+ [this, index] {
1204
+ return grpc_error_set_int(
1205
+ grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1206
+ "Invalid HPACK index received"),
1207
+ GRPC_ERROR_INT_INDEX,
1208
+ static_cast<intptr_t>(index)),
1209
+ GRPC_ERROR_INT_SIZE,
1210
+ static_cast<intptr_t>(this->table_->num_entries()));
1211
+ },
1212
+ std::move(result));
1364
1213
  }
1365
- return GRPC_ERROR_NONE;
1366
- }
1367
1214
 
1368
- /* decode some string bytes based on the current decoding mode
1369
- (huffman or not) */
1370
- grpc_error_handle HPackParser::AppendStrBytes(const uint8_t* cur,
1371
- const uint8_t* end) {
1372
- if (huff_) {
1373
- return AppendHuffBytes(cur, end);
1374
- } else {
1375
- return AppendString(cur, end);
1215
+ GPR_ATTRIBUTE_NOINLINE
1216
+ bool HandleMetadataSizeLimitExceeded(const HPackTable::Memento&) {
1217
+ gpr_log(GPR_DEBUG,
1218
+ "received initial metadata size exceeds limit (%" PRIu32
1219
+ " vs. %" PRIu32
1220
+ "). GRPC_ARG_MAX_METADATA_SIZE can be set to increase this limit.",
1221
+ *frame_length_, metadata_size_limit_);
1222
+ if (metadata_buffer_ != nullptr) metadata_buffer_->Clear();
1223
+ return input_->MaybeSetErrorAndReturn(
1224
+ [] {
1225
+ return grpc_error_set_int(
1226
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1227
+ "received initial metadata size exceeds limit"),
1228
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_RESOURCE_EXHAUSTED);
1229
+ },
1230
+ false);
1376
1231
  }
1377
- }
1378
1232
 
1379
- /* parse a string - tries to do large chunks at a time */
1380
- grpc_error_handle HPackParser::parse_string(const uint8_t* cur,
1381
- const uint8_t* end) {
1382
- size_t remaining = strlen_ - strgot_;
1383
- size_t given = static_cast<size_t>(end - cur);
1384
- if (remaining <= given) {
1385
- grpc_error_handle err = AppendStrBytes(cur, cur + remaining);
1386
- if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
1387
- err = finish_str(cur + remaining, end);
1388
- if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
1389
- return parse_next(cur + remaining, end);
1390
- } else {
1391
- grpc_error_handle err = AppendStrBytes(cur, cur + given);
1392
- if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
1393
- GPR_ASSERT(given <= UINT32_MAX - strgot_);
1394
- strgot_ += static_cast<uint32_t>(given);
1395
- state_ = &HPackParser::parse_string;
1396
- return GRPC_ERROR_NONE;
1233
+ Input* const input_;
1234
+ grpc_metadata_batch* const metadata_buffer_;
1235
+ HPackTable* const table_;
1236
+ uint8_t* const dynamic_table_updates_allowed_;
1237
+ uint32_t* const frame_length_;
1238
+ const uint32_t metadata_size_limit_;
1239
+ const LogInfo log_info_;
1240
+ };
1241
+
1242
+ Slice HPackParser::String::Take(Extern) {
1243
+ if (auto* p = absl::get_if<Slice>(&value_)) {
1244
+ return p->Copy();
1245
+ } else if (auto* p = absl::get_if<absl::Span<const uint8_t>>(&value_)) {
1246
+ return Slice::FromCopiedBuffer(*p);
1247
+ } else if (auto* p = absl::get_if<std::vector<uint8_t>>(&value_)) {
1248
+ return Slice::FromCopiedBuffer(*p);
1397
1249
  }
1250
+ GPR_UNREACHABLE_CODE(return Slice());
1398
1251
  }
1399
1252
 
1400
- /* begin parsing a string - performs setup, calls parse_string */
1401
- grpc_error_handle HPackParser::begin_parse_string(const uint8_t* cur,
1402
- const uint8_t* end,
1403
- BinaryState binary,
1404
- HPackParser::String* str) {
1405
- if (!huff_ && binary == BinaryState::kNotBinary &&
1406
- static_cast<uint32_t>(end - cur) >= strlen_ &&
1407
- current_slice_refcount_ != nullptr) {
1408
- GRPC_STATS_INC_HPACK_RECV_UNCOMPRESSED();
1409
- str->copied_ = false;
1410
- str->data_.referenced.refcount = current_slice_refcount_;
1411
- str->data_.referenced.data.refcounted.bytes = const_cast<uint8_t*>(cur);
1412
- str->data_.referenced.data.refcounted.length = strlen_;
1413
- grpc_slice_ref_internal(str->data_.referenced);
1414
- return parse_next(cur + strlen_, end);
1415
- }
1416
- strgot_ = 0;
1417
- str->copied_ = true;
1418
- str->data_.copied.length = 0;
1419
- parsing_.str = str;
1420
- huff_state_ = 0;
1421
- binary_ = binary;
1422
- switch (binary_) {
1423
- case BinaryState::kNotBinary:
1424
- if (huff_) {
1425
- GRPC_STATS_INC_HPACK_RECV_HUFFMAN();
1426
- } else {
1427
- GRPC_STATS_INC_HPACK_RECV_UNCOMPRESSED();
1428
- }
1429
- break;
1430
- case BinaryState::kBinaryBegin:
1431
- /* stats incremented later: don't know true binary or not */
1432
- break;
1433
- default:
1434
- abort();
1253
+ Slice HPackParser::String::Take(Intern) {
1254
+ ManagedMemorySlice m;
1255
+ if (auto* p = absl::get_if<Slice>(&value_)) {
1256
+ m = ManagedMemorySlice(&p->c_slice());
1257
+ } else if (auto* p = absl::get_if<absl::Span<const uint8_t>>(&value_)) {
1258
+ m = ManagedMemorySlice(reinterpret_cast<const char*>(p->data()), p->size());
1259
+ } else if (auto* p = absl::get_if<std::vector<uint8_t>>(&value_)) {
1260
+ m = ManagedMemorySlice(reinterpret_cast<const char*>(p->data()), p->size());
1435
1261
  }
1436
- return parse_string(cur, end);
1262
+ return Slice(m);
1437
1263
  }
1438
1264
 
1439
- /* parse the key string */
1440
- grpc_error_handle HPackParser::parse_key_string(const uint8_t* cur,
1441
- const uint8_t* end) {
1442
- return begin_parse_string(cur, end, BinaryState::kNotBinary, &key_);
1443
- }
1265
+ /* PUBLIC INTERFACE */
1444
1266
 
1445
- /* check if a key represents a binary header or not */
1446
-
1447
- bool HPackParser::IsBinaryLiteralHeader() {
1448
- /* We know that either argument here is a reference counter slice.
1449
- * 1. If it is a grpc_core::StaticSlice, the refcount is set to kNoopRefcount.
1450
- * 2. If it's key_.data.referenced, then key_.copied was set to false,
1451
- * which occurs in begin_parse_string() - where the refcount is set to
1452
- * current_slice_refcount_, which is not null. */
1453
- return grpc_is_refcounted_slice_binary_header(
1454
- key_.copied_ ? grpc_core::ExternallyManagedSlice(key_.data_.copied.str,
1455
- key_.data_.copied.length)
1456
- : key_.data_.referenced);
1457
- }
1267
+ HPackParser::HPackParser() = default;
1458
1268
 
1459
- /* Cache the metadata for the given index during initial parsing. This avoids a
1460
- pointless recomputation of the metadata when finishing a header. We read the
1461
- cached value in get_precomputed_md_for_idx(). */
1462
- void HPackParser::SetPrecomputedMDIndex(grpc_mdelem md) {
1463
- GPR_DEBUG_ASSERT(md_for_index_.payload == 0);
1464
- GPR_DEBUG_ASSERT(precomputed_md_index_ == -1);
1465
- md_for_index_ = md;
1466
- #ifndef NDEBUG
1467
- precomputed_md_index_ = index_;
1468
- #endif
1469
- }
1269
+ HPackParser::~HPackParser() = default;
1470
1270
 
1471
- /* Determines if a metadata element key associated with the current parser index
1472
- is a binary indexed header during string parsing. We'll need to revisit this
1473
- metadata when we're done parsing, so we cache the metadata for this index
1474
- here using set_precomputed_md_idx(). */
1475
- grpc_error_handle HPackParser::IsBinaryIndexedHeader(bool* is) {
1476
- grpc_mdelem elem = grpc_chttp2_hptbl_lookup(&table_, index_);
1477
- if (GPR_UNLIKELY(GRPC_MDISNULL(elem))) {
1478
- return InvalidHPackIndexError();
1271
+ void HPackParser::BeginFrame(grpc_metadata_batch* metadata_buffer,
1272
+ uint32_t metadata_size_limit, Boundary boundary,
1273
+ Priority priority, LogInfo log_info) {
1274
+ metadata_buffer_ = metadata_buffer;
1275
+ boundary_ = boundary;
1276
+ priority_ = priority;
1277
+ dynamic_table_updates_allowed_ = 2;
1278
+ frame_length_ = 0;
1279
+ metadata_size_limit_ = metadata_size_limit;
1280
+ log_info_ = log_info;
1281
+ }
1282
+
1283
+ grpc_error_handle HPackParser::Parse(const grpc_slice& slice, bool is_last) {
1284
+ if (GPR_UNLIKELY(!unparsed_bytes_.empty())) {
1285
+ std::vector<uint8_t> buffer = std::move(unparsed_bytes_);
1286
+ buffer.insert(buffer.end(), GRPC_SLICE_START_PTR(slice),
1287
+ GRPC_SLICE_END_PTR(slice));
1288
+ return ParseInput(
1289
+ Input(nullptr, buffer.data(), buffer.data() + buffer.size()), is_last);
1479
1290
  }
1480
- /* We know that GRPC_MDKEY(elem) points to a reference counted slice since:
1481
- * 1. elem was a result of grpc_chttp2_hptbl_lookup
1482
- * 2. An item in this table is either static (see entries with
1483
- * index < GRPC_CHTTP2_LAST_STATIC_ENTRY or added via
1484
- * grpc_chttp2_hptbl_add).
1485
- * 3. If added via grpc_chttp2_hptbl_add, the entry is either static or
1486
- * interned.
1487
- * 4. Both static and interned element slices have non-null refcounts. */
1488
- *is = grpc_is_refcounted_slice_binary_header(GRPC_MDKEY(elem));
1489
- SetPrecomputedMDIndex(elem);
1490
- return GRPC_ERROR_NONE;
1491
- }
1492
-
1493
- /* parse the value string */
1494
- grpc_error_handle HPackParser::parse_value_string(const uint8_t* cur,
1495
- const uint8_t* end,
1496
- bool is_binary) {
1497
- return begin_parse_string(
1498
- cur, end, is_binary ? BinaryState::kBinaryBegin : BinaryState::kNotBinary,
1499
- &value_);
1500
- }
1501
-
1502
- grpc_error_handle HPackParser::parse_value_string_with_indexed_key(
1503
- const uint8_t* cur, const uint8_t* end) {
1504
- bool is_binary = false;
1505
- grpc_error_handle err = IsBinaryIndexedHeader(&is_binary);
1506
- if (err != GRPC_ERROR_NONE) return parse_error(cur, end, err);
1507
- return parse_value_string(cur, end, is_binary);
1508
- }
1509
-
1510
- grpc_error_handle HPackParser::parse_value_string_with_literal_key(
1511
- const uint8_t* cur, const uint8_t* end) {
1512
- return parse_value_string(cur, end, IsBinaryLiteralHeader());
1291
+ return ParseInput(Input(slice.refcount, GRPC_SLICE_START_PTR(slice),
1292
+ GRPC_SLICE_END_PTR(slice)),
1293
+ is_last);
1513
1294
  }
1514
1295
 
1515
- /* PUBLIC INTERFACE */
1516
-
1517
- HPackParser::HPackParser() {
1518
- state_ = &HPackParser::parse_begin;
1519
- key_.data_.referenced = grpc_empty_slice();
1520
- key_.data_.copied.str = nullptr;
1521
- key_.data_.copied.capacity = 0;
1522
- key_.data_.copied.length = 0;
1523
- value_.data_.referenced = grpc_empty_slice();
1524
- value_.data_.copied.str = nullptr;
1525
- value_.data_.copied.capacity = 0;
1526
- value_.data_.copied.length = 0;
1527
- /* Cached metadata for the current index the parser is handling. This is set
1528
- to 0 initially, invalidated when the index changes, and invalidated when it
1529
- is read (by get_precomputed_md_for_idx()). It is set during string parsing,
1530
- by set_precomputed_md_idx() - which is called by parse_value_string().
1531
- The goal here is to avoid recomputing the metadata for the index when
1532
- finishing with a header as well as the initial parse. */
1533
- md_for_index_.payload = 0;
1534
- #ifndef NDEBUG
1535
- /* In debug mode, this ensures that the cached metadata we're reading is in
1536
- * fact correct for the index we are examining. */
1537
- precomputed_md_index_ = -1;
1538
- #endif
1539
- dynamic_table_updates_allowed_ = 2;
1540
- last_error_ = GRPC_ERROR_NONE;
1296
+ grpc_error_handle HPackParser::ParseInput(Input input, bool is_last) {
1297
+ if (ParseInputInner(&input)) {
1298
+ return GRPC_ERROR_NONE;
1299
+ }
1300
+ if (input.eof_error()) {
1301
+ if (GPR_UNLIKELY(is_last && is_boundary())) {
1302
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1303
+ "Incomplete header at the end of a header/continuation sequence");
1304
+ }
1305
+ unparsed_bytes_ = std::vector<uint8_t>(input.frontier(), input.end_ptr());
1306
+ return GRPC_ERROR_NONE;
1307
+ }
1308
+ return input.TakeError();
1541
1309
  }
1542
1310
 
1543
- void HPackParser::BeginFrame(Sink sink, Boundary boundary, Priority priority) {
1544
- sink_ = std::move(sink);
1545
- boundary_ = boundary;
1546
- switch (priority) {
1547
- case Priority::Included:
1548
- after_prioritization_ = state_;
1549
- state_ = &HPackParser::parse_stream_dep0;
1550
- break;
1311
+ bool HPackParser::ParseInputInner(Input* input) {
1312
+ switch (priority_) {
1551
1313
  case Priority::None:
1552
1314
  break;
1315
+ case Priority::Included: {
1316
+ if (input->remaining() < 5) return input->UnexpectedEOF(false);
1317
+ input->Advance(5);
1318
+ input->UpdateFrontier();
1319
+ priority_ = Priority::None;
1320
+ }
1553
1321
  }
1554
- }
1555
-
1556
- HPackParser::~HPackParser() {
1557
- grpc_chttp2_hptbl_destroy(&table_);
1558
- GRPC_ERROR_UNREF(last_error_);
1559
- grpc_slice_unref_internal(key_.data_.referenced);
1560
- grpc_slice_unref_internal(value_.data_.referenced);
1561
- gpr_free(key_.data_.copied.str);
1562
- gpr_free(value_.data_.copied.str);
1563
- }
1564
-
1565
- grpc_error_handle HPackParser::Parse(const grpc_slice& slice) {
1566
- /* max number of bytes to parse at a time... limits call stack depth on
1567
- * compilers without TCO */
1568
- #define MAX_PARSE_LENGTH 1024
1569
- current_slice_refcount_ = slice.refcount;
1570
- const uint8_t* start = GRPC_SLICE_START_PTR(slice);
1571
- const uint8_t* end = GRPC_SLICE_END_PTR(slice);
1572
- grpc_error_handle error = GRPC_ERROR_NONE;
1573
- while (start != end && error == GRPC_ERROR_NONE) {
1574
- const uint8_t* target = start + GPR_MIN(MAX_PARSE_LENGTH, end - start);
1575
- error = (this->*state_)(start, target);
1576
- start = target;
1322
+ while (!input->end_of_stream()) {
1323
+ if (GPR_UNLIKELY(!Parser(input, metadata_buffer_, metadata_size_limit_,
1324
+ &table_, &dynamic_table_updates_allowed_,
1325
+ &frame_length_, log_info_)
1326
+ .Parse())) {
1327
+ return false;
1328
+ }
1329
+ input->UpdateFrontier();
1577
1330
  }
1578
- current_slice_refcount_ = nullptr;
1579
- return error;
1331
+ return true;
1580
1332
  }
1581
1333
 
1334
+ void HPackParser::FinishFrame() { metadata_buffer_ = nullptr; }
1335
+
1582
1336
  } // namespace grpc_core
1583
1337
 
1584
1338
  // TODO(ctiller): this serves as an eviction notice for the remainder of this
@@ -1605,10 +1359,11 @@ static void force_client_rst_stream(void* sp, grpc_error_handle /*error*/) {
1605
1359
  static void parse_stream_compression_md(grpc_chttp2_transport* /*t*/,
1606
1360
  grpc_chttp2_stream* s,
1607
1361
  grpc_metadata_batch* initial_metadata) {
1608
- if (initial_metadata->idx.named.content_encoding == nullptr ||
1362
+ if (initial_metadata->legacy_index()->named.content_encoding == nullptr ||
1609
1363
  grpc_stream_compression_method_parse(
1610
- GRPC_MDVALUE(initial_metadata->idx.named.content_encoding->md), false,
1611
- &s->stream_decompression_method) == 0) {
1364
+ GRPC_MDVALUE(
1365
+ initial_metadata->legacy_index()->named.content_encoding->md),
1366
+ false, &s->stream_decompression_method) == 0) {
1612
1367
  s->stream_decompression_method =
1613
1368
  GRPC_STREAM_COMPRESSION_IDENTITY_DECOMPRESS;
1614
1369
  }
@@ -1630,27 +1385,23 @@ grpc_error_handle grpc_chttp2_header_parser_parse(void* hpack_parser,
1630
1385
  if (s != nullptr) {
1631
1386
  s->stats.incoming.header_bytes += GRPC_SLICE_LENGTH(slice);
1632
1387
  }
1633
- grpc_error_handle error = parser->Parse(slice);
1388
+ grpc_error_handle error = parser->Parse(slice, is_last != 0);
1634
1389
  if (error != GRPC_ERROR_NONE) {
1635
1390
  return error;
1636
1391
  }
1637
1392
  if (is_last) {
1638
- if (parser->is_boundary() && !parser->is_in_begin_state()) {
1639
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1640
- "end of header frame not aligned with a hpack record boundary");
1641
- }
1642
1393
  /* need to check for null stream: this can occur if we receive an invalid
1643
1394
  stream id on a header */
1644
1395
  if (s != nullptr) {
1645
1396
  if (parser->is_boundary()) {
1646
- if (s->header_frames_received == GPR_ARRAY_SIZE(s->metadata_buffer)) {
1397
+ if (s->header_frames_received == 2) {
1647
1398
  return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1648
1399
  "Too many trailer frames");
1649
1400
  }
1650
1401
  /* Process stream compression md element if it exists */
1651
1402
  if (s->header_frames_received ==
1652
1403
  0) { /* Only acts on initial metadata */
1653
- parse_stream_compression_md(t, s, &s->metadata_buffer[0].batch);
1404
+ parse_stream_compression_md(t, s, &s->initial_metadata_buffer);
1654
1405
  }
1655
1406
  s->published_metadata[s->header_frames_received] =
1656
1407
  GRPC_METADATA_PUBLISHED_FROM_WIRE;