grpc 1.18.0 → 1.22.0

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 (428) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +4731 -7404
  3. data/etc/roots.pem +146 -0
  4. data/include/grpc/grpc.h +11 -6
  5. data/include/grpc/grpc_security.h +297 -4
  6. data/include/grpc/grpc_security_constants.h +1 -1
  7. data/include/grpc/impl/codegen/byte_buffer.h +13 -0
  8. data/include/grpc/impl/codegen/gpr_types.h +1 -1
  9. data/include/grpc/impl/codegen/grpc_types.h +30 -7
  10. data/include/grpc/impl/codegen/port_platform.h +88 -7
  11. data/include/grpc/impl/codegen/slice.h +2 -22
  12. data/include/grpc/impl/codegen/status.h +2 -1
  13. data/include/grpc/impl/codegen/sync_posix.h +18 -0
  14. data/include/grpc/slice.h +3 -3
  15. data/src/core/ext/filters/client_channel/backup_poller.cc +21 -16
  16. data/src/core/ext/filters/client_channel/backup_poller.h +8 -2
  17. data/src/core/ext/filters/client_channel/channel_connectivity.cc +3 -1
  18. data/src/core/ext/filters/client_channel/client_channel.cc +2435 -1557
  19. data/src/core/ext/filters/client_channel/client_channel.h +2 -10
  20. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +6 -89
  21. data/src/core/ext/filters/client_channel/client_channel_channelz.h +8 -33
  22. data/src/core/ext/filters/client_channel/client_channel_factory.cc +22 -34
  23. data/src/core/ext/filters/client_channel/client_channel_factory.h +19 -38
  24. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +9 -11
  25. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +179 -0
  26. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +68 -0
  27. data/src/core/ext/filters/client_channel/health/health_check_client.cc +59 -55
  28. data/src/core/ext/filters/client_channel/health/health_check_client.h +20 -9
  29. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +146 -157
  30. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +29 -32
  32. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +844 -859
  33. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +3 -1
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +2 -6
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +6 -2
  36. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +14 -12
  37. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +16 -12
  38. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +3 -3
  39. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +185 -312
  40. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +143 -375
  41. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +192 -245
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +1554 -955
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc +0 -43
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.cc +14 -10
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +2 -2
  46. data/src/core/ext/filters/client_channel/lb_policy.cc +115 -22
  47. data/src/core/ext/filters/client_channel/lb_policy.h +260 -129
  48. data/src/core/ext/filters/client_channel/lb_policy_factory.h +5 -2
  49. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +107 -4
  50. data/src/core/ext/filters/client_channel/lb_policy_registry.h +10 -3
  51. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +96 -0
  52. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +56 -0
  53. data/src/core/ext/filters/client_channel/parse_address.cc +24 -5
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +121 -122
  55. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +84 -2
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +3 -0
  57. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +179 -0
  58. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +24 -10
  59. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +111 -47
  60. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +7 -13
  61. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +2 -2
  62. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +39 -0
  63. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +0 -6
  64. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -64
  65. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +28 -0
  66. data/src/core/{lib/iomgr/network_status_tracker.cc → ext/filters/client_channel/resolver/dns/dns_resolver_selection.h} +8 -15
  67. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +36 -82
  68. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +111 -72
  69. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +13 -8
  70. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +28 -63
  71. data/src/core/ext/filters/client_channel/resolver.cc +54 -1
  72. data/src/core/ext/filters/client_channel/resolver.h +52 -23
  73. data/src/core/ext/filters/client_channel/resolver_factory.h +3 -1
  74. data/src/core/ext/filters/client_channel/resolver_registry.cc +5 -2
  75. data/src/core/ext/filters/client_channel/resolver_registry.h +5 -4
  76. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +368 -241
  77. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +58 -76
  78. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +543 -0
  79. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +139 -0
  80. data/src/core/ext/filters/client_channel/server_address.cc +4 -54
  81. data/src/core/ext/filters/client_channel/server_address.h +1 -13
  82. data/src/core/ext/filters/client_channel/service_config.cc +329 -0
  83. data/src/core/ext/filters/client_channel/service_config.h +205 -0
  84. data/src/core/ext/filters/client_channel/subchannel.cc +803 -838
  85. data/src/core/ext/filters/client_channel/subchannel.h +295 -128
  86. data/src/core/ext/filters/client_channel/subchannel_interface.h +113 -0
  87. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +97 -0
  88. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +94 -0
  89. data/src/core/ext/filters/deadline/deadline_filter.cc +3 -4
  90. data/src/core/ext/filters/deadline/deadline_filter.h +3 -2
  91. data/src/core/ext/filters/http/client/http_client_filter.cc +7 -5
  92. data/src/core/ext/filters/http/client/http_client_filter.h +1 -1
  93. data/src/core/ext/filters/http/client_authority_filter.cc +6 -3
  94. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +4 -3
  95. data/src/core/ext/filters/http/server/http_server_filter.cc +18 -12
  96. data/src/core/ext/filters/max_age/max_age_filter.cc +5 -2
  97. data/src/core/ext/filters/message_size/message_size_filter.cc +119 -77
  98. data/src/core/ext/filters/message_size/message_size_filter.h +33 -0
  99. data/src/core/ext/transport/chttp2/alpn/alpn.h +1 -1
  100. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +13 -12
  101. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +45 -47
  102. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +134 -143
  103. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +68 -21
  104. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +4 -4
  105. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +4 -4
  106. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +7 -6
  107. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +4 -3
  108. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +9 -7
  109. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +156 -94
  110. data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -2
  111. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -1
  112. data/src/core/ext/transport/chttp2/transport/frame_data.cc +33 -37
  113. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
  114. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +6 -5
  115. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -2
  116. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -4
  117. data/src/core/ext/transport/chttp2/transport/frame_ping.h +1 -1
  118. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +8 -6
  119. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -1
  120. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -4
  121. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
  122. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -6
  123. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +1 -1
  124. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +74 -55
  125. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +33 -11
  126. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +3 -2
  127. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +7 -14
  128. data/src/core/ext/transport/chttp2/transport/hpack_table.h +10 -1
  129. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +9 -5
  130. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +9 -3
  131. data/src/core/ext/transport/chttp2/transport/internal.h +43 -30
  132. data/src/core/ext/transport/chttp2/transport/parsing.cc +52 -70
  133. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -3
  134. data/src/core/ext/transport/chttp2/transport/writing.cc +70 -33
  135. data/src/core/ext/transport/inproc/inproc_transport.cc +26 -18
  136. data/src/core/lib/channel/channel_args.cc +2 -101
  137. data/src/core/lib/channel/channel_args.h +3 -37
  138. data/src/core/lib/channel/channel_stack.h +10 -6
  139. data/src/core/lib/channel/channel_trace.cc +4 -4
  140. data/src/core/lib/channel/channel_trace.h +4 -4
  141. data/src/core/lib/channel/channelz.cc +168 -38
  142. data/src/core/lib/channel/channelz.h +40 -44
  143. data/src/core/lib/channel/channelz_registry.cc +75 -107
  144. data/src/core/lib/channel/channelz_registry.h +10 -28
  145. data/src/core/lib/channel/connected_channel.cc +2 -2
  146. data/src/core/lib/channel/context.h +2 -2
  147. data/src/core/lib/channel/handshaker.cc +151 -218
  148. data/src/core/lib/channel/handshaker.h +110 -101
  149. data/src/core/lib/channel/handshaker_factory.h +11 -19
  150. data/src/core/lib/channel/handshaker_registry.cc +67 -51
  151. data/src/core/lib/channel/handshaker_registry.h +21 -16
  152. data/src/core/lib/compression/algorithm_metadata.h +3 -3
  153. data/src/core/lib/compression/compression.cc +14 -9
  154. data/src/core/lib/compression/compression_args.cc +127 -0
  155. data/src/core/lib/compression/compression_args.h +55 -0
  156. data/src/core/lib/compression/compression_internal.cc +16 -12
  157. data/src/core/lib/compression/compression_internal.h +1 -1
  158. data/src/core/lib/compression/stream_compression.cc +3 -2
  159. data/src/core/lib/compression/stream_compression.h +2 -2
  160. data/src/core/lib/compression/stream_compression_gzip.cc +9 -9
  161. data/src/core/lib/debug/trace.cc +13 -7
  162. data/src/core/lib/debug/trace.h +14 -1
  163. data/src/core/lib/gpr/arena.h +13 -9
  164. data/src/core/lib/gpr/cpu_posix.cc +5 -3
  165. data/src/core/lib/gpr/env.h +3 -6
  166. data/src/core/lib/gpr/env_linux.cc +6 -1
  167. data/src/core/lib/gpr/env_posix.cc +5 -0
  168. data/src/core/lib/gpr/env_windows.cc +7 -5
  169. data/src/core/lib/gpr/log.cc +9 -13
  170. data/src/core/lib/gpr/log_posix.cc +2 -1
  171. data/src/core/lib/gpr/string.cc +20 -7
  172. data/src/core/lib/gpr/string.h +10 -3
  173. data/src/core/lib/gpr/sync_posix.cc +65 -4
  174. data/src/core/lib/gpr/time.cc +8 -0
  175. data/src/core/lib/gpr/time_posix.cc +21 -2
  176. data/src/core/lib/gprpp/arena.cc +103 -0
  177. data/src/core/lib/gprpp/arena.h +121 -0
  178. data/src/core/lib/gprpp/atomic.h +75 -5
  179. data/src/core/lib/gprpp/fork.cc +13 -32
  180. data/src/core/lib/gprpp/fork.h +5 -1
  181. data/src/core/lib/gprpp/global_config.h +96 -0
  182. data/src/core/lib/gprpp/global_config_custom.h +29 -0
  183. data/src/core/lib/gprpp/global_config_env.cc +135 -0
  184. data/src/core/lib/gprpp/global_config_env.h +131 -0
  185. data/src/core/lib/gprpp/global_config_generic.h +44 -0
  186. data/src/core/lib/gprpp/inlined_vector.h +8 -0
  187. data/src/core/lib/gprpp/map.h +436 -0
  188. data/src/core/lib/gprpp/memory.h +2 -2
  189. data/src/core/lib/gprpp/optional.h +48 -0
  190. data/src/core/lib/gprpp/orphanable.h +6 -5
  191. data/src/core/lib/gprpp/{mutex_lock.h → pair.h} +15 -19
  192. data/src/core/lib/gprpp/ref_counted.h +36 -17
  193. data/src/core/lib/gprpp/sync.h +126 -0
  194. data/src/core/lib/gprpp/thd.h +42 -7
  195. data/src/core/lib/gprpp/thd_posix.cc +31 -13
  196. data/src/core/lib/gprpp/thd_windows.cc +47 -34
  197. data/src/core/lib/http/httpcli.cc +6 -5
  198. data/src/core/lib/http/httpcli_security_connector.cc +13 -15
  199. data/src/core/lib/http/parser.cc +3 -2
  200. data/src/core/lib/http/parser.h +2 -1
  201. data/src/core/lib/iomgr/buffer_list.cc +182 -24
  202. data/src/core/lib/iomgr/buffer_list.h +72 -10
  203. data/src/core/lib/iomgr/call_combiner.cc +84 -90
  204. data/src/core/lib/iomgr/call_combiner.h +75 -82
  205. data/src/core/lib/iomgr/cfstream_handle.cc +203 -0
  206. data/src/core/lib/iomgr/cfstream_handle.h +86 -0
  207. data/src/core/lib/iomgr/combiner.cc +11 -3
  208. data/src/core/lib/iomgr/combiner.h +1 -1
  209. data/src/core/lib/iomgr/endpoint.cc +2 -2
  210. data/src/core/lib/iomgr/endpoint.h +3 -2
  211. data/src/core/lib/iomgr/endpoint_cfstream.cc +375 -0
  212. data/src/core/lib/iomgr/endpoint_cfstream.h +49 -0
  213. data/src/core/lib/iomgr/endpoint_pair_windows.cc +2 -2
  214. data/src/core/lib/iomgr/error.cc +21 -17
  215. data/src/core/lib/iomgr/error.h +36 -6
  216. data/src/core/lib/iomgr/error_cfstream.cc +52 -0
  217. data/src/core/lib/iomgr/error_cfstream.h +31 -0
  218. data/src/core/lib/iomgr/error_internal.h +1 -1
  219. data/src/core/lib/iomgr/ev_epoll1_linux.cc +44 -28
  220. data/src/core/lib/iomgr/ev_epollex_linux.cc +173 -194
  221. data/src/core/lib/iomgr/ev_poll_posix.cc +16 -487
  222. data/src/core/lib/iomgr/ev_posix.cc +29 -19
  223. data/src/core/lib/iomgr/ev_posix.h +19 -3
  224. data/src/core/lib/iomgr/ev_windows.cc +2 -2
  225. data/src/core/lib/iomgr/exec_ctx.cc +1 -0
  226. data/src/core/lib/iomgr/exec_ctx.h +137 -8
  227. data/src/core/lib/iomgr/executor.cc +147 -95
  228. data/src/core/lib/iomgr/executor.h +55 -49
  229. data/src/core/lib/iomgr/fork_posix.cc +6 -5
  230. data/src/core/lib/{gprpp/atomic_with_std.h → iomgr/grpc_if_nametoindex.h} +8 -13
  231. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +42 -0
  232. data/src/core/lib/iomgr/{network_status_tracker.h → grpc_if_nametoindex_unsupported.cc} +15 -9
  233. data/src/core/lib/iomgr/internal_errqueue.cc +3 -5
  234. data/src/core/lib/iomgr/internal_errqueue.h +105 -3
  235. data/src/core/lib/iomgr/iomgr.cc +20 -13
  236. data/src/core/lib/iomgr/iomgr.h +15 -0
  237. data/src/core/lib/iomgr/iomgr_custom.cc +17 -3
  238. data/src/core/lib/iomgr/iomgr_custom.h +2 -0
  239. data/src/core/lib/iomgr/iomgr_internal.cc +10 -0
  240. data/src/core/lib/iomgr/iomgr_internal.h +12 -0
  241. data/src/core/lib/iomgr/iomgr_posix.cc +19 -2
  242. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +93 -0
  243. data/src/core/lib/iomgr/iomgr_windows.cc +18 -2
  244. data/src/core/lib/iomgr/lockfree_event.cc +4 -4
  245. data/src/core/lib/iomgr/port.h +35 -0
  246. data/src/core/lib/iomgr/resolve_address_posix.cc +4 -3
  247. data/src/core/lib/iomgr/resolve_address_windows.cc +2 -1
  248. data/src/core/lib/iomgr/resource_quota.cc +40 -37
  249. data/src/core/lib/iomgr/socket_utils_common_posix.cc +6 -2
  250. data/src/core/lib/iomgr/socket_windows.cc +19 -0
  251. data/src/core/lib/iomgr/socket_windows.h +8 -0
  252. data/src/core/lib/iomgr/tcp_client_cfstream.cc +216 -0
  253. data/src/core/lib/iomgr/tcp_client_custom.cc +2 -2
  254. data/src/core/lib/iomgr/tcp_client_posix.cc +3 -3
  255. data/src/core/lib/iomgr/tcp_client_windows.cc +7 -5
  256. data/src/core/lib/iomgr/tcp_custom.cc +10 -14
  257. data/src/core/lib/iomgr/tcp_posix.cc +256 -140
  258. data/src/core/lib/iomgr/tcp_server.cc +5 -0
  259. data/src/core/lib/iomgr/tcp_server.h +24 -0
  260. data/src/core/lib/iomgr/tcp_server_custom.cc +14 -12
  261. data/src/core/lib/iomgr/tcp_server_posix.cc +86 -12
  262. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
  263. data/src/core/lib/iomgr/tcp_server_windows.cc +13 -11
  264. data/src/core/lib/iomgr/tcp_uv.cc +5 -7
  265. data/src/core/lib/iomgr/tcp_windows.cc +8 -14
  266. data/src/core/lib/iomgr/timer.h +2 -1
  267. data/src/core/lib/iomgr/timer_generic.cc +16 -16
  268. data/src/core/lib/iomgr/timer_manager.cc +20 -11
  269. data/src/core/lib/iomgr/udp_server.cc +8 -6
  270. data/src/core/lib/iomgr/wakeup_fd_posix.cc +1 -19
  271. data/src/core/lib/json/json.cc +1 -4
  272. data/src/core/lib/profiling/basic_timers.cc +10 -4
  273. data/src/core/lib/security/context/security_context.cc +6 -7
  274. data/src/core/lib/security/context/security_context.h +3 -4
  275. data/src/core/lib/security/credentials/alts/alts_credentials.cc +1 -1
  276. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -2
  277. data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -0
  278. data/src/core/lib/security/credentials/credentials.h +9 -1
  279. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +15 -3
  280. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +2 -0
  281. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  282. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +2 -1
  283. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +10 -6
  284. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -1
  285. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +3 -3
  286. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +9 -8
  287. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -2
  288. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +2 -2
  289. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +192 -0
  290. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +210 -0
  291. data/src/core/lib/security/credentials/tls/spiffe_credentials.cc +129 -0
  292. data/src/core/lib/security/credentials/tls/spiffe_credentials.h +62 -0
  293. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +10 -8
  294. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -12
  295. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +7 -5
  296. data/src/core/lib/security/security_connector/local/local_security_connector.cc +10 -8
  297. data/src/core/lib/security/security_connector/security_connector.cc +0 -1
  298. data/src/core/lib/security/security_connector/security_connector.h +3 -3
  299. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +39 -38
  300. data/src/core/lib/security/security_connector/ssl_utils.cc +164 -26
  301. data/src/core/lib/security/security_connector/ssl_utils.h +70 -1
  302. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +426 -0
  303. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +122 -0
  304. data/src/core/lib/security/transport/auth_filters.h +5 -2
  305. data/src/core/lib/security/transport/client_auth_filter.cc +55 -50
  306. data/src/core/lib/security/transport/secure_endpoint.cc +6 -6
  307. data/src/core/lib/security/transport/security_handshaker.cc +271 -303
  308. data/src/core/lib/security/transport/security_handshaker.h +11 -2
  309. data/src/core/lib/security/transport/server_auth_filter.cc +3 -3
  310. data/src/core/lib/slice/b64.h +2 -2
  311. data/src/core/lib/slice/percent_encoding.cc +3 -3
  312. data/src/core/lib/slice/percent_encoding.h +3 -3
  313. data/src/core/lib/slice/slice.cc +174 -122
  314. data/src/core/lib/slice/slice_buffer.cc +54 -21
  315. data/src/core/lib/slice/slice_hash_table.h +4 -4
  316. data/src/core/lib/slice/slice_intern.cc +49 -107
  317. data/src/core/lib/slice/slice_internal.h +264 -3
  318. data/src/core/lib/slice/slice_string_helpers.cc +10 -1
  319. data/src/core/lib/slice/slice_string_helpers.h +3 -1
  320. data/src/core/lib/slice/slice_utils.h +50 -0
  321. data/src/core/lib/slice/slice_weak_hash_table.h +6 -6
  322. data/src/core/lib/surface/api_trace.h +1 -1
  323. data/src/core/lib/surface/byte_buffer_reader.cc +17 -0
  324. data/src/core/lib/surface/call.cc +67 -46
  325. data/src/core/lib/surface/call.h +7 -2
  326. data/src/core/lib/surface/call_details.cc +0 -1
  327. data/src/core/lib/surface/channel.cc +89 -97
  328. data/src/core/lib/surface/channel.h +60 -6
  329. data/src/core/lib/surface/channel_init.h +5 -0
  330. data/src/core/lib/surface/completion_queue.cc +221 -216
  331. data/src/core/lib/surface/completion_queue.h +2 -1
  332. data/src/core/lib/surface/init.cc +82 -33
  333. data/src/core/lib/surface/init.h +1 -0
  334. data/src/core/lib/surface/init_secure.cc +1 -1
  335. data/src/core/lib/surface/lame_client.cc +5 -7
  336. data/src/core/lib/surface/server.cc +42 -47
  337. data/src/core/lib/surface/validate_metadata.cc +14 -8
  338. data/src/core/lib/surface/validate_metadata.h +13 -2
  339. data/src/core/lib/surface/version.cc +1 -1
  340. data/src/core/lib/transport/bdp_estimator.cc +3 -3
  341. data/src/core/lib/transport/bdp_estimator.h +2 -2
  342. data/src/core/lib/transport/connectivity_state.cc +10 -40
  343. data/src/core/lib/transport/connectivity_state.h +0 -8
  344. data/src/core/lib/transport/error_utils.cc +12 -0
  345. data/src/core/lib/transport/metadata.cc +258 -267
  346. data/src/core/lib/transport/metadata.h +227 -16
  347. data/src/core/lib/transport/metadata_batch.cc +1 -1
  348. data/src/core/lib/transport/metadata_batch.h +1 -1
  349. data/src/core/lib/transport/static_metadata.cc +477 -399
  350. data/src/core/lib/transport/static_metadata.h +273 -182
  351. data/src/core/lib/transport/status_metadata.cc +3 -3
  352. data/src/core/lib/transport/timeout_encoding.cc +1 -1
  353. data/src/core/lib/transport/timeout_encoding.h +1 -1
  354. data/src/core/lib/transport/transport.cc +39 -72
  355. data/src/core/lib/transport/transport.h +59 -24
  356. data/src/core/lib/transport/transport_impl.h +1 -1
  357. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +3 -3
  358. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
  359. data/src/core/tsi/alts/handshaker/alts_shared_resource.h +1 -1
  360. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +4 -3
  361. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +1 -1
  362. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +1 -1
  363. data/src/core/tsi/fake_transport_security.cc +4 -4
  364. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +1 -1
  365. data/src/core/tsi/ssl_transport_security.cc +12 -10
  366. data/src/core/tsi/ssl_transport_security.h +24 -4
  367. data/src/ruby/bin/math_pb.rb +18 -16
  368. data/src/ruby/ext/grpc/extconf.rb +12 -4
  369. data/src/ruby/ext/grpc/rb_call_credentials.c +8 -5
  370. data/src/ruby/ext/grpc/rb_channel.c +14 -10
  371. data/src/ruby/ext/grpc/rb_channel_credentials.c +8 -4
  372. data/src/ruby/ext/grpc/rb_compression_options.c +9 -7
  373. data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
  374. data/src/ruby/ext/grpc/rb_grpc.c +23 -24
  375. data/src/ruby/ext/grpc/rb_grpc.h +4 -2
  376. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +24 -0
  377. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +36 -0
  378. data/src/ruby/ext/grpc/rb_server.c +8 -4
  379. data/src/ruby/lib/grpc/errors.rb +22 -3
  380. data/src/ruby/lib/grpc/generic/bidi_call.rb +1 -1
  381. data/src/ruby/lib/grpc/generic/rpc_server.rb +2 -2
  382. data/src/ruby/lib/grpc/version.rb +1 -1
  383. data/src/ruby/pb/README.md +1 -1
  384. data/src/ruby/pb/grpc/health/v1/health_pb.rb +13 -10
  385. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +18 -0
  386. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +3 -1
  387. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +58 -56
  388. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -0
  389. data/src/ruby/spec/errors_spec.rb +141 -0
  390. data/third_party/cares/cares/ares.h +12 -0
  391. data/third_party/cares/cares/ares_create_query.c +5 -1
  392. data/third_party/cares/cares/ares_data.c +74 -73
  393. data/third_party/cares/cares/ares_destroy.c +6 -1
  394. data/third_party/cares/cares/ares_gethostbyaddr.c +5 -5
  395. data/third_party/cares/cares/ares_gethostbyname.c +15 -4
  396. data/third_party/cares/cares/ares_getnameinfo.c +11 -0
  397. data/third_party/cares/cares/ares_init.c +274 -173
  398. data/third_party/cares/cares/ares_library_init.c +21 -3
  399. data/third_party/cares/cares/ares_options.c +6 -2
  400. data/third_party/cares/cares/ares_parse_naptr_reply.c +7 -6
  401. data/third_party/cares/cares/ares_parse_ptr_reply.c +4 -2
  402. data/third_party/cares/cares/ares_platform.c +7 -0
  403. data/third_party/cares/cares/ares_private.h +19 -11
  404. data/third_party/cares/cares/ares_process.c +27 -2
  405. data/third_party/cares/cares/ares_rules.h +1 -1
  406. data/third_party/cares/cares/ares_search.c +7 -0
  407. data/third_party/cares/cares/ares_send.c +6 -0
  408. data/third_party/cares/cares/ares_strsplit.c +174 -0
  409. data/third_party/cares/cares/ares_strsplit.h +43 -0
  410. data/third_party/cares/cares/ares_version.h +4 -4
  411. data/third_party/cares/cares/config-win32.h +1 -1
  412. data/third_party/cares/cares/inet_ntop.c +2 -3
  413. data/third_party/cares/config_darwin/ares_config.h +3 -0
  414. data/third_party/cares/config_freebsd/ares_config.h +3 -0
  415. data/third_party/cares/config_linux/ares_config.h +3 -0
  416. data/third_party/cares/config_openbsd/ares_config.h +3 -0
  417. metadata +83 -48
  418. data/src/core/ext/filters/client_channel/request_routing.cc +0 -936
  419. data/src/core/ext/filters/client_channel/request_routing.h +0 -177
  420. data/src/core/ext/filters/client_channel/subchannel_index.cc +0 -248
  421. data/src/core/ext/filters/client_channel/subchannel_index.h +0 -76
  422. data/src/core/lib/channel/handshaker_factory.cc +0 -42
  423. data/src/core/lib/gpr/arena.cc +0 -192
  424. data/src/core/lib/gprpp/atomic_with_atm.h +0 -57
  425. data/src/core/lib/iomgr/wakeup_fd_cv.cc +0 -107
  426. data/src/core/lib/iomgr/wakeup_fd_cv.h +0 -69
  427. data/src/core/lib/transport/service_config.cc +0 -106
  428. data/src/core/lib/transport/service_config.h +0 -249
@@ -37,6 +37,7 @@
37
37
  #include "src/core/lib/debug/stats.h"
38
38
  #include "src/core/lib/slice/slice_internal.h"
39
39
  #include "src/core/lib/slice/slice_string_helpers.h"
40
+ #include "src/core/lib/surface/validate_metadata.h"
40
41
  #include "src/core/lib/transport/metadata.h"
41
42
  #include "src/core/lib/transport/static_metadata.h"
42
43
  #include "src/core/lib/transport/timeout_encoding.h"
@@ -56,10 +57,13 @@
56
57
  /* don't consider adding anything bigger than this to the hpack table */
57
58
  #define MAX_DECODER_SPACE_USAGE 512
58
59
 
59
- static grpc_slice_refcount terminal_slice_refcount = {nullptr, nullptr};
60
+ #define DATA_FRAME_HEADER_SIZE 9
61
+
62
+ static grpc_slice_refcount terminal_slice_refcount(
63
+ grpc_slice_refcount::Type::STATIC);
60
64
  static const grpc_slice terminal_slice = {
61
65
  &terminal_slice_refcount, /* refcount */
62
- {{nullptr, 0}} /* data.refcounted */
66
+ {{0, nullptr}} /* data.refcounted */
63
67
  };
64
68
 
65
69
  typedef struct {
@@ -80,7 +84,8 @@ typedef struct {
80
84
  bool use_true_binary_metadata;
81
85
  } framer_state;
82
86
 
83
- /* fills p (which is expected to be 9 bytes long) with a data frame header */
87
+ /* fills p (which is expected to be DATA_FRAME_HEADER_SIZE bytes long)
88
+ * with a data frame header */
84
89
  static void fill_header(uint8_t* p, uint8_t type, uint32_t id, size_t len,
85
90
  uint8_t flags) {
86
91
  GPR_ASSERT(len < 16777316);
@@ -107,15 +112,17 @@ static void finish_frame(framer_state* st, int is_header_boundary,
107
112
  static_cast<uint8_t>(
108
113
  (is_last_in_stream ? GRPC_CHTTP2_DATA_FLAG_END_STREAM : 0) |
109
114
  (is_header_boundary ? GRPC_CHTTP2_DATA_FLAG_END_HEADERS : 0)));
110
- st->stats->framing_bytes += 9;
115
+ st->stats->framing_bytes += DATA_FRAME_HEADER_SIZE;
111
116
  st->is_first_frame = 0;
112
117
  }
113
118
 
114
119
  /* begin a new frame: reserve off header space, remember how many bytes we'd
115
120
  output before beginning */
116
121
  static void begin_frame(framer_state* st) {
117
- st->header_idx =
118
- grpc_slice_buffer_add_indexed(st->output, GRPC_SLICE_MALLOC(9));
122
+ grpc_slice reserved;
123
+ reserved.refcount = nullptr;
124
+ reserved.data.inlined.length = DATA_FRAME_HEADER_SIZE;
125
+ st->header_idx = grpc_slice_buffer_add_indexed(st->output, reserved);
119
126
  st->output_length_at_start_of_frame = st->output->length;
120
127
  }
121
128
 
@@ -188,8 +195,9 @@ static void evict_entry(grpc_chttp2_hpack_compressor* c) {
188
195
  static uint32_t prepare_space_for_new_elem(grpc_chttp2_hpack_compressor* c,
189
196
  size_t elem_size) {
190
197
  uint32_t new_index = c->tail_remote_index + c->table_elems + 1;
191
- GPR_ASSERT(elem_size < 65536);
198
+ GPR_DEBUG_ASSERT(elem_size < 65536);
192
199
 
200
+ // TODO(arjunroy): Re-examine semantics
193
201
  if (elem_size > c->max_table_size) {
194
202
  while (c->table_size > 0) {
195
203
  evict_entry(c);
@@ -203,6 +211,7 @@ static uint32_t prepare_space_for_new_elem(grpc_chttp2_hpack_compressor* c,
203
211
  while (c->table_size + elem_size > c->max_table_size) {
204
212
  evict_entry(c);
205
213
  }
214
+ // TODO(arjunroy): Are we conflating size in bytes vs. membership?
206
215
  GPR_ASSERT(c->table_elems < c->max_table_size);
207
216
  c->table_elem_size[new_index % c->cap_table_elems] =
208
217
  static_cast<uint16_t>(elem_size);
@@ -215,19 +224,19 @@ static uint32_t prepare_space_for_new_elem(grpc_chttp2_hpack_compressor* c,
215
224
  // Add a key to the dynamic table. Both key and value will be added to table at
216
225
  // the decoder.
217
226
  static void add_key_with_index(grpc_chttp2_hpack_compressor* c,
218
- grpc_mdelem elem, uint32_t new_index) {
227
+ grpc_mdelem elem, uint32_t new_index,
228
+ uint32_t key_hash) {
219
229
  if (new_index == 0) {
220
230
  return;
221
231
  }
222
232
 
223
- uint32_t key_hash = grpc_slice_hash(GRPC_MDKEY(elem));
224
-
225
233
  /* Store the key into {entries,indices}_keys */
226
- if (grpc_slice_eq(c->entries_keys[HASH_FRAGMENT_2(key_hash)],
227
- GRPC_MDKEY(elem))) {
234
+ if (grpc_slice_static_interned_equal(
235
+ c->entries_keys[HASH_FRAGMENT_2(key_hash)], GRPC_MDKEY(elem))) {
228
236
  c->indices_keys[HASH_FRAGMENT_2(key_hash)] = new_index;
229
- } else if (grpc_slice_eq(c->entries_keys[HASH_FRAGMENT_3(key_hash)],
230
- GRPC_MDKEY(elem))) {
237
+ } else if (grpc_slice_static_interned_equal(
238
+ c->entries_keys[HASH_FRAGMENT_3(key_hash)],
239
+ GRPC_MDKEY(elem))) {
231
240
  c->indices_keys[HASH_FRAGMENT_3(key_hash)] = new_index;
232
241
  } else if (c->entries_keys[HASH_FRAGMENT_2(key_hash)].refcount ==
233
242
  &terminal_slice_refcount) {
@@ -255,22 +264,20 @@ static void add_key_with_index(grpc_chttp2_hpack_compressor* c,
255
264
 
256
265
  /* add an element to the decoder table */
257
266
  static void add_elem_with_index(grpc_chttp2_hpack_compressor* c,
258
- grpc_mdelem elem, uint32_t new_index) {
267
+ grpc_mdelem elem, uint32_t new_index,
268
+ uint32_t elem_hash, uint32_t key_hash) {
259
269
  if (new_index == 0) {
260
270
  return;
261
271
  }
262
- GPR_ASSERT(GRPC_MDELEM_IS_INTERNED(elem));
263
-
264
- uint32_t key_hash = grpc_slice_hash(GRPC_MDKEY(elem));
265
- uint32_t value_hash = grpc_slice_hash(GRPC_MDVALUE(elem));
266
- uint32_t elem_hash = GRPC_MDSTR_KV_HASH(key_hash, value_hash);
272
+ GPR_DEBUG_ASSERT(GRPC_MDELEM_IS_INTERNED(elem));
267
273
 
268
274
  /* Store this element into {entries,indices}_elem */
269
- if (grpc_mdelem_eq(c->entries_elems[HASH_FRAGMENT_2(elem_hash)], elem)) {
275
+ if (grpc_mdelem_both_interned_eq(c->entries_elems[HASH_FRAGMENT_2(elem_hash)],
276
+ elem)) {
270
277
  /* already there: update with new index */
271
278
  c->indices_elems[HASH_FRAGMENT_2(elem_hash)] = new_index;
272
- } else if (grpc_mdelem_eq(c->entries_elems[HASH_FRAGMENT_3(elem_hash)],
273
- elem)) {
279
+ } else if (grpc_mdelem_both_interned_eq(
280
+ c->entries_elems[HASH_FRAGMENT_3(elem_hash)], elem)) {
274
281
  /* already there (cuckoo): update with new index */
275
282
  c->indices_elems[HASH_FRAGMENT_3(elem_hash)] = new_index;
276
283
  } else if (GRPC_MDISNULL(c->entries_elems[HASH_FRAGMENT_2(elem_hash)])) {
@@ -294,19 +301,19 @@ static void add_elem_with_index(grpc_chttp2_hpack_compressor* c,
294
301
  c->indices_elems[HASH_FRAGMENT_3(elem_hash)] = new_index;
295
302
  }
296
303
 
297
- add_key_with_index(c, elem, new_index);
304
+ add_key_with_index(c, elem, new_index, key_hash);
298
305
  }
299
306
 
300
307
  static void add_elem(grpc_chttp2_hpack_compressor* c, grpc_mdelem elem,
301
- size_t elem_size) {
308
+ size_t elem_size, uint32_t elem_hash, uint32_t key_hash) {
302
309
  uint32_t new_index = prepare_space_for_new_elem(c, elem_size);
303
- add_elem_with_index(c, elem, new_index);
310
+ add_elem_with_index(c, elem, new_index, elem_hash, key_hash);
304
311
  }
305
312
 
306
313
  static void add_key(grpc_chttp2_hpack_compressor* c, grpc_mdelem elem,
307
- size_t elem_size) {
314
+ size_t elem_size, uint32_t key_hash) {
308
315
  uint32_t new_index = prepare_space_for_new_elem(c, elem_size);
309
- add_key_with_index(c, elem, new_index);
316
+ add_key_with_index(c, elem, new_index, key_hash);
310
317
  }
311
318
 
312
319
  static void emit_indexed(grpc_chttp2_hpack_compressor* c, uint32_t elem_index,
@@ -323,9 +330,14 @@ typedef struct {
323
330
  bool insert_null_before_wire_value;
324
331
  } wire_value;
325
332
 
333
+ template <bool mdkey_definitely_interned>
326
334
  static wire_value get_wire_value(grpc_mdelem elem, bool true_binary_enabled) {
327
335
  wire_value wire_val;
328
- if (grpc_is_binary_header(GRPC_MDKEY(elem))) {
336
+ bool is_bin_hdr =
337
+ mdkey_definitely_interned
338
+ ? grpc_is_refcounted_slice_binary_header(GRPC_MDKEY(elem))
339
+ : grpc_is_binary_header_internal(GRPC_MDKEY(elem));
340
+ if (is_bin_hdr) {
329
341
  if (true_binary_enabled) {
330
342
  GRPC_STATS_INC_HPACK_SEND_BINARY();
331
343
  wire_val.huffman_prefix = 0x00;
@@ -363,7 +375,7 @@ static void emit_lithdr_incidx(grpc_chttp2_hpack_compressor* c,
363
375
  framer_state* st) {
364
376
  GRPC_STATS_INC_HPACK_SEND_LITHDR_INCIDX();
365
377
  uint32_t len_pfx = GRPC_CHTTP2_VARINT_LENGTH(key_index, 2);
366
- wire_value value = get_wire_value(elem, st->use_true_binary_metadata);
378
+ wire_value value = get_wire_value<true>(elem, st->use_true_binary_metadata);
367
379
  size_t len_val = wire_value_length(value);
368
380
  uint32_t len_val_len;
369
381
  GPR_ASSERT(len_val <= UINT32_MAX);
@@ -380,7 +392,7 @@ static void emit_lithdr_noidx(grpc_chttp2_hpack_compressor* c,
380
392
  framer_state* st) {
381
393
  GRPC_STATS_INC_HPACK_SEND_LITHDR_NOTIDX();
382
394
  uint32_t len_pfx = GRPC_CHTTP2_VARINT_LENGTH(key_index, 4);
383
- wire_value value = get_wire_value(elem, st->use_true_binary_metadata);
395
+ wire_value value = get_wire_value<false>(elem, st->use_true_binary_metadata);
384
396
  size_t len_val = wire_value_length(value);
385
397
  uint32_t len_val_len;
386
398
  GPR_ASSERT(len_val <= UINT32_MAX);
@@ -399,7 +411,7 @@ static void emit_lithdr_incidx_v(grpc_chttp2_hpack_compressor* c,
399
411
  GRPC_STATS_INC_HPACK_SEND_LITHDR_INCIDX_V();
400
412
  GRPC_STATS_INC_HPACK_SEND_UNCOMPRESSED();
401
413
  uint32_t len_key = static_cast<uint32_t> GRPC_SLICE_LENGTH(GRPC_MDKEY(elem));
402
- wire_value value = get_wire_value(elem, st->use_true_binary_metadata);
414
+ wire_value value = get_wire_value<true>(elem, st->use_true_binary_metadata);
403
415
  uint32_t len_val = static_cast<uint32_t>(wire_value_length(value));
404
416
  uint32_t len_key_len = GRPC_CHTTP2_VARINT_LENGTH(len_key, 1);
405
417
  uint32_t len_val_len = GRPC_CHTTP2_VARINT_LENGTH(len_val, 1);
@@ -421,7 +433,7 @@ static void emit_lithdr_noidx_v(grpc_chttp2_hpack_compressor* c,
421
433
  GRPC_STATS_INC_HPACK_SEND_LITHDR_NOTIDX_V();
422
434
  GRPC_STATS_INC_HPACK_SEND_UNCOMPRESSED();
423
435
  uint32_t len_key = static_cast<uint32_t> GRPC_SLICE_LENGTH(GRPC_MDKEY(elem));
424
- wire_value value = get_wire_value(elem, st->use_true_binary_metadata);
436
+ wire_value value = get_wire_value<false>(elem, st->use_true_binary_metadata);
425
437
  uint32_t len_val = static_cast<uint32_t>(wire_value_length(value));
426
438
  uint32_t len_key_len = GRPC_CHTTP2_VARINT_LENGTH(len_key, 1);
427
439
  uint32_t len_val_len = GRPC_CHTTP2_VARINT_LENGTH(len_val, 1);
@@ -461,10 +473,10 @@ static void hpack_enc(grpc_chttp2_hpack_compressor* c, grpc_mdelem elem,
461
473
  "Reserved header (colon-prefixed) happening after regular ones.");
462
474
  }
463
475
 
464
- if (grpc_http_trace.enabled()) {
476
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
465
477
  char* k = grpc_slice_to_c_string(GRPC_MDKEY(elem));
466
478
  char* v = nullptr;
467
- if (grpc_is_binary_header(GRPC_MDKEY(elem))) {
479
+ if (grpc_is_binary_header_internal(GRPC_MDKEY(elem))) {
468
480
  v = grpc_dump_slice(GRPC_MDVALUE(elem), GPR_DUMP_HEX);
469
481
  } else {
470
482
  v = grpc_slice_to_c_string(GRPC_MDVALUE(elem));
@@ -488,27 +500,33 @@ static void hpack_enc(grpc_chttp2_hpack_compressor* c, grpc_mdelem elem,
488
500
  return;
489
501
  }
490
502
 
491
- uint32_t key_hash = grpc_slice_hash(GRPC_MDKEY(elem));
492
503
  uint32_t elem_hash = 0;
493
504
 
494
505
  if (elem_interned) {
495
- uint32_t value_hash = grpc_slice_hash(GRPC_MDVALUE(elem));
496
- elem_hash = GRPC_MDSTR_KV_HASH(key_hash, value_hash);
506
+ if (GRPC_MDELEM_STORAGE(elem) == GRPC_MDELEM_STORAGE_INTERNED) {
507
+ elem_hash =
508
+ reinterpret_cast<grpc_core::InternedMetadata*>(GRPC_MDELEM_DATA(elem))
509
+ ->hash();
510
+ } else {
511
+ elem_hash =
512
+ reinterpret_cast<grpc_core::StaticMetadata*>(GRPC_MDELEM_DATA(elem))
513
+ ->hash();
514
+ }
497
515
 
498
516
  inc_filter(HASH_FRAGMENT_1(elem_hash), &c->filter_elems_sum,
499
517
  c->filter_elems);
500
518
 
501
519
  /* is this elem currently in the decoders table? */
502
-
503
- if (grpc_mdelem_eq(c->entries_elems[HASH_FRAGMENT_2(elem_hash)], elem) &&
520
+ if (grpc_mdelem_both_interned_eq(
521
+ c->entries_elems[HASH_FRAGMENT_2(elem_hash)], elem) &&
504
522
  c->indices_elems[HASH_FRAGMENT_2(elem_hash)] > c->tail_remote_index) {
505
523
  /* HIT: complete element (first cuckoo hash) */
506
524
  emit_indexed(c, dynidx(c, c->indices_elems[HASH_FRAGMENT_2(elem_hash)]),
507
525
  st);
508
526
  return;
509
527
  }
510
-
511
- if (grpc_mdelem_eq(c->entries_elems[HASH_FRAGMENT_3(elem_hash)], elem) &&
528
+ if (grpc_mdelem_both_interned_eq(
529
+ c->entries_elems[HASH_FRAGMENT_3(elem_hash)], elem) &&
512
530
  c->indices_elems[HASH_FRAGMENT_3(elem_hash)] > c->tail_remote_index) {
513
531
  /* HIT: complete element (second cuckoo hash) */
514
532
  emit_indexed(c, dynidx(c, c->indices_elems[HASH_FRAGMENT_3(elem_hash)]),
@@ -527,11 +545,12 @@ static void hpack_enc(grpc_chttp2_hpack_compressor* c, grpc_mdelem elem,
527
545
  c->filter_elems[HASH_FRAGMENT_1(elem_hash)] >=
528
546
  c->filter_elems_sum / ONE_ON_ADD_PROBABILITY;
529
547
 
548
+ uint32_t key_hash = GRPC_MDKEY(elem).refcount->Hash(GRPC_MDKEY(elem));
530
549
  auto emit_maybe_add = [&should_add_elem, &elem, &st, &c, &indices_key,
531
- &decoder_space_usage] {
550
+ &decoder_space_usage, &elem_hash, &key_hash] {
532
551
  if (should_add_elem) {
533
552
  emit_lithdr_incidx(c, dynidx(c, indices_key), elem, st);
534
- add_elem(c, elem, decoder_space_usage);
553
+ add_elem(c, elem, decoder_space_usage, elem_hash, key_hash);
535
554
  } else {
536
555
  emit_lithdr_noidx(c, dynidx(c, indices_key), elem, st);
537
556
  }
@@ -539,8 +558,8 @@ static void hpack_enc(grpc_chttp2_hpack_compressor* c, grpc_mdelem elem,
539
558
 
540
559
  /* no hits for the elem... maybe there's a key? */
541
560
  indices_key = c->indices_keys[HASH_FRAGMENT_2(key_hash)];
542
- if (grpc_slice_eq(c->entries_keys[HASH_FRAGMENT_2(key_hash)],
543
- GRPC_MDKEY(elem)) &&
561
+ if (grpc_slice_static_interned_equal(
562
+ c->entries_keys[HASH_FRAGMENT_2(key_hash)], GRPC_MDKEY(elem)) &&
544
563
  indices_key > c->tail_remote_index) {
545
564
  /* HIT: key (first cuckoo hash) */
546
565
  emit_maybe_add();
@@ -548,8 +567,8 @@ static void hpack_enc(grpc_chttp2_hpack_compressor* c, grpc_mdelem elem,
548
567
  }
549
568
 
550
569
  indices_key = c->indices_keys[HASH_FRAGMENT_3(key_hash)];
551
- if (grpc_slice_eq(c->entries_keys[HASH_FRAGMENT_3(key_hash)],
552
- GRPC_MDKEY(elem)) &&
570
+ if (grpc_slice_static_interned_equal(
571
+ c->entries_keys[HASH_FRAGMENT_3(key_hash)], GRPC_MDKEY(elem)) &&
553
572
  indices_key > c->tail_remote_index) {
554
573
  /* HIT: key (first cuckoo hash) */
555
574
  emit_maybe_add();
@@ -565,9 +584,9 @@ static void hpack_enc(grpc_chttp2_hpack_compressor* c, grpc_mdelem elem,
565
584
  emit_lithdr_noidx_v(c, 0, elem, st);
566
585
  }
567
586
  if (should_add_elem) {
568
- add_elem(c, elem, decoder_space_usage);
587
+ add_elem(c, elem, decoder_space_usage, elem_hash, key_hash);
569
588
  } else if (should_add_key) {
570
- add_key(c, elem, decoder_space_usage);
589
+ add_key(c, elem, decoder_space_usage, key_hash);
571
590
  }
572
591
  }
573
592
 
@@ -660,7 +679,7 @@ void grpc_chttp2_hpack_compressor_set_max_table_size(
660
679
  }
661
680
  }
662
681
  c->advertise_table_size_change = 1;
663
- if (grpc_http_trace.enabled()) {
682
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
664
683
  gpr_log(GPR_INFO, "set max table size from encoder to %d", max_table_size);
665
684
  }
666
685
  }
@@ -692,18 +711,18 @@ void grpc_chttp2_encode_header(grpc_chttp2_hpack_compressor* c,
692
711
  }
693
712
  for (size_t i = 0; i < extra_headers_size; ++i) {
694
713
  grpc_mdelem md = *extra_headers[i];
695
- uint8_t static_index = grpc_chttp2_get_static_hpack_table_index(md);
714
+ uintptr_t static_index = grpc_chttp2_get_static_hpack_table_index(md);
696
715
  if (static_index) {
697
- emit_indexed(c, static_index, &st);
716
+ emit_indexed(c, static_cast<uint32_t>(static_index), &st);
698
717
  } else {
699
718
  hpack_enc(c, md, &st);
700
719
  }
701
720
  }
702
721
  grpc_metadata_batch_assert_ok(metadata);
703
722
  for (grpc_linked_mdelem* l = metadata->list.head; l; l = l->next) {
704
- uint8_t static_index = grpc_chttp2_get_static_hpack_table_index(l->md);
723
+ uintptr_t static_index = grpc_chttp2_get_static_hpack_table_index(l->md);
705
724
  if (static_index) {
706
- emit_indexed(c, static_index, &st);
725
+ emit_indexed(c, static_cast<uint32_t>(static_index), &st);
707
726
  } else {
708
727
  hpack_enc(c, l->md, &st);
709
728
  }
@@ -35,6 +35,7 @@
35
35
  #include "src/core/lib/profiling/timers.h"
36
36
  #include "src/core/lib/slice/slice_internal.h"
37
37
  #include "src/core/lib/slice/slice_string_helpers.h"
38
+ #include "src/core/lib/surface/validate_metadata.h"
38
39
  #include "src/core/lib/transport/http2_errors.h"
39
40
 
40
41
  typedef enum {
@@ -624,10 +625,10 @@ static const uint8_t inverse_base64[256] = {
624
625
  /* emission helpers */
625
626
  static grpc_error* on_hdr(grpc_chttp2_hpack_parser* p, grpc_mdelem md,
626
627
  int add_to_table) {
627
- if (grpc_http_trace.enabled()) {
628
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
628
629
  char* k = grpc_slice_to_c_string(GRPC_MDKEY(md));
629
630
  char* v = nullptr;
630
- if (grpc_is_binary_header(GRPC_MDKEY(md))) {
631
+ if (grpc_is_binary_header_internal(GRPC_MDKEY(md))) {
631
632
  v = grpc_dump_slice(GRPC_MDVALUE(md), GPR_DUMP_HEX);
632
633
  } else {
633
634
  v = grpc_slice_to_c_string(GRPC_MDVALUE(md));
@@ -994,7 +995,7 @@ static grpc_error* parse_lithdr_nvridx_v(grpc_chttp2_hpack_parser* p,
994
995
  /* finish parsing a max table size change */
995
996
  static grpc_error* finish_max_tbl_size(grpc_chttp2_hpack_parser* p,
996
997
  const uint8_t* cur, const uint8_t* end) {
997
- if (grpc_http_trace.enabled()) {
998
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
998
999
  gpr_log(GPR_INFO, "MAX TABLE SIZE: %d", p->index);
999
1000
  }
1000
1001
  grpc_error* err =
@@ -1452,7 +1453,7 @@ static grpc_error* begin_parse_string(grpc_chttp2_hpack_parser* p,
1452
1453
  uint8_t binary,
1453
1454
  grpc_chttp2_hpack_parser_string* str) {
1454
1455
  if (!p->huff && binary == NOT_BINARY &&
1455
- (end - cur) >= static_cast<intptr_t>(p->strlen) &&
1456
+ static_cast<uint32_t>(end - cur) >= p->strlen &&
1456
1457
  p->current_slice_refcount != nullptr) {
1457
1458
  GRPC_STATS_INC_HPACK_RECV_UNCOMPRESSED();
1458
1459
  str->copied = false;
@@ -1494,7 +1495,13 @@ static grpc_error* parse_key_string(grpc_chttp2_hpack_parser* p,
1494
1495
  /* check if a key represents a binary header or not */
1495
1496
 
1496
1497
  static bool is_binary_literal_header(grpc_chttp2_hpack_parser* p) {
1497
- return grpc_is_binary_header(
1498
+ /* We know that either argument here is a reference counter slice.
1499
+ * 1. If a result of grpc_slice_from_static_buffer, the refcount is set to
1500
+ * NoopRefcount.
1501
+ * 2. If it's p->key.data.referenced, then p->key.copied was set to false,
1502
+ * which occurs in begin_parse_string() - where the refcount is set to
1503
+ * p->current_slice_refcount, which is not null. */
1504
+ return grpc_is_refcounted_slice_binary_header(
1498
1505
  p->key.copied ? grpc_slice_from_static_buffer(p->key.data.copied.str,
1499
1506
  p->key.data.copied.length)
1500
1507
  : p->key.data.referenced);
@@ -1511,7 +1518,15 @@ static grpc_error* is_binary_indexed_header(grpc_chttp2_hpack_parser* p,
1511
1518
  static_cast<intptr_t>(p->index)),
1512
1519
  GRPC_ERROR_INT_SIZE, static_cast<intptr_t>(p->table.num_ents));
1513
1520
  }
1514
- *is = grpc_is_binary_header(GRPC_MDKEY(elem));
1521
+ /* We know that GRPC_MDKEY(elem) points to a reference counted slice since:
1522
+ * 1. elem was a result of grpc_chttp2_hptbl_lookup
1523
+ * 2. An item in this table is either static (see entries with
1524
+ * index < GRPC_CHTTP2_LAST_STATIC_ENTRY or added via
1525
+ * grpc_chttp2_hptbl_add).
1526
+ * 3. If added via grpc_chttp2_hptbl_add, the entry is either static or
1527
+ * interned.
1528
+ * 4. Both static and interned element slices have non-null refcounts. */
1529
+ *is = grpc_is_refcounted_slice_binary_header(GRPC_MDKEY(elem));
1515
1530
  return GRPC_ERROR_NONE;
1516
1531
  }
1517
1532
 
@@ -1570,16 +1585,16 @@ void grpc_chttp2_hpack_parser_destroy(grpc_chttp2_hpack_parser* p) {
1570
1585
  }
1571
1586
 
1572
1587
  grpc_error* grpc_chttp2_hpack_parser_parse(grpc_chttp2_hpack_parser* p,
1573
- grpc_slice slice) {
1588
+ const grpc_slice& slice) {
1574
1589
  /* max number of bytes to parse at a time... limits call stack depth on
1575
1590
  * compilers without TCO */
1576
1591
  #define MAX_PARSE_LENGTH 1024
1577
1592
  p->current_slice_refcount = slice.refcount;
1578
- uint8_t* start = GRPC_SLICE_START_PTR(slice);
1579
- uint8_t* end = GRPC_SLICE_END_PTR(slice);
1593
+ const uint8_t* start = GRPC_SLICE_START_PTR(slice);
1594
+ const uint8_t* end = GRPC_SLICE_END_PTR(slice);
1580
1595
  grpc_error* error = GRPC_ERROR_NONE;
1581
1596
  while (start != end && error == GRPC_ERROR_NONE) {
1582
- uint8_t* target = start + GPR_MIN(MAX_PARSE_LENGTH, end - start);
1597
+ const uint8_t* target = start + GPR_MIN(MAX_PARSE_LENGTH, end - start);
1583
1598
  error = p->state(p, start, target);
1584
1599
  start = target;
1585
1600
  }
@@ -1616,12 +1631,19 @@ static void parse_stream_compression_md(grpc_chttp2_transport* t,
1616
1631
  s->stream_decompression_method =
1617
1632
  GRPC_STREAM_COMPRESSION_IDENTITY_DECOMPRESS;
1618
1633
  }
1634
+
1635
+ if (s->stream_decompression_method !=
1636
+ GRPC_STREAM_COMPRESSION_IDENTITY_DECOMPRESS) {
1637
+ s->stream_decompression_ctx = nullptr;
1638
+ grpc_slice_buffer_init(&s->decompressed_data_buffer);
1639
+ }
1619
1640
  }
1620
1641
 
1621
1642
  grpc_error* grpc_chttp2_header_parser_parse(void* hpack_parser,
1622
1643
  grpc_chttp2_transport* t,
1623
1644
  grpc_chttp2_stream* s,
1624
- grpc_slice slice, int is_last) {
1645
+ const grpc_slice& slice,
1646
+ int is_last) {
1625
1647
  GPR_TIMER_SCOPE("grpc_chttp2_header_parser_parse", 0);
1626
1648
  grpc_chttp2_hpack_parser* parser =
1627
1649
  static_cast<grpc_chttp2_hpack_parser*>(hpack_parser);
@@ -97,13 +97,14 @@ void grpc_chttp2_hpack_parser_destroy(grpc_chttp2_hpack_parser* p);
97
97
  void grpc_chttp2_hpack_parser_set_has_priority(grpc_chttp2_hpack_parser* p);
98
98
 
99
99
  grpc_error* grpc_chttp2_hpack_parser_parse(grpc_chttp2_hpack_parser* p,
100
- grpc_slice slice);
100
+ const grpc_slice& slice);
101
101
 
102
102
  /* wraps grpc_chttp2_hpack_parser_parse to provide a frame level parser for
103
103
  the transport */
104
104
  grpc_error* grpc_chttp2_header_parser_parse(void* hpack_parser,
105
105
  grpc_chttp2_transport* t,
106
106
  grpc_chttp2_stream* s,
107
- grpc_slice slice, int is_last);
107
+ const grpc_slice& slice,
108
+ int is_last);
108
109
 
109
110
  #endif /* GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_PARSER_H */
@@ -29,6 +29,7 @@
29
29
 
30
30
  #include "src/core/lib/debug/trace.h"
31
31
  #include "src/core/lib/gpr/murmur_hash.h"
32
+ #include "src/core/lib/surface/validate_metadata.h"
32
33
  #include "src/core/lib/transport/static_metadata.h"
33
34
 
34
35
  extern grpc_core::TraceFlag grpc_http_trace;
@@ -247,7 +248,7 @@ void grpc_chttp2_hptbl_set_max_bytes(grpc_chttp2_hptbl* tbl,
247
248
  if (tbl->max_bytes == max_bytes) {
248
249
  return;
249
250
  }
250
- if (grpc_http_trace.enabled()) {
251
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
251
252
  gpr_log(GPR_INFO, "Update hpack parser max size to %d", max_bytes);
252
253
  }
253
254
  while (tbl->mem_used > max_bytes) {
@@ -270,7 +271,7 @@ grpc_error* grpc_chttp2_hptbl_set_current_table_size(grpc_chttp2_hptbl* tbl,
270
271
  gpr_free(msg);
271
272
  return err;
272
273
  }
273
- if (grpc_http_trace.enabled()) {
274
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) {
274
275
  gpr_log(GPR_INFO, "Update hpack parser table size to %d", bytes);
275
276
  }
276
277
  while (tbl->mem_used > bytes) {
@@ -375,9 +376,11 @@ static size_t get_base64_encoded_size(size_t raw_length) {
375
376
 
376
377
  size_t grpc_chttp2_get_size_in_hpack_table(grpc_mdelem elem,
377
378
  bool use_true_binary_metadata) {
378
- size_t overhead_and_key = 32 + GRPC_SLICE_LENGTH(GRPC_MDKEY(elem));
379
+ const uint8_t* key_buf = GRPC_SLICE_START_PTR(GRPC_MDKEY(elem));
380
+ size_t key_len = GRPC_SLICE_LENGTH(GRPC_MDKEY(elem));
381
+ size_t overhead_and_key = 32 + key_len;
379
382
  size_t value_len = GRPC_SLICE_LENGTH(GRPC_MDVALUE(elem));
380
- if (grpc_is_binary_header(GRPC_MDKEY(elem))) {
383
+ if (grpc_key_is_binary_header(key_buf, key_len)) {
381
384
  return overhead_and_key + (use_true_binary_metadata
382
385
  ? value_len + 1
383
386
  : get_base64_encoded_size(value_len));
@@ -385,13 +388,3 @@ size_t grpc_chttp2_get_size_in_hpack_table(grpc_mdelem elem,
385
388
  return overhead_and_key + value_len;
386
389
  }
387
390
  }
388
-
389
- uint8_t grpc_chttp2_get_static_hpack_table_index(grpc_mdelem md) {
390
- if (GRPC_MDELEM_STORAGE(md) == GRPC_MDELEM_STORAGE_STATIC) {
391
- uint8_t index = GRPC_MDELEM_DATA(md) - grpc_static_mdelem_table;
392
- if (index < GRPC_CHTTP2_LAST_STATIC_ENTRY) {
393
- return index + 1; // Hpack static metadata element indices start at 1
394
- }
395
- }
396
- return 0;
397
- }
@@ -24,6 +24,7 @@
24
24
  #include <grpc/slice.h>
25
25
  #include "src/core/lib/iomgr/error.h"
26
26
  #include "src/core/lib/transport/metadata.h"
27
+ #include "src/core/lib/transport/static_metadata.h"
27
28
 
28
29
  /* HPACK header table */
29
30
 
@@ -90,7 +91,15 @@ size_t grpc_chttp2_get_size_in_hpack_table(grpc_mdelem elem,
90
91
  /* Returns the static hpack table index that corresponds to /a elem. Returns 0
91
92
  if /a elem is not statically stored or if it is not in the static hpack
92
93
  table */
93
- uint8_t grpc_chttp2_get_static_hpack_table_index(grpc_mdelem md);
94
+ inline uintptr_t grpc_chttp2_get_static_hpack_table_index(grpc_mdelem md) {
95
+ uintptr_t index =
96
+ reinterpret_cast<grpc_core::StaticMetadata*>(GRPC_MDELEM_DATA(md)) -
97
+ grpc_static_mdelem_table;
98
+ if (index < GRPC_CHTTP2_LAST_STATIC_ENTRY) {
99
+ return index + 1; // Hpack static metadata element indices start at 1
100
+ }
101
+ return 0;
102
+ }
94
103
 
95
104
  /* Find a key/value pair in the table... returns the index in the table of the
96
105
  most similar entry, or 0 if the value was not found */
@@ -30,11 +30,15 @@
30
30
  grpc_error* grpc_chttp2_incoming_metadata_buffer_add(
31
31
  grpc_chttp2_incoming_metadata_buffer* buffer, grpc_mdelem elem) {
32
32
  buffer->size += GRPC_MDELEM_LENGTH(elem);
33
- return grpc_metadata_batch_add_tail(
34
- &buffer->batch,
35
- static_cast<grpc_linked_mdelem*>(
36
- gpr_arena_alloc(buffer->arena, sizeof(grpc_linked_mdelem))),
37
- elem);
33
+ grpc_linked_mdelem* storage;
34
+ if (buffer->count < buffer->kPreallocatedMDElem) {
35
+ storage = &buffer->preallocated_mdelems[buffer->count];
36
+ buffer->count++;
37
+ } else {
38
+ storage = static_cast<grpc_linked_mdelem*>(
39
+ buffer->arena->Alloc(sizeof(grpc_linked_mdelem)));
40
+ }
41
+ return grpc_metadata_batch_add_tail(&buffer->batch, storage, elem);
38
42
  }
39
43
 
40
44
  grpc_error* grpc_chttp2_incoming_metadata_buffer_replace_or_add(
@@ -24,7 +24,8 @@
24
24
  #include "src/core/lib/transport/transport.h"
25
25
 
26
26
  struct grpc_chttp2_incoming_metadata_buffer {
27
- grpc_chttp2_incoming_metadata_buffer(gpr_arena* arena) : arena(arena) {
27
+ explicit grpc_chttp2_incoming_metadata_buffer(grpc_core::Arena* arena)
28
+ : arena(arena) {
28
29
  grpc_metadata_batch_init(&batch);
29
30
  batch.deadline = GRPC_MILLIS_INF_FUTURE;
30
31
  }
@@ -32,9 +33,14 @@ struct grpc_chttp2_incoming_metadata_buffer {
32
33
  grpc_metadata_batch_destroy(&batch);
33
34
  }
34
35
 
35
- gpr_arena* arena;
36
+ static constexpr size_t kPreallocatedMDElem = 10;
37
+
38
+ grpc_core::Arena* arena;
39
+ size_t size = 0; // total size of metadata.
40
+ size_t count = 0; // minimum of count of metadata and kPreallocatedMDElem.
41
+ // These preallocated mdelems are used while count < kPreallocatedMDElem.
42
+ grpc_linked_mdelem preallocated_mdelems[kPreallocatedMDElem];
36
43
  grpc_metadata_batch batch;
37
- size_t size = 0; // total size of metadata
38
44
  };
39
45
 
40
46
  void grpc_chttp2_incoming_metadata_buffer_publish(