grpc 1.40.0 → 1.41.0.pre2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (827) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +27 -36
  3. data/include/grpc/byte_buffer.h +1 -1
  4. data/include/grpc/byte_buffer_reader.h +1 -1
  5. data/include/grpc/event_engine/endpoint_config.h +6 -11
  6. data/include/grpc/event_engine/event_engine.h +63 -58
  7. data/include/grpc/event_engine/port.h +1 -3
  8. data/include/grpc/event_engine/slice_allocator.h +6 -1
  9. data/include/grpc/fork.h +1 -1
  10. data/include/grpc/grpc.h +10 -4
  11. data/include/grpc/grpc_posix.h +5 -2
  12. data/include/grpc/impl/codegen/atm.h +5 -3
  13. data/include/grpc/impl/codegen/atm_gcc_atomic.h +2 -0
  14. data/include/grpc/impl/codegen/atm_gcc_sync.h +2 -0
  15. data/include/grpc/impl/codegen/atm_windows.h +2 -0
  16. data/include/grpc/impl/codegen/byte_buffer.h +2 -0
  17. data/include/grpc/impl/codegen/byte_buffer_reader.h +2 -0
  18. data/include/grpc/impl/codegen/compression_types.h +2 -0
  19. data/include/grpc/impl/codegen/connectivity_state.h +2 -0
  20. data/include/grpc/impl/codegen/fork.h +2 -0
  21. data/include/grpc/impl/codegen/gpr_slice.h +2 -0
  22. data/include/grpc/impl/codegen/gpr_types.h +2 -0
  23. data/include/grpc/impl/codegen/grpc_types.h +4 -5
  24. data/include/grpc/impl/codegen/log.h +2 -0
  25. data/include/grpc/impl/codegen/port_platform.h +26 -22
  26. data/include/grpc/impl/codegen/propagation_bits.h +2 -0
  27. data/include/grpc/impl/codegen/slice.h +2 -0
  28. data/include/grpc/impl/codegen/status.h +2 -0
  29. data/include/grpc/impl/codegen/sync.h +8 -5
  30. data/include/grpc/impl/codegen/sync_abseil.h +2 -0
  31. data/include/grpc/impl/codegen/sync_custom.h +2 -0
  32. data/include/grpc/impl/codegen/sync_generic.h +3 -0
  33. data/include/grpc/impl/codegen/sync_posix.h +4 -2
  34. data/include/grpc/impl/codegen/sync_windows.h +2 -0
  35. data/include/grpc/slice.h +1 -1
  36. data/include/grpc/status.h +1 -1
  37. data/include/grpc/support/atm.h +1 -1
  38. data/include/grpc/support/atm_gcc_atomic.h +1 -1
  39. data/include/grpc/support/atm_gcc_sync.h +1 -1
  40. data/include/grpc/support/atm_windows.h +1 -1
  41. data/include/grpc/support/log.h +1 -1
  42. data/include/grpc/support/port_platform.h +1 -1
  43. data/include/grpc/support/sync.h +1 -1
  44. data/include/grpc/support/sync_abseil.h +1 -1
  45. data/include/grpc/support/sync_custom.h +1 -1
  46. data/include/grpc/support/sync_generic.h +1 -1
  47. data/include/grpc/support/sync_posix.h +1 -1
  48. data/include/grpc/support/sync_windows.h +1 -1
  49. data/include/grpc/support/time.h +2 -2
  50. data/src/core/ext/filters/census/grpc_context.cc +1 -0
  51. data/src/core/ext/filters/client_channel/backend_metric.cc +0 -1
  52. data/src/core/ext/filters/client_channel/backup_poller.h +1 -0
  53. data/src/core/ext/filters/client_channel/channel_connectivity.cc +1 -2
  54. data/src/core/ext/filters/client_channel/client_channel.cc +24 -52
  55. data/src/core/ext/filters/client_channel/client_channel.h +3 -3
  56. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +6 -5
  57. data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -1
  58. data/src/core/ext/filters/client_channel/client_channel_factory.cc +1 -0
  59. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +8 -1
  60. data/src/core/ext/filters/client_channel/config_selector.cc +1 -0
  61. data/src/core/ext/filters/client_channel/health/health_check_client.cc +7 -6
  62. data/src/core/ext/filters/client_channel/health/health_check_client.h +4 -3
  63. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +8 -7
  64. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +10 -2
  65. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +2 -2
  66. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +2 -8
  67. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -2
  68. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +2 -2
  69. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -2
  70. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -1
  71. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +14 -23
  72. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +1 -0
  73. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +2 -2
  74. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +2 -8
  75. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +15 -18
  76. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +10 -7
  77. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +2 -8
  78. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +2 -3
  79. data/src/core/ext/filters/client_channel/lb_policy.h +11 -44
  80. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -7
  81. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +2 -10
  82. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -0
  83. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -3
  84. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +6 -5
  85. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +14 -19
  86. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +1 -0
  87. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
  88. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +5 -5
  89. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +5 -8
  90. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +2 -3
  91. data/src/core/ext/filters/client_idle/client_idle_filter.cc +36 -30
  92. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +8 -6
  93. data/src/core/ext/filters/fault_injection/service_config_parser.cc +6 -13
  94. data/src/core/ext/filters/http/client/http_client_filter.cc +3 -2
  95. data/src/core/ext/filters/http/client_authority_filter.cc +2 -1
  96. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +2 -1
  97. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +7 -8
  98. data/src/core/ext/filters/http/server/http_server_filter.cc +5 -3
  99. data/src/core/ext/filters/message_size/message_size_filter.cc +9 -13
  100. data/src/core/ext/transport/chttp2/alpn/alpn.cc +2 -1
  101. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +29 -12
  102. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +2 -0
  103. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +2 -3
  104. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +10 -6
  105. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +2 -3
  106. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +60 -37
  107. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +0 -1
  108. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +12 -6
  109. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +5 -9
  110. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +3 -1
  111. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +2 -1
  112. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +1 -0
  113. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +4 -3
  114. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +2 -2
  115. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +24 -30
  116. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +4 -1
  117. data/src/core/ext/transport/chttp2/transport/context_list.h +1 -2
  118. data/src/core/ext/transport/chttp2/transport/flow_control.cc +39 -23
  119. data/src/core/ext/transport/chttp2/transport/flow_control.h +9 -3
  120. data/src/core/ext/transport/chttp2/transport/frame_data.cc +7 -7
  121. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -0
  122. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +4 -3
  123. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +1 -0
  124. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -4
  125. data/src/core/ext/transport/chttp2/transport/frame_ping.h +1 -0
  126. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +3 -5
  127. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +1 -0
  128. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +36 -5
  129. data/src/core/ext/transport/chttp2/transport/frame_settings.h +1 -0
  130. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +12 -7
  131. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +1 -0
  132. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +41 -0
  133. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +272 -666
  134. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +236 -70
  135. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +107 -0
  136. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +86 -0
  137. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +69 -0
  138. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +776 -1037
  139. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +48 -169
  140. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +159 -0
  141. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +130 -0
  142. data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +46 -0
  143. data/src/core/ext/transport/chttp2/transport/hpack_utils.h +30 -0
  144. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -2
  145. data/src/core/ext/transport/chttp2/transport/internal.h +2 -2
  146. data/src/core/ext/transport/chttp2/transport/parsing.cc +20 -30
  147. data/src/core/ext/transport/chttp2/transport/popularity_count.h +60 -0
  148. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +2 -2
  149. data/src/core/ext/transport/chttp2/transport/varint.cc +7 -3
  150. data/src/core/ext/transport/chttp2/transport/varint.h +39 -28
  151. data/src/core/ext/transport/chttp2/transport/writing.cc +32 -28
  152. data/src/core/ext/transport/inproc/inproc_transport.cc +6 -4
  153. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +96 -96
  154. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +221 -89
  155. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +1 -1
  156. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +1 -1
  157. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +3 -3
  158. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +11 -5
  159. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +48 -48
  160. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +151 -61
  161. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +99 -99
  162. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +171 -69
  163. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +15 -15
  164. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +31 -13
  165. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +126 -127
  166. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +229 -101
  167. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +4 -4
  168. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +11 -5
  169. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +23 -23
  170. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +11 -5
  171. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +28 -28
  172. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +71 -29
  173. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +4 -4
  174. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +11 -5
  175. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +82 -82
  176. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +201 -81
  177. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +24 -24
  178. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +51 -21
  179. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +3 -3
  180. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +11 -5
  181. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +9 -9
  182. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +21 -9
  183. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +62 -62
  184. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +131 -53
  185. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +51 -51
  186. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +81 -33
  187. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +5 -5
  188. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +11 -5
  189. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +62 -62
  190. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +141 -57
  191. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +3 -3
  192. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +11 -5
  193. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +7 -7
  194. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +21 -9
  195. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +8 -8
  196. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +11 -5
  197. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +8 -8
  198. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +11 -5
  199. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +4 -4
  200. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +11 -5
  201. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +16 -16
  202. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +31 -13
  203. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +57 -22
  204. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +174 -17
  205. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +32 -32
  206. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +51 -21
  207. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +3 -3
  208. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +11 -5
  209. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +37 -37
  210. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +61 -25
  211. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +40 -40
  212. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +71 -29
  213. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +9 -9
  214. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +11 -5
  215. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +5 -5
  216. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +21 -9
  217. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +30 -30
  218. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +81 -33
  219. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +41 -29
  220. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +141 -43
  221. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +46 -43
  222. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +88 -29
  223. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +18 -18
  224. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +31 -13
  225. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +281 -277
  226. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +569 -248
  227. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +10 -10
  228. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +31 -13
  229. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +6 -6
  230. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +21 -9
  231. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +3 -3
  232. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +11 -5
  233. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +13 -13
  234. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +51 -21
  235. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +23 -23
  236. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +31 -13
  237. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +9 -9
  238. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +11 -5
  239. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +115 -116
  240. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +191 -77
  241. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +1 -1
  242. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +1 -1
  243. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +46 -32
  244. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +118 -34
  245. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +12 -12
  246. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +31 -13
  247. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +44 -42
  248. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +108 -55
  249. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +2 -2
  250. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +11 -5
  251. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +2 -2
  252. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +11 -5
  253. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +42 -42
  254. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +61 -25
  255. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +2 -2
  256. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +11 -5
  257. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +2 -2
  258. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +11 -5
  259. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +9 -9
  260. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +21 -9
  261. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +2 -2
  262. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +11 -5
  263. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +2 -2
  264. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +11 -5
  265. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +28 -28
  266. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +51 -21
  267. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +8 -8
  268. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +41 -17
  269. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +9 -8
  270. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +25 -9
  271. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +4 -4
  272. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +11 -5
  273. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +4 -4
  274. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +11 -5
  275. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +3 -3
  276. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +11 -5
  277. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +9 -9
  278. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +31 -13
  279. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +10 -10
  280. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +21 -9
  281. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +6 -6
  282. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +21 -9
  283. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +11 -11
  284. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +31 -13
  285. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +15 -15
  286. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +71 -29
  287. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +19 -19
  288. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +51 -21
  289. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.c +1 -1
  290. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +1 -1
  291. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +6 -6
  292. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +21 -9
  293. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +10 -10
  294. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +31 -13
  295. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +5 -5
  296. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +11 -5
  297. data/src/core/ext/upb-generated/google/api/annotations.upb.c +1 -1
  298. data/src/core/ext/upb-generated/google/api/annotations.upb.h +1 -1
  299. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +58 -58
  300. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +111 -45
  301. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +68 -68
  302. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +121 -49
  303. data/src/core/ext/upb-generated/google/api/http.upb.c +18 -18
  304. data/src/core/ext/upb-generated/google/api/http.upb.h +31 -13
  305. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +4 -4
  306. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +11 -5
  307. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +153 -153
  308. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +271 -109
  309. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +4 -4
  310. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +11 -5
  311. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +2 -2
  312. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +11 -5
  313. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +15 -15
  314. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +31 -13
  315. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +4 -4
  316. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +11 -5
  317. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +19 -19
  318. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +91 -37
  319. data/src/core/ext/upb-generated/google/rpc/status.upb.c +5 -5
  320. data/src/core/ext/upb-generated/google/rpc/status.upb.h +11 -5
  321. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +12 -12
  322. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +11 -5
  323. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +60 -60
  324. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +101 -41
  325. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +7 -7
  326. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +21 -9
  327. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +5 -5
  328. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +21 -9
  329. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +31 -31
  330. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +91 -37
  331. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +8 -8
  332. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +31 -13
  333. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +4 -4
  334. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +11 -5
  335. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +1 -1
  336. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +1 -1
  337. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +4 -4
  338. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +11 -5
  339. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +3 -3
  340. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +11 -5
  341. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +13 -13
  342. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +11 -5
  343. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.c +4 -4
  344. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +11 -5
  345. data/src/core/ext/upb-generated/validate/validate.upb.c +220 -220
  346. data/src/core/ext/upb-generated/validate/validate.upb.h +231 -93
  347. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +3 -3
  348. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +11 -5
  349. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +8 -8
  350. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +21 -9
  351. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +6 -6
  352. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +11 -5
  353. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +5 -5
  354. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +11 -5
  355. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +11 -11
  356. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +21 -9
  357. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +6 -6
  358. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +11 -5
  359. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +384 -382
  360. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +94 -63
  361. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +10 -0
  362. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +30 -19
  363. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +5 -0
  364. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +791 -780
  365. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +96 -100
  366. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +133 -115
  367. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +5 -0
  368. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +178 -173
  369. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +14 -13
  370. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +103 -103
  371. data/src/core/ext/xds/certificate_provider_registry.cc +2 -2
  372. data/src/core/ext/xds/xds_api.cc +788 -910
  373. data/src/core/ext/xds/xds_api.h +16 -33
  374. data/src/core/ext/xds/xds_bootstrap.cc +27 -52
  375. data/src/core/ext/xds/xds_client.cc +69 -30
  376. data/src/core/ext/xds/xds_client_stats.cc +16 -15
  377. data/src/core/ext/xds/xds_client_stats.h +6 -6
  378. data/src/core/ext/xds/xds_http_fault_filter.cc +4 -3
  379. data/src/core/ext/xds/xds_http_fault_filter.h +3 -2
  380. data/src/core/ext/xds/xds_http_filters.cc +1 -0
  381. data/src/core/ext/xds/xds_server_config_fetcher.cc +10 -10
  382. data/src/core/lib/address_utils/parse_address.cc +4 -8
  383. data/src/core/lib/address_utils/sockaddr_utils.cc +2 -2
  384. data/src/core/lib/channel/channel_args.cc +2 -1
  385. data/src/core/lib/channel/channel_stack.cc +5 -3
  386. data/src/core/lib/channel/channel_stack_builder.cc +1 -11
  387. data/src/core/lib/channel/channel_stack_builder.h +0 -8
  388. data/src/core/lib/channel/channel_trace.cc +4 -3
  389. data/src/core/lib/channel/channel_trace.h +1 -0
  390. data/src/core/lib/channel/channelz.cc +40 -36
  391. data/src/core/lib/channel/channelz.h +27 -27
  392. data/src/core/lib/channel/channelz_registry.cc +7 -6
  393. data/src/core/lib/channel/connected_channel.cc +1 -0
  394. data/src/core/lib/channel/handshaker.cc +2 -1
  395. data/src/core/lib/channel/handshaker.h +1 -2
  396. data/src/core/lib/channel/handshaker_factory.h +10 -2
  397. data/src/core/lib/channel/handshaker_registry.cc +15 -70
  398. data/src/core/lib/channel/handshaker_registry.h +29 -12
  399. data/src/core/lib/channel/status_util.h +2 -2
  400. data/src/core/lib/compression/algorithm_metadata.h +1 -0
  401. data/src/core/lib/compression/compression_args.cc +2 -1
  402. data/src/core/lib/compression/compression_internal.cc +2 -4
  403. data/src/core/lib/compression/message_compress.cc +2 -2
  404. data/src/core/lib/compression/stream_compression.cc +2 -1
  405. data/src/core/lib/compression/stream_compression.h +2 -1
  406. data/src/core/lib/compression/stream_compression_gzip.cc +2 -1
  407. data/src/core/lib/compression/stream_compression_identity.cc +2 -1
  408. data/src/core/lib/config/core_configuration.cc +54 -0
  409. data/src/core/lib/config/core_configuration.h +108 -0
  410. data/src/core/lib/debug/stats.h +1 -0
  411. data/src/core/lib/debug/stats_data.cc +2 -1
  412. data/src/core/lib/debug/stats_data.h +1 -0
  413. data/src/core/lib/debug/trace.cc +1 -0
  414. data/src/core/lib/debug/trace.h +2 -1
  415. data/src/core/lib/event_engine/endpoint_config.cc +0 -1
  416. data/src/core/lib/event_engine/event_engine.cc +3 -3
  417. data/src/core/lib/event_engine/sockaddr.cc +3 -3
  418. data/src/core/lib/gpr/alloc.cc +4 -3
  419. data/src/core/lib/gpr/env_linux.cc +1 -2
  420. data/src/core/lib/gpr/env_posix.cc +2 -3
  421. data/src/core/lib/gpr/log.cc +3 -3
  422. data/src/core/lib/gpr/log_android.cc +3 -2
  423. data/src/core/lib/gpr/log_linux.cc +7 -4
  424. data/src/core/lib/gpr/log_posix.cc +6 -3
  425. data/src/core/lib/gpr/string.h +2 -2
  426. data/src/core/lib/gpr/sync.cc +2 -2
  427. data/src/core/lib/gpr/sync_abseil.cc +7 -6
  428. data/src/core/lib/gpr/sync_posix.cc +3 -3
  429. data/src/core/lib/gpr/time.cc +3 -2
  430. data/src/core/lib/gpr/time_windows.cc +3 -2
  431. data/src/core/lib/gpr/tls.h +120 -41
  432. data/src/core/lib/gpr/tmpfile_posix.cc +1 -2
  433. data/src/core/lib/gprpp/arena.cc +2 -1
  434. data/src/core/lib/gprpp/arena.h +5 -5
  435. data/src/core/lib/gprpp/atomic_utils.h +47 -0
  436. data/src/core/lib/gprpp/bitset.h +166 -0
  437. data/src/core/lib/gprpp/construct_destruct.h +39 -0
  438. data/src/core/lib/gprpp/dual_ref_counted.h +25 -26
  439. data/src/core/lib/gprpp/fork.cc +14 -12
  440. data/src/core/lib/gprpp/fork.h +4 -4
  441. data/src/core/lib/gprpp/global_config.h +1 -2
  442. data/src/core/lib/gprpp/global_config_env.cc +7 -7
  443. data/src/core/lib/gprpp/global_config_generic.h +2 -2
  444. data/src/core/lib/gprpp/manual_constructor.h +8 -5
  445. data/src/core/lib/gprpp/match.h +73 -0
  446. data/src/core/lib/gprpp/memory.h +3 -3
  447. data/src/core/lib/gprpp/mpscq.cc +7 -7
  448. data/src/core/lib/gprpp/mpscq.h +6 -5
  449. data/src/core/lib/gprpp/orphanable.h +3 -3
  450. data/src/core/lib/gprpp/overload.h +59 -0
  451. data/src/core/lib/gprpp/ref_counted.h +18 -18
  452. data/src/core/lib/gprpp/status_helper.cc +4 -4
  453. data/src/core/lib/gprpp/sync.h +3 -1
  454. data/src/core/lib/gprpp/thd_posix.cc +5 -5
  455. data/src/core/lib/gprpp/thd_windows.cc +4 -11
  456. data/src/core/lib/gprpp/time_util.cc +2 -2
  457. data/src/core/lib/gprpp/time_util.h +2 -2
  458. data/src/core/lib/http/format_request.cc +1 -0
  459. data/src/core/lib/http/format_request.h +1 -0
  460. data/src/core/lib/http/httpcli.cc +9 -9
  461. data/src/core/lib/http/httpcli.h +3 -0
  462. data/src/core/lib/http/httpcli_security_connector.cc +5 -8
  463. data/src/core/lib/http/parser.h +1 -0
  464. data/src/core/lib/iomgr/buffer_list.cc +2 -1
  465. data/src/core/lib/iomgr/buffer_list.h +1 -2
  466. data/src/core/lib/iomgr/call_combiner.cc +1 -0
  467. data/src/core/lib/iomgr/cfstream_handle.cc +1 -1
  468. data/src/core/lib/iomgr/combiner.cc +3 -2
  469. data/src/core/lib/iomgr/combiner.h +1 -0
  470. data/src/core/lib/iomgr/dualstack_socket_posix.cc +1 -0
  471. data/src/core/lib/iomgr/endpoint.cc +0 -4
  472. data/src/core/lib/iomgr/endpoint.h +1 -3
  473. data/src/core/lib/iomgr/endpoint_cfstream.cc +9 -20
  474. data/src/core/lib/iomgr/endpoint_cfstream.h +1 -1
  475. data/src/core/lib/iomgr/endpoint_pair.h +1 -0
  476. data/src/core/lib/iomgr/endpoint_pair_event_engine.cc +1 -2
  477. data/src/core/lib/iomgr/endpoint_pair_posix.cc +15 -11
  478. data/src/core/lib/iomgr/endpoint_pair_windows.cc +17 -9
  479. data/src/core/lib/iomgr/error.h +23 -9
  480. data/src/core/lib/iomgr/error_cfstream.cc +2 -2
  481. data/src/core/lib/iomgr/error_internal.h +1 -0
  482. data/src/core/lib/iomgr/ev_epoll1_linux.cc +14 -22
  483. data/src/core/lib/iomgr/ev_epollex_linux.cc +15 -22
  484. data/src/core/lib/iomgr/ev_poll_posix.cc +13 -25
  485. data/src/core/lib/iomgr/ev_posix.cc +1 -2
  486. data/src/core/lib/iomgr/event_engine/endpoint.cc +3 -22
  487. data/src/core/lib/iomgr/event_engine/endpoint.h +1 -2
  488. data/src/core/lib/iomgr/event_engine/iomgr.cc +17 -18
  489. data/src/core/lib/iomgr/event_engine/iomgr.h +20 -2
  490. data/src/core/lib/iomgr/event_engine/resolver.cc +2 -1
  491. data/src/core/lib/iomgr/event_engine/tcp.cc +53 -24
  492. data/src/core/lib/iomgr/exec_ctx.cc +3 -4
  493. data/src/core/lib/iomgr/exec_ctx.h +11 -19
  494. data/src/core/lib/iomgr/executor/mpmcqueue.cc +10 -9
  495. data/src/core/lib/iomgr/executor/mpmcqueue.h +4 -3
  496. data/src/core/lib/iomgr/executor/threadpool.cc +2 -2
  497. data/src/core/lib/iomgr/executor/threadpool.h +2 -1
  498. data/src/core/lib/iomgr/executor.cc +5 -6
  499. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +2 -2
  500. data/src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc +2 -2
  501. data/src/core/lib/iomgr/internal_errqueue.cc +3 -2
  502. data/src/core/lib/iomgr/iocp_windows.cc +1 -0
  503. data/src/core/lib/iomgr/iomgr.h +2 -2
  504. data/src/core/lib/iomgr/iomgr_custom.cc +2 -2
  505. data/src/core/lib/iomgr/iomgr_custom.h +2 -2
  506. data/src/core/lib/iomgr/iomgr_internal.cc +2 -1
  507. data/src/core/lib/iomgr/iomgr_windows.cc +1 -2
  508. data/src/core/lib/iomgr/is_epollexclusive_available.cc +4 -4
  509. data/src/core/lib/iomgr/polling_entity.cc +2 -2
  510. data/src/core/lib/iomgr/pollset_custom.cc +3 -4
  511. data/src/core/lib/iomgr/pollset_custom.h +2 -2
  512. data/src/core/lib/iomgr/pollset_set_custom.cc +1 -2
  513. data/src/core/lib/iomgr/pollset_set_windows.cc +1 -0
  514. data/src/core/lib/iomgr/port.h +0 -5
  515. data/src/core/lib/iomgr/python_util.h +1 -0
  516. data/src/core/lib/iomgr/resolve_address.cc +2 -1
  517. data/src/core/lib/iomgr/resolve_address.h +0 -4
  518. data/src/core/lib/iomgr/resolve_address_custom.cc +4 -4
  519. data/src/core/lib/iomgr/resolve_address_custom.h +0 -1
  520. data/src/core/lib/iomgr/resolve_address_posix.cc +2 -4
  521. data/src/core/lib/iomgr/resolve_address_windows.cc +6 -8
  522. data/src/core/lib/iomgr/resource_quota.cc +127 -42
  523. data/src/core/lib/iomgr/resource_quota.h +66 -17
  524. data/src/core/lib/iomgr/sockaddr.h +1 -1
  525. data/src/core/lib/iomgr/socket_factory_posix.cc +3 -3
  526. data/src/core/lib/iomgr/socket_factory_posix.h +1 -0
  527. data/src/core/lib/iomgr/socket_mutator.h +2 -2
  528. data/src/core/lib/iomgr/socket_utils_common_posix.cc +3 -3
  529. data/src/core/lib/iomgr/socket_utils_linux.cc +4 -4
  530. data/src/core/lib/iomgr/socket_utils_posix.cc +2 -2
  531. data/src/core/lib/iomgr/socket_utils_posix.h +2 -2
  532. data/src/core/lib/iomgr/socket_utils_windows.cc +2 -2
  533. data/src/core/lib/iomgr/tcp_client.cc +4 -2
  534. data/src/core/lib/iomgr/tcp_client.h +4 -0
  535. data/src/core/lib/iomgr/tcp_client_cfstream.cc +9 -19
  536. data/src/core/lib/iomgr/tcp_client_custom.cc +9 -17
  537. data/src/core/lib/iomgr/tcp_client_posix.cc +24 -9
  538. data/src/core/lib/iomgr/tcp_client_posix.h +5 -2
  539. data/src/core/lib/iomgr/tcp_client_windows.cc +14 -6
  540. data/src/core/lib/iomgr/tcp_custom.cc +11 -23
  541. data/src/core/lib/iomgr/tcp_custom.h +2 -1
  542. data/src/core/lib/iomgr/tcp_posix.cc +29 -59
  543. data/src/core/lib/iomgr/tcp_posix.h +11 -12
  544. data/src/core/lib/iomgr/tcp_server.cc +6 -4
  545. data/src/core/lib/iomgr/tcp_server.h +12 -9
  546. data/src/core/lib/iomgr/tcp_server_custom.cc +15 -33
  547. data/src/core/lib/iomgr/tcp_server_posix.cc +20 -13
  548. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
  549. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -2
  550. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +3 -4
  551. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +4 -4
  552. data/src/core/lib/iomgr/tcp_server_windows.cc +13 -9
  553. data/src/core/lib/iomgr/tcp_windows.cc +6 -25
  554. data/src/core/lib/iomgr/tcp_windows.h +2 -1
  555. data/src/core/lib/iomgr/timer.cc +1 -0
  556. data/src/core/lib/iomgr/timer.h +1 -2
  557. data/src/core/lib/iomgr/timer_custom.cc +2 -2
  558. data/src/core/lib/iomgr/timer_generic.cc +8 -38
  559. data/src/core/lib/iomgr/timer_generic.h +1 -0
  560. data/src/core/lib/iomgr/timer_heap.cc +1 -2
  561. data/src/core/lib/iomgr/udp_server.cc +1 -2
  562. data/src/core/lib/iomgr/unix_sockets_posix.cc +3 -5
  563. data/src/core/lib/iomgr/unix_sockets_posix.h +2 -3
  564. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +1 -0
  565. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -3
  566. data/src/core/lib/iomgr/wakeup_fd_posix.cc +1 -0
  567. data/src/core/lib/iomgr/work_serializer.cc +4 -4
  568. data/src/core/lib/iomgr/work_serializer.h +1 -1
  569. data/src/core/lib/json/json_reader.cc +9 -17
  570. data/src/core/lib/json/json_util.h +18 -26
  571. data/src/core/lib/matchers/matchers.h +0 -1
  572. data/src/core/lib/profiling/basic_timers.cc +8 -6
  573. data/src/core/lib/profiling/stap_timers.cc +2 -2
  574. data/src/core/lib/security/authorization/authorization_policy_provider.h +5 -4
  575. data/src/core/lib/security/authorization/evaluate_args.cc +2 -0
  576. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +159 -0
  577. data/src/core/lib/security/authorization/sdk_server_authz_filter.h +67 -0
  578. data/src/core/lib/security/context/security_context.cc +7 -6
  579. data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +2 -2
  580. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -2
  581. data/src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc +2 -2
  582. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -3
  583. data/src/core/lib/security/credentials/credentials.cc +6 -6
  584. data/src/core/lib/security/credentials/credentials.h +1 -1
  585. data/src/core/lib/security/credentials/credentials_metadata.cc +2 -3
  586. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +13 -26
  587. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +1 -2
  588. data/src/core/lib/security/credentials/external/aws_request_signer.cc +3 -3
  589. data/src/core/lib/security/credentials/external/external_account_credentials.cc +13 -22
  590. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -4
  591. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +1 -2
  592. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +55 -3
  593. data/src/core/lib/security/credentials/iam/iam_credentials.cc +2 -1
  594. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  595. data/src/core/lib/security/credentials/jwt/json_token.h +2 -1
  596. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +31 -14
  597. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +11 -3
  598. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +0 -2
  599. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +3 -3
  600. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +3 -7
  601. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -0
  602. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -4
  603. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +4 -4
  604. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +0 -1
  605. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +3 -2
  606. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +10 -6
  607. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +2 -1
  608. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +7 -5
  609. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +2 -2
  610. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +4 -6
  611. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +1 -0
  612. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +3 -3
  613. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +4 -7
  614. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +1 -2
  615. data/src/core/lib/security/security_connector/ssl_utils.cc +2 -3
  616. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +9 -14
  617. data/src/core/lib/security/transport/auth_filters.h +1 -0
  618. data/src/core/lib/security/transport/client_auth_filter.cc +4 -6
  619. data/src/core/lib/security/transport/secure_endpoint.cc +4 -14
  620. data/src/core/lib/security/transport/secure_endpoint.h +1 -0
  621. data/src/core/lib/security/transport/security_handshaker.cc +5 -4
  622. data/src/core/lib/security/transport/security_handshaker.h +2 -1
  623. data/src/core/lib/security/util/json_util.cc +6 -8
  624. data/src/core/lib/slice/percent_encoding.cc +73 -30
  625. data/src/core/lib/slice/percent_encoding.h +29 -28
  626. data/src/core/lib/slice/slice.cc +2 -3
  627. data/src/core/lib/slice/slice_buffer.cc +1 -2
  628. data/src/core/lib/slice/slice_intern.cc +2 -3
  629. data/src/core/lib/slice/slice_internal.h +2 -2
  630. data/src/core/lib/surface/api_trace.cc +2 -1
  631. data/src/core/lib/surface/api_trace.h +1 -0
  632. data/src/core/lib/surface/byte_buffer_reader.cc +1 -1
  633. data/src/core/lib/surface/call.cc +9 -8
  634. data/src/core/lib/surface/call.h +3 -3
  635. data/src/core/lib/surface/call_details.cc +2 -2
  636. data/src/core/lib/surface/call_log_batch.cc +2 -2
  637. data/src/core/lib/surface/channel.cc +22 -9
  638. data/src/core/lib/surface/channel.h +14 -2
  639. data/src/core/lib/surface/channel_ping.cc +1 -2
  640. data/src/core/lib/surface/channel_stack_type.cc +2 -1
  641. data/src/core/lib/surface/completion_queue.cc +54 -64
  642. data/src/core/lib/surface/completion_queue_factory.cc +2 -1
  643. data/src/core/lib/surface/completion_queue_factory.h +1 -0
  644. data/src/core/lib/surface/event_string.cc +1 -0
  645. data/src/core/lib/surface/init.cc +4 -9
  646. data/src/core/lib/surface/init.h +0 -1
  647. data/src/core/lib/surface/init_secure.cc +23 -4
  648. data/src/core/lib/surface/lame_client.cc +6 -5
  649. data/src/core/lib/surface/metadata_array.cc +2 -2
  650. data/src/core/lib/surface/server.cc +17 -33
  651. data/src/core/lib/surface/server.h +11 -13
  652. data/src/core/lib/surface/validate_metadata.cc +44 -16
  653. data/src/core/lib/surface/version.cc +2 -2
  654. data/src/core/lib/transport/byte_stream.h +1 -0
  655. data/src/core/lib/transport/connectivity_state.cc +8 -5
  656. data/src/core/lib/transport/connectivity_state.h +2 -2
  657. data/src/core/lib/transport/error_utils.cc +1 -0
  658. data/src/core/lib/transport/metadata.cc +10 -10
  659. data/src/core/lib/transport/metadata.h +13 -11
  660. data/src/core/lib/transport/metadata_batch.h +8 -0
  661. data/src/core/lib/transport/transport_op_string.cc +2 -2
  662. data/src/core/plugin_registry/grpc_plugin_registry.cc +14 -0
  663. data/src/core/tsi/alts/crypt/aes_gcm.cc +3 -2
  664. data/src/core/tsi/alts/crypt/gsec.h +2 -3
  665. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +2 -2
  666. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +2 -3
  667. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +2 -2
  668. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +4 -3
  669. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +2 -2
  670. data/src/core/tsi/ssl_transport_security.cc +11 -9
  671. data/src/core/tsi/ssl_transport_security.h +3 -1
  672. data/src/core/tsi/transport_security.cc +3 -3
  673. data/src/core/tsi/transport_security_grpc.h +1 -0
  674. data/src/ruby/ext/grpc/extconf.rb +1 -1
  675. data/src/ruby/ext/grpc/rb_byte_buffer.c +2 -1
  676. data/src/ruby/ext/grpc/rb_call.c +5 -5
  677. data/src/ruby/ext/grpc/rb_call_credentials.c +5 -5
  678. data/src/ruby/ext/grpc/rb_channel.c +10 -8
  679. data/src/ruby/ext/grpc/rb_channel_args.c +2 -2
  680. data/src/ruby/ext/grpc/rb_channel_credentials.c +4 -4
  681. data/src/ruby/ext/grpc/rb_channel_credentials.h +1 -0
  682. data/src/ruby/ext/grpc/rb_completion_queue.c +3 -2
  683. data/src/ruby/ext/grpc/rb_compression_options.c +5 -4
  684. data/src/ruby/ext/grpc/rb_event_thread.c +4 -4
  685. data/src/ruby/ext/grpc/rb_grpc.c +5 -4
  686. data/src/ruby/ext/grpc/rb_grpc.h +1 -0
  687. data/src/ruby/ext/grpc/rb_server.c +6 -5
  688. data/src/ruby/ext/grpc/rb_server_credentials.c +3 -3
  689. data/src/ruby/ext/grpc/rb_server_credentials.h +1 -0
  690. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +8 -5
  691. data/src/ruby/ext/grpc/rb_xds_channel_credentials.h +3 -1
  692. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +6 -5
  693. data/src/ruby/ext/grpc/rb_xds_server_credentials.h +3 -1
  694. data/src/ruby/lib/grpc/version.rb +1 -1
  695. data/third_party/boringssl-with-bazel/err_data.c +294 -292
  696. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +52 -47
  697. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +1 -1
  698. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +1 -1
  699. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +1 -0
  700. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +1 -1
  701. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +1 -1
  702. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +1 -1
  703. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utf8.c +1 -1
  704. data/third_party/boringssl-with-bazel/src/crypto/asn1/{asn1_locl.h → internal.h} +20 -1
  705. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +1 -1
  706. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -1
  707. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +1 -1
  708. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +1 -1
  709. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +1 -1
  710. data/third_party/boringssl-with-bazel/src/crypto/asn1/time_support.c +1 -1
  711. data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +14 -3
  712. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +5 -3
  713. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +5 -6
  714. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +2 -0
  715. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +5 -9
  716. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +1 -1
  717. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +4 -6
  718. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +34 -0
  719. data/third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c +219 -121
  720. data/third_party/boringssl-with-bazel/src/crypto/hrss/internal.h +9 -2
  721. data/third_party/boringssl-with-bazel/src/crypto/internal.h +23 -2
  722. data/third_party/boringssl-with-bazel/src/crypto/lhash/internal.h +253 -0
  723. data/third_party/boringssl-with-bazel/src/crypto/lhash/lhash.c +28 -23
  724. data/third_party/boringssl-with-bazel/src/crypto/mem.c +2 -0
  725. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +7 -3
  726. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +1 -1
  727. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +1 -0
  728. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +4 -0
  729. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c +4 -0
  730. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +4 -0
  731. data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +2 -2
  732. data/third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c +15 -11
  733. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +1 -1
  734. data/third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c +1 -0
  735. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +45 -2
  736. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +4 -2
  737. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +10 -3
  738. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +6 -23
  739. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +2 -2
  740. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +1 -0
  741. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +25 -22
  742. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +0 -4
  743. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +1 -0
  744. data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +1 -3
  745. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +9 -11
  746. data/third_party/boringssl-with-bazel/src/crypto/x509/x_exten.c +2 -0
  747. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +1 -3
  748. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +1 -3
  749. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +1 -0
  750. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c +0 -2
  751. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +2 -0
  752. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +14 -11
  753. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +5 -5
  754. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +160 -74
  755. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +0 -1
  756. data/third_party/boringssl-with-bazel/src/include/openssl/conf.h +8 -5
  757. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +3 -0
  758. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +6 -0
  759. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +25 -0
  760. data/third_party/boringssl-with-bazel/src/include/openssl/hrss.h +14 -12
  761. data/third_party/boringssl-with-bazel/src/include/openssl/lhash.h +4 -205
  762. data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +3 -0
  763. data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +5 -4
  764. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +58 -6
  765. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +184 -55
  766. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +0 -5
  767. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +9 -16
  768. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +44 -2
  769. data/third_party/boringssl-with-bazel/src/ssl/{t1_lib.cc → extensions.cc} +24 -11
  770. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +9 -0
  771. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +75 -68
  772. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +17 -9
  773. data/third_party/boringssl-with-bazel/src/ssl/internal.h +25 -6
  774. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +1 -2
  775. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +11 -5
  776. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +0 -49
  777. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +121 -65
  778. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +14 -6
  779. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +9 -11
  780. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +2 -2
  781. data/third_party/upb/upb/decode.c +129 -60
  782. data/third_party/upb/upb/decode.h +32 -4
  783. data/third_party/upb/upb/decode_fast.c +513 -500
  784. data/third_party/upb/upb/decode_fast.h +27 -0
  785. data/third_party/upb/upb/{decode.int.h → decode_internal.h} +38 -8
  786. data/third_party/upb/upb/def.c +171 -181
  787. data/third_party/upb/upb/def.h +41 -19
  788. data/third_party/upb/upb/def.hpp +29 -0
  789. data/third_party/upb/upb/encode.c +49 -16
  790. data/third_party/upb/upb/encode.h +29 -2
  791. data/third_party/upb/upb/msg.c +169 -28
  792. data/third_party/upb/upb/msg.h +75 -580
  793. data/third_party/upb/upb/msg_internal.h +687 -0
  794. data/third_party/upb/upb/port_def.inc +85 -24
  795. data/third_party/upb/upb/port_undef.inc +38 -1
  796. data/third_party/upb/upb/reflection.c +29 -37
  797. data/third_party/upb/upb/reflection.h +36 -8
  798. data/third_party/upb/upb/reflection.hpp +37 -0
  799. data/third_party/upb/upb/table.c +211 -86
  800. data/third_party/upb/upb/{table.int.h → table_internal.h} +56 -180
  801. data/third_party/upb/upb/text_encode.c +32 -4
  802. data/third_party/upb/upb/text_encode.h +26 -0
  803. data/third_party/upb/upb/upb.c +59 -8
  804. data/third_party/upb/upb/upb.h +36 -6
  805. data/third_party/upb/upb/upb.hpp +24 -0
  806. data/third_party/upb/upb/upb_internal.h +58 -0
  807. metadata +64 -62
  808. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +0 -179
  809. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +0 -38
  810. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +0 -243
  811. data/src/core/ext/transport/chttp2/transport/hpack_table.h +0 -148
  812. data/src/core/lib/gpr/tls_gcc.h +0 -52
  813. data/src/core/lib/gpr/tls_msvc.h +0 -54
  814. data/src/core/lib/gpr/tls_pthread.cc +0 -30
  815. data/src/core/lib/gpr/tls_pthread.h +0 -56
  816. data/src/core/lib/gpr/tls_stdcpp.h +0 -48
  817. data/src/core/lib/gprpp/atomic.h +0 -104
  818. data/src/core/lib/iomgr/endpoint_pair_uv.cc +0 -40
  819. data/src/core/lib/iomgr/iomgr_uv.cc +0 -43
  820. data/src/core/lib/iomgr/pollset_uv.cc +0 -95
  821. data/src/core/lib/iomgr/pollset_uv.h +0 -36
  822. data/src/core/lib/iomgr/sockaddr_custom.h +0 -54
  823. data/src/core/lib/iomgr/socket_utils_uv.cc +0 -49
  824. data/src/core/lib/iomgr/tcp_uv.cc +0 -421
  825. data/src/core/lib/iomgr/timer_uv.cc +0 -66
  826. data/third_party/upb/third_party/wyhash/wyhash.h +0 -145
  827. data/third_party/upb/upb/upb.int.h +0 -29
@@ -27,12 +27,11 @@
27
27
  * TODO(murgatroid99): Remove this
28
28
  */
29
29
  #include <grpc/grpc.h>
30
-
31
30
  #include <grpc/support/alloc.h>
32
31
  #include <grpc/support/log.h>
33
32
 
34
33
  #include "src/core/ext/transport/chttp2/transport/bin_encoder.h"
35
- #include "src/core/ext/transport/chttp2/transport/hpack_table.h"
34
+ #include "src/core/ext/transport/chttp2/transport/hpack_utils.h"
36
35
  #include "src/core/ext/transport/chttp2/transport/varint.h"
37
36
  #include "src/core/lib/debug/stats.h"
38
37
  #include "src/core/lib/slice/slice_internal.h"
@@ -42,257 +41,30 @@
42
41
  #include "src/core/lib/transport/static_metadata.h"
43
42
  #include "src/core/lib/transport/timeout_encoding.h"
44
43
 
44
+ namespace grpc_core {
45
+
45
46
  namespace {
46
- /* (Maybe-cuckoo) hpack encoder hash table implementation.
47
-
48
- This hashtable implementation is a subset of a proper cuckoo hash; while we
49
- have fallback cells that a value can be hashed to if the first cell is full,
50
- we do not attempt to iteratively rearrange entries into backup cells to get
51
- things to fit. Instead, if both a cell and the backup cell for a value are
52
- occupied, the older existing entry is evicted.
53
-
54
- Note that we can disable backup-cell picking by setting
55
- GRPC_HPACK_ENCODER_USE_CUCKOO_HASH to 0. In that case, we simply evict an
56
- existing entry rather than try to use a backup. Hence, "maybe-cuckoo."
57
- TODO(arjunroy): Add unit tests for hashtable implementation. */
58
- #define GRPC_HPACK_ENCODER_USE_CUCKOO_HASH 1
59
- #define HASH_FRAGMENT_MASK (GRPC_CHTTP2_HPACKC_NUM_VALUES - 1)
60
- #define HASH_FRAGMENT_1(x) ((x)&HASH_FRAGMENT_MASK)
61
- #define HASH_FRAGMENT_2(x) \
62
- (((x) >> GRPC_CHTTP2_HPACKC_NUM_VALUES_BITS) & HASH_FRAGMENT_MASK)
63
- #define HASH_FRAGMENT_3(x) \
64
- (((x) >> (GRPC_CHTTP2_HPACKC_NUM_VALUES_BITS * 2)) & HASH_FRAGMENT_MASK)
65
- #define HASH_FRAGMENT_4(x) \
66
- (((x) >> (GRPC_CHTTP2_HPACKC_NUM_VALUES_BITS * 3)) & HASH_FRAGMENT_MASK)
67
47
 
68
48
  /* don't consider adding anything bigger than this to the hpack table */
69
49
  constexpr size_t kMaxDecoderSpaceUsage = 512;
70
50
  constexpr size_t kDataFrameHeaderSize = 9;
71
- constexpr uint8_t kMaxFilterValue = 255;
72
-
73
- /* if the probability of this item being seen again is < 1/x then don't add
74
- it to the table */
75
- #define ONE_ON_ADD_PROBABILITY (GRPC_CHTTP2_HPACKC_NUM_VALUES >> 1)
76
- /* The hpack index we encode over the wire. Meaningful to the hpack encoder and
77
- parser on the remote end as well as HTTP2. *Not* the same as
78
- HpackEncoderSlotHash, which is only meaningful to the hpack encoder
79
- implementation (HpackEncoderSlotHash is used for the hashtable implementation
80
- when mapping from metadata to HpackEncoderIndex. */
81
- typedef uint32_t HpackEncoderIndex;
82
- /* Internal-table bookkeeping (*not* the hpack index). */
83
- typedef uint32_t HpackEncoderSlotHash;
84
-
85
- struct SliceRefComparator {
86
- typedef grpc_slice_refcount* Type;
87
- static grpc_slice_refcount* Null() { return nullptr; }
88
- static bool IsNull(const grpc_slice_refcount* sref) {
89
- return sref == nullptr;
90
- }
91
- static bool Equals(const grpc_slice_refcount* s1,
92
- const grpc_slice_refcount* s2) {
93
- return s1 == s2;
94
- }
95
- static void Ref(grpc_slice_refcount* sref) {
96
- GPR_DEBUG_ASSERT(sref != nullptr);
97
- sref->Ref();
98
- }
99
- static void Unref(grpc_slice_refcount* sref) {
100
- GPR_DEBUG_ASSERT(sref != nullptr);
101
- sref->Unref();
102
- }
103
- };
104
51
 
105
- struct MetadataComparator {
106
- typedef grpc_mdelem Type;
107
- static grpc_mdelem Null() { return {0}; }
108
- static bool IsNull(const grpc_mdelem md) { return md.payload == 0; }
109
- static bool Equals(const grpc_mdelem md1, const grpc_mdelem md2) {
110
- return md1.payload == md2.payload;
111
- }
112
- static void Ref(grpc_mdelem md) {
113
- GPR_DEBUG_ASSERT(md.payload != 0);
114
- GRPC_MDELEM_REF(md);
115
- }
116
- static void Unref(grpc_mdelem md) {
117
- GPR_DEBUG_ASSERT(md.payload != 0);
118
- GRPC_MDELEM_UNREF(md);
119
- }
120
- };
121
-
122
- /* Index table management */
123
- template <typename Hashtable>
124
- static HpackEncoderIndex HpackIndex(const Hashtable* hashtable,
125
- HpackEncoderSlotHash hash_index) {
126
- return hashtable[hash_index].index;
127
- }
128
-
129
- template <typename ValueType, typename Hashtable>
130
- static const ValueType& GetEntry(const Hashtable* hashtable,
131
- HpackEncoderSlotHash hash_index) {
132
- return hashtable[hash_index].value;
133
- }
134
-
135
- template <typename Cmp, typename Hashtable>
136
- static bool TableEmptyAt(const Hashtable* hashtable,
137
- HpackEncoderSlotHash hash_index) {
138
- return Cmp::Equals(hashtable[hash_index].value, Cmp::Null());
139
- }
140
-
141
- template <typename Cmp, typename Hashtable, typename ValueType>
142
- static bool Matches(const Hashtable* hashtable, const ValueType& value,
143
- HpackEncoderSlotHash hash_index) {
144
- return Cmp::Equals(value, hashtable[hash_index].value);
145
- }
146
-
147
- template <typename Hashtable>
148
- static void UpdateIndex(Hashtable* hashtable, HpackEncoderSlotHash hash_index,
149
- HpackEncoderIndex hpack_index) {
150
- hashtable[hash_index].index = hpack_index;
151
- }
152
-
153
- template <typename Hashtable, typename ValueType>
154
- static void SetIndex(Hashtable* hashtable, HpackEncoderSlotHash hash_index,
155
- const ValueType& value, HpackEncoderIndex hpack_index) {
156
- hashtable[hash_index].value = value;
157
- UpdateIndex(hashtable, hash_index, hpack_index);
158
- }
159
-
160
- template <typename Cmp, typename Hashtable, typename ValueType>
161
- static bool GetMatchingIndex(Hashtable* hashtable, const ValueType& value,
162
- uint32_t value_hash, HpackEncoderIndex* index) {
163
- const HpackEncoderSlotHash cuckoo_first = HASH_FRAGMENT_2(value_hash);
164
- if (Matches<Cmp>(hashtable, value, cuckoo_first)) {
165
- *index = HpackIndex(hashtable, cuckoo_first);
166
- return true;
167
- }
168
- #if GRPC_HPACK_ENCODER_USE_CUCKOO_HASH
169
- const HpackEncoderSlotHash cuckoo_second = HASH_FRAGMENT_3(value_hash);
170
-
171
- if (Matches<Cmp>(hashtable, value, cuckoo_second)) {
172
- *index = HpackIndex(hashtable, cuckoo_second);
173
- return true;
174
- }
175
- #endif
176
- return false;
177
- }
178
-
179
- template <typename Cmp, typename Hashtable, typename ValueType>
180
- static ValueType ReplaceOlderIndex(Hashtable* hashtable, const ValueType& value,
181
- HpackEncoderSlotHash hash_index_a,
182
- HpackEncoderSlotHash hash_index_b,
183
- HpackEncoderIndex new_index) {
184
- const HpackEncoderIndex hpack_idx_a = hashtable[hash_index_a].index;
185
- const HpackEncoderIndex hpack_idx_b = hashtable[hash_index_b].index;
186
- const HpackEncoderSlotHash id =
187
- hpack_idx_a < hpack_idx_b ? hash_index_a : hash_index_b;
188
- ValueType old = GetEntry<typename Cmp::Type>(hashtable, id);
189
- SetIndex(hashtable, id, value, new_index);
190
- return old;
191
- }
192
-
193
- template <typename Cmp, typename Hashtable, typename ValueType>
194
- static void UpdateAddOrEvict(Hashtable hashtable, const ValueType& value,
195
- uint32_t value_hash, HpackEncoderIndex new_index) {
196
- const HpackEncoderSlotHash cuckoo_first = HASH_FRAGMENT_2(value_hash);
197
- if (Matches<Cmp>(hashtable, value, cuckoo_first)) {
198
- UpdateIndex(hashtable, cuckoo_first, new_index);
199
- return;
200
- }
201
- if (TableEmptyAt<Cmp>(hashtable, cuckoo_first)) {
202
- Cmp::Ref(value);
203
- SetIndex(hashtable, cuckoo_first, value, new_index);
204
- return;
205
- }
206
- #if GRPC_HPACK_ENCODER_USE_CUCKOO_HASH
207
- const HpackEncoderSlotHash cuckoo_second = HASH_FRAGMENT_3(value_hash);
208
- if (Matches<Cmp>(hashtable, value, cuckoo_second)) {
209
- UpdateIndex(hashtable, cuckoo_second, new_index);
210
- return;
211
- }
212
- Cmp::Ref(value);
213
- if (TableEmptyAt<Cmp>(hashtable, cuckoo_second)) {
214
- SetIndex(hashtable, cuckoo_second, value, new_index);
215
- return;
216
- }
217
- Cmp::Unref(ReplaceOlderIndex<Cmp>(hashtable, value, cuckoo_first,
218
- cuckoo_second, new_index));
219
- #else
220
- ValueType old = GetEntry<typename Cmp::Type>(hashtable, cuckoo_first);
221
- SetIndex(hashtable, cuckoo_first, value, new_index);
222
- Cmp::Unref(old);
223
- #endif
224
- }
225
-
226
- /* halve all counts because an element reached max */
227
- static void HalveFilter(uint8_t /*idx*/, uint32_t* sum, uint8_t* elems) {
228
- *sum = 0;
229
- for (int i = 0; i < GRPC_CHTTP2_HPACKC_NUM_VALUES; i++) {
230
- elems[i] /= 2;
231
- (*sum) += elems[i];
232
- }
233
- }
234
-
235
- /* increment a filter count, halve all counts if one element reaches max */
236
- static void IncrementFilter(uint8_t idx, uint32_t* sum, uint8_t* elems) {
237
- elems[idx]++;
238
- if (GPR_LIKELY(elems[idx] < kMaxFilterValue)) {
239
- (*sum)++;
240
- } else {
241
- HalveFilter(idx, sum, elems);
242
- }
243
- }
244
-
245
- static uint32_t UpdateHashtablePopularity(
246
- grpc_chttp2_hpack_compressor* hpack_compressor, uint32_t elem_hash) {
247
- const uint32_t popularity_hash = HASH_FRAGMENT_1(elem_hash);
248
- IncrementFilter(popularity_hash, &hpack_compressor->filter_elems_sum,
249
- hpack_compressor->filter_elems);
250
- return popularity_hash;
251
- }
252
-
253
- static bool CanAddToHashtable(grpc_chttp2_hpack_compressor* hpack_compressor,
254
- uint32_t popularity_hash) {
255
- const bool can_add =
256
- hpack_compressor->filter_elems[popularity_hash] >=
257
- hpack_compressor->filter_elems_sum / ONE_ON_ADD_PROBABILITY;
258
- return can_add;
259
- }
260
52
  } /* namespace */
261
53
 
262
- struct framer_state {
263
- int is_first_frame;
264
- /* number of bytes in 'output' when we started the frame - used to calculate
265
- frame length */
266
- size_t output_length_at_start_of_frame;
267
- /* index (in output) of the header for the current frame */
268
- size_t header_idx;
269
- #ifndef NDEBUG
270
- /* have we seen a regular (non-colon-prefixed) header yet? */
271
- uint8_t seen_regular_header;
272
- #endif
273
- /* output stream id */
274
- uint32_t stream_id;
275
- grpc_slice_buffer* output;
276
- grpc_transport_one_way_stats* stats;
277
- /* maximum size of a frame */
278
- size_t max_frame_size;
279
- bool use_true_binary_metadata;
280
- bool is_end_of_stream;
281
- };
282
54
  /* fills p (which is expected to be kDataFrameHeaderSize bytes long)
283
55
  * with a data frame header */
284
- static void fill_header(uint8_t* p, uint8_t type, uint32_t id, size_t len,
285
- uint8_t flags) {
56
+ static void FillHeader(uint8_t* p, uint8_t type, uint32_t id, size_t len,
57
+ uint8_t flags) {
286
58
  /* len is the current frame size (i.e. for the frame we're finishing).
287
59
  We finish a frame if:
288
60
  1) We called ensure_space(), (i.e. add_tiny_header_data()) and adding
289
- 'need_bytes' to the frame would cause us to exceed st->max_frame_size.
61
+ 'need_bytes' to the frame would cause us to exceed max_frame_size.
290
62
  2) We called add_header_data, and adding the slice would cause us to exceed
291
- st->max_frame_size.
63
+ max_frame_size.
292
64
  3) We're done encoding the header.
293
65
 
294
- Thus, len is always <= st->max_frame_size.
295
- st->max_frame_size is derived from GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE,
66
+ Thus, len is always <= max_frame_size.
67
+ max_frame_size is derived from GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE,
296
68
  which has a max allowable value of 16777215 (see chttp_transport.cc).
297
69
  Thus, the following assert can be a debug assert. */
298
70
  GPR_DEBUG_ASSERT(len < 16777316);
@@ -307,174 +79,123 @@ static void fill_header(uint8_t* p, uint8_t type, uint32_t id, size_t len,
307
79
  *p++ = static_cast<uint8_t>(id);
308
80
  }
309
81
 
310
- static size_t current_frame_size(framer_state* st) {
82
+ size_t HPackCompressor::Framer::CurrentFrameSize() const {
311
83
  const size_t frame_size =
312
- st->output->length - st->output_length_at_start_of_frame;
313
- GPR_DEBUG_ASSERT(frame_size <= st->max_frame_size);
84
+ output_->length - prefix_.output_length_at_start_of_frame;
85
+ GPR_DEBUG_ASSERT(frame_size <= max_frame_size_);
314
86
  return frame_size;
315
87
  }
316
88
 
317
- /* finish a frame - fill in the previously reserved header */
318
- static void finish_frame(framer_state* st, int is_header_boundary) {
319
- uint8_t type = 0xff;
320
- type =
321
- static_cast<uint8_t>(st->is_first_frame ? GRPC_CHTTP2_FRAME_HEADER
322
- : GRPC_CHTTP2_FRAME_CONTINUATION);
323
- uint8_t flags = 0xff;
324
- /* per the HTTP/2 spec:
325
- A HEADERS frame carries the END_STREAM flag that signals the end of a
326
- stream. However, a HEADERS frame with the END_STREAM flag set can be
327
- followed by CONTINUATION frames on the same stream. Logically, the
328
- CONTINUATION frames are part of the HEADERS frame.
329
- Thus, we add the END_STREAM flag to the HEADER frame (the first frame). */
330
- flags = static_cast<uint8_t>(st->is_first_frame && st->is_end_of_stream
331
- ? GRPC_CHTTP2_DATA_FLAG_END_STREAM
332
- : 0);
333
- /* per the HTTP/2 spec:
334
- A HEADERS frame without the END_HEADERS flag set MUST be followed by
335
- a CONTINUATION frame for the same stream.
336
- Thus, we add the END_HEADER flag to the last frame. */
337
- flags |= static_cast<uint8_t>(
338
- is_header_boundary ? GRPC_CHTTP2_DATA_FLAG_END_HEADERS : 0);
339
- fill_header(GRPC_SLICE_START_PTR(st->output->slices[st->header_idx]), type,
340
- st->stream_id, current_frame_size(st), flags);
341
- st->stats->framing_bytes += kDataFrameHeaderSize;
342
- st->is_first_frame = 0;
343
- }
344
-
345
- /* begin a new frame: reserve off header space, remember how many bytes we'd
346
- output before beginning */
347
- static void begin_frame(framer_state* st) {
89
+ // finish a frame - fill in the previously reserved header
90
+ void HPackCompressor::Framer::FinishFrame(bool is_header_boundary) {
91
+ const uint8_t type = is_first_frame_ ? GRPC_CHTTP2_FRAME_HEADER
92
+ : GRPC_CHTTP2_FRAME_CONTINUATION;
93
+ uint8_t flags = 0;
94
+ // per the HTTP/2 spec:
95
+ // A HEADERS frame carries the END_STREAM flag that signals the end of a
96
+ // stream. However, a HEADERS frame with the END_STREAM flag set can be
97
+ // followed by CONTINUATION frames on the same stream. Logically, the
98
+ // CONTINUATION frames are part of the HEADERS frame.
99
+ // Thus, we add the END_STREAM flag to the HEADER frame (the first frame).
100
+ if (is_first_frame_ && is_end_of_stream_) {
101
+ flags |= GRPC_CHTTP2_DATA_FLAG_END_STREAM;
102
+ }
103
+ // per the HTTP/2 spec:
104
+ // A HEADERS frame without the END_HEADERS flag set MUST be followed by
105
+ // a CONTINUATION frame for the same stream.
106
+ // Thus, we add the END_HEADER flag to the last frame.
107
+ if (is_header_boundary) {
108
+ flags |= GRPC_CHTTP2_DATA_FLAG_END_HEADERS;
109
+ }
110
+ FillHeader(GRPC_SLICE_START_PTR(output_->slices[prefix_.header_idx]), type,
111
+ stream_id_, CurrentFrameSize(), flags);
112
+ stats_->framing_bytes += kDataFrameHeaderSize;
113
+ is_first_frame_ = false;
114
+ }
115
+
116
+ // begin a new frame: reserve off header space, remember how many bytes we'd
117
+ // output before beginning
118
+ HPackCompressor::Framer::FramePrefix HPackCompressor::Framer::BeginFrame() {
348
119
  grpc_slice reserved;
349
120
  reserved.refcount = nullptr;
350
121
  reserved.data.inlined.length = kDataFrameHeaderSize;
351
- st->header_idx = grpc_slice_buffer_add_indexed(st->output, reserved);
352
- st->output_length_at_start_of_frame = st->output->length;
122
+ return FramePrefix{grpc_slice_buffer_add_indexed(output_, reserved),
123
+ output_->length};
353
124
  }
354
125
 
355
- /* make sure that the current frame is of the type desired, and has sufficient
356
- space to add at least about_to_add bytes -- finishes the current frame if
357
- needed */
358
- static void ensure_space(framer_state* st, size_t need_bytes) {
359
- if (GPR_LIKELY(current_frame_size(st) + need_bytes <= st->max_frame_size)) {
126
+ // make sure that the current frame is of the type desired, and has sufficient
127
+ // space to add at least about_to_add bytes -- finishes the current frame if
128
+ // needed
129
+ void HPackCompressor::Framer::EnsureSpace(size_t need_bytes) {
130
+ if (GPR_LIKELY(CurrentFrameSize() + need_bytes <= max_frame_size_)) {
360
131
  return;
361
132
  }
362
- finish_frame(st, 0);
363
- begin_frame(st);
133
+ FinishFrame(false);
134
+ prefix_ = BeginFrame();
364
135
  }
365
136
 
366
- static void add_header_data(framer_state* st, grpc_slice slice) {
367
- size_t len = GRPC_SLICE_LENGTH(slice);
368
- size_t remaining;
137
+ void HPackCompressor::Framer::Add(grpc_slice slice) {
138
+ const size_t len = GRPC_SLICE_LENGTH(slice);
369
139
  if (len == 0) return;
370
- remaining = st->max_frame_size - current_frame_size(st);
140
+ const size_t remaining = max_frame_size_ - CurrentFrameSize();
371
141
  if (len <= remaining) {
372
- st->stats->header_bytes += len;
373
- grpc_slice_buffer_add(st->output, slice);
142
+ stats_->header_bytes += len;
143
+ grpc_slice_buffer_add(output_, slice);
374
144
  } else {
375
- st->stats->header_bytes += remaining;
376
- grpc_slice_buffer_add(st->output, grpc_slice_split_head(&slice, remaining));
377
- finish_frame(st, 0);
378
- begin_frame(st);
379
- add_header_data(st, slice);
145
+ stats_->header_bytes += remaining;
146
+ grpc_slice_buffer_add(output_, grpc_slice_split_head(&slice, remaining));
147
+ FinishFrame(false);
148
+ prefix_ = BeginFrame();
149
+ Add(slice);
380
150
  }
381
151
  }
382
152
 
383
- static uint8_t* add_tiny_header_data(framer_state* st, size_t len) {
384
- ensure_space(st, len);
385
- st->stats->header_bytes += len;
386
- return grpc_slice_buffer_tiny_add(st->output, len);
387
- }
388
-
389
- static void evict_entry(grpc_chttp2_hpack_compressor* c) {
390
- c->tail_remote_index++;
391
- GPR_ASSERT(c->tail_remote_index > 0);
392
- GPR_ASSERT(c->table_size >=
393
- c->table_elem_size[c->tail_remote_index % c->cap_table_elems]);
394
- GPR_ASSERT(c->table_elems > 0);
395
- c->table_size = static_cast<uint16_t>(
396
- c->table_size -
397
- c->table_elem_size[c->tail_remote_index % c->cap_table_elems]);
398
- c->table_elems--;
399
- }
400
-
401
- // Reserve space in table for the new element, evict entries if needed.
402
- // Return the new index of the element. Return 0 to indicate not adding to
403
- // table.
404
- static uint32_t prepare_space_for_new_elem(grpc_chttp2_hpack_compressor* c,
405
- size_t elem_size) {
406
- uint32_t new_index = c->tail_remote_index + c->table_elems + 1;
407
- GPR_DEBUG_ASSERT(elem_size < 65536);
408
-
409
- // TODO(arjunroy): Re-examine semantics
410
- if (elem_size > c->max_table_size) {
411
- while (c->table_size > 0) {
412
- evict_entry(c);
413
- }
414
- return 0;
415
- }
416
-
417
- /* Reserve space for this element in the remote table: if this overflows
418
- the current table, drop elements until it fits, matching the decompressor
419
- algorithm */
420
- while (c->table_size + elem_size > c->max_table_size) {
421
- evict_entry(c);
422
- }
423
- GPR_ASSERT(c->table_elems < c->max_table_size);
424
- c->table_elem_size[new_index % c->cap_table_elems] =
425
- static_cast<uint16_t>(elem_size);
426
- c->table_size = static_cast<uint16_t>(c->table_size + elem_size);
427
- c->table_elems++;
428
-
429
- return new_index;
153
+ uint8_t* HPackCompressor::Framer::AddTiny(size_t len) {
154
+ EnsureSpace(len);
155
+ stats_->header_bytes += len;
156
+ return grpc_slice_buffer_tiny_add(output_, len);
430
157
  }
431
158
 
432
159
  // Add a key to the dynamic table. Both key and value will be added to table at
433
160
  // the decoder.
434
- static void AddKeyWithIndex(grpc_chttp2_hpack_compressor* c,
435
- grpc_slice_refcount* key_ref, uint32_t new_index,
436
- uint32_t key_hash) {
437
- UpdateAddOrEvict<SliceRefComparator>(c->key_table.entries, key_ref, key_hash,
438
- new_index);
161
+ void HPackCompressor::AddKeyWithIndex(grpc_slice_refcount* key_ref,
162
+ uint32_t new_index, uint32_t key_hash) {
163
+ key_index_.Insert(KeySliceRef(key_ref, key_hash), new_index);
439
164
  }
440
165
 
441
166
  /* add an element to the decoder table */
442
- static void AddElemWithIndex(grpc_chttp2_hpack_compressor* c, grpc_mdelem elem,
443
- uint32_t new_index, uint32_t elem_hash,
444
- uint32_t key_hash) {
167
+ void HPackCompressor::AddElemWithIndex(grpc_mdelem elem, uint32_t new_index,
168
+ uint32_t elem_hash, uint32_t key_hash) {
445
169
  GPR_DEBUG_ASSERT(GRPC_MDELEM_IS_INTERNED(elem));
446
- UpdateAddOrEvict<MetadataComparator>(c->elem_table.entries, elem, elem_hash,
447
- new_index);
448
- AddKeyWithIndex(c, GRPC_MDKEY(elem).refcount, new_index, key_hash);
170
+ elem_index_.Insert(KeyElem(elem, elem_hash), new_index);
171
+ AddKeyWithIndex(GRPC_MDKEY(elem).refcount, new_index, key_hash);
449
172
  }
450
173
 
451
- static void add_elem(grpc_chttp2_hpack_compressor* c, grpc_mdelem elem,
452
- size_t elem_size, uint32_t elem_hash, uint32_t key_hash) {
453
- uint32_t new_index = prepare_space_for_new_elem(c, elem_size);
174
+ void HPackCompressor::AddElem(grpc_mdelem elem, size_t elem_size,
175
+ uint32_t elem_hash, uint32_t key_hash) {
176
+ uint32_t new_index = table_.AllocateIndex(elem_size);
454
177
  if (new_index != 0) {
455
- AddElemWithIndex(c, elem, new_index, elem_hash, key_hash);
178
+ AddElemWithIndex(elem, new_index, elem_hash, key_hash);
456
179
  }
457
180
  }
458
181
 
459
- static void add_key(grpc_chttp2_hpack_compressor* c, grpc_mdelem elem,
460
- size_t elem_size, uint32_t key_hash) {
461
- uint32_t new_index = prepare_space_for_new_elem(c, elem_size);
182
+ void HPackCompressor::AddKey(grpc_mdelem elem, size_t elem_size,
183
+ uint32_t key_hash) {
184
+ uint32_t new_index = table_.AllocateIndex(elem_size);
462
185
  if (new_index != 0) {
463
- AddKeyWithIndex(c, GRPC_MDKEY(elem).refcount, new_index, key_hash);
186
+ AddKeyWithIndex(GRPC_MDKEY(elem).refcount, new_index, key_hash);
464
187
  }
465
188
  }
466
189
 
467
- static void emit_indexed(grpc_chttp2_hpack_compressor* /*c*/,
468
- uint32_t elem_index, framer_state* st) {
190
+ void HPackCompressor::Framer::EmitIndexed(uint32_t elem_index) {
469
191
  GRPC_STATS_INC_HPACK_SEND_INDEXED();
470
- uint32_t len = GRPC_CHTTP2_VARINT_LENGTH(elem_index, 1);
471
- GRPC_CHTTP2_WRITE_VARINT(elem_index, 1, 0x80, add_tiny_header_data(st, len),
472
- len);
192
+ VarintWriter<1> w(elem_index);
193
+ w.Write(0x80, AddTiny(w.length()));
473
194
  }
474
195
 
475
- struct wire_value {
476
- wire_value(uint8_t huffman_prefix, bool insert_null_before_wire_value,
477
- const grpc_slice& slice)
196
+ struct WireValue {
197
+ WireValue(uint8_t huffman_prefix, bool insert_null_before_wire_value,
198
+ const grpc_slice& slice)
478
199
  : data(slice),
479
200
  huffman_prefix(huffman_prefix),
480
201
  insert_null_before_wire_value(insert_null_before_wire_value),
@@ -488,124 +209,131 @@ struct wire_value {
488
209
  const size_t length;
489
210
  };
490
211
 
491
- template <bool mdkey_definitely_interned>
492
- static wire_value get_wire_value(grpc_mdelem elem, bool true_binary_enabled) {
493
- const bool is_bin_hdr =
494
- mdkey_definitely_interned
495
- ? grpc_is_refcounted_slice_binary_header(GRPC_MDKEY(elem))
496
- : grpc_is_binary_header_internal(GRPC_MDKEY(elem));
497
- const grpc_slice& value = GRPC_MDVALUE(elem);
212
+ static WireValue GetWireValue(const grpc_slice& value, bool true_binary_enabled,
213
+ bool is_bin_hdr) {
498
214
  if (is_bin_hdr) {
499
215
  if (true_binary_enabled) {
500
216
  GRPC_STATS_INC_HPACK_SEND_BINARY();
501
- return wire_value(0x00, true, grpc_slice_ref_internal(value));
217
+ return WireValue(0x00, true, grpc_slice_ref_internal(value));
502
218
  } else {
503
219
  GRPC_STATS_INC_HPACK_SEND_BINARY_BASE64();
504
- return wire_value(0x80, false,
505
- grpc_chttp2_base64_encode_and_huffman_compress(value));
220
+ return WireValue(0x80, false,
221
+ grpc_chttp2_base64_encode_and_huffman_compress(value));
506
222
  }
507
223
  } else {
508
224
  /* TODO(ctiller): opportunistically compress non-binary headers */
509
225
  GRPC_STATS_INC_HPACK_SEND_UNCOMPRESSED();
510
- return wire_value(0x00, false, grpc_slice_ref_internal(value));
226
+ return WireValue(0x00, false, grpc_slice_ref_internal(value));
511
227
  }
512
228
  }
513
229
 
514
- static uint32_t wire_value_length(const wire_value& v) {
515
- GPR_DEBUG_ASSERT(v.length <= UINT32_MAX);
516
- return static_cast<uint32_t>(v.length);
517
- }
230
+ struct DefinitelyInterned {
231
+ static bool IsBinary(grpc_slice key) {
232
+ return grpc_is_refcounted_slice_binary_header(key);
233
+ }
234
+ };
235
+ struct UnsureIfInterned {
236
+ static bool IsBinary(grpc_slice key) {
237
+ return grpc_is_binary_header_internal(key);
238
+ }
239
+ };
518
240
 
519
- namespace {
520
- enum class EmitLitHdrType { INC_IDX, NO_IDX };
521
-
522
- enum class EmitLitHdrVType { INC_IDX_V, NO_IDX_V };
523
- } // namespace
524
-
525
- template <EmitLitHdrType type>
526
- static void emit_lithdr(grpc_chttp2_hpack_compressor* /*c*/, uint32_t key_index,
527
- grpc_mdelem elem, framer_state* st) {
528
- switch (type) {
529
- case EmitLitHdrType::INC_IDX:
530
- GRPC_STATS_INC_HPACK_SEND_LITHDR_INCIDX();
531
- break;
532
- case EmitLitHdrType::NO_IDX:
533
- GRPC_STATS_INC_HPACK_SEND_LITHDR_NOTIDX();
534
- break;
241
+ class StringValue {
242
+ public:
243
+ template <typename MetadataKeyType>
244
+ StringValue(MetadataKeyType, grpc_mdelem elem, bool use_true_binary_metadata)
245
+ : wire_value_(GetWireValue(GRPC_MDVALUE(elem), use_true_binary_metadata,
246
+ MetadataKeyType::IsBinary(GRPC_MDKEY(elem)))),
247
+ len_val_(wire_value_.length) {}
248
+
249
+ size_t prefix_length() const {
250
+ return len_val_.length() +
251
+ (wire_value_.insert_null_before_wire_value ? 1 : 0);
535
252
  }
536
- const uint32_t len_pfx = type == EmitLitHdrType::INC_IDX
537
- ? GRPC_CHTTP2_VARINT_LENGTH(key_index, 2)
538
- : GRPC_CHTTP2_VARINT_LENGTH(key_index, 4);
539
- const wire_value value =
540
- get_wire_value<true>(elem, st->use_true_binary_metadata);
541
- const uint32_t len_val = wire_value_length(value);
542
- const uint32_t len_val_len = GRPC_CHTTP2_VARINT_LENGTH(len_val, 1);
543
- GPR_DEBUG_ASSERT(len_pfx + len_val_len < GRPC_SLICE_INLINED_SIZE);
544
- uint8_t* data = add_tiny_header_data(
545
- st,
546
- len_pfx + len_val_len + (value.insert_null_before_wire_value ? 1 : 0));
547
- switch (type) {
548
- case EmitLitHdrType::INC_IDX:
549
- GRPC_CHTTP2_WRITE_VARINT(key_index, 2, 0x40, data, len_pfx);
550
- break;
551
- case EmitLitHdrType::NO_IDX:
552
- GRPC_CHTTP2_WRITE_VARINT(key_index, 4, 0x00, data, len_pfx);
553
- break;
253
+
254
+ void WritePrefix(uint8_t* prefix_data) {
255
+ len_val_.Write(wire_value_.huffman_prefix, prefix_data);
256
+ if (wire_value_.insert_null_before_wire_value) {
257
+ prefix_data[len_val_.length()] = 0;
258
+ }
554
259
  }
555
- GRPC_CHTTP2_WRITE_VARINT(len_val, 1, value.huffman_prefix, &data[len_pfx],
556
- len_val_len);
557
- if (value.insert_null_before_wire_value) {
558
- data[len_pfx + len_val_len] = 0;
260
+
261
+ const grpc_slice& data() { return wire_value_.data; }
262
+
263
+ private:
264
+ WireValue wire_value_;
265
+ VarintWriter<1> len_val_;
266
+ };
267
+
268
+ class StringKey {
269
+ public:
270
+ explicit StringKey(grpc_slice key)
271
+ : key_(key), len_key_(GRPC_SLICE_LENGTH(key)) {}
272
+
273
+ size_t prefix_length() const { return 1 + len_key_.length(); }
274
+
275
+ void WritePrefix(uint8_t type, uint8_t* data) {
276
+ data[0] = type;
277
+ len_key_.Write(0x00, data + 1);
559
278
  }
560
- add_header_data(st, value.data);
279
+
280
+ grpc_slice key() const { return key_; }
281
+
282
+ private:
283
+ grpc_slice key_;
284
+ VarintWriter<1> len_key_;
285
+ };
286
+
287
+ void HPackCompressor::Framer::EmitLitHdrIncIdx(uint32_t key_index,
288
+ grpc_mdelem elem) {
289
+ GRPC_STATS_INC_HPACK_SEND_LITHDR_INCIDX();
290
+ StringValue emit(DefinitelyInterned(), elem, use_true_binary_metadata_);
291
+ VarintWriter<2> key(key_index);
292
+ uint8_t* data = AddTiny(key.length() + emit.prefix_length());
293
+ key.Write(0x40, data);
294
+ emit.WritePrefix(data + key.length());
295
+ Add(emit.data());
296
+ }
297
+
298
+ void HPackCompressor::Framer::EmitLitHdrNotIdx(uint32_t key_index,
299
+ grpc_mdelem elem) {
300
+ GRPC_STATS_INC_HPACK_SEND_LITHDR_NOTIDX();
301
+ StringValue emit(DefinitelyInterned(), elem, use_true_binary_metadata_);
302
+ VarintWriter<4> key(key_index);
303
+ uint8_t* data = AddTiny(key.length() + emit.prefix_length());
304
+ key.Write(0x00, data);
305
+ emit.WritePrefix(data + key.length());
306
+ Add(emit.data());
307
+ }
308
+
309
+ void HPackCompressor::Framer::EmitLitHdrWithStringKeyIncIdx(grpc_mdelem elem) {
310
+ GRPC_STATS_INC_HPACK_SEND_LITHDR_INCIDX_V();
311
+ GRPC_STATS_INC_HPACK_SEND_UNCOMPRESSED();
312
+ StringKey key(GRPC_MDKEY(elem));
313
+ key.WritePrefix(0x40, AddTiny(key.prefix_length()));
314
+ Add(grpc_slice_ref_internal(key.key()));
315
+ StringValue emit(DefinitelyInterned(), elem, use_true_binary_metadata_);
316
+ emit.WritePrefix(AddTiny(emit.prefix_length()));
317
+ Add(emit.data());
561
318
  }
562
319
 
563
- template <EmitLitHdrVType type>
564
- static void emit_lithdr_v(grpc_chttp2_hpack_compressor* /*c*/, grpc_mdelem elem,
565
- framer_state* st) {
566
- switch (type) {
567
- case EmitLitHdrVType::INC_IDX_V:
568
- GRPC_STATS_INC_HPACK_SEND_LITHDR_INCIDX_V();
569
- break;
570
- case EmitLitHdrVType::NO_IDX_V:
571
- GRPC_STATS_INC_HPACK_SEND_LITHDR_NOTIDX_V();
572
- break;
573
- }
320
+ void HPackCompressor::Framer::EmitLitHdrWithStringKeyNotIdx(grpc_mdelem elem) {
321
+ GRPC_STATS_INC_HPACK_SEND_LITHDR_NOTIDX_V();
574
322
  GRPC_STATS_INC_HPACK_SEND_UNCOMPRESSED();
575
- const uint32_t len_key =
576
- static_cast<uint32_t>(GRPC_SLICE_LENGTH(GRPC_MDKEY(elem)));
577
- const wire_value value =
578
- type == EmitLitHdrVType::INC_IDX_V
579
- ? get_wire_value<true>(elem, st->use_true_binary_metadata)
580
- : get_wire_value<false>(elem, st->use_true_binary_metadata);
581
- const uint32_t len_val = wire_value_length(value);
582
- const uint32_t len_key_len = GRPC_CHTTP2_VARINT_LENGTH(len_key, 1);
583
- const uint32_t len_val_len = GRPC_CHTTP2_VARINT_LENGTH(len_val, 1);
584
- GPR_DEBUG_ASSERT(len_key <= UINT32_MAX);
585
- GPR_DEBUG_ASSERT(1 + len_key_len < GRPC_SLICE_INLINED_SIZE);
586
- uint8_t* key_buf = add_tiny_header_data(st, 1 + len_key_len);
587
- key_buf[0] = type == EmitLitHdrVType::INC_IDX_V ? 0x40 : 0x00;
588
- GRPC_CHTTP2_WRITE_VARINT(len_key, 1, 0x00, &key_buf[1], len_key_len);
589
- add_header_data(st, grpc_slice_ref_internal(GRPC_MDKEY(elem)));
590
- uint8_t* value_buf = add_tiny_header_data(
591
- st, len_val_len + (value.insert_null_before_wire_value ? 1 : 0));
592
- GRPC_CHTTP2_WRITE_VARINT(len_val, 1, value.huffman_prefix, value_buf,
593
- len_val_len);
594
- if (value.insert_null_before_wire_value) {
595
- value_buf[len_val_len] = 0;
596
- }
597
- add_header_data(st, value.data);
323
+ StringKey key(GRPC_MDKEY(elem));
324
+ key.WritePrefix(0x00, AddTiny(key.prefix_length()));
325
+ Add(grpc_slice_ref_internal(key.key()));
326
+ StringValue emit(UnsureIfInterned(), elem, use_true_binary_metadata_);
327
+ emit.WritePrefix(AddTiny(emit.prefix_length()));
328
+ Add(emit.data());
598
329
  }
599
330
 
600
- static void emit_advertise_table_size_change(grpc_chttp2_hpack_compressor* c,
601
- framer_state* st) {
602
- uint32_t len = GRPC_CHTTP2_VARINT_LENGTH(c->max_table_size, 3);
603
- GRPC_CHTTP2_WRITE_VARINT(c->max_table_size, 3, 0x20,
604
- add_tiny_header_data(st, len), len);
605
- c->advertise_table_size_change = 0;
331
+ void HPackCompressor::Framer::AdvertiseTableSizeChange() {
332
+ VarintWriter<3> w(compressor_->table_.max_size());
333
+ w.Write(0x20, AddTiny(w.length()));
606
334
  }
607
335
 
608
- static void GPR_ATTRIBUTE_NOINLINE hpack_enc_log(grpc_mdelem elem) {
336
+ void HPackCompressor::Framer::Log(grpc_mdelem elem) {
609
337
  char* k = grpc_slice_to_c_string(GRPC_MDKEY(elem));
610
338
  char* v = nullptr;
611
339
  if (grpc_is_binary_header_internal(GRPC_MDKEY(elem))) {
@@ -623,11 +351,6 @@ static void GPR_ATTRIBUTE_NOINLINE hpack_enc_log(grpc_mdelem elem) {
623
351
  gpr_free(v);
624
352
  }
625
353
 
626
- static uint32_t dynidx(grpc_chttp2_hpack_compressor* c, uint32_t elem_index) {
627
- return 1 + GRPC_CHTTP2_LAST_STATIC_ENTRY + c->tail_remote_index +
628
- c->table_elems - elem_index;
629
- }
630
-
631
354
  struct EmitIndexedStatus {
632
355
  EmitIndexedStatus() = default;
633
356
  EmitIndexedStatus(uint32_t elem_hash, bool emitted, bool can_add)
@@ -637,264 +360,147 @@ struct EmitIndexedStatus {
637
360
  const bool can_add = false;
638
361
  };
639
362
 
640
- static EmitIndexedStatus maybe_emit_indexed(grpc_chttp2_hpack_compressor* c,
641
- grpc_mdelem elem,
642
- framer_state* st) {
643
- const uint32_t elem_hash =
644
- GRPC_MDELEM_STORAGE(elem) == GRPC_MDELEM_STORAGE_INTERNED
645
- ? reinterpret_cast<grpc_core::InternedMetadata*>(
646
- GRPC_MDELEM_DATA(elem))
647
- ->hash()
648
- : reinterpret_cast<grpc_core::StaticMetadata*>(GRPC_MDELEM_DATA(elem))
649
- ->hash();
650
- /* Update filter to see if we can perhaps add this elem. */
651
- const uint32_t popularity_hash = UpdateHashtablePopularity(c, elem_hash);
652
- /* is this elem currently in the decoders table? */
653
- HpackEncoderIndex indices_key;
654
- if (GetMatchingIndex<MetadataComparator>(c->elem_table.entries, elem,
655
- elem_hash, &indices_key) &&
656
- indices_key > c->tail_remote_index) {
657
- emit_indexed(c, dynidx(c, indices_key), st);
658
- return EmitIndexedStatus(elem_hash, true, false);
659
- }
660
- /* Didn't hit either cuckoo index, so no emit. */
661
- return EmitIndexedStatus(elem_hash, false,
662
- CanAddToHashtable(c, popularity_hash));
663
- }
664
-
665
- static void emit_maybe_add(grpc_chttp2_hpack_compressor* c, grpc_mdelem elem,
666
- framer_state* st, uint32_t indices_key,
667
- bool should_add_elem, size_t decoder_space_usage,
668
- uint32_t elem_hash, uint32_t key_hash) {
669
- if (should_add_elem) {
670
- emit_lithdr<EmitLitHdrType::INC_IDX>(c, dynidx(c, indices_key), elem, st);
671
- add_elem(c, elem, decoder_space_usage, elem_hash, key_hash);
672
- } else {
673
- emit_lithdr<EmitLitHdrType::NO_IDX>(c, dynidx(c, indices_key), elem, st);
674
- }
675
- }
676
-
677
363
  /* encode an mdelem */
678
- static void hpack_enc(grpc_chttp2_hpack_compressor* c, grpc_mdelem elem,
679
- framer_state* st) {
364
+ void HPackCompressor::Framer::EncodeDynamic(grpc_mdelem elem) {
680
365
  const grpc_slice& elem_key = GRPC_MDKEY(elem);
681
- /* User-provided key len validated in grpc_validate_header_key_is_legal(). */
366
+ // User-provided key len validated in grpc_validate_header_key_is_legal().
682
367
  GPR_DEBUG_ASSERT(GRPC_SLICE_LENGTH(elem_key) > 0);
683
- /* Header ordering: all reserved headers (prefixed with ':') must precede
684
- * regular headers. This can be a debug assert, since:
685
- * 1) User cannot give us ':' headers (grpc_validate_header_key_is_legal()).
686
- * 2) grpc filters/core should be checked during debug builds. */
368
+ // Header ordering: all reserved headers (prefixed with ':') must precede
369
+ // regular headers. This can be a debug assert, since:
370
+ // 1) User cannot give us ':' headers (grpc_validate_header_key_is_legal()).
371
+ // 2) grpc filters/core should be checked during debug builds. */
687
372
  #ifndef NDEBUG
688
373
  if (GRPC_SLICE_START_PTR(elem_key)[0] != ':') { /* regular header */
689
- st->seen_regular_header = 1;
374
+ seen_regular_header_ = true;
690
375
  } else {
691
376
  GPR_DEBUG_ASSERT(
692
- st->seen_regular_header == 0 &&
377
+ !seen_regular_header_ &&
693
378
  "Reserved header (colon-prefixed) happening after regular ones.");
694
379
  }
695
380
  #endif
696
381
  if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
697
- hpack_enc_log(elem);
382
+ Log(elem);
698
383
  }
699
384
  const bool elem_interned = GRPC_MDELEM_IS_INTERNED(elem);
700
385
  const bool key_interned = elem_interned || grpc_slice_is_interned(elem_key);
701
- /* Key is not interned, emit literals. */
386
+ // Key is not interned, emit literals.
702
387
  if (!key_interned) {
703
- emit_lithdr_v<EmitLitHdrVType::NO_IDX_V>(c, elem, st);
388
+ EmitLitHdrWithStringKeyNotIdx(elem);
704
389
  return;
705
390
  }
706
391
  /* Interned metadata => maybe already indexed. */
707
- const EmitIndexedStatus ret =
708
- elem_interned ? maybe_emit_indexed(c, elem, st) : EmitIndexedStatus();
709
- if (ret.emitted) {
710
- return;
392
+ uint32_t elem_hash = 0;
393
+ if (elem_interned) {
394
+ // Update filter to see if we can perhaps add this elem.
395
+ elem_hash = GRPC_MDELEM_STORAGE(elem) == GRPC_MDELEM_STORAGE_INTERNED
396
+ ? reinterpret_cast<grpc_core::InternedMetadata*>(
397
+ GRPC_MDELEM_DATA(elem))
398
+ ->hash()
399
+ : reinterpret_cast<grpc_core::StaticMetadata*>(
400
+ GRPC_MDELEM_DATA(elem))
401
+ ->hash();
402
+ bool can_add_to_hashtable =
403
+ compressor_->filter_elems_.AddElement(elem_hash % kNumFilterValues);
404
+ /* is this elem currently in the decoders table? */
405
+ auto indices_key =
406
+ compressor_->elem_index_.Lookup(KeyElem(elem, elem_hash));
407
+ if (indices_key.has_value() &&
408
+ compressor_->table_.ConvertableToDynamicIndex(*indices_key)) {
409
+ EmitIndexed(compressor_->table_.DynamicIndex(*indices_key));
410
+ return;
411
+ }
412
+ /* Didn't hit either cuckoo index, so no emit. */
413
+ if (!can_add_to_hashtable) elem_hash = 0;
711
414
  }
415
+
712
416
  /* should this elem be in the table? */
713
417
  const size_t decoder_space_usage =
714
- grpc_chttp2_get_size_in_hpack_table(elem, st->use_true_binary_metadata);
418
+ grpc_core::MetadataSizeInHPackTable(elem, use_true_binary_metadata_);
715
419
  const bool decoder_space_available =
716
420
  decoder_space_usage < kMaxDecoderSpaceUsage;
717
421
  const bool should_add_elem =
718
- elem_interned && decoder_space_available && ret.can_add;
719
- const uint32_t elem_hash = ret.elem_hash;
422
+ elem_interned && decoder_space_available && elem_hash != 0;
720
423
  /* no hits for the elem... maybe there's a key? */
721
424
  const uint32_t key_hash = elem_key.refcount->Hash(elem_key);
722
- HpackEncoderIndex indices_key;
723
- if (GetMatchingIndex<SliceRefComparator>(
724
- c->key_table.entries, elem_key.refcount, key_hash, &indices_key) &&
725
- indices_key > c->tail_remote_index) {
726
- emit_maybe_add(c, elem, st, indices_key, should_add_elem,
727
- decoder_space_usage, elem_hash, key_hash);
425
+ auto indices_key =
426
+ compressor_->key_index_.Lookup(KeySliceRef(elem_key.refcount, key_hash));
427
+ if (indices_key.has_value() &&
428
+ compressor_->table_.ConvertableToDynamicIndex(*indices_key)) {
429
+ if (should_add_elem) {
430
+ EmitLitHdrIncIdx(compressor_->table_.DynamicIndex(*indices_key), elem);
431
+ compressor_->AddElem(elem, decoder_space_usage, elem_hash, key_hash);
432
+ } else {
433
+ EmitLitHdrNotIdx(compressor_->table_.DynamicIndex(*indices_key), elem);
434
+ }
728
435
  return;
729
436
  }
730
437
  /* no elem, key in the table... fall back to literal emission */
731
438
  const bool should_add_key = !elem_interned && decoder_space_available;
732
439
  if (should_add_elem || should_add_key) {
733
- emit_lithdr_v<EmitLitHdrVType::INC_IDX_V>(c, elem, st);
440
+ EmitLitHdrWithStringKeyIncIdx(elem);
734
441
  } else {
735
- emit_lithdr_v<EmitLitHdrVType::NO_IDX_V>(c, elem, st);
442
+ EmitLitHdrWithStringKeyNotIdx(elem);
736
443
  }
737
444
  if (should_add_elem) {
738
- add_elem(c, elem, decoder_space_usage, elem_hash, key_hash);
445
+ compressor_->AddElem(elem, decoder_space_usage, elem_hash, key_hash);
739
446
  } else if (should_add_key) {
740
- add_key(c, elem, decoder_space_usage, key_hash);
447
+ compressor_->AddKey(elem, decoder_space_usage, key_hash);
741
448
  }
742
449
  }
743
450
 
744
- #define STRLEN_LIT(x) (sizeof(x) - 1)
745
- #define TIMEOUT_KEY "grpc-timeout"
746
-
747
- static void deadline_enc(grpc_chttp2_hpack_compressor* c, grpc_millis deadline,
748
- framer_state* st) {
451
+ void HPackCompressor::Framer::EncodeDeadline(grpc_millis deadline) {
749
452
  char timeout_str[GRPC_HTTP2_TIMEOUT_ENCODE_MIN_BUFSIZE];
750
453
  grpc_mdelem mdelem;
751
454
  grpc_http2_encode_timeout(deadline - grpc_core::ExecCtx::Get()->Now(),
752
455
  timeout_str);
753
456
  mdelem = grpc_mdelem_from_slices(
754
457
  GRPC_MDSTR_GRPC_TIMEOUT, grpc_core::UnmanagedMemorySlice(timeout_str));
755
- hpack_enc(c, mdelem, st);
458
+ EncodeDynamic(mdelem);
756
459
  GRPC_MDELEM_UNREF(mdelem);
757
460
  }
758
461
 
759
- static uint32_t elems_for_bytes(uint32_t bytes) { return (bytes + 31) / 32; }
760
-
761
- void grpc_chttp2_hpack_compressor_init(grpc_chttp2_hpack_compressor* c) {
762
- memset(c, 0, sizeof(*c));
763
- c->max_table_size = GRPC_CHTTP2_HPACKC_INITIAL_TABLE_SIZE;
764
- c->cap_table_elems = elems_for_bytes(c->max_table_size);
765
- c->max_table_elems = c->cap_table_elems;
766
- c->max_usable_size = GRPC_CHTTP2_HPACKC_INITIAL_TABLE_SIZE;
767
- const size_t alloc_size = sizeof(*c->table_elem_size) * c->cap_table_elems;
768
- c->table_elem_size = static_cast<uint16_t*>(gpr_malloc(alloc_size));
769
- memset(c->table_elem_size, 0, alloc_size);
462
+ void HPackCompressor::SetMaxUsableSize(uint32_t max_table_size) {
463
+ max_usable_size_ = max_table_size;
464
+ SetMaxTableSize(std::min(table_.max_size(), max_table_size));
770
465
  }
771
466
 
772
- void grpc_chttp2_hpack_compressor_destroy(grpc_chttp2_hpack_compressor* c) {
773
- for (int i = 0; i < GRPC_CHTTP2_HPACKC_NUM_VALUES; i++) {
774
- auto* const key = GetEntry<grpc_slice_refcount*>(c->key_table.entries, i);
775
- if (key != nullptr) {
776
- key->Unref();
467
+ void HPackCompressor::SetMaxTableSize(uint32_t max_table_size) {
468
+ if (table_.SetMaxSize(std::min(max_usable_size_, max_table_size))) {
469
+ advertise_table_size_change_ = true;
470
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
471
+ gpr_log(GPR_INFO, "set max table size from encoder to %d",
472
+ max_table_size);
777
473
  }
778
- GRPC_MDELEM_UNREF(GetEntry<grpc_mdelem>(c->elem_table.entries, i));
779
474
  }
780
- gpr_free(c->table_elem_size);
781
- }
782
-
783
- void grpc_chttp2_hpack_compressor_set_max_usable_size(
784
- grpc_chttp2_hpack_compressor* c, uint32_t max_table_size) {
785
- c->max_usable_size = max_table_size;
786
- grpc_chttp2_hpack_compressor_set_max_table_size(
787
- c, GPR_MIN(c->max_table_size, max_table_size));
788
475
  }
789
476
 
790
- static void rebuild_elems(grpc_chttp2_hpack_compressor* c, uint32_t new_cap) {
791
- uint16_t* table_elem_size =
792
- static_cast<uint16_t*>(gpr_malloc(sizeof(*table_elem_size) * new_cap));
793
- uint32_t i;
794
-
795
- memset(table_elem_size, 0, sizeof(*table_elem_size) * new_cap);
796
- GPR_ASSERT(c->table_elems <= new_cap);
797
-
798
- for (i = 0; i < c->table_elems; i++) {
799
- uint32_t ofs = c->tail_remote_index + i + 1;
800
- table_elem_size[ofs % new_cap] =
801
- c->table_elem_size[ofs % c->cap_table_elems];
477
+ HPackCompressor::Framer::Framer(const EncodeHeaderOptions& options,
478
+ HPackCompressor* compressor,
479
+ grpc_slice_buffer* output)
480
+ : max_frame_size_(options.max_frame_size),
481
+ use_true_binary_metadata_(options.use_true_binary_metadata),
482
+ is_end_of_stream_(options.is_end_of_stream),
483
+ stream_id_(options.stream_id),
484
+ output_(output),
485
+ stats_(options.stats),
486
+ compressor_(compressor),
487
+ prefix_(BeginFrame()) {
488
+ if (absl::exchange(compressor_->advertise_table_size_change_, false)) {
489
+ AdvertiseTableSizeChange();
802
490
  }
803
-
804
- c->cap_table_elems = new_cap;
805
- gpr_free(c->table_elem_size);
806
- c->table_elem_size = table_elem_size;
807
491
  }
808
492
 
809
- void grpc_chttp2_hpack_compressor_set_max_table_size(
810
- grpc_chttp2_hpack_compressor* c, uint32_t max_table_size) {
811
- max_table_size = GPR_MIN(max_table_size, c->max_usable_size);
812
- if (max_table_size == c->max_table_size) {
813
- return;
814
- }
815
- while (c->table_size > 0 && c->table_size > max_table_size) {
816
- evict_entry(c);
817
- }
818
- c->max_table_size = max_table_size;
819
- c->max_table_elems = elems_for_bytes(max_table_size);
820
- if (c->max_table_elems > c->cap_table_elems) {
821
- rebuild_elems(c, GPR_MAX(c->max_table_elems, 2 * c->cap_table_elems));
822
- } else if (c->max_table_elems < c->cap_table_elems / 3) {
823
- uint32_t new_cap = GPR_MAX(c->max_table_elems, 16);
824
- if (new_cap != c->cap_table_elems) {
825
- rebuild_elems(c, new_cap);
493
+ void HPackCompressor::Framer::Encode(grpc_mdelem md) {
494
+ if (GRPC_MDELEM_STORAGE(md) == GRPC_MDELEM_STORAGE_STATIC) {
495
+ const uintptr_t static_index =
496
+ reinterpret_cast<grpc_core::StaticMetadata*>(GRPC_MDELEM_DATA(md))
497
+ ->StaticIndex();
498
+ if (static_index < hpack_constants::kLastStaticEntry) {
499
+ EmitIndexed(static_cast<uint32_t>(static_index + 1));
500
+ return;
826
501
  }
827
502
  }
828
- c->advertise_table_size_change = 1;
829
- if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
830
- gpr_log(GPR_INFO, "set max table size from encoder to %d", max_table_size);
831
- }
503
+ EncodeDynamic(md);
832
504
  }
833
505
 
834
- void grpc_chttp2_encode_header(grpc_chttp2_hpack_compressor* c,
835
- grpc_mdelem** extra_headers,
836
- size_t extra_headers_size,
837
- grpc_metadata_batch* metadata,
838
- const grpc_encode_header_options* options,
839
- grpc_slice_buffer* outbuf) {
840
- /* grpc_chttp2_encode_header is called by FlushInitial/TrailingMetadata in
841
- writing.cc. Specifically, on streams returned by NextStream(), which
842
- returns streams from the list GRPC_CHTTP2_LIST_WRITABLE. The only way to be
843
- added to the list is via grpc_chttp2_list_add_writable_stream(), which
844
- validates that stream_id is not 0. So, this can be a debug assert. */
845
- GPR_DEBUG_ASSERT(options->stream_id != 0);
846
- framer_state st;
847
- #ifndef NDEBUG
848
- st.seen_regular_header = 0;
849
- #endif
850
- st.stream_id = options->stream_id;
851
- st.output = outbuf;
852
- st.is_first_frame = 1;
853
- st.stats = options->stats;
854
- st.max_frame_size = options->max_frame_size;
855
- st.use_true_binary_metadata = options->use_true_binary_metadata;
856
- st.is_end_of_stream = options->is_eof;
857
-
858
- /* Encode a metadata batch; store the returned values, representing
859
- a metadata element that needs to be unreffed back into the metadata
860
- slot. THIS MAY NOT BE THE SAME ELEMENT (if a decoder table slot got
861
- updated). After this loop, we'll do a batch unref of elements. */
862
- begin_frame(&st);
863
- if (c->advertise_table_size_change != 0) {
864
- emit_advertise_table_size_change(c, &st);
865
- }
866
- for (size_t i = 0; i < extra_headers_size; ++i) {
867
- grpc_mdelem md = *extra_headers[i];
868
- const bool is_static =
869
- GRPC_MDELEM_STORAGE(md) == GRPC_MDELEM_STORAGE_STATIC;
870
- uintptr_t static_index;
871
- if (is_static &&
872
- (static_index =
873
- reinterpret_cast<grpc_core::StaticMetadata*>(GRPC_MDELEM_DATA(md))
874
- ->StaticIndex()) < GRPC_CHTTP2_LAST_STATIC_ENTRY) {
875
- emit_indexed(c, static_cast<uint32_t>(static_index + 1), &st);
876
- } else {
877
- hpack_enc(c, md, &st);
878
- }
879
- }
880
- grpc_metadata_batch_assert_ok(metadata);
881
- for (grpc_linked_mdelem* l = metadata->list.head; l; l = l->next) {
882
- const bool is_static =
883
- GRPC_MDELEM_STORAGE(l->md) == GRPC_MDELEM_STORAGE_STATIC;
884
- uintptr_t static_index;
885
- if (is_static &&
886
- (static_index = reinterpret_cast<grpc_core::StaticMetadata*>(
887
- GRPC_MDELEM_DATA(l->md))
888
- ->StaticIndex()) < GRPC_CHTTP2_LAST_STATIC_ENTRY) {
889
- emit_indexed(c, static_cast<uint32_t>(static_index + 1), &st);
890
- } else {
891
- hpack_enc(c, l->md, &st);
892
- }
893
- }
894
- grpc_millis deadline = metadata->deadline;
895
- if (deadline != GRPC_MILLIS_INF_FUTURE) {
896
- deadline_enc(c, deadline, &st);
897
- }
898
-
899
- finish_frame(&st, 1);
900
- }
506
+ } // namespace grpc_core