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
@@ -31,153 +31,161 @@
31
31
  #include "src/core/ext/filters/client_channel/resolver_registry.h"
32
32
  #include "src/core/lib/channel/channel_args.h"
33
33
  #include "src/core/lib/channel/handshaker_registry.h"
34
- #include "src/core/lib/gpr/env.h"
35
34
  #include "src/core/lib/gpr/string.h"
35
+ #include "src/core/lib/gprpp/sync.h"
36
36
  #include "src/core/lib/http/format_request.h"
37
37
  #include "src/core/lib/http/parser.h"
38
38
  #include "src/core/lib/slice/slice_internal.h"
39
39
  #include "src/core/lib/uri/uri_parser.h"
40
40
 
41
- typedef struct http_connect_handshaker {
42
- // Base class. Must be first.
43
- grpc_handshaker base;
41
+ namespace grpc_core {
44
42
 
45
- gpr_refcount refcount;
46
- gpr_mu mu;
43
+ namespace {
47
44
 
48
- bool shutdown;
45
+ class HttpConnectHandshaker : public Handshaker {
46
+ public:
47
+ HttpConnectHandshaker();
48
+ void Shutdown(grpc_error* why) override;
49
+ void DoHandshake(grpc_tcp_server_acceptor* acceptor,
50
+ grpc_closure* on_handshake_done,
51
+ HandshakerArgs* args) override;
52
+ const char* name() const override { return "http_connect"; }
53
+
54
+ private:
55
+ virtual ~HttpConnectHandshaker();
56
+ void CleanupArgsForFailureLocked();
57
+ void HandshakeFailedLocked(grpc_error* error);
58
+ static void OnWriteDone(void* arg, grpc_error* error);
59
+ static void OnReadDone(void* arg, grpc_error* error);
60
+
61
+ gpr_mu mu_;
62
+
63
+ bool is_shutdown_ = false;
49
64
  // Endpoint and read buffer to destroy after a shutdown.
50
- grpc_endpoint* endpoint_to_destroy;
51
- grpc_slice_buffer* read_buffer_to_destroy;
65
+ grpc_endpoint* endpoint_to_destroy_ = nullptr;
66
+ grpc_slice_buffer* read_buffer_to_destroy_ = nullptr;
52
67
 
53
68
  // State saved while performing the handshake.
54
- grpc_handshaker_args* args;
55
- grpc_closure* on_handshake_done;
69
+ HandshakerArgs* args_ = nullptr;
70
+ grpc_closure* on_handshake_done_ = nullptr;
56
71
 
57
72
  // Objects for processing the HTTP CONNECT request and response.
58
- grpc_slice_buffer write_buffer;
59
- grpc_closure request_done_closure;
60
- grpc_closure response_read_closure;
61
- grpc_http_parser http_parser;
62
- grpc_http_response http_response;
63
- } http_connect_handshaker;
73
+ grpc_slice_buffer write_buffer_;
74
+ grpc_closure request_done_closure_;
75
+ grpc_closure response_read_closure_;
76
+ grpc_http_parser http_parser_;
77
+ grpc_http_response http_response_;
78
+ };
64
79
 
65
- // Unref and clean up handshaker.
66
- static void http_connect_handshaker_unref(http_connect_handshaker* handshaker) {
67
- if (gpr_unref(&handshaker->refcount)) {
68
- gpr_mu_destroy(&handshaker->mu);
69
- if (handshaker->endpoint_to_destroy != nullptr) {
70
- grpc_endpoint_destroy(handshaker->endpoint_to_destroy);
71
- }
72
- if (handshaker->read_buffer_to_destroy != nullptr) {
73
- grpc_slice_buffer_destroy_internal(handshaker->read_buffer_to_destroy);
74
- gpr_free(handshaker->read_buffer_to_destroy);
75
- }
76
- grpc_slice_buffer_destroy_internal(&handshaker->write_buffer);
77
- grpc_http_parser_destroy(&handshaker->http_parser);
78
- grpc_http_response_destroy(&handshaker->http_response);
79
- gpr_free(handshaker);
80
+ HttpConnectHandshaker::~HttpConnectHandshaker() {
81
+ gpr_mu_destroy(&mu_);
82
+ if (endpoint_to_destroy_ != nullptr) {
83
+ grpc_endpoint_destroy(endpoint_to_destroy_);
84
+ }
85
+ if (read_buffer_to_destroy_ != nullptr) {
86
+ grpc_slice_buffer_destroy_internal(read_buffer_to_destroy_);
87
+ gpr_free(read_buffer_to_destroy_);
80
88
  }
89
+ grpc_slice_buffer_destroy_internal(&write_buffer_);
90
+ grpc_http_parser_destroy(&http_parser_);
91
+ grpc_http_response_destroy(&http_response_);
81
92
  }
82
93
 
83
94
  // Set args fields to nullptr, saving the endpoint and read buffer for
84
95
  // later destruction.
85
- static void cleanup_args_for_failure_locked(
86
- http_connect_handshaker* handshaker) {
87
- handshaker->endpoint_to_destroy = handshaker->args->endpoint;
88
- handshaker->args->endpoint = nullptr;
89
- handshaker->read_buffer_to_destroy = handshaker->args->read_buffer;
90
- handshaker->args->read_buffer = nullptr;
91
- grpc_channel_args_destroy(handshaker->args->args);
92
- handshaker->args->args = nullptr;
96
+ void HttpConnectHandshaker::CleanupArgsForFailureLocked() {
97
+ endpoint_to_destroy_ = args_->endpoint;
98
+ args_->endpoint = nullptr;
99
+ read_buffer_to_destroy_ = args_->read_buffer;
100
+ args_->read_buffer = nullptr;
101
+ grpc_channel_args_destroy(args_->args);
102
+ args_->args = nullptr;
93
103
  }
94
104
 
95
105
  // If the handshake failed or we're shutting down, clean up and invoke the
96
106
  // callback with the error.
97
- static void handshake_failed_locked(http_connect_handshaker* handshaker,
98
- grpc_error* error) {
107
+ void HttpConnectHandshaker::HandshakeFailedLocked(grpc_error* error) {
99
108
  if (error == GRPC_ERROR_NONE) {
100
109
  // If we were shut down after an endpoint operation succeeded but
101
110
  // before the endpoint callback was invoked, we need to generate our
102
111
  // own error.
103
112
  error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Handshaker shutdown");
104
113
  }
105
- if (!handshaker->shutdown) {
114
+ if (!is_shutdown_) {
106
115
  // TODO(ctiller): It is currently necessary to shutdown endpoints
107
116
  // before destroying them, even if we know that there are no
108
117
  // pending read/write callbacks. This should be fixed, at which
109
118
  // point this can be removed.
110
- grpc_endpoint_shutdown(handshaker->args->endpoint, GRPC_ERROR_REF(error));
119
+ grpc_endpoint_shutdown(args_->endpoint, GRPC_ERROR_REF(error));
111
120
  // Not shutting down, so the handshake failed. Clean up before
112
121
  // invoking the callback.
113
- cleanup_args_for_failure_locked(handshaker);
122
+ CleanupArgsForFailureLocked();
114
123
  // Set shutdown to true so that subsequent calls to
115
124
  // http_connect_handshaker_shutdown() do nothing.
116
- handshaker->shutdown = true;
125
+ is_shutdown_ = true;
117
126
  }
118
127
  // Invoke callback.
119
- GRPC_CLOSURE_SCHED(handshaker->on_handshake_done, error);
128
+ GRPC_CLOSURE_SCHED(on_handshake_done_, error);
120
129
  }
121
130
 
122
131
  // Callback invoked when finished writing HTTP CONNECT request.
123
- static void on_write_done(void* arg, grpc_error* error) {
124
- http_connect_handshaker* handshaker =
125
- static_cast<http_connect_handshaker*>(arg);
126
- gpr_mu_lock(&handshaker->mu);
127
- if (error != GRPC_ERROR_NONE || handshaker->shutdown) {
132
+ void HttpConnectHandshaker::OnWriteDone(void* arg, grpc_error* error) {
133
+ auto* handshaker = static_cast<HttpConnectHandshaker*>(arg);
134
+ gpr_mu_lock(&handshaker->mu_);
135
+ if (error != GRPC_ERROR_NONE || handshaker->is_shutdown_) {
128
136
  // If the write failed or we're shutting down, clean up and invoke the
129
137
  // callback with the error.
130
- handshake_failed_locked(handshaker, GRPC_ERROR_REF(error));
131
- gpr_mu_unlock(&handshaker->mu);
132
- http_connect_handshaker_unref(handshaker);
138
+ handshaker->HandshakeFailedLocked(GRPC_ERROR_REF(error));
139
+ gpr_mu_unlock(&handshaker->mu_);
140
+ handshaker->Unref();
133
141
  } else {
134
142
  // Otherwise, read the response.
135
143
  // The read callback inherits our ref to the handshaker.
136
- grpc_endpoint_read(handshaker->args->endpoint,
137
- handshaker->args->read_buffer,
138
- &handshaker->response_read_closure);
139
- gpr_mu_unlock(&handshaker->mu);
144
+ grpc_endpoint_read(handshaker->args_->endpoint,
145
+ handshaker->args_->read_buffer,
146
+ &handshaker->response_read_closure_, /*urgent=*/true);
147
+ gpr_mu_unlock(&handshaker->mu_);
140
148
  }
141
149
  }
142
150
 
143
151
  // Callback invoked for reading HTTP CONNECT response.
144
- static void on_read_done(void* arg, grpc_error* error) {
145
- http_connect_handshaker* handshaker =
146
- static_cast<http_connect_handshaker*>(arg);
147
- gpr_mu_lock(&handshaker->mu);
148
- if (error != GRPC_ERROR_NONE || handshaker->shutdown) {
152
+ void HttpConnectHandshaker::OnReadDone(void* arg, grpc_error* error) {
153
+ auto* handshaker = static_cast<HttpConnectHandshaker*>(arg);
154
+
155
+ gpr_mu_lock(&handshaker->mu_);
156
+ if (error != GRPC_ERROR_NONE || handshaker->is_shutdown_) {
149
157
  // If the read failed or we're shutting down, clean up and invoke the
150
158
  // callback with the error.
151
- handshake_failed_locked(handshaker, GRPC_ERROR_REF(error));
159
+ handshaker->HandshakeFailedLocked(GRPC_ERROR_REF(error));
152
160
  goto done;
153
161
  }
154
162
  // Add buffer to parser.
155
- for (size_t i = 0; i < handshaker->args->read_buffer->count; ++i) {
156
- if (GRPC_SLICE_LENGTH(handshaker->args->read_buffer->slices[i]) > 0) {
163
+ for (size_t i = 0; i < handshaker->args_->read_buffer->count; ++i) {
164
+ if (GRPC_SLICE_LENGTH(handshaker->args_->read_buffer->slices[i]) > 0) {
157
165
  size_t body_start_offset = 0;
158
- error = grpc_http_parser_parse(&handshaker->http_parser,
159
- handshaker->args->read_buffer->slices[i],
166
+ error = grpc_http_parser_parse(&handshaker->http_parser_,
167
+ handshaker->args_->read_buffer->slices[i],
160
168
  &body_start_offset);
161
169
  if (error != GRPC_ERROR_NONE) {
162
- handshake_failed_locked(handshaker, error);
170
+ handshaker->HandshakeFailedLocked(error);
163
171
  goto done;
164
172
  }
165
- if (handshaker->http_parser.state == GRPC_HTTP_BODY) {
173
+ if (handshaker->http_parser_.state == GRPC_HTTP_BODY) {
166
174
  // Remove the data we've already read from the read buffer,
167
175
  // leaving only the leftover bytes (if any).
168
176
  grpc_slice_buffer tmp_buffer;
169
177
  grpc_slice_buffer_init(&tmp_buffer);
170
178
  if (body_start_offset <
171
- GRPC_SLICE_LENGTH(handshaker->args->read_buffer->slices[i])) {
179
+ GRPC_SLICE_LENGTH(handshaker->args_->read_buffer->slices[i])) {
172
180
  grpc_slice_buffer_add(
173
181
  &tmp_buffer,
174
- grpc_slice_split_tail(&handshaker->args->read_buffer->slices[i],
182
+ grpc_slice_split_tail(&handshaker->args_->read_buffer->slices[i],
175
183
  body_start_offset));
176
184
  }
177
185
  grpc_slice_buffer_addn(&tmp_buffer,
178
- &handshaker->args->read_buffer->slices[i + 1],
179
- handshaker->args->read_buffer->count - i - 1);
180
- grpc_slice_buffer_swap(handshaker->args->read_buffer, &tmp_buffer);
186
+ &handshaker->args_->read_buffer->slices[i + 1],
187
+ handshaker->args_->read_buffer->count - i - 1);
188
+ grpc_slice_buffer_swap(handshaker->args_->read_buffer, &tmp_buffer);
181
189
  grpc_slice_buffer_destroy_internal(&tmp_buffer);
182
190
  break;
183
191
  }
@@ -194,64 +202,53 @@ static void on_read_done(void* arg, grpc_error* error) {
194
202
  // need to fix the HTTP parser to understand when the body is
195
203
  // complete (e.g., handling chunked transfer encoding or looking
196
204
  // at the Content-Length: header).
197
- if (handshaker->http_parser.state != GRPC_HTTP_BODY) {
198
- grpc_slice_buffer_reset_and_unref_internal(handshaker->args->read_buffer);
199
- grpc_endpoint_read(handshaker->args->endpoint,
200
- handshaker->args->read_buffer,
201
- &handshaker->response_read_closure);
202
- gpr_mu_unlock(&handshaker->mu);
205
+ if (handshaker->http_parser_.state != GRPC_HTTP_BODY) {
206
+ grpc_slice_buffer_reset_and_unref_internal(handshaker->args_->read_buffer);
207
+ grpc_endpoint_read(handshaker->args_->endpoint,
208
+ handshaker->args_->read_buffer,
209
+ &handshaker->response_read_closure_, /*urgent=*/true);
210
+ gpr_mu_unlock(&handshaker->mu_);
203
211
  return;
204
212
  }
205
213
  // Make sure we got a 2xx response.
206
- if (handshaker->http_response.status < 200 ||
207
- handshaker->http_response.status >= 300) {
214
+ if (handshaker->http_response_.status < 200 ||
215
+ handshaker->http_response_.status >= 300) {
208
216
  char* msg;
209
217
  gpr_asprintf(&msg, "HTTP proxy returned response code %d",
210
- handshaker->http_response.status);
218
+ handshaker->http_response_.status);
211
219
  error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg);
212
220
  gpr_free(msg);
213
- handshake_failed_locked(handshaker, error);
221
+ handshaker->HandshakeFailedLocked(error);
214
222
  goto done;
215
223
  }
216
224
  // Success. Invoke handshake-done callback.
217
- GRPC_CLOSURE_SCHED(handshaker->on_handshake_done, error);
225
+ GRPC_CLOSURE_SCHED(handshaker->on_handshake_done_, error);
218
226
  done:
219
227
  // Set shutdown to true so that subsequent calls to
220
228
  // http_connect_handshaker_shutdown() do nothing.
221
- handshaker->shutdown = true;
222
- gpr_mu_unlock(&handshaker->mu);
223
- http_connect_handshaker_unref(handshaker);
229
+ handshaker->is_shutdown_ = true;
230
+ gpr_mu_unlock(&handshaker->mu_);
231
+ handshaker->Unref();
224
232
  }
225
233
 
226
234
  //
227
235
  // Public handshaker methods
228
236
  //
229
237
 
230
- static void http_connect_handshaker_destroy(grpc_handshaker* handshaker_in) {
231
- http_connect_handshaker* handshaker =
232
- reinterpret_cast<http_connect_handshaker*>(handshaker_in);
233
- http_connect_handshaker_unref(handshaker);
234
- }
235
-
236
- static void http_connect_handshaker_shutdown(grpc_handshaker* handshaker_in,
237
- grpc_error* why) {
238
- http_connect_handshaker* handshaker =
239
- reinterpret_cast<http_connect_handshaker*>(handshaker_in);
240
- gpr_mu_lock(&handshaker->mu);
241
- if (!handshaker->shutdown) {
242
- handshaker->shutdown = true;
243
- grpc_endpoint_shutdown(handshaker->args->endpoint, GRPC_ERROR_REF(why));
244
- cleanup_args_for_failure_locked(handshaker);
238
+ void HttpConnectHandshaker::Shutdown(grpc_error* why) {
239
+ gpr_mu_lock(&mu_);
240
+ if (!is_shutdown_) {
241
+ is_shutdown_ = true;
242
+ grpc_endpoint_shutdown(args_->endpoint, GRPC_ERROR_REF(why));
243
+ CleanupArgsForFailureLocked();
245
244
  }
246
- gpr_mu_unlock(&handshaker->mu);
245
+ gpr_mu_unlock(&mu_);
247
246
  GRPC_ERROR_UNREF(why);
248
247
  }
249
248
 
250
- static void http_connect_handshaker_do_handshake(
251
- grpc_handshaker* handshaker_in, grpc_tcp_server_acceptor* acceptor,
252
- grpc_closure* on_handshake_done, grpc_handshaker_args* args) {
253
- http_connect_handshaker* handshaker =
254
- reinterpret_cast<http_connect_handshaker*>(handshaker_in);
249
+ void HttpConnectHandshaker::DoHandshake(grpc_tcp_server_acceptor* acceptor,
250
+ grpc_closure* on_handshake_done,
251
+ HandshakerArgs* args) {
255
252
  // Check for HTTP CONNECT channel arg.
256
253
  // If not found, invoke on_handshake_done without doing anything.
257
254
  const grpc_arg* arg =
@@ -260,9 +257,9 @@ static void http_connect_handshaker_do_handshake(
260
257
  if (server_name == nullptr) {
261
258
  // Set shutdown to true so that subsequent calls to
262
259
  // http_connect_handshaker_shutdown() do nothing.
263
- gpr_mu_lock(&handshaker->mu);
264
- handshaker->shutdown = true;
265
- gpr_mu_unlock(&handshaker->mu);
260
+ gpr_mu_lock(&mu_);
261
+ is_shutdown_ = true;
262
+ gpr_mu_unlock(&mu_);
266
263
  GRPC_CLOSURE_SCHED(on_handshake_done, GRPC_ERROR_NONE);
267
264
  return;
268
265
  }
@@ -280,6 +277,7 @@ static void http_connect_handshaker_do_handshake(
280
277
  gpr_malloc(sizeof(grpc_http_header) * num_header_strings));
281
278
  for (size_t i = 0; i < num_header_strings; ++i) {
282
279
  char* sep = strchr(header_strings[i], ':');
280
+
283
281
  if (sep == nullptr) {
284
282
  gpr_log(GPR_ERROR, "skipping unparseable HTTP CONNECT header: %s",
285
283
  header_strings[i]);
@@ -292,9 +290,9 @@ static void http_connect_handshaker_do_handshake(
292
290
  }
293
291
  }
294
292
  // Save state in the handshaker object.
295
- gpr_mu_lock(&handshaker->mu);
296
- handshaker->args = args;
297
- handshaker->on_handshake_done = on_handshake_done;
293
+ MutexLock lock(&mu_);
294
+ args_ = args;
295
+ on_handshake_done_ = on_handshake_done;
298
296
  // Log connection via proxy.
299
297
  char* proxy_name = grpc_endpoint_get_peer(args->endpoint);
300
298
  gpr_log(GPR_INFO, "Connecting to server %s via HTTP proxy %s", server_name,
@@ -302,15 +300,18 @@ static void http_connect_handshaker_do_handshake(
302
300
  gpr_free(proxy_name);
303
301
  // Construct HTTP CONNECT request.
304
302
  grpc_httpcli_request request;
305
- memset(&request, 0, sizeof(request));
306
303
  request.host = server_name;
304
+ request.ssl_host_override = nullptr;
307
305
  request.http.method = (char*)"CONNECT";
308
306
  request.http.path = server_name;
307
+ request.http.version = GRPC_HTTP_HTTP10; // Set by OnReadDone
309
308
  request.http.hdrs = headers;
310
309
  request.http.hdr_count = num_headers;
310
+ request.http.body_length = 0;
311
+ request.http.body = nullptr;
311
312
  request.handshaker = &grpc_httpcli_plaintext;
312
313
  grpc_slice request_slice = grpc_httpcli_format_connect_request(&request);
313
- grpc_slice_buffer_add(&handshaker->write_buffer, request_slice);
314
+ grpc_slice_buffer_add(&write_buffer_, request_slice);
314
315
  // Clean up.
315
316
  gpr_free(headers);
316
317
  for (size_t i = 0; i < num_header_strings; ++i) {
@@ -318,54 +319,42 @@ static void http_connect_handshaker_do_handshake(
318
319
  }
319
320
  gpr_free(header_strings);
320
321
  // Take a new ref to be held by the write callback.
321
- gpr_ref(&handshaker->refcount);
322
- grpc_endpoint_write(args->endpoint, &handshaker->write_buffer,
323
- &handshaker->request_done_closure, nullptr);
324
- gpr_mu_unlock(&handshaker->mu);
322
+ Ref().release();
323
+ grpc_endpoint_write(args->endpoint, &write_buffer_, &request_done_closure_,
324
+ nullptr);
325
325
  }
326
326
 
327
- static const grpc_handshaker_vtable http_connect_handshaker_vtable = {
328
- http_connect_handshaker_destroy, http_connect_handshaker_shutdown,
329
- http_connect_handshaker_do_handshake, "http_connect"};
330
-
331
- static grpc_handshaker* grpc_http_connect_handshaker_create() {
332
- http_connect_handshaker* handshaker =
333
- static_cast<http_connect_handshaker*>(gpr_malloc(sizeof(*handshaker)));
334
- memset(handshaker, 0, sizeof(*handshaker));
335
- grpc_handshaker_init(&http_connect_handshaker_vtable, &handshaker->base);
336
- gpr_mu_init(&handshaker->mu);
337
- gpr_ref_init(&handshaker->refcount, 1);
338
- grpc_slice_buffer_init(&handshaker->write_buffer);
339
- GRPC_CLOSURE_INIT(&handshaker->request_done_closure, on_write_done,
340
- handshaker, grpc_schedule_on_exec_ctx);
341
- GRPC_CLOSURE_INIT(&handshaker->response_read_closure, on_read_done,
342
- handshaker, grpc_schedule_on_exec_ctx);
343
- grpc_http_parser_init(&handshaker->http_parser, GRPC_HTTP_RESPONSE,
344
- &handshaker->http_response);
345
- return &handshaker->base;
327
+ HttpConnectHandshaker::HttpConnectHandshaker() {
328
+ gpr_mu_init(&mu_);
329
+ grpc_slice_buffer_init(&write_buffer_);
330
+ GRPC_CLOSURE_INIT(&request_done_closure_, &HttpConnectHandshaker::OnWriteDone,
331
+ this, grpc_schedule_on_exec_ctx);
332
+ GRPC_CLOSURE_INIT(&response_read_closure_, &HttpConnectHandshaker::OnReadDone,
333
+ this, grpc_schedule_on_exec_ctx);
334
+ grpc_http_parser_init(&http_parser_, GRPC_HTTP_RESPONSE, &http_response_);
346
335
  }
347
336
 
348
337
  //
349
338
  // handshaker factory
350
339
  //
351
340
 
352
- static void handshaker_factory_add_handshakers(
353
- grpc_handshaker_factory* factory, const grpc_channel_args* args,
354
- grpc_pollset_set* interested_parties,
355
- grpc_handshake_manager* handshake_mgr) {
356
- grpc_handshake_manager_add(handshake_mgr,
357
- grpc_http_connect_handshaker_create());
358
- }
359
-
360
- static void handshaker_factory_destroy(grpc_handshaker_factory* factory) {}
341
+ class HttpConnectHandshakerFactory : public HandshakerFactory {
342
+ public:
343
+ void AddHandshakers(const grpc_channel_args* args,
344
+ grpc_pollset_set* interested_parties,
345
+ HandshakeManager* handshake_mgr) override {
346
+ handshake_mgr->Add(MakeRefCounted<HttpConnectHandshaker>());
347
+ }
348
+ ~HttpConnectHandshakerFactory() override = default;
349
+ };
361
350
 
362
- static const grpc_handshaker_factory_vtable handshaker_factory_vtable = {
363
- handshaker_factory_add_handshakers, handshaker_factory_destroy};
351
+ } // namespace
364
352
 
365
- static grpc_handshaker_factory handshaker_factory = {
366
- &handshaker_factory_vtable};
353
+ } // namespace grpc_core
367
354
 
368
355
  void grpc_http_connect_register_handshaker_factory() {
369
- grpc_handshaker_factory_register(true /* at_start */, HANDSHAKER_CLIENT,
370
- &handshaker_factory);
356
+ using namespace grpc_core;
357
+ HandshakerRegistry::RegisterHandshakerFactory(
358
+ true /* at_start */, HANDSHAKER_CLIENT,
359
+ UniquePtr<HandshakerFactory>(New<HttpConnectHandshakerFactory>()));
371
360
  }
@@ -25,7 +25,7 @@
25
25
 
26
26
  /// Channel arg indicating HTTP CONNECT headers (string).
27
27
  /// Multiple headers are separated by newlines. Key/value pairs are
28
- /// seperated by colons.
28
+ /// separated by colons.
29
29
  #define GRPC_ARG_HTTP_CONNECT_HEADERS "grpc.http_connect_headers"
30
30
 
31
31
  /// Registers handshaker factory.
@@ -37,17 +37,6 @@ static void destroy_channel_elem(grpc_channel_element* elem) {}
37
37
  namespace {
38
38
 
39
39
  struct call_data {
40
- call_data(const grpc_call_element_args& args) {
41
- if (args.context[GRPC_GRPCLB_CLIENT_STATS].value != nullptr) {
42
- // Get stats object from context and take a ref.
43
- client_stats = static_cast<grpc_core::GrpcLbClientStats*>(
44
- args.context[GRPC_GRPCLB_CLIENT_STATS].value)
45
- ->Ref();
46
- // Record call started.
47
- client_stats->AddCallStarted();
48
- }
49
- }
50
-
51
40
  // Stats object to update.
52
41
  grpc_core::RefCountedPtr<grpc_core::GrpcLbClientStats> client_stats;
53
42
  // State for intercepting send_initial_metadata.
@@ -82,7 +71,7 @@ static void recv_initial_metadata_ready(void* arg, grpc_error* error) {
82
71
  static grpc_error* init_call_elem(grpc_call_element* elem,
83
72
  const grpc_call_element_args* args) {
84
73
  GPR_ASSERT(args->context != nullptr);
85
- new (elem->call_data) call_data(*args);
74
+ new (elem->call_data) call_data();
86
75
  return GRPC_ERROR_NONE;
87
76
  }
88
77
 
@@ -96,9 +85,6 @@ static void destroy_call_elem(grpc_call_element* elem,
96
85
  calld->client_stats->AddCallFinished(
97
86
  !calld->send_initial_metadata_succeeded /* client_failed_to_send */,
98
87
  calld->recv_initial_metadata_succeeded /* known_received */);
99
- // All done, so unref the stats object.
100
- // TODO(roth): Eliminate this once filter stack is converted to C++.
101
- calld->client_stats.reset();
102
88
  }
103
89
  calld->~call_data();
104
90
  }
@@ -107,25 +93,36 @@ static void start_transport_stream_op_batch(
107
93
  grpc_call_element* elem, grpc_transport_stream_op_batch* batch) {
108
94
  call_data* calld = static_cast<call_data*>(elem->call_data);
109
95
  GPR_TIMER_SCOPE("clr_start_transport_stream_op_batch", 0);
110
- if (calld->client_stats != nullptr) {
111
- // Intercept send_initial_metadata.
112
- if (batch->send_initial_metadata) {
113
- calld->original_on_complete_for_send = batch->on_complete;
114
- GRPC_CLOSURE_INIT(&calld->on_complete_for_send, on_complete_for_send,
115
- calld, grpc_schedule_on_exec_ctx);
116
- batch->on_complete = &calld->on_complete_for_send;
117
- }
118
- // Intercept recv_initial_metadata.
119
- if (batch->recv_initial_metadata) {
120
- calld->original_recv_initial_metadata_ready =
121
- batch->payload->recv_initial_metadata.recv_initial_metadata_ready;
122
- GRPC_CLOSURE_INIT(&calld->recv_initial_metadata_ready,
123
- recv_initial_metadata_ready, calld,
124
- grpc_schedule_on_exec_ctx);
125
- batch->payload->recv_initial_metadata.recv_initial_metadata_ready =
126
- &calld->recv_initial_metadata_ready;
96
+ // Handle send_initial_metadata.
97
+ if (batch->send_initial_metadata) {
98
+ // Grab client stats object from user_data for LB token metadata.
99
+ grpc_linked_mdelem* lb_token =
100
+ batch->payload->send_initial_metadata.send_initial_metadata->idx.named
101
+ .lb_token;
102
+ if (lb_token != nullptr) {
103
+ grpc_core::GrpcLbClientStats* client_stats =
104
+ static_cast<grpc_core::GrpcLbClientStats*>(grpc_mdelem_get_user_data(
105
+ lb_token->md, grpc_core::GrpcLbClientStats::Destroy));
106
+ if (client_stats != nullptr) {
107
+ calld->client_stats = client_stats->Ref();
108
+ // Intercept completion.
109
+ calld->original_on_complete_for_send = batch->on_complete;
110
+ GRPC_CLOSURE_INIT(&calld->on_complete_for_send, on_complete_for_send,
111
+ calld, grpc_schedule_on_exec_ctx);
112
+ batch->on_complete = &calld->on_complete_for_send;
113
+ }
127
114
  }
128
115
  }
116
+ // Intercept completion of recv_initial_metadata.
117
+ if (batch->recv_initial_metadata) {
118
+ calld->original_recv_initial_metadata_ready =
119
+ batch->payload->recv_initial_metadata.recv_initial_metadata_ready;
120
+ GRPC_CLOSURE_INIT(&calld->recv_initial_metadata_ready,
121
+ recv_initial_metadata_ready, calld,
122
+ grpc_schedule_on_exec_ctx);
123
+ batch->payload->recv_initial_metadata.recv_initial_metadata_ready =
124
+ &calld->recv_initial_metadata_ready;
125
+ }
129
126
  // Chain to next filter.
130
127
  grpc_call_next_op(elem, batch);
131
128
  }