grpc 1.46.3 → 1.47.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 (481) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +49 -97
  3. data/include/grpc/event_engine/event_engine.h +42 -7
  4. data/include/grpc/event_engine/memory_allocator.h +0 -15
  5. data/include/grpc/event_engine/port.h +1 -1
  6. data/include/grpc/event_engine/slice.h +286 -0
  7. data/include/grpc/event_engine/slice_buffer.h +112 -0
  8. data/include/grpc/grpc_security.h +11 -0
  9. data/include/grpc/impl/codegen/port_platform.h +100 -36
  10. data/include/grpc/impl/codegen/slice.h +1 -1
  11. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +18 -30
  12. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +4 -1
  13. data/src/core/ext/filters/client_channel/backend_metric.cc +17 -12
  14. data/src/core/ext/filters/client_channel/backend_metric.h +19 -9
  15. data/src/core/ext/filters/client_channel/backup_poller.cc +5 -5
  16. data/src/core/ext/filters/client_channel/backup_poller.h +2 -4
  17. data/src/core/ext/filters/client_channel/channel_connectivity.cc +42 -20
  18. data/src/core/ext/filters/client_channel/client_channel.cc +60 -17
  19. data/src/core/ext/filters/client_channel/client_channel.h +26 -6
  20. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +3 -5
  21. data/src/core/ext/filters/client_channel/client_channel_channelz.h +12 -2
  22. data/src/core/ext/filters/client_channel/client_channel_factory.cc +5 -0
  23. data/src/core/ext/filters/client_channel/client_channel_factory.h +8 -0
  24. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -13
  25. data/src/core/ext/filters/client_channel/config_selector.cc +1 -0
  26. data/src/core/ext/filters/client_channel/config_selector.h +7 -5
  27. data/src/core/ext/filters/client_channel/connector.h +8 -2
  28. data/src/core/ext/filters/client_channel/dynamic_filters.cc +13 -2
  29. data/src/core/ext/filters/client_channel/dynamic_filters.h +11 -1
  30. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +2 -0
  31. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +3 -0
  32. data/src/core/ext/filters/client_channel/health/health_check_client.cc +14 -1
  33. data/src/core/ext/filters/client_channel/health/health_check_client.h +2 -0
  34. data/src/core/ext/filters/client_channel/http_proxy.cc +10 -2
  35. data/src/core/ext/filters/client_channel/http_proxy.h +3 -0
  36. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +6 -2
  37. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +1 -0
  38. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +49 -0
  39. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +12 -0
  40. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +5 -0
  41. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +9 -3
  42. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +59 -19
  43. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +4 -0
  44. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +6 -0
  45. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +10 -1
  46. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +6 -3
  47. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +408 -0
  48. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +57 -0
  49. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +1038 -0
  50. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +54 -0
  51. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +60 -52
  52. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +102 -60
  53. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +157 -96
  54. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +2 -0
  55. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +45 -10
  56. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +182 -171
  57. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +39 -36
  58. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +30 -5
  59. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +99 -23
  60. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +6 -0
  61. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +30 -4
  62. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +23 -3
  63. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +75 -11
  64. data/src/core/ext/filters/client_channel/lb_policy.cc +4 -2
  65. data/src/core/ext/filters/client_channel/lb_policy.h +18 -24
  66. data/src/core/ext/filters/client_channel/lb_policy_factory.h +2 -0
  67. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +8 -1
  68. data/src/core/ext/filters/client_channel/lb_policy_registry.h +6 -1
  69. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +4 -0
  70. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +1 -0
  71. data/src/core/ext/filters/client_channel/proxy_mapper.h +1 -1
  72. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +2 -0
  73. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +5 -0
  74. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +23 -5
  75. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +134 -43
  76. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -1
  77. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +10 -8
  78. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +1 -1
  79. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +26 -9
  80. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +13 -4
  81. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -1
  82. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +2 -0
  83. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +2 -1
  84. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +30 -7
  85. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +13 -14
  86. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +5 -2
  87. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +59 -13
  88. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +13 -1
  89. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +8 -1
  90. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +15 -11
  91. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +89 -33
  92. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +5 -11
  93. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +11 -5
  94. data/src/core/ext/filters/client_channel/retry_filter.cc +42 -2
  95. data/src/core/ext/filters/client_channel/retry_service_config.cc +8 -9
  96. data/src/core/ext/filters/client_channel/retry_service_config.h +10 -1
  97. data/src/core/ext/filters/client_channel/retry_throttle.cc +1 -8
  98. data/src/core/ext/filters/client_channel/retry_throttle.h +7 -1
  99. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +22 -5
  100. data/src/core/ext/filters/client_channel/subchannel.cc +156 -160
  101. data/src/core/ext/filters/client_channel/subchannel.h +80 -20
  102. data/src/core/ext/filters/client_channel/subchannel_interface.h +41 -23
  103. data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +38 -0
  104. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +12 -2
  105. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +6 -3
  106. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +16 -2
  107. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +12 -0
  108. data/src/core/ext/filters/deadline/deadline_filter.cc +6 -2
  109. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -4
  110. data/src/core/ext/filters/http/client/http_client_filter.cc +14 -5
  111. data/src/core/ext/filters/http/client/http_client_filter.h +7 -1
  112. data/src/core/ext/filters/http/client_authority_filter.cc +5 -10
  113. data/src/core/ext/filters/http/http_filters_plugin.cc +7 -8
  114. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +1 -0
  115. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +3 -1
  116. data/src/core/ext/filters/http/server/http_server_filter.cc +80 -247
  117. data/src/core/ext/filters/http/server/http_server_filter.h +31 -2
  118. data/src/core/ext/filters/message_size/message_size_filter.cc +20 -26
  119. data/src/core/ext/filters/message_size/message_size_filter.h +2 -2
  120. data/src/core/ext/filters/rbac/rbac_filter.cc +1 -0
  121. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +101 -135
  122. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +9 -7
  123. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +44 -15
  124. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -0
  125. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +3 -3
  126. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +2 -1
  127. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +1 -0
  128. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +69 -20
  129. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +5 -0
  130. data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -0
  131. data/src/core/ext/transport/chttp2/transport/context_list.h +4 -1
  132. data/src/core/ext/transport/chttp2/transport/flow_control.cc +6 -2
  133. data/src/core/ext/transport/chttp2/transport/flow_control.h +6 -2
  134. data/src/core/ext/transport/chttp2/transport/frame.h +0 -4
  135. data/src/core/ext/transport/chttp2/transport/frame_data.cc +7 -1
  136. data/src/core/ext/transport/chttp2/transport/frame_data.h +4 -1
  137. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +3 -0
  138. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -1
  139. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -0
  140. data/src/core/ext/transport/chttp2/transport/frame_ping.h +3 -0
  141. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +6 -2
  142. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +3 -0
  143. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +12 -3
  144. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -0
  145. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -1
  146. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +3 -0
  147. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +14 -12
  148. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +15 -2
  149. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +3 -0
  150. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +3 -0
  151. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +25 -7
  152. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +8 -1
  153. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +55 -37
  154. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +38 -21
  155. data/src/core/ext/transport/chttp2/transport/http2_settings.h +0 -1
  156. data/src/core/ext/transport/chttp2/transport/internal.h +24 -3
  157. data/src/core/ext/transport/chttp2/transport/parsing.cc +27 -6
  158. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +13 -9
  159. data/src/core/ext/transport/chttp2/transport/stream_map.cc +1 -1
  160. data/src/core/ext/transport/chttp2/transport/stream_map.h +1 -0
  161. data/src/core/ext/transport/chttp2/transport/varint.h +2 -0
  162. data/src/core/ext/transport/chttp2/transport/writing.cc +38 -2
  163. data/src/core/ext/transport/inproc/inproc_transport.cc +8 -5
  164. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +47 -0
  165. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +109 -0
  166. data/src/core/ext/xds/certificate_provider_store.cc +4 -2
  167. data/src/core/ext/xds/certificate_provider_store.h +1 -1
  168. data/src/core/ext/xds/xds_certificate_provider.cc +4 -1
  169. data/src/core/ext/xds/xds_certificate_provider.h +1 -1
  170. data/src/core/ext/xds/xds_channel_stack_modifier.cc +5 -5
  171. data/src/core/ext/xds/xds_client.cc +46 -22
  172. data/src/core/ext/xds/xds_cluster.cc +106 -16
  173. data/src/core/ext/xds/xds_cluster.h +3 -0
  174. data/src/core/ext/xds/xds_http_fault_filter.cc +3 -3
  175. data/src/core/ext/xds/xds_listener.cc +19 -9
  176. data/src/core/ext/xds/xds_server_config_fetcher.cc +2 -1
  177. data/src/core/lib/address_utils/sockaddr_utils.cc +56 -23
  178. data/src/core/lib/address_utils/sockaddr_utils.h +7 -4
  179. data/src/core/lib/avl/avl.h +3 -1
  180. data/src/core/lib/channel/call_finalization.h +4 -0
  181. data/src/core/lib/channel/call_tracer.h +8 -2
  182. data/src/core/lib/channel/channel_args.cc +41 -22
  183. data/src/core/lib/channel/channel_args.h +33 -3
  184. data/src/core/lib/channel/channel_args_preconditioning.cc +3 -3
  185. data/src/core/lib/channel/channel_args_preconditioning.h +3 -2
  186. data/src/core/lib/channel/channel_stack.cc +41 -3
  187. data/src/core/lib/channel/channel_stack.h +49 -3
  188. data/src/core/lib/channel/channel_stack_builder.cc +9 -19
  189. data/src/core/lib/channel/channel_stack_builder.h +15 -27
  190. data/src/core/lib/channel/channel_stack_builder_impl.cc +36 -41
  191. data/src/core/lib/channel/channel_stack_builder_impl.h +3 -6
  192. data/src/core/lib/channel/channel_trace.cc +8 -13
  193. data/src/core/lib/channel/channel_trace.h +6 -3
  194. data/src/core/lib/channel/channelz.cc +8 -13
  195. data/src/core/lib/channel/channelz.h +13 -4
  196. data/src/core/lib/channel/channelz_registry.cc +7 -14
  197. data/src/core/lib/channel/channelz_registry.h +10 -9
  198. data/src/core/lib/channel/connected_channel.cc +21 -31
  199. data/src/core/lib/channel/connected_channel.h +1 -0
  200. data/src/core/lib/channel/promise_based_filter.cc +444 -189
  201. data/src/core/lib/channel/promise_based_filter.h +160 -27
  202. data/src/core/lib/channel/status_util.cc +2 -0
  203. data/src/core/lib/channel/status_util.h +0 -3
  204. data/src/core/lib/compression/compression_internal.cc +45 -10
  205. data/src/core/lib/compression/compression_internal.h +1 -1
  206. data/src/core/lib/config/core_configuration.cc +3 -0
  207. data/src/core/lib/config/core_configuration.h +2 -1
  208. data/src/core/lib/event_engine/channel_args_endpoint_config.cc +4 -2
  209. data/src/core/lib/event_engine/channel_args_endpoint_config.h +3 -2
  210. data/src/core/lib/event_engine/default_event_engine_factory.cc +8 -2
  211. data/src/core/lib/event_engine/event_engine.cc +12 -2
  212. data/src/core/lib/event_engine/event_engine_factory.h +5 -0
  213. data/src/core/lib/event_engine/handle_containers.h +67 -0
  214. data/src/core/lib/event_engine/iomgr_engine.cc +206 -0
  215. data/src/core/lib/event_engine/iomgr_engine.h +118 -0
  216. data/src/core/lib/event_engine/memory_allocator.cc +12 -4
  217. data/src/core/lib/event_engine/resolved_address.cc +4 -2
  218. data/src/core/lib/event_engine/slice.cc +102 -0
  219. data/src/core/lib/event_engine/slice_buffer.cc +50 -0
  220. data/src/core/lib/{iomgr/event_engine/pollset.h → event_engine/trace.cc} +3 -10
  221. data/src/core/lib/{iomgr/endpoint_pair_event_engine.cc → event_engine/trace.h} +12 -14
  222. data/src/core/lib/gpr/log.cc +5 -0
  223. data/src/core/lib/gpr/tls.h +3 -5
  224. data/src/core/lib/gprpp/bitset.h +5 -1
  225. data/src/core/lib/gprpp/chunked_vector.h +4 -0
  226. data/src/core/lib/gprpp/construct_destruct.h +1 -0
  227. data/src/core/lib/gprpp/dual_ref_counted.h +1 -4
  228. data/src/core/lib/gprpp/examine_stack.h +0 -1
  229. data/src/core/lib/gprpp/fork.cc +3 -6
  230. data/src/core/lib/gprpp/global_config.h +2 -4
  231. data/src/core/lib/gprpp/global_config_env.cc +3 -2
  232. data/src/core/lib/gprpp/global_config_env.h +3 -1
  233. data/src/core/lib/gprpp/global_config_generic.h +0 -4
  234. data/src/core/lib/gprpp/host_port.cc +2 -0
  235. data/src/core/lib/gprpp/manual_constructor.h +0 -1
  236. data/src/core/lib/gprpp/match.h +2 -0
  237. data/src/core/lib/gprpp/memory.h +1 -5
  238. data/src/core/lib/gprpp/orphanable.h +1 -4
  239. data/src/core/lib/gprpp/ref_counted.h +1 -3
  240. data/src/core/lib/gprpp/ref_counted_ptr.h +1 -1
  241. data/src/core/lib/gprpp/stat.h +0 -2
  242. data/src/core/lib/gprpp/stat_posix.cc +7 -2
  243. data/src/core/lib/gprpp/status_helper.cc +8 -4
  244. data/src/core/lib/gprpp/status_helper.h +4 -0
  245. data/src/core/lib/gprpp/sync.h +3 -1
  246. data/src/core/lib/gprpp/table.h +10 -0
  247. data/src/core/lib/gprpp/thd.h +2 -5
  248. data/src/core/lib/gprpp/thd_posix.cc +4 -2
  249. data/src/core/lib/gprpp/thd_windows.cc +2 -0
  250. data/src/core/lib/gprpp/time.cc +8 -0
  251. data/src/core/lib/gprpp/time.h +6 -1
  252. data/src/core/lib/gprpp/time_util.cc +4 -0
  253. data/src/core/lib/gprpp/time_util.h +1 -1
  254. data/src/core/lib/gprpp/unique_type_name.h +104 -0
  255. data/src/core/lib/http/format_request.cc +29 -0
  256. data/src/core/lib/http/format_request.h +2 -0
  257. data/src/core/lib/http/httpcli.cc +88 -81
  258. data/src/core/lib/http/httpcli.h +39 -7
  259. data/src/core/lib/http/httpcli_security_connector.cc +3 -4
  260. data/src/core/lib/iomgr/endpoint.cc +4 -4
  261. data/src/core/lib/iomgr/endpoint.h +6 -4
  262. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -4
  263. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -1
  264. data/src/core/lib/iomgr/ev_posix.cc +1 -4
  265. data/src/core/lib/iomgr/exec_ctx.h +1 -2
  266. data/src/core/lib/iomgr/internal_errqueue.cc +38 -47
  267. data/src/core/lib/iomgr/internal_errqueue.h +1 -6
  268. data/src/core/lib/iomgr/iomgr.cc +0 -1
  269. data/src/core/{ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc → lib/iomgr/iomgr_fwd.h} +9 -12
  270. data/src/core/lib/iomgr/pollset_set.h +1 -2
  271. data/src/core/lib/iomgr/port.h +25 -6
  272. data/src/core/lib/iomgr/resolve_address.cc +8 -0
  273. data/src/core/lib/iomgr/resolve_address.h +21 -14
  274. data/src/core/lib/iomgr/resolve_address_impl.h +2 -3
  275. data/src/core/lib/iomgr/resolve_address_posix.cc +8 -14
  276. data/src/core/lib/iomgr/resolve_address_posix.h +5 -2
  277. data/src/core/lib/iomgr/resolve_address_windows.cc +7 -14
  278. data/src/core/lib/iomgr/resolve_address_windows.h +5 -2
  279. data/src/core/lib/iomgr/sockaddr.h +2 -3
  280. data/src/core/lib/iomgr/sockaddr_posix.h +2 -0
  281. data/src/core/lib/iomgr/sockaddr_windows.h +2 -0
  282. data/src/core/lib/iomgr/socket_utils_common_posix.cc +3 -2
  283. data/src/core/lib/iomgr/tcp_client_cfstream.cc +10 -2
  284. data/src/core/lib/iomgr/tcp_client_posix.cc +12 -5
  285. data/src/core/lib/iomgr/tcp_client_windows.cc +13 -6
  286. data/src/core/lib/iomgr/tcp_posix.cc +9 -27
  287. data/src/core/lib/iomgr/tcp_server_posix.cc +26 -12
  288. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +30 -27
  289. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +7 -4
  290. data/src/core/lib/iomgr/tcp_server_windows.cc +13 -5
  291. data/src/core/lib/iomgr/tcp_windows.cc +7 -4
  292. data/src/core/lib/json/json.h +1 -2
  293. data/src/core/lib/json/json_reader.cc +9 -1
  294. data/src/core/lib/json/json_util.cc +7 -0
  295. data/src/core/lib/json/json_util.h +10 -1
  296. data/src/core/lib/json/json_writer.cc +6 -1
  297. data/src/core/lib/promise/activity.cc +1 -1
  298. data/src/core/lib/promise/activity.h +6 -6
  299. data/src/core/lib/promise/arena_promise.h +11 -1
  300. data/src/core/lib/promise/call_push_pull.h +4 -0
  301. data/src/core/lib/promise/context.h +1 -1
  302. data/src/core/lib/promise/detail/basic_seq.h +2 -2
  303. data/src/core/lib/promise/detail/promise_factory.h +0 -1
  304. data/src/core/lib/promise/latch.h +0 -1
  305. data/src/core/lib/promise/loop.h +1 -0
  306. data/src/core/lib/promise/race.h +0 -1
  307. data/src/core/lib/promise/seq.h +0 -2
  308. data/src/core/lib/promise/sleep.cc +2 -0
  309. data/src/core/lib/promise/sleep.h +10 -0
  310. data/src/core/lib/promise/try_seq.h +2 -2
  311. data/src/core/lib/resolver/resolver_factory.h +1 -2
  312. data/src/core/lib/resolver/server_address.cc +9 -3
  313. data/src/core/lib/resolver/server_address.h +4 -4
  314. data/src/core/lib/resource_quota/api.cc +14 -1
  315. data/src/core/lib/resource_quota/api.h +4 -1
  316. data/src/core/lib/resource_quota/arena.cc +0 -6
  317. data/src/core/lib/resource_quota/arena.h +1 -2
  318. data/src/core/lib/resource_quota/memory_quota.cc +47 -5
  319. data/src/core/lib/resource_quota/memory_quota.h +24 -5
  320. data/src/core/lib/resource_quota/resource_quota.h +8 -0
  321. data/src/core/lib/resource_quota/thread_quota.cc +2 -0
  322. data/src/core/lib/resource_quota/thread_quota.h +4 -0
  323. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +3 -0
  324. data/src/core/lib/security/credentials/alts/alts_credentials.cc +8 -2
  325. data/src/core/lib/security/credentials/alts/alts_credentials.h +2 -2
  326. data/src/core/lib/security/credentials/call_creds_util.cc +2 -0
  327. data/src/core/lib/security/credentials/channel_creds_registry.h +1 -0
  328. data/src/core/lib/security/credentials/composite/composite_credentials.cc +7 -3
  329. data/src/core/lib/security/credentials/composite/composite_credentials.h +5 -4
  330. data/src/core/lib/security/credentials/credentials.h +17 -10
  331. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +81 -0
  332. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +8 -0
  333. data/src/core/lib/security/credentials/external/external_account_credentials.cc +3 -0
  334. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -0
  335. data/src/core/lib/security/credentials/fake/fake_credentials.cc +13 -3
  336. data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
  337. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +25 -15
  338. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +2 -2
  339. data/src/core/lib/security/credentials/iam/iam_credentials.cc +4 -1
  340. data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
  341. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +8 -2
  342. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +4 -4
  343. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -2
  344. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
  345. data/src/core/lib/security/credentials/local/local_credentials.cc +8 -2
  346. data/src/core/lib/security/credentials/local/local_credentials.h +2 -2
  347. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +10 -6
  348. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +4 -4
  349. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +4 -1
  350. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +1 -1
  351. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +8 -2
  352. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +4 -4
  353. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +10 -0
  354. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +5 -7
  355. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +26 -1
  356. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +28 -4
  357. data/src/core/lib/security/credentials/tls/tls_credentials.cc +10 -0
  358. data/src/core/lib/security/credentials/tls/tls_credentials.h +2 -2
  359. data/src/core/lib/security/credentials/xds/xds_credentials.cc +12 -3
  360. data/src/core/lib/security/credentials/xds/xds_credentials.h +5 -5
  361. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -1
  362. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +1 -1
  363. data/src/core/lib/security/security_connector/security_connector.cc +1 -1
  364. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  365. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +1 -1
  366. data/src/core/lib/security/transport/client_auth_filter.cc +6 -8
  367. data/src/core/lib/security/transport/secure_endpoint.cc +23 -12
  368. data/src/core/lib/security/transport/security_handshaker.cc +5 -5
  369. data/src/core/lib/security/transport/security_handshaker.h +1 -1
  370. data/src/core/lib/security/transport/server_auth_filter.cc +3 -2
  371. data/src/core/lib/service_config/service_config.h +4 -8
  372. data/src/core/lib/service_config/service_config_call_data.h +4 -1
  373. data/src/core/lib/service_config/service_config_impl.cc +7 -0
  374. data/src/core/lib/service_config/service_config_impl.h +9 -2
  375. data/src/core/lib/service_config/service_config_parser.cc +8 -0
  376. data/src/core/lib/service_config/service_config_parser.h +7 -0
  377. data/src/core/lib/slice/b64.cc +1 -1
  378. data/src/core/lib/slice/b64.h +2 -0
  379. data/src/core/lib/slice/percent_encoding.cc +4 -1
  380. data/src/core/lib/slice/percent_encoding.h +0 -6
  381. data/src/core/lib/slice/slice.cc +2 -1
  382. data/src/core/lib/slice/slice.h +10 -5
  383. data/src/core/lib/slice/slice_api.cc +1 -1
  384. data/src/core/lib/slice/slice_buffer.cc +50 -23
  385. data/src/core/lib/slice/slice_buffer.h +106 -0
  386. data/src/core/lib/slice/slice_buffer_api.cc +35 -0
  387. data/src/core/lib/slice/slice_internal.h +4 -3
  388. data/src/core/lib/slice/slice_refcount.h +2 -3
  389. data/src/core/lib/slice/slice_refcount_base.h +2 -3
  390. data/src/core/lib/slice/slice_split.cc +3 -0
  391. data/src/core/lib/slice/slice_split.h +0 -4
  392. data/src/core/lib/slice/slice_string_helpers.cc +4 -0
  393. data/src/core/lib/slice/slice_string_helpers.h +1 -4
  394. data/src/core/lib/surface/builtins.cc +7 -2
  395. data/src/core/lib/surface/byte_buffer.cc +7 -1
  396. data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
  397. data/src/core/lib/surface/call.cc +41 -26
  398. data/src/core/lib/surface/call.h +16 -2
  399. data/src/core/lib/surface/call_details.cc +4 -4
  400. data/src/core/lib/surface/call_log_batch.cc +7 -1
  401. data/src/core/lib/surface/call_test_only.h +4 -1
  402. data/src/core/lib/surface/channel.cc +179 -242
  403. data/src/core/lib/surface/channel.h +94 -57
  404. data/src/core/lib/surface/channel_init.h +2 -0
  405. data/src/core/lib/surface/channel_ping.cc +8 -2
  406. data/src/core/lib/surface/channel_stack_type.cc +0 -2
  407. data/src/core/lib/surface/channel_stack_type.h +0 -2
  408. data/src/core/lib/surface/completion_queue.cc +14 -6
  409. data/src/core/lib/surface/completion_queue.h +5 -1
  410. data/src/core/lib/surface/completion_queue_factory.cc +1 -0
  411. data/src/core/lib/surface/completion_queue_factory.h +1 -3
  412. data/src/core/lib/surface/event_string.cc +1 -7
  413. data/src/core/lib/surface/event_string.h +1 -1
  414. data/src/core/lib/surface/init.cc +17 -45
  415. data/src/core/lib/surface/init.h +0 -8
  416. data/src/core/lib/surface/lame_client.cc +64 -110
  417. data/src/core/lib/surface/lame_client.h +40 -2
  418. data/src/core/lib/surface/metadata_array.cc +2 -0
  419. data/src/core/lib/surface/server.cc +69 -56
  420. data/src/core/lib/surface/server.h +39 -9
  421. data/src/core/lib/surface/validate_metadata.cc +2 -5
  422. data/src/core/lib/surface/validate_metadata.h +3 -0
  423. data/src/core/lib/surface/version.cc +2 -2
  424. data/src/core/lib/transport/bdp_estimator.cc +3 -1
  425. data/src/core/lib/transport/bdp_estimator.h +2 -3
  426. data/src/core/lib/transport/byte_stream.cc +4 -3
  427. data/src/core/lib/transport/byte_stream.h +5 -1
  428. data/src/core/lib/transport/connectivity_state.cc +6 -4
  429. data/src/core/lib/transport/connectivity_state.h +2 -3
  430. data/src/core/lib/transport/error_utils.cc +4 -2
  431. data/src/core/lib/transport/error_utils.h +5 -1
  432. data/src/core/lib/{channel → transport}/handshaker.cc +9 -4
  433. data/src/core/lib/{channel → transport}/handshaker.h +13 -6
  434. data/src/core/lib/{channel → transport}/handshaker_factory.h +9 -10
  435. data/src/core/lib/{channel → transport}/handshaker_registry.cc +5 -1
  436. data/src/core/lib/{channel → transport}/handshaker_registry.h +5 -4
  437. data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.cc +24 -10
  438. data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.h +3 -3
  439. data/src/core/lib/transport/metadata_batch.cc +287 -0
  440. data/src/core/lib/transport/metadata_batch.h +133 -264
  441. data/src/core/lib/transport/parsed_metadata.cc +2 -0
  442. data/src/core/lib/transport/parsed_metadata.h +10 -3
  443. data/src/core/lib/transport/status_conversion.cc +2 -0
  444. data/src/core/lib/transport/status_conversion.h +2 -2
  445. data/src/core/lib/transport/tcp_connect_handshaker.cc +253 -0
  446. data/src/core/lib/transport/tcp_connect_handshaker.h +39 -0
  447. data/src/core/lib/transport/timeout_encoding.cc +2 -6
  448. data/src/core/lib/transport/timeout_encoding.h +5 -1
  449. data/src/core/lib/transport/transport.cc +18 -17
  450. data/src/core/lib/transport/transport.h +28 -2
  451. data/src/core/lib/transport/transport_impl.h +10 -0
  452. data/src/core/lib/transport/transport_op_string.cc +9 -10
  453. data/src/core/lib/uri/uri_parser.cc +11 -3
  454. data/src/core/lib/uri/uri_parser.h +0 -2
  455. data/src/core/plugin_registry/grpc_plugin_registry.cc +11 -0
  456. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -0
  457. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +2 -0
  458. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +2 -0
  459. data/src/ruby/ext/grpc/extconf.rb +2 -2
  460. data/src/ruby/lib/grpc/version.rb +1 -1
  461. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  462. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  463. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +504 -0
  464. metadata +36 -29
  465. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc +0 -31
  466. data/src/core/lib/event_engine/sockaddr.cc +0 -40
  467. data/src/core/lib/event_engine/sockaddr.h +0 -44
  468. data/src/core/lib/gprpp/capture.h +0 -76
  469. data/src/core/lib/iomgr/event_engine/closure.cc +0 -77
  470. data/src/core/lib/iomgr/event_engine/closure.h +0 -42
  471. data/src/core/lib/iomgr/event_engine/endpoint.cc +0 -172
  472. data/src/core/lib/iomgr/event_engine/endpoint.h +0 -52
  473. data/src/core/lib/iomgr/event_engine/iomgr.cc +0 -85
  474. data/src/core/lib/iomgr/event_engine/pollset.cc +0 -87
  475. data/src/core/lib/iomgr/event_engine/promise.h +0 -51
  476. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +0 -47
  477. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +0 -37
  478. data/src/core/lib/iomgr/event_engine/resolver.cc +0 -133
  479. data/src/core/lib/iomgr/event_engine/resolver.h +0 -56
  480. data/src/core/lib/iomgr/event_engine/tcp.cc +0 -296
  481. data/src/core/lib/iomgr/event_engine/timer.cc +0 -62
@@ -20,6 +20,7 @@
20
20
 
21
21
  #include "src/core/lib/http/httpcli.h"
22
22
 
23
+ #include <limits.h>
23
24
  #include <string.h>
24
25
 
25
26
  #include <string>
@@ -46,6 +47,7 @@
46
47
  #include "src/core/lib/resource_quota/api.h"
47
48
  #include "src/core/lib/slice/slice_internal.h"
48
49
  #include "src/core/lib/transport/error_utils.h"
50
+ #include "src/core/lib/transport/tcp_connect_handshaker.h"
49
51
 
50
52
  namespace grpc_core {
51
53
 
@@ -53,6 +55,7 @@ namespace {
53
55
 
54
56
  grpc_httpcli_get_override g_get_override;
55
57
  grpc_httpcli_post_override g_post_override;
58
+ grpc_httpcli_put_override g_put_override;
56
59
  void (*g_test_only_on_handshake_done_intercept)(HttpRequest* req);
57
60
 
58
61
  } // namespace
@@ -107,10 +110,36 @@ OrphanablePtr<HttpRequest> HttpRequest::Post(
107
110
  std::move(channel_creds));
108
111
  }
109
112
 
113
+ OrphanablePtr<HttpRequest> HttpRequest::Put(
114
+ URI uri, const grpc_channel_args* channel_args,
115
+ grpc_polling_entity* pollent, const grpc_http_request* request,
116
+ Timestamp deadline, grpc_closure* on_done, grpc_http_response* response,
117
+ RefCountedPtr<grpc_channel_credentials> channel_creds) {
118
+ absl::optional<std::function<void()>> test_only_generate_response;
119
+ if (g_put_override != nullptr) {
120
+ test_only_generate_response = [request, uri, deadline, on_done,
121
+ response]() {
122
+ g_put_override(request, uri.authority().c_str(), uri.path().c_str(),
123
+ request->body, request->body_length, deadline, on_done,
124
+ response);
125
+ };
126
+ }
127
+ std::string name =
128
+ absl::StrFormat("HTTP:PUT:%s:%s", uri.authority(), uri.path());
129
+ const grpc_slice request_text = grpc_httpcli_format_put_request(
130
+ request, uri.authority().c_str(), uri.path().c_str());
131
+ return MakeOrphanable<HttpRequest>(
132
+ std::move(uri), request_text, response, deadline, channel_args, on_done,
133
+ pollent, name.c_str(), std::move(test_only_generate_response),
134
+ std::move(channel_creds));
135
+ }
136
+
110
137
  void HttpRequest::SetOverride(grpc_httpcli_get_override get,
111
- grpc_httpcli_post_override post) {
138
+ grpc_httpcli_post_override post,
139
+ grpc_httpcli_put_override put) {
112
140
  g_get_override = get;
113
141
  g_post_override = post;
142
+ g_put_override = put;
114
143
  }
115
144
 
116
145
  void HttpRequest::TestOnlySetOnHandshakeDoneIntercept(
@@ -129,7 +158,8 @@ HttpRequest::HttpRequest(
129
158
  deadline_(deadline),
130
159
  channel_args_(CoreConfiguration::Get()
131
160
  .channel_args_preconditioning()
132
- .PreconditionChannelArgs(channel_args)),
161
+ .PreconditionChannelArgs(channel_args)
162
+ .ToC()),
133
163
  channel_creds_(std::move(channel_creds)),
134
164
  on_done_(on_done),
135
165
  resource_quota_(ResourceQuotaFromChannelArgs(channel_args_)),
@@ -150,10 +180,6 @@ HttpRequest::HttpRequest(
150
180
  grpc_schedule_on_exec_ctx);
151
181
  GPR_ASSERT(pollent);
152
182
  grpc_polling_entity_add_to_pollset_set(pollent, pollset_set_);
153
- // Create the DNS resolver. We'll start resolving when Start is called.
154
- dns_request_ = GetDNSResolver()->ResolveName(
155
- uri_.authority(), uri_.scheme(), pollset_set_,
156
- absl::bind_front(&HttpRequest::OnResolved, this));
157
183
  }
158
184
 
159
185
  HttpRequest::~HttpRequest() {
@@ -177,7 +203,9 @@ void HttpRequest::Start() {
177
203
  return;
178
204
  }
179
205
  Ref().release(); // ref held by pending DNS resolution
180
- dns_request_->Start();
206
+ dns_request_handle_ = GetDNSResolver()->ResolveName(
207
+ uri_.authority(), uri_.scheme(), pollset_set_,
208
+ absl::bind_front(&HttpRequest::OnResolved, this));
181
209
  }
182
210
 
183
211
  void HttpRequest::Orphan() {
@@ -185,21 +213,17 @@ void HttpRequest::Orphan() {
185
213
  MutexLock lock(&mu_);
186
214
  GPR_ASSERT(!cancelled_);
187
215
  cancelled_ = true;
188
- dns_request_.reset(); // cancel potentially pending DNS resolution
189
- if (connecting_) {
190
- // gRPC's TCP connection establishment API doesn't currently have
191
- // a mechanism for cancellation. So invoke the user callback now. The TCP
192
- // connection will eventually complete (at least within its deadline), and
193
- // we'll simply unref ourselves at that point.
194
- // TODO(apolcyn): fix this to cancel the TCP connection attempt when
195
- // an API to do so exists.
196
- Finish(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
197
- "HTTP request cancelled during TCP connection establishment",
198
- &overall_error_, 1));
216
+ // cancel potentially pending DNS resolution.
217
+ if (dns_request_handle_.has_value() &&
218
+ GetDNSResolver()->Cancel(dns_request_handle_.value())) {
219
+ Finish(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
220
+ "cancelled during DNS resolution"));
221
+ Unref();
199
222
  }
200
223
  if (handshake_mgr_ != nullptr) {
224
+ // Shutdown will cancel any ongoing tcp connect.
201
225
  handshake_mgr_->Shutdown(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
202
- "HTTP request cancelled during security handshake"));
226
+ "HTTP request cancelled during handshake"));
203
227
  }
204
228
  if (own_endpoint_ && ep_ != nullptr) {
205
229
  grpc_endpoint_shutdown(
@@ -215,10 +239,12 @@ void HttpRequest::AppendError(grpc_error_handle error) {
215
239
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Failed HTTP/1 client request");
216
240
  }
217
241
  const grpc_resolved_address* addr = &addresses_[next_address_ - 1];
218
- std::string addr_text = grpc_sockaddr_to_uri(addr);
242
+ auto addr_text = grpc_sockaddr_to_uri(addr);
219
243
  overall_error_ = grpc_error_add_child(
220
244
  overall_error_,
221
- grpc_error_set_str(error, GRPC_ERROR_STR_TARGET_ADDRESS, addr_text));
245
+ grpc_error_set_str(
246
+ error, GRPC_ERROR_STR_TARGET_ADDRESS,
247
+ addr_text.ok() ? addr_text.value() : addr_text.status().ToString()));
222
248
  }
223
249
 
224
250
  void HttpRequest::OnReadInternal(grpc_error_handle error) {
@@ -260,7 +286,8 @@ void HttpRequest::StartWrite() {
260
286
  grpc_slice_ref_internal(request_text_);
261
287
  grpc_slice_buffer_add(&outgoing_, request_text_);
262
288
  Ref().release(); // ref held by pending write
263
- grpc_endpoint_write(ep_, &outgoing_, &done_write_, nullptr);
289
+ grpc_endpoint_write(ep_, &outgoing_, &done_write_, nullptr,
290
+ /*max_frame_size=*/INT_MAX);
264
291
  }
265
292
 
266
293
  void HttpRequest::OnHandshakeDone(void* arg, grpc_error_handle error) {
@@ -274,8 +301,7 @@ void HttpRequest::OnHandshakeDone(void* arg, grpc_error_handle error) {
274
301
  MutexLock lock(&req->mu_);
275
302
  req->own_endpoint_ = true;
276
303
  if (error != GRPC_ERROR_NONE) {
277
- gpr_log(GPR_ERROR, "Secure transport setup failed: %s",
278
- grpc_error_std_string(error).c_str());
304
+ req->handshake_mgr_.reset();
279
305
  req->NextAddress(GRPC_ERROR_REF(error));
280
306
  return;
281
307
  }
@@ -284,69 +310,55 @@ void HttpRequest::OnHandshakeDone(void* arg, grpc_error_handle error) {
284
310
  grpc_slice_buffer_destroy_internal(args->read_buffer);
285
311
  gpr_free(args->read_buffer);
286
312
  req->ep_ = args->endpoint;
313
+ req->handshake_mgr_.reset();
287
314
  if (req->cancelled_) {
288
315
  req->NextAddress(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
289
- "HTTP request cancelled during security handshake"));
316
+ "HTTP request cancelled during handshake"));
290
317
  return;
291
318
  }
292
319
  req->StartWrite();
293
320
  }
294
321
 
295
- void HttpRequest::OnConnected(void* arg, grpc_error_handle error) {
296
- RefCountedPtr<HttpRequest> req(static_cast<HttpRequest*>(arg));
297
- MutexLock lock(&req->mu_);
298
- req->connecting_ = false;
299
- req->own_endpoint_ = true;
300
- if (req->cancelled_) {
301
- // since we were cancelled while connecting, Finish has already
302
- // been called.
303
- return;
304
- }
305
- if (!req->ep_) {
306
- req->NextAddress(GRPC_ERROR_REF(error));
307
- return;
308
- }
309
- // TODO(yihuaz): treating nullptr channel_creds_ as insecure is
310
- // a hack used to support the port server client (a test utility) in
311
- // unsecure builds (when no definition of grpc_insecure_credentials_create
312
- // exists). We can remove this hack and unconditionally assume a valid
313
- // channel_creds_ object after unsecure builds are deleted, in
314
- // https://github.com/grpc/grpc/pull/25586.
315
- if (req->channel_creds_ == nullptr) {
316
- gpr_log(GPR_DEBUG,
317
- "HTTP request skipping handshake because creds are null");
318
- req->StartWrite();
319
- return;
320
- }
322
+ void HttpRequest::DoHandshake(const grpc_resolved_address* addr) {
321
323
  // Create the security connector using the credentials and target name.
322
324
  grpc_channel_args* new_args_from_connector = nullptr;
323
325
  RefCountedPtr<grpc_channel_security_connector> sc =
324
- req->channel_creds_->create_security_connector(
325
- nullptr /*call_creds*/, req->uri_.authority().c_str(),
326
- req->channel_args_, &new_args_from_connector);
326
+ channel_creds_->create_security_connector(
327
+ nullptr /*call_creds*/, uri_.authority().c_str(), channel_args_,
328
+ &new_args_from_connector);
327
329
  if (sc == nullptr) {
328
- req->Finish(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
329
- "failed to create security connector", &req->overall_error_, 1));
330
+ Finish(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
331
+ "failed to create security connector", &overall_error_, 1));
330
332
  return;
331
333
  }
332
- grpc_arg security_connector_arg = grpc_security_connector_to_arg(sc.get());
333
- grpc_channel_args* new_args = grpc_channel_args_copy_and_add(
334
+ absl::StatusOr<std::string> address = grpc_sockaddr_to_uri(addr);
335
+ if (!address.ok()) {
336
+ Finish(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
337
+ "Failed to extract URI from address", &overall_error_, 1));
338
+ return;
339
+ }
340
+ absl::InlinedVector<grpc_arg, 2> args_to_add = {
341
+ grpc_security_connector_to_arg(sc.get()),
342
+ grpc_channel_arg_string_create(
343
+ const_cast<char*>(GRPC_ARG_TCP_HANDSHAKER_RESOLVED_ADDRESS),
344
+ const_cast<char*>(address.value().c_str())),
345
+ };
346
+ const grpc_channel_args* new_args = grpc_channel_args_copy_and_add(
334
347
  new_args_from_connector != nullptr ? new_args_from_connector
335
- : req->channel_args_,
336
- &security_connector_arg, 1);
348
+ : channel_args_,
349
+ args_to_add.data(), args_to_add.size());
337
350
  grpc_channel_args_destroy(new_args_from_connector);
338
351
  // Start the handshake
339
- req->handshake_mgr_ = MakeRefCounted<HandshakeManager>();
352
+ handshake_mgr_ = MakeRefCounted<HandshakeManager>();
340
353
  CoreConfiguration::Get().handshaker_registry().AddHandshakers(
341
- HANDSHAKER_CLIENT, new_args, req->pollset_set_,
342
- req->handshake_mgr_.get());
343
- req->Ref().release(); // ref held by pending handshake
344
- grpc_endpoint* ep = req->ep_;
345
- req->ep_ = nullptr;
346
- req->own_endpoint_ = false;
347
- req->handshake_mgr_->DoHandshake(ep, new_args, req->deadline_,
348
- /*acceptor=*/nullptr, OnHandshakeDone,
349
- /*user_data=*/req.get());
354
+ HANDSHAKER_CLIENT, new_args, pollset_set_, handshake_mgr_.get());
355
+ Ref().release(); // ref held by pending handshake
356
+ grpc_endpoint* ep = ep_;
357
+ ep_ = nullptr;
358
+ own_endpoint_ = false;
359
+ handshake_mgr_->DoHandshake(ep, new_args, deadline_,
360
+ /*acceptor=*/nullptr, OnHandshakeDone,
361
+ /*user_data=*/this);
350
362
  sc.reset(DEBUG_LOCATION, "httpcli");
351
363
  grpc_channel_args_destroy(new_args);
352
364
  }
@@ -366,28 +378,23 @@ void HttpRequest::NextAddress(grpc_error_handle error) {
366
378
  return;
367
379
  }
368
380
  const grpc_resolved_address* addr = &addresses_[next_address_++];
369
- GRPC_CLOSURE_INIT(&connected_, OnConnected, this, grpc_schedule_on_exec_ctx);
370
- connecting_ = true;
371
- own_endpoint_ = false;
372
- Ref().release(); // ref held by pending connect
373
- grpc_tcp_client_connect(&connected_, &ep_, pollset_set_, channel_args_, addr,
374
- deadline_);
381
+ DoHandshake(addr);
375
382
  }
376
383
 
377
384
  void HttpRequest::OnResolved(
378
385
  absl::StatusOr<std::vector<grpc_resolved_address>> addresses_or) {
379
386
  RefCountedPtr<HttpRequest> unreffer(this);
380
387
  MutexLock lock(&mu_);
381
- dns_request_.reset();
382
- if (!addresses_or.ok()) {
383
- Finish(absl_status_to_grpc_error(addresses_or.status()));
384
- return;
385
- }
388
+ dns_request_handle_.reset();
386
389
  if (cancelled_) {
387
390
  Finish(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
388
391
  "cancelled during DNS resolution"));
389
392
  return;
390
393
  }
394
+ if (!addresses_or.ok()) {
395
+ Finish(absl_status_to_grpc_error(addresses_or.status()));
396
+ return;
397
+ }
391
398
  addresses_ = std::move(*addresses_or);
392
399
  next_address_ = 0;
393
400
  NextAddress(GRPC_ERROR_NONE);
@@ -25,7 +25,6 @@
25
25
 
26
26
  #include <grpc/support/time.h>
27
27
 
28
- #include "src/core/lib/channel/handshaker.h"
29
28
  #include "src/core/lib/gprpp/orphanable.h"
30
29
  #include "src/core/lib/http/parser.h"
31
30
  #include "src/core/lib/iomgr/endpoint.h"
@@ -35,6 +34,7 @@
35
34
  #include "src/core/lib/iomgr/resolve_address.h"
36
35
  #include "src/core/lib/resource_quota/resource_quota.h"
37
36
  #include "src/core/lib/security/credentials/credentials.h"
37
+ #include "src/core/lib/transport/handshaker.h"
38
38
  #include "src/core/lib/uri/uri_parser.h"
39
39
 
40
40
  /* User agent this library reports */
@@ -50,6 +50,10 @@ typedef int (*grpc_httpcli_post_override)(
50
50
  const grpc_http_request* request, const char* host, const char* path,
51
51
  const char* body_bytes, size_t body_size, grpc_core::Timestamp deadline,
52
52
  grpc_closure* on_complete, grpc_http_response* response);
53
+ typedef int (*grpc_httpcli_put_override)(
54
+ const grpc_http_request* request, const char* host, const char* path,
55
+ const char* body_bytes, size_t body_size, grpc_core::Timestamp deadline,
56
+ grpc_closure* on_complete, grpc_http_response* response);
53
57
 
54
58
  namespace grpc_core {
55
59
 
@@ -112,6 +116,32 @@ class HttpRequest : public InternallyRefCounted<HttpRequest> {
112
116
  RefCountedPtr<grpc_channel_credentials> channel_creds)
113
117
  GRPC_MUST_USE_RESULT;
114
118
 
119
+ // Asynchronously perform a HTTP PUT.
120
+ // 'uri' is the target to make the request to. The scheme field is used to
121
+ // determine the port number. The authority field is the target host. The
122
+ // path field determines the path of the request. No other fields are used.
123
+ // 'args' are optional channel args for the request.
124
+ // 'pollent' indicates a grpc_polling_entity that is interested in the result
125
+ // of the post - work on this entity may be used to progress the post
126
+ // operation
127
+ // 'request' contains request parameters - these are caller owned and can be
128
+ // destroyed once the call returns
129
+ // 'deadline' contains a deadline for the request (or gpr_inf_future)
130
+ // 'on_done' is a callback to report results to
131
+ // 'channel_creds' are used to configurably secure the connection.
132
+ // For insecure requests, use grpc_insecure_credentials_create.
133
+ // For secure requests, use CreateHttpRequestSSLCredentials().
134
+ // nullptr is treated as insecure credentials.
135
+ // TODO(apolcyn): disallow nullptr as a value after unsecure builds
136
+ // are removed.
137
+ // Does not support ?var1=val1&var2=val2 in the path.
138
+ static OrphanablePtr<HttpRequest> Put(
139
+ URI uri, const grpc_channel_args* args, grpc_polling_entity* pollent,
140
+ const grpc_http_request* request, Timestamp deadline,
141
+ grpc_closure* on_done, grpc_http_response* response,
142
+ RefCountedPtr<grpc_channel_credentials> channel_creds)
143
+ GRPC_MUST_USE_RESULT;
144
+
115
145
  HttpRequest(URI uri, const grpc_slice& request_text,
116
146
  grpc_http_response* response, Timestamp deadline,
117
147
  const grpc_channel_args* channel_args, grpc_closure* on_done,
@@ -126,7 +156,8 @@ class HttpRequest : public InternallyRefCounted<HttpRequest> {
126
156
  void Orphan() override;
127
157
 
128
158
  static void SetOverride(grpc_httpcli_get_override get,
129
- grpc_httpcli_post_override post);
159
+ grpc_httpcli_post_override post,
160
+ grpc_httpcli_put_override put);
130
161
 
131
162
  static void TestOnlySetOnHandshakeDoneIntercept(
132
163
  void (*intercept)(HttpRequest* req));
@@ -141,7 +172,8 @@ class HttpRequest : public InternallyRefCounted<HttpRequest> {
141
172
 
142
173
  void DoRead() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
143
174
  Ref().release(); // ref held by pending read
144
- grpc_endpoint_read(ep_, &incoming_, &on_read_, /*urgent=*/true);
175
+ grpc_endpoint_read(ep_, &incoming_, &on_read_, /*urgent=*/true,
176
+ /*min_progress_size=*/1);
145
177
  }
146
178
 
147
179
  static void OnRead(void* user_data, grpc_error_handle error) {
@@ -179,7 +211,8 @@ class HttpRequest : public InternallyRefCounted<HttpRequest> {
179
211
 
180
212
  static void OnHandshakeDone(void* arg, grpc_error_handle error);
181
213
 
182
- static void OnConnected(void* arg, grpc_error_handle error);
214
+ void DoHandshake(const grpc_resolved_address* addr)
215
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
183
216
 
184
217
  void NextAddress(grpc_error_handle error) ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
185
218
 
@@ -195,7 +228,6 @@ class HttpRequest : public InternallyRefCounted<HttpRequest> {
195
228
  grpc_closure continue_on_read_after_schedule_on_exec_ctx_;
196
229
  grpc_closure done_write_;
197
230
  grpc_closure continue_done_write_after_schedule_on_exec_ctx_;
198
- grpc_closure connected_;
199
231
  grpc_endpoint* ep_ = nullptr;
200
232
  grpc_closure* on_done_;
201
233
  ResourceQuotaRefPtr resource_quota_;
@@ -206,7 +238,6 @@ class HttpRequest : public InternallyRefCounted<HttpRequest> {
206
238
  RefCountedPtr<HandshakeManager> handshake_mgr_ ABSL_GUARDED_BY(mu_);
207
239
  bool own_endpoint_ ABSL_GUARDED_BY(mu_) = true;
208
240
  bool cancelled_ ABSL_GUARDED_BY(mu_) = false;
209
- bool connecting_ ABSL_GUARDED_BY(mu_) = false;
210
241
  grpc_http_parser parser_ ABSL_GUARDED_BY(mu_);
211
242
  std::vector<grpc_resolved_address> addresses_ ABSL_GUARDED_BY(mu_);
212
243
  size_t next_address_ ABSL_GUARDED_BY(mu_) = 0;
@@ -215,7 +246,8 @@ class HttpRequest : public InternallyRefCounted<HttpRequest> {
215
246
  grpc_slice_buffer incoming_ ABSL_GUARDED_BY(mu_);
216
247
  grpc_slice_buffer outgoing_ ABSL_GUARDED_BY(mu_);
217
248
  grpc_error_handle overall_error_ ABSL_GUARDED_BY(mu_) = GRPC_ERROR_NONE;
218
- OrphanablePtr<DNSResolver::Request> dns_request_ ABSL_GUARDED_BY(mu_);
249
+ absl::optional<DNSResolver::TaskHandle> dns_request_handle_
250
+ ABSL_GUARDED_BY(mu_) = DNSResolver::kNullHandle;
219
251
  };
220
252
 
221
253
  } // namespace grpc_core
@@ -178,12 +178,11 @@ class HttpRequestSSLCredentials : public grpc_channel_credentials {
178
178
  return Ref();
179
179
  }
180
180
 
181
- grpc_channel_args* update_arguments(grpc_channel_args* args) override {
182
- return args;
181
+ UniqueTypeName type() const override {
182
+ static UniqueTypeName::Factory kFactory("HttpRequestSSL");
183
+ return kFactory.Create();
183
184
  }
184
185
 
185
- const char* type() const override { return "HttpRequestSSL"; }
186
-
187
186
  private:
188
187
  int cmp_impl(const grpc_channel_credentials* /* other */) const override {
189
188
  // There's no differentiating factor between two HttpRequestSSLCredentials
@@ -23,13 +23,13 @@
23
23
  grpc_core::TraceFlag grpc_tcp_trace(false, "tcp");
24
24
 
25
25
  void grpc_endpoint_read(grpc_endpoint* ep, grpc_slice_buffer* slices,
26
- grpc_closure* cb, bool urgent) {
27
- ep->vtable->read(ep, slices, cb, urgent);
26
+ grpc_closure* cb, bool urgent, int min_progress_size) {
27
+ ep->vtable->read(ep, slices, cb, urgent, min_progress_size);
28
28
  }
29
29
 
30
30
  void grpc_endpoint_write(grpc_endpoint* ep, grpc_slice_buffer* slices,
31
- grpc_closure* cb, void* arg) {
32
- ep->vtable->write(ep, slices, cb, arg);
31
+ grpc_closure* cb, void* arg, int max_frame_size) {
32
+ ep->vtable->write(ep, slices, cb, arg, max_frame_size);
33
33
  }
34
34
 
35
35
  void grpc_endpoint_add_to_pollset(grpc_endpoint* ep, grpc_pollset* pollset) {
@@ -38,9 +38,9 @@ typedef struct grpc_endpoint_vtable grpc_endpoint_vtable;
38
38
 
39
39
  struct grpc_endpoint_vtable {
40
40
  void (*read)(grpc_endpoint* ep, grpc_slice_buffer* slices, grpc_closure* cb,
41
- bool urgent);
41
+ bool urgent, int min_progress_size);
42
42
  void (*write)(grpc_endpoint* ep, grpc_slice_buffer* slices, grpc_closure* cb,
43
- void* arg);
43
+ void* arg, int max_frame_size);
44
44
  void (*add_to_pollset)(grpc_endpoint* ep, grpc_pollset* pollset);
45
45
  void (*add_to_pollset_set)(grpc_endpoint* ep, grpc_pollset_set* pollset);
46
46
  void (*delete_from_pollset_set)(grpc_endpoint* ep, grpc_pollset_set* pollset);
@@ -58,7 +58,7 @@ struct grpc_endpoint_vtable {
58
58
  Valid slices may be placed into \a slices even when the callback is
59
59
  invoked with error != GRPC_ERROR_NONE. */
60
60
  void grpc_endpoint_read(grpc_endpoint* ep, grpc_slice_buffer* slices,
61
- grpc_closure* cb, bool urgent);
61
+ grpc_closure* cb, bool urgent, int min_progress_size);
62
62
 
63
63
  absl::string_view grpc_endpoint_get_peer(grpc_endpoint* ep);
64
64
 
@@ -79,9 +79,11 @@ int grpc_endpoint_get_fd(grpc_endpoint* ep);
79
79
  it is a valid slice buffer.
80
80
  \a arg is platform specific. It is currently only used by TCP on linux
81
81
  platforms as an argument that would be forwarded to the timestamps callback.
82
+ \a max_frame_size. A hint to the endpoint implementation to construct
83
+ frames which do not exceed the specified size.
82
84
  */
83
85
  void grpc_endpoint_write(grpc_endpoint* ep, grpc_slice_buffer* slices,
84
- grpc_closure* cb, void* arg);
86
+ grpc_closure* cb, void* arg, int max_frame_size);
85
87
 
86
88
  /* Causes any pending and future read/write callbacks to run immediately with
87
89
  success==0 */
@@ -237,7 +237,8 @@ static void WriteAction(void* arg, grpc_error_handle error) {
237
237
  }
238
238
 
239
239
  static void CFStreamRead(grpc_endpoint* ep, grpc_slice_buffer* slices,
240
- grpc_closure* cb, bool urgent) {
240
+ grpc_closure* cb, bool urgent,
241
+ int /*min_progress_size*/) {
241
242
  CFStreamEndpoint* ep_impl = reinterpret_cast<CFStreamEndpoint*>(ep);
242
243
  if (grpc_tcp_trace.enabled()) {
243
244
  gpr_log(GPR_DEBUG, "CFStream endpoint:%p read (%p, %p) length:%zu", ep_impl,
@@ -254,7 +255,7 @@ static void CFStreamRead(grpc_endpoint* ep, grpc_slice_buffer* slices,
254
255
  }
255
256
 
256
257
  static void CFStreamWrite(grpc_endpoint* ep, grpc_slice_buffer* slices,
257
- grpc_closure* cb, void* arg) {
258
+ grpc_closure* cb, void* arg, int /*max_frame_size*/) {
258
259
  CFStreamEndpoint* ep_impl = reinterpret_cast<CFStreamEndpoint*>(ep);
259
260
  if (grpc_tcp_trace.enabled()) {
260
261
  gpr_log(GPR_DEBUG, "CFStream endpoint:%p write (%p, %p) length:%zu",
@@ -351,11 +352,13 @@ grpc_endpoint* grpc_cfstream_endpoint_create(CFReadStreamRef read_stream,
351
352
  if (native_handle) {
352
353
  CFRelease(native_handle);
353
354
  }
355
+ absl::StatusOr<std::string> addr_uri;
354
356
  if (getsockname(sockfd, reinterpret_cast<sockaddr*>(resolved_local_addr.addr),
355
- &resolved_local_addr.len) < 0) {
357
+ &resolved_local_addr.len) < 0 ||
358
+ !(addr_uri = grpc_sockaddr_to_uri(&resolved_local_addr)).ok()) {
356
359
  ep_impl->local_address = "";
357
360
  } else {
358
- ep_impl->local_address = grpc_sockaddr_to_uri(&resolved_local_addr);
361
+ ep_impl->local_address = addr_uri.value();
359
362
  }
360
363
  ep_impl->read_cb = nil;
361
364
  ep_impl->write_cb = nil;
@@ -62,7 +62,8 @@ grpc_endpoint_pair grpc_iomgr_create_endpoint_pair(const char* name,
62
62
  std::string final_name = absl::StrCat(name, ":client");
63
63
  const grpc_channel_args* new_args = grpc_core::CoreConfiguration::Get()
64
64
  .channel_args_preconditioning()
65
- .PreconditionChannelArgs(args);
65
+ .PreconditionChannelArgs(args)
66
+ .ToC();
66
67
  p.client = grpc_tcp_create(grpc_fd_create(sv[1], final_name.c_str(), false),
67
68
  new_args, "socketpair-server");
68
69
  final_name = absl::StrCat(name, ":server");
@@ -237,10 +237,7 @@ void grpc_event_engine_shutdown(void) {
237
237
 
238
238
  bool grpc_event_engine_can_track_errors(void) {
239
239
  /* Only track errors if platform supports errqueue. */
240
- if (grpc_core::kernel_supports_errqueue()) {
241
- return g_event_engine->can_track_err;
242
- }
243
- return false;
240
+ return grpc_core::KernelSupportsErrqueue() && g_event_engine->can_track_err;
244
241
  }
245
242
 
246
243
  bool grpc_event_engine_run_in_background(void) {
@@ -204,8 +204,6 @@ class ExecCtx {
204
204
  /** Gets pointer to current exec_ctx. */
205
205
  static ExecCtx* Get() { return exec_ctx_; }
206
206
 
207
- static void Set(ExecCtx* exec_ctx) { exec_ctx_ = exec_ctx; }
208
-
209
207
  static void Run(const DebugLocation& location, grpc_closure* closure,
210
208
  grpc_error_handle error);
211
209
 
@@ -220,6 +218,7 @@ class ExecCtx {
220
218
 
221
219
  private:
222
220
  /** Set exec_ctx_ to exec_ctx. */
221
+ static void Set(ExecCtx* exec_ctx) { exec_ctx_ = exec_ctx; }
223
222
 
224
223
  grpc_closure_list closure_list_ = GRPC_CLOSURE_LIST_INIT;
225
224
  CombinerData combiner_data_ = {nullptr, nullptr};
@@ -1,20 +1,16 @@
1
- /*
2
- *
3
- * Copyright 2018 gRPC authors.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License");
6
- * you may not use this file except in compliance with the License.
7
- * You may obtain a copy of the License at
8
- *
9
- * http://www.apache.org/licenses/LICENSE-2.0
10
- *
11
- * Unless required by applicable law or agreed to in writing, software
12
- * distributed under the License is distributed on an "AS IS" BASIS,
13
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- * See the License for the specific language governing permissions and
15
- * limitations under the License.
16
- *
17
- */
1
+ // Copyright 2018 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
18
14
 
19
15
  #include <grpc/support/port_platform.h>
20
16
 
@@ -32,37 +28,32 @@
32
28
  #include <sys/utsname.h>
33
29
 
34
30
  namespace grpc_core {
35
- static bool errqueue_supported = false;
36
31
 
37
- bool kernel_supports_errqueue() { return errqueue_supported; }
38
-
39
- void grpc_errqueue_init() {
40
- /* Both-compile time and run-time linux kernel versions should be at least 4.0.0
41
- */
32
+ bool KernelSupportsErrqueue() {
33
+ static const bool errqueue_supported = []() {
42
34
  #ifdef GRPC_LINUX_ERRQUEUE
43
- struct utsname buffer;
44
- if (uname(&buffer) != 0) {
45
- gpr_log(GPR_ERROR, "uname: %s", strerror(errno));
46
- return;
47
- }
48
- char* release = buffer.release;
49
- if (release == nullptr) {
50
- return;
51
- }
52
-
53
- if (strtol(release, nullptr, 10) >= 4) {
54
- errqueue_supported = true;
55
- } else {
56
- gpr_log(GPR_DEBUG, "ERRQUEUE support not enabled");
57
- }
58
- #endif /* GRPC_LINUX_ERRQUEUE */
35
+ // Both-compile time and run-time linux kernel versions should be at
36
+ // least 4.0.0
37
+ struct utsname buffer;
38
+ if (uname(&buffer) != 0) {
39
+ gpr_log(GPR_ERROR, "uname: %s", strerror(errno));
40
+ return false;
41
+ }
42
+ char* release = buffer.release;
43
+ if (release == nullptr) {
44
+ return false;
45
+ }
46
+
47
+ if (strtol(release, nullptr, 10) >= 4) {
48
+ return true;
49
+ } else {
50
+ gpr_log(GPR_DEBUG, "ERRQUEUE support not enabled");
51
+ }
52
+ #endif // GRPC_LINUX_ERRQUEUE
53
+ return false;
54
+ }();
55
+ return errqueue_supported;
59
56
  }
60
- } /* namespace grpc_core */
61
-
62
- #else
63
-
64
- namespace grpc_core {
65
- void grpc_errqueue_init() {}
66
- } /* namespace grpc_core */
57
+ } // namespace grpc_core
67
58
 
68
- #endif /* GRPC_POSIX_SOCKET_TCP */
59
+ #endif // GRPC_POSIX_SOCKET_TCP