grpc 1.43.1 → 1.44.0.pre2

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

Potentially problematic release.


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

Files changed (382) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +84 -64
  3. data/include/grpc/grpc_security.h +10 -0
  4. data/include/grpc/impl/codegen/compression_types.h +0 -2
  5. data/include/grpc/impl/codegen/grpc_types.h +6 -0
  6. data/src/core/ext/filters/client_channel/backend_metric.h +1 -1
  7. data/src/core/ext/filters/client_channel/client_channel.cc +62 -68
  8. data/src/core/ext/filters/client_channel/client_channel.h +8 -8
  9. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  10. data/src/core/ext/filters/client_channel/config_selector.h +4 -4
  11. data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
  12. data/src/core/ext/filters/client_channel/health/health_check_client.cc +16 -14
  13. data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
  14. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
  15. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +4 -3
  16. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +6 -5
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +3 -7
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +31 -32
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +0 -7
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +1 -1
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -1
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +43 -29
  24. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +6 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +120 -68
  26. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +60 -48
  27. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +62 -61
  28. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +16 -11
  29. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -5
  30. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +19 -15
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -1
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +14 -12
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +3 -2
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +50 -105
  35. data/src/core/ext/filters/client_channel/lb_policy.cc +15 -14
  36. data/src/core/ext/filters/client_channel/lb_policy.h +19 -3
  37. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -3
  38. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +207 -81
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +22 -12
  40. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +19 -15
  41. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +23 -38
  42. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +118 -207
  43. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +25 -32
  44. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  45. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +82 -73
  46. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +10 -10
  47. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +2 -1
  48. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -5
  49. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +5 -5
  50. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +157 -67
  51. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
  52. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +2 -2
  53. data/src/core/ext/filters/client_channel/retry_filter.cc +37 -64
  54. data/src/core/ext/filters/client_channel/retry_service_config.cc +1 -1
  55. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  56. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +1 -1
  57. data/src/core/ext/filters/client_channel/subchannel.cc +12 -16
  58. data/src/core/ext/filters/client_channel/subchannel.h +2 -3
  59. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +37 -48
  60. data/src/core/ext/filters/fault_injection/service_config_parser.cc +6 -8
  61. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +51 -122
  63. data/src/core/ext/filters/http/client_authority_filter.cc +8 -24
  64. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +42 -140
  65. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +5 -25
  66. data/src/core/ext/filters/http/server/http_server_filter.cc +50 -135
  67. data/src/core/ext/filters/message_size/message_size_filter.cc +1 -1
  68. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  69. data/src/core/ext/filters/rbac/rbac_filter.cc +157 -0
  70. data/src/core/ext/filters/rbac/rbac_filter.h +74 -0
  71. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +605 -0
  72. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +70 -0
  73. data/src/core/ext/filters/server_config_selector/server_config_selector.h +3 -2
  74. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +11 -6
  75. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +1 -1
  76. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +1 -1
  77. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +89 -29
  78. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +0 -1
  79. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +45 -186
  80. data/src/core/ext/transport/chttp2/transport/frame_data.cc +0 -1
  81. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +341 -279
  82. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +69 -159
  83. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +1 -1
  84. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +2 -0
  85. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +19 -32
  86. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -1
  87. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +94 -1
  88. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +2 -24
  89. data/src/core/ext/transport/chttp2/transport/internal.h +0 -33
  90. data/src/core/ext/transport/chttp2/transport/parsing.cc +0 -6
  91. data/src/core/ext/transport/chttp2/transport/writing.cc +47 -116
  92. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -4
  93. data/src/core/ext/transport/inproc/inproc_transport.cc +11 -63
  94. data/src/core/ext/transport/inproc/inproc_transport.h +0 -3
  95. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +61 -0
  96. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +146 -0
  97. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +188 -0
  98. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +70 -0
  99. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +56 -0
  100. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h +40 -0
  101. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.c +154 -0
  102. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.h +95 -0
  103. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.c +58 -0
  104. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.h +55 -0
  105. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.c +44 -0
  106. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.h +40 -0
  107. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.c +153 -0
  108. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.h +100 -0
  109. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.c +75 -0
  110. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.h +55 -0
  111. data/src/core/ext/xds/upb_utils.h +65 -0
  112. data/src/core/ext/xds/xds_api.cc +81 -3458
  113. data/src/core/ext/xds/xds_api.h +56 -611
  114. data/src/core/ext/xds/xds_bootstrap.cc +189 -125
  115. data/src/core/ext/xds/xds_bootstrap.h +20 -15
  116. data/src/core/ext/xds/xds_certificate_provider.h +1 -0
  117. data/src/core/ext/xds/xds_channel_creds.cc +108 -0
  118. data/src/core/ext/xds/xds_channel_creds.h +50 -0
  119. data/src/core/ext/xds/xds_client.cc +584 -994
  120. data/src/core/ext/xds/xds_client.h +78 -135
  121. data/src/core/ext/xds/xds_cluster.cc +451 -0
  122. data/src/core/ext/xds/xds_cluster.h +111 -0
  123. data/src/core/ext/xds/xds_common_types.cc +388 -0
  124. data/src/core/ext/xds/xds_common_types.h +110 -0
  125. data/src/core/ext/xds/xds_endpoint.cc +364 -0
  126. data/src/core/ext/xds/xds_endpoint.h +135 -0
  127. data/src/core/ext/xds/xds_http_filters.cc +5 -0
  128. data/src/core/ext/xds/xds_http_rbac_filter.cc +563 -0
  129. data/src/core/ext/xds/xds_http_rbac_filter.h +54 -0
  130. data/src/core/ext/xds/xds_listener.cc +1036 -0
  131. data/src/core/ext/xds/xds_listener.h +220 -0
  132. data/src/core/ext/{transport/chttp2/transport/hpack_utils.h → xds/xds_resource_type.cc} +12 -9
  133. data/src/core/ext/xds/xds_resource_type.h +98 -0
  134. data/src/core/ext/xds/xds_resource_type_impl.h +87 -0
  135. data/src/core/ext/xds/xds_route_config.cc +993 -0
  136. data/src/core/ext/xds/xds_route_config.h +215 -0
  137. data/src/core/ext/xds/xds_routing.cc +11 -8
  138. data/src/core/ext/xds/xds_routing.h +8 -5
  139. data/src/core/ext/xds/xds_server_config_fetcher.cc +159 -99
  140. data/src/core/lib/address_utils/parse_address.cc +20 -0
  141. data/src/core/lib/address_utils/parse_address.h +5 -0
  142. data/src/core/lib/address_utils/sockaddr_utils.cc +33 -36
  143. data/src/core/lib/address_utils/sockaddr_utils.h +1 -16
  144. data/src/core/lib/backoff/backoff.cc +4 -30
  145. data/src/core/lib/backoff/backoff.h +3 -3
  146. data/src/core/lib/channel/channel_args.cc +0 -1
  147. data/src/core/lib/channel/channel_stack.cc +8 -0
  148. data/src/core/lib/channel/channel_stack.h +1 -1
  149. data/src/core/lib/channel/channel_stack_builder.cc +5 -9
  150. data/src/core/lib/channel/channel_stack_builder.h +4 -7
  151. data/src/core/lib/channel/channelz.cc +1 -0
  152. data/src/core/lib/compression/compression.cc +19 -111
  153. data/src/core/lib/compression/compression_internal.cc +142 -202
  154. data/src/core/lib/compression/compression_internal.h +64 -69
  155. data/src/core/lib/compression/message_compress.cc +11 -11
  156. data/src/core/lib/compression/message_compress.h +2 -2
  157. data/src/core/lib/gpr/useful.h +4 -0
  158. data/src/core/lib/gprpp/bitset.h +7 -0
  159. data/src/core/lib/gprpp/chunked_vector.h +45 -3
  160. data/src/core/lib/gprpp/status_helper.cc +20 -28
  161. data/src/core/lib/gprpp/status_helper.h +6 -19
  162. data/src/core/lib/gprpp/table.h +11 -0
  163. data/src/core/lib/http/httpcli.cc +37 -46
  164. data/src/core/lib/http/httpcli.h +3 -15
  165. data/src/core/lib/iomgr/call_combiner.cc +15 -4
  166. data/src/core/lib/iomgr/closure.h +29 -9
  167. data/src/core/lib/iomgr/combiner.cc +25 -3
  168. data/src/core/lib/iomgr/error.cc +2 -0
  169. data/src/core/lib/iomgr/error.h +3 -0
  170. data/src/core/lib/iomgr/event_engine/iomgr.cc +3 -2
  171. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +6 -0
  172. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +2 -0
  173. data/src/core/lib/iomgr/event_engine/resolver.cc +66 -48
  174. data/src/core/lib/iomgr/event_engine/resolver.h +56 -0
  175. data/src/core/lib/iomgr/exec_ctx.cc +22 -9
  176. data/src/core/lib/iomgr/executor.cc +10 -1
  177. data/src/core/lib/iomgr/fork_posix.cc +3 -2
  178. data/src/core/lib/iomgr/iomgr_custom.cc +4 -1
  179. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  180. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
  181. data/src/core/lib/iomgr/iomgr_windows.cc +2 -2
  182. data/src/core/lib/iomgr/port.h +2 -2
  183. data/src/core/lib/iomgr/resolve_address.cc +5 -24
  184. data/src/core/lib/iomgr/resolve_address.h +47 -44
  185. data/src/core/lib/iomgr/resolve_address_custom.cc +131 -109
  186. data/src/core/lib/iomgr/resolve_address_custom.h +101 -19
  187. data/src/core/lib/iomgr/resolve_address_impl.h +59 -0
  188. data/src/core/lib/iomgr/resolve_address_posix.cc +82 -66
  189. data/src/core/lib/iomgr/resolve_address_posix.h +47 -0
  190. data/src/core/lib/iomgr/resolve_address_windows.cc +93 -74
  191. data/src/core/lib/iomgr/resolve_address_windows.h +47 -0
  192. data/src/core/lib/iomgr/resolved_address.h +39 -0
  193. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -0
  194. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +1 -0
  195. data/src/core/lib/iomgr/unix_sockets_posix.cc +22 -34
  196. data/src/core/lib/iomgr/unix_sockets_posix.h +4 -7
  197. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +6 -15
  198. data/src/core/lib/matchers/matchers.cc +1 -1
  199. data/src/core/lib/promise/activity.h +49 -20
  200. data/src/core/lib/promise/detail/status.h +5 -0
  201. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.cc +17 -25
  202. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.h +43 -44
  203. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_factory.h +10 -5
  204. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.cc +3 -2
  205. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.h +4 -5
  206. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.cc +1 -1
  207. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.h +4 -4
  208. data/src/core/lib/resource_quota/api.h +0 -1
  209. data/src/core/lib/{gprpp → resource_quota}/arena.cc +16 -13
  210. data/src/core/lib/{gprpp → resource_quota}/arena.h +24 -13
  211. data/src/core/lib/security/authorization/evaluate_args.cc +30 -15
  212. data/src/core/lib/security/authorization/evaluate_args.h +1 -0
  213. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +60 -0
  214. data/src/core/lib/security/authorization/grpc_authorization_engine.h +62 -0
  215. data/src/core/lib/security/authorization/matchers.cc +227 -0
  216. data/src/core/lib/security/authorization/matchers.h +211 -0
  217. data/src/core/lib/security/authorization/rbac_policy.cc +442 -0
  218. data/src/core/lib/security/authorization/rbac_policy.h +170 -0
  219. data/src/core/lib/security/context/security_context.cc +4 -2
  220. data/src/core/lib/security/context/security_context.h +1 -1
  221. data/src/core/lib/security/credentials/composite/composite_credentials.cc +5 -5
  222. data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -3
  223. data/src/core/lib/security/credentials/credentials.h +10 -20
  224. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +6 -9
  225. data/src/core/lib/security/credentials/external/external_account_credentials.cc +7 -9
  226. data/src/core/lib/security/credentials/external/external_account_credentials.h +2 -7
  227. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -3
  228. data/src/core/lib/security/credentials/fake/fake_credentials.cc +5 -4
  229. data/src/core/lib/security/credentials/fake/fake_credentials.h +8 -7
  230. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +2 -5
  231. data/src/core/lib/security/credentials/iam/iam_credentials.cc +16 -19
  232. data/src/core/lib/security/credentials/iam/iam_credentials.h +6 -5
  233. data/src/core/lib/security/credentials/jwt/json_token.cc +4 -6
  234. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +16 -28
  235. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +8 -8
  236. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +6 -13
  237. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +44 -57
  238. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +13 -15
  239. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -7
  240. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +5 -4
  241. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +1 -10
  242. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +6 -0
  243. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +7 -0
  244. data/src/core/lib/security/credentials/xds/xds_credentials.h +1 -1
  245. data/src/core/lib/security/security_connector/security_connector.cc +0 -4
  246. data/src/core/lib/security/security_connector/security_connector.h +5 -1
  247. data/src/core/lib/security/security_connector/ssl_utils.cc +14 -24
  248. data/src/core/lib/security/security_connector/ssl_utils.h +5 -14
  249. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +2 -3
  250. data/src/core/lib/security/transport/auth_filters.h +7 -0
  251. data/src/core/lib/security/transport/client_auth_filter.cc +53 -33
  252. data/src/core/lib/security/transport/server_auth_filter.cc +40 -35
  253. data/src/core/{ext → lib}/service_config/service_config.cc +2 -2
  254. data/src/core/{ext → lib}/service_config/service_config.h +4 -4
  255. data/src/core/{ext → lib}/service_config/service_config_call_data.h +5 -5
  256. data/src/core/{ext → lib}/service_config/service_config_parser.cc +1 -1
  257. data/src/core/{ext → lib}/service_config/service_config_parser.h +3 -3
  258. data/src/core/lib/slice/slice.cc +3 -1
  259. data/src/core/lib/slice/slice.h +43 -13
  260. data/src/core/lib/slice/slice_intern.cc +3 -101
  261. data/src/core/lib/slice/slice_internal.h +1 -2
  262. data/src/core/lib/slice/slice_refcount.h +4 -13
  263. data/src/core/lib/slice/slice_refcount_base.h +0 -16
  264. data/src/core/lib/surface/call.cc +140 -382
  265. data/src/core/lib/surface/call.h +4 -4
  266. data/src/core/lib/surface/channel.cc +42 -44
  267. data/src/core/lib/surface/channel.h +4 -4
  268. data/src/core/lib/surface/init.cc +0 -2
  269. data/src/core/lib/surface/lame_client.cc +0 -1
  270. data/src/core/lib/surface/server.cc +12 -29
  271. data/src/core/lib/surface/server.h +2 -2
  272. data/src/core/lib/surface/version.cc +2 -2
  273. data/src/core/lib/transport/error_utils.h +14 -0
  274. data/src/core/lib/transport/metadata_batch.h +799 -717
  275. data/src/core/lib/transport/parsed_metadata.cc +2 -0
  276. data/src/core/lib/transport/parsed_metadata.h +95 -92
  277. data/src/core/lib/transport/timeout_encoding.cc +200 -66
  278. data/src/core/lib/transport/timeout_encoding.h +40 -10
  279. data/src/core/lib/transport/transport.h +1 -1
  280. data/src/core/lib/transport/transport_op_string.cc +6 -39
  281. data/src/core/lib/uri/uri_parser.cc +223 -53
  282. data/src/core/lib/uri/uri_parser.h +36 -23
  283. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -3
  284. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  285. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -4
  286. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -5
  287. data/src/core/tsi/ssl_transport_security.cc +53 -13
  288. data/src/core/tsi/ssl_transport_security.h +18 -6
  289. data/src/ruby/ext/grpc/extconf.rb +10 -3
  290. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  291. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
  292. data/src/ruby/lib/grpc/version.rb +1 -1
  293. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -1
  294. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +48 -0
  295. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +200 -0
  296. data/third_party/abseil-cpp/absl/random/beta_distribution.h +427 -0
  297. data/third_party/abseil-cpp/absl/random/discrete_distribution.cc +98 -0
  298. data/third_party/abseil-cpp/absl/random/discrete_distribution.h +247 -0
  299. data/third_party/abseil-cpp/absl/random/distributions.h +452 -0
  300. data/third_party/abseil-cpp/absl/random/exponential_distribution.h +165 -0
  301. data/third_party/abseil-cpp/absl/random/gaussian_distribution.cc +104 -0
  302. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +275 -0
  303. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +92 -0
  304. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +268 -0
  305. data/third_party/abseil-cpp/absl/random/internal/fastmath.h +57 -0
  306. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +144 -0
  307. data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +245 -0
  308. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +150 -0
  309. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +308 -0
  310. data/third_party/abseil-cpp/absl/random/internal/platform.h +171 -0
  311. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +253 -0
  312. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +131 -0
  313. data/third_party/abseil-cpp/absl/random/internal/randen.cc +91 -0
  314. data/third_party/abseil-cpp/absl/random/internal/randen.h +102 -0
  315. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +221 -0
  316. data/third_party/abseil-cpp/absl/random/internal/randen_detect.h +33 -0
  317. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +239 -0
  318. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +526 -0
  319. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h +50 -0
  320. data/third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc +462 -0
  321. data/third_party/abseil-cpp/absl/random/internal/randen_slow.cc +471 -0
  322. data/third_party/abseil-cpp/absl/random/internal/randen_slow.h +40 -0
  323. data/third_party/abseil-cpp/absl/random/internal/randen_traits.h +88 -0
  324. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +167 -0
  325. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +267 -0
  326. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +104 -0
  327. data/third_party/abseil-cpp/absl/random/internal/traits.h +101 -0
  328. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +244 -0
  329. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +111 -0
  330. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +257 -0
  331. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +258 -0
  332. data/third_party/abseil-cpp/absl/random/random.h +189 -0
  333. data/third_party/abseil-cpp/absl/random/seed_gen_exception.cc +46 -0
  334. data/third_party/abseil-cpp/absl/random/seed_gen_exception.h +55 -0
  335. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +29 -0
  336. data/third_party/abseil-cpp/absl/random/seed_sequences.h +110 -0
  337. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +275 -0
  338. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +202 -0
  339. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +271 -0
  340. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -0
  341. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +13 -0
  342. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +21 -0
  343. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +12 -0
  344. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +1 -2
  345. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +2 -2
  346. data/third_party/boringssl-with-bazel/src/crypto/mem.c +1 -1
  347. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +29 -0
  348. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +0 -1
  349. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +1 -1
  350. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  351. data/third_party/boringssl-with-bazel/src/include/openssl/base64.h +8 -0
  352. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +13 -1
  353. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +10 -0
  354. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +1 -1
  355. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +9 -4
  356. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +6 -1
  357. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +23 -2
  358. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +4 -0
  359. data/third_party/xxhash/xxhash.h +607 -352
  360. metadata +149 -77
  361. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +0 -107
  362. data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +0 -46
  363. data/src/core/ext/transport/chttp2/transport/popularity_count.h +0 -60
  364. data/src/core/lib/compression/algorithm_metadata.h +0 -62
  365. data/src/core/lib/compression/compression_args.cc +0 -140
  366. data/src/core/lib/compression/compression_args.h +0 -58
  367. data/src/core/lib/compression/stream_compression.cc +0 -81
  368. data/src/core/lib/compression/stream_compression.h +0 -117
  369. data/src/core/lib/compression/stream_compression_gzip.cc +0 -231
  370. data/src/core/lib/compression/stream_compression_gzip.h +0 -28
  371. data/src/core/lib/compression/stream_compression_identity.cc +0 -91
  372. data/src/core/lib/compression/stream_compression_identity.h +0 -29
  373. data/src/core/lib/security/credentials/credentials_metadata.cc +0 -61
  374. data/src/core/lib/slice/static_slice.cc +0 -377
  375. data/src/core/lib/slice/static_slice.h +0 -300
  376. data/src/core/lib/transport/metadata.cc +0 -714
  377. data/src/core/lib/transport/metadata.h +0 -449
  378. data/src/core/lib/transport/metadata_batch.cc +0 -99
  379. data/src/core/lib/transport/static_metadata.cc +0 -1032
  380. data/src/core/lib/transport/static_metadata.h +0 -322
  381. data/src/core/lib/transport/status_metadata.cc +0 -63
  382. data/src/core/lib/transport/status_metadata.h +0 -48
@@ -23,61 +23,64 @@
23
23
 
24
24
  #include <stddef.h>
25
25
 
26
- #include "src/core/lib/iomgr/port.h"
27
-
28
- #ifdef GRPC_WINSOCK_SOCKET
29
- #include <ws2tcpip.h>
30
- #endif
31
-
32
- #if defined(GRPC_POSIX_SOCKET) || defined(GRPC_CFSTREAM)
33
- #include <sys/socket.h>
34
- #endif
26
+ #include "absl/status/statusor.h"
35
27
 
28
+ #include "src/core/lib/gprpp/orphanable.h"
36
29
  #include "src/core/lib/iomgr/pollset_set.h"
30
+ #include "src/core/lib/iomgr/port.h"
31
+ #include "src/core/lib/iomgr/resolved_address.h"
37
32
 
38
33
  #define GRPC_MAX_SOCKADDR_SIZE 128
39
34
 
40
- struct grpc_resolved_address {
41
- char addr[GRPC_MAX_SOCKADDR_SIZE];
42
- socklen_t len;
43
- };
44
- struct grpc_resolved_addresses {
45
- size_t naddrs;
46
- grpc_resolved_address* addrs;
47
- };
48
-
49
35
  namespace grpc_core {
50
36
  extern const char* kDefaultSecurePort;
51
37
  constexpr int kDefaultSecurePortInt = 443;
52
- } // namespace grpc_core
53
-
54
- typedef struct grpc_address_resolver_vtable {
55
- void (*resolve_address)(const char* addr, const char* default_port,
56
- grpc_pollset_set* interested_parties,
57
- grpc_closure* on_done,
58
- grpc_resolved_addresses** addresses);
59
- grpc_error_handle (*blocking_resolve_address)(
60
- const char* name, const char* default_port,
61
- grpc_resolved_addresses** addresses);
62
- } grpc_address_resolver_vtable;
63
38
 
64
- void grpc_set_resolver_impl(grpc_address_resolver_vtable* vtable);
39
+ // A singleton class used for async and blocking DNS resolution
40
+ class DNSResolver {
41
+ public:
42
+ // Tracks a single asynchronous DNS resolution attempt. The DNS
43
+ // resolution should be arranged to be cancelled as soon as possible
44
+ // when Orphan is called.
45
+ class Request : public InternallyRefCounted<Request> {
46
+ public:
47
+ // Begins async DNS resolution
48
+ virtual void Start() = 0;
49
+ };
50
+
51
+ virtual ~DNSResolver() {}
52
+
53
+ // Asynchronously resolve name. Use \a default_port if a port isn't designated
54
+ // in \a name, otherwise use the port in \a name. On completion, \a on_done is
55
+ // invoked with the result.
56
+ //
57
+ // Note for implementations: calls may acquire locks in \a on_done which
58
+ // were previously held while calling Request::Start(). Therefore,
59
+ // implementations must not invoke \a on_done inline from the call to
60
+ // Request::Start(). The DNSCallbackExecCtxScheduler utility may help address
61
+ // this.
62
+ virtual OrphanablePtr<Request> ResolveName(
63
+ absl::string_view name, absl::string_view default_port,
64
+ grpc_pollset_set* interested_parties,
65
+ std::function<void(absl::StatusOr<std::vector<grpc_resolved_address>>)>
66
+ on_done) GRPC_MUST_USE_RESULT = 0;
67
+
68
+ // Resolve name in a blocking fashion. Use \a default_port if a port isn't
69
+ // designated in \a name, otherwise use the port in \a name.
70
+ virtual absl::StatusOr<std::vector<grpc_resolved_address>>
71
+ ResolveNameBlocking(absl::string_view name,
72
+ absl::string_view default_port) = 0;
73
+ };
65
74
 
66
- /* Asynchronously resolve addr. Use default_port if a port isn't designated
67
- in addr, otherwise use the port in addr. */
68
- /* TODO(apolcyn): add a timeout here */
69
- void grpc_resolve_address(const char* addr, const char* default_port,
70
- grpc_pollset_set* interested_parties,
71
- grpc_closure* on_done,
72
- grpc_resolved_addresses** addresses);
75
+ // Override the active DNS resolver which should be used for all DNS
76
+ // resolution in gRPC. Note this should only be used during library
77
+ // initialization or within tests.
78
+ void SetDNSResolver(DNSResolver* resolver);
73
79
 
74
- /* Destroy resolved addresses */
75
- void grpc_resolved_addresses_destroy(grpc_resolved_addresses* addresses);
80
+ // Get the singleton DNS resolver instance which should be used for all
81
+ // DNS resolution in gRPC.
82
+ DNSResolver* GetDNSResolver();
76
83
 
77
- /* Resolve addr in a blocking fashion. On success,
78
- result must be freed with grpc_resolved_addresses_destroy. */
79
- grpc_error_handle grpc_blocking_resolve_address(
80
- const char* name, const char* default_port,
81
- grpc_resolved_addresses** addresses);
84
+ } // namespace grpc_core
82
85
 
83
86
  #endif /* GRPC_CORE_LIB_IOMGR_RESOLVE_ADDRESS_H */
@@ -1,20 +1,18 @@
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
+ //
2
+ // Copyright 2018 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
18
16
 
19
17
  #include <grpc/support/port_platform.h>
20
18
 
@@ -22,6 +20,7 @@
22
20
 
23
21
  #include <string.h>
24
22
 
23
+ #include <cstdio>
25
24
  #include <string>
26
25
 
27
26
  #include "absl/strings/str_format.h"
@@ -35,135 +34,158 @@
35
34
  #include "src/core/lib/gprpp/host_port.h"
36
35
  #include "src/core/lib/iomgr/iomgr_custom.h"
37
36
  #include "src/core/lib/iomgr/port.h"
37
+ #include "src/core/lib/iomgr/resolve_address_impl.h"
38
+ #include "src/core/lib/transport/error_utils.h"
38
39
 
39
- struct grpc_custom_resolver {
40
- grpc_closure* on_done = nullptr;
41
- grpc_resolved_addresses** addresses = nullptr;
42
- std::string host;
43
- std::string port;
44
- };
45
-
46
- static grpc_custom_resolver_vtable* resolve_address_vtable = nullptr;
47
-
48
- static int retry_named_port_failure(grpc_custom_resolver* r,
49
- grpc_resolved_addresses** res) {
50
- // This loop is copied from resolve_address_posix.c
51
- const char* svc[][2] = {{"http", "80"}, {"https", "443"}};
52
- for (size_t i = 0; i < GPR_ARRAY_SIZE(svc); i++) {
53
- if (r->port == svc[i][0]) {
54
- r->port = svc[i][1];
55
- if (res) {
56
- grpc_error_handle error = resolve_address_vtable->resolve(
57
- r->host.c_str(), r->port.c_str(), res);
58
- if (error != GRPC_ERROR_NONE) {
59
- GRPC_ERROR_UNREF(error);
60
- return 0;
61
- }
62
- } else {
63
- resolve_address_vtable->resolve_async(r, r->host.c_str(),
64
- r->port.c_str());
65
- }
66
- return 1;
67
- }
40
+ void grpc_resolved_addresses_destroy(grpc_resolved_addresses* addresses) {
41
+ if (addresses != nullptr) {
42
+ gpr_free(addresses->addrs);
68
43
  }
69
- return 0;
44
+ gpr_free(addresses);
70
45
  }
71
46
 
72
- void grpc_custom_resolve_callback(grpc_custom_resolver* r,
47
+ void grpc_custom_resolve_callback(grpc_custom_resolver* resolver,
73
48
  grpc_resolved_addresses* result,
74
49
  grpc_error_handle error) {
75
50
  GRPC_CUSTOM_IOMGR_ASSERT_SAME_THREAD();
76
51
  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
77
52
  grpc_core::ExecCtx exec_ctx;
78
- if (error == GRPC_ERROR_NONE) {
79
- *r->addresses = result;
80
- } else if (retry_named_port_failure(r, nullptr)) {
81
- return;
82
- }
83
- if (r->on_done) {
84
- grpc_core::ExecCtx::Run(DEBUG_LOCATION, r->on_done, error);
53
+ grpc_core::CustomDNSResolver::Request* request =
54
+ grpc_core::CustomDNSResolver::Request::FromC(resolver);
55
+ if (error != GRPC_ERROR_NONE) {
56
+ request->ResolveCallback(grpc_error_to_absl_status(error));
57
+ } else {
58
+ std::vector<grpc_resolved_address> addresses;
59
+ for (size_t i = 0; i < result->naddrs; i++) {
60
+ addresses.push_back(result->addrs[i]);
61
+ }
62
+ request->ResolveCallback(std::move(addresses));
63
+ grpc_resolved_addresses_destroy(result);
85
64
  }
86
- delete r;
65
+ GRPC_ERROR_UNREF(error);
87
66
  }
88
67
 
89
- static grpc_error_handle try_split_host_port(const char* name,
90
- const char* default_port,
91
- std::string* host,
92
- std::string* port) {
93
- /* parse name, splitting it into host and port parts */
94
- grpc_core::SplitHostPort(name, host, port);
68
+ namespace grpc_core {
69
+
70
+ namespace {
71
+
72
+ absl::Status TrySplitHostPort(absl::string_view name,
73
+ absl::string_view default_port, std::string* host,
74
+ std::string* port) {
75
+ // parse name, splitting it into host and port parts
76
+ SplitHostPort(name, host, port);
95
77
  if (host->empty()) {
96
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
78
+ return absl::UnknownError(
97
79
  absl::StrFormat("unparseable host:port: '%s'", name));
98
80
  }
99
81
  if (port->empty()) {
100
82
  // TODO(murgatroid99): add tests for this case
101
83
  if (default_port == nullptr) {
102
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
103
- absl::StrFormat("no port in name '%s'", name));
84
+ return absl::UnknownError(absl::StrFormat("no port in name '%s'", name));
85
+ }
86
+ *port = std::string(default_port);
87
+ }
88
+ return absl::OkStatus();
89
+ }
90
+
91
+ absl::StatusOr<std::string> NamedPortToNumeric(absl::string_view named_port) {
92
+ if (named_port == "http") {
93
+ return "80";
94
+ } else if (named_port == "https") {
95
+ return "443";
96
+ } else {
97
+ return absl::UnknownError(absl::StrCat("unknown named port: ", named_port));
98
+ }
99
+ }
100
+
101
+ } // namespace
102
+
103
+ void CustomDNSResolver::Request::ResolveCallback(
104
+ absl::StatusOr<std::vector<grpc_resolved_address>> result) {
105
+ if (!result.ok()) {
106
+ auto numeric_port_or = NamedPortToNumeric(port_);
107
+ if (numeric_port_or.ok()) {
108
+ port_ = *numeric_port_or;
109
+ resolve_address_vtable_->resolve_async(c_ptr(), host_.c_str(),
110
+ port_.c_str());
111
+ // keep holding ref for active resolution
112
+ return;
104
113
  }
105
- *port = default_port;
106
114
  }
107
- return GRPC_ERROR_NONE;
115
+ // since we can't guarantee that we're not being called inline from
116
+ // Start(), run the callback on the ExecCtx.
117
+ new DNSCallbackExecCtxScheduler(std::move(on_done_), std::move(result));
118
+ Unref();
108
119
  }
109
120
 
110
- static grpc_error_handle blocking_resolve_address_impl(
111
- const char* name, const char* default_port,
112
- grpc_resolved_addresses** addresses) {
121
+ namespace {
122
+ CustomDNSResolver* g_custom_dns_resolver;
123
+ } // namespace
124
+
125
+ // Creates the global custom resolver with the specified vtable.
126
+ void CustomDNSResolver::Create(grpc_custom_resolver_vtable* vtable) {
127
+ if (g_custom_dns_resolver != nullptr) return;
128
+ g_custom_dns_resolver = new CustomDNSResolver(vtable);
129
+ }
130
+
131
+ // Gets the singleton instance.
132
+ CustomDNSResolver* CustomDNSResolver::Get() { return g_custom_dns_resolver; }
133
+
134
+ absl::StatusOr<std::vector<grpc_resolved_address>>
135
+ CustomDNSResolver::ResolveNameBlocking(absl::string_view name,
136
+ absl::string_view default_port) {
113
137
  GRPC_CUSTOM_IOMGR_ASSERT_SAME_THREAD();
114
138
 
115
- grpc_custom_resolver resolver;
116
- grpc_error_handle err =
117
- try_split_host_port(name, default_port, &resolver.host, &resolver.port);
118
- if (err != GRPC_ERROR_NONE) {
119
- return err;
139
+ std::string host;
140
+ std::string port;
141
+ absl::Status parse_status =
142
+ TrySplitHostPort(name, default_port, &host, &port);
143
+ if (!parse_status.ok()) {
144
+ return parse_status;
120
145
  }
121
146
 
122
- /* Call getaddrinfo */
147
+ // Call getaddrinfo
148
+ ExecCtx* curr = ExecCtx::Get();
149
+ ExecCtx::Set(nullptr);
123
150
  grpc_resolved_addresses* addrs;
124
- grpc_core::ExecCtx* curr = grpc_core::ExecCtx::Get();
125
- grpc_core::ExecCtx::Set(nullptr);
126
- err = resolve_address_vtable->resolve(resolver.host.c_str(),
127
- resolver.port.c_str(), &addrs);
151
+ grpc_error_handle err =
152
+ resolve_address_vtable_->resolve(host.c_str(), port.c_str(), &addrs);
128
153
  if (err != GRPC_ERROR_NONE) {
129
- if (retry_named_port_failure(&resolver, &addrs)) {
154
+ auto numeric_port_or = NamedPortToNumeric(port);
155
+ if (numeric_port_or.ok()) {
156
+ port = *numeric_port_or;
130
157
  GRPC_ERROR_UNREF(err);
131
- err = GRPC_ERROR_NONE;
158
+ err =
159
+ resolve_address_vtable_->resolve(host.c_str(), port.c_str(), &addrs);
132
160
  }
133
161
  }
134
- grpc_core::ExecCtx::Set(curr);
162
+ ExecCtx::Set(curr);
135
163
  if (err == GRPC_ERROR_NONE) {
136
- *addresses = addrs;
164
+ GPR_ASSERT(addrs != nullptr);
165
+ std::vector<grpc_resolved_address> result;
166
+ for (size_t i = 0; i < addrs->naddrs; i++) {
167
+ result.push_back(addrs->addrs[i]);
168
+ }
169
+ grpc_resolved_addresses_destroy(addrs);
170
+ return result;
137
171
  }
138
- return err;
172
+ auto error_result = grpc_error_to_absl_status(err);
173
+ GRPC_ERROR_UNREF(err);
174
+ return error_result;
139
175
  }
140
176
 
141
- static void resolve_address_impl(const char* name, const char* default_port,
142
- grpc_pollset_set* /*interested_parties*/,
143
- grpc_closure* on_done,
144
- grpc_resolved_addresses** addrs) {
177
+ void CustomDNSResolver::Request::Start() {
145
178
  GRPC_CUSTOM_IOMGR_ASSERT_SAME_THREAD();
146
- std::string host;
147
- std::string port;
148
- grpc_error_handle err = try_split_host_port(name, default_port, &host, &port);
149
- if (err != GRPC_ERROR_NONE) {
150
- grpc_core::ExecCtx::Run(DEBUG_LOCATION, on_done, err);
179
+ absl::Status parse_status =
180
+ TrySplitHostPort(name_, default_port_, &host_, &port_);
181
+ if (!parse_status.ok()) {
182
+ new DNSCallbackExecCtxScheduler(std::move(on_done_),
183
+ std::move(parse_status));
151
184
  return;
152
185
  }
153
- grpc_custom_resolver* r = new grpc_custom_resolver();
154
- r->on_done = on_done;
155
- r->addresses = addrs;
156
- r->host = std::move(host);
157
- r->port = std::move(port);
158
-
159
- /* Call getaddrinfo */
160
- resolve_address_vtable->resolve_async(r, r->host.c_str(), r->port.c_str());
186
+ // Call getaddrinfo
187
+ Ref().release(); // ref held by resolution
188
+ resolve_address_vtable_->resolve_async(c_ptr(), host_.c_str(), port_.c_str());
161
189
  }
162
190
 
163
- static grpc_address_resolver_vtable custom_resolver_vtable = {
164
- resolve_address_impl, blocking_resolve_address_impl};
165
-
166
- void grpc_custom_resolver_init(grpc_custom_resolver_vtable* impl) {
167
- resolve_address_vtable = impl;
168
- grpc_set_resolver_impl(&custom_resolver_vtable);
169
- }
191
+ } // namespace grpc_core
@@ -1,30 +1,43 @@
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
+ //
2
+ // Copyright 2018 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
18
16
 
19
17
  #ifndef GRPC_CORE_LIB_IOMGR_RESOLVE_ADDRESS_CUSTOM_H
20
18
  #define GRPC_CORE_LIB_IOMGR_RESOLVE_ADDRESS_CUSTOM_H
21
19
 
22
20
  #include <grpc/support/port_platform.h>
23
21
 
22
+ #include <grpc/support/sync.h>
23
+
24
+ #include "src/core/lib/gprpp/cpp_impl_of.h"
24
25
  #include "src/core/lib/iomgr/port.h"
25
26
  #include "src/core/lib/iomgr/resolve_address.h"
26
27
  #include "src/core/lib/iomgr/sockaddr.h"
27
28
 
29
+ // User-configured custom DNS resolution APIs
30
+
31
+ // TODO(apolcyn): This type could be deleted as a part of converting
32
+ // this grpc_custom_resolver API to C++.
33
+ struct grpc_resolved_addresses {
34
+ size_t naddrs;
35
+ grpc_resolved_address* addrs;
36
+ };
37
+
38
+ // Destroy resolved addresses
39
+ void grpc_resolved_addresses_destroy(grpc_resolved_addresses* addresses);
40
+
28
41
  typedef struct grpc_custom_resolver grpc_custom_resolver;
29
42
 
30
43
  typedef struct grpc_custom_resolver_vtable {
@@ -34,11 +47,80 @@ typedef struct grpc_custom_resolver_vtable {
34
47
  const char* port);
35
48
  } grpc_custom_resolver_vtable;
36
49
 
50
+ // TODO(apolcyn): as a part of converting this API to C++,
51
+ // callers of \a grpc_custom_resolve_callback could instead just invoke
52
+ // CustomDNSResolver::Request::ResolveCallback directly.
37
53
  void grpc_custom_resolve_callback(grpc_custom_resolver* resolver,
38
54
  grpc_resolved_addresses* result,
39
55
  grpc_error_handle error);
40
56
 
41
- /* Internal APIs */
42
- void grpc_custom_resolver_init(grpc_custom_resolver_vtable* impl);
57
+ // Internal APIs
58
+
59
+ namespace grpc_core {
60
+
61
+ class CustomDNSResolver : public DNSResolver {
62
+ public:
63
+ class Request : public DNSResolver::Request,
64
+ public CppImplOf<Request, grpc_custom_resolver> {
65
+ public:
66
+ Request(
67
+ absl::string_view name, absl::string_view default_port,
68
+ std::function<void(absl::StatusOr<std::vector<grpc_resolved_address>>)>
69
+ on_done,
70
+ const grpc_custom_resolver_vtable* resolve_address_vtable)
71
+ : name_(name),
72
+ default_port_(default_port),
73
+ on_done_(std::move(on_done)),
74
+ resolve_address_vtable_(resolve_address_vtable) {}
75
+
76
+ // Starts the resolution
77
+ void Start() override;
78
+
79
+ // This is a no-op for the native resolver. Note
80
+ // that no I/O polling is required for the resolution to finish.
81
+ void Orphan() override { Unref(); }
82
+
83
+ // Continues async resolution with the results passed first in to
84
+ // grpc_custom_resolve_callback.
85
+ void ResolveCallback(
86
+ absl::StatusOr<std::vector<grpc_resolved_address>> result);
87
+
88
+ private:
89
+ const std::string name_;
90
+ const std::string default_port_;
91
+ std::string host_;
92
+ std::string port_;
93
+ std::function<void(absl::StatusOr<std::vector<grpc_resolved_address>>)>
94
+ on_done_;
95
+ // user-defined DNS methods
96
+ const grpc_custom_resolver_vtable* resolve_address_vtable_;
97
+ };
98
+
99
+ // Creates the global custom resolver with the specified vtable.
100
+ static void Create(grpc_custom_resolver_vtable* vtable);
101
+
102
+ // Gets the singleton instance.
103
+ static CustomDNSResolver* Get();
104
+
105
+ explicit CustomDNSResolver(const grpc_custom_resolver_vtable* vtable)
106
+ : resolve_address_vtable_(vtable) {}
107
+
108
+ OrphanablePtr<DNSResolver::Request> ResolveName(
109
+ absl::string_view name, absl::string_view default_port,
110
+ grpc_pollset_set* /* interested_parties */,
111
+ std::function<void(absl::StatusOr<std::vector<grpc_resolved_address>>)>
112
+ on_done) override {
113
+ return MakeOrphanable<Request>(name, default_port, std::move(on_done),
114
+ resolve_address_vtable_);
115
+ }
116
+
117
+ absl::StatusOr<std::vector<grpc_resolved_address>> ResolveNameBlocking(
118
+ absl::string_view name, absl::string_view default_port) override;
119
+
120
+ private:
121
+ // user-defined DNS methods
122
+ const grpc_custom_resolver_vtable* resolve_address_vtable_;
123
+ };
43
124
 
125
+ } // namespace grpc_core
44
126
  #endif /* GRPC_CORE_LIB_IOMGR_RESOLVE_ADDRESS_CUSTOM_H */
@@ -0,0 +1,59 @@
1
+ //
2
+ // Copyright 2015 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
16
+
17
+ #ifndef GRPC_CORE_LIB_IOMGR_RESOLVE_ADDRESS_IMPL_H
18
+ #define GRPC_CORE_LIB_IOMGR_RESOLVE_ADDRESS_IMPL_H
19
+
20
+ #include <grpc/support/port_platform.h>
21
+
22
+ #include <stddef.h>
23
+
24
+ #include "src/core/lib/iomgr/port.h"
25
+ #include "src/core/lib/iomgr/resolve_address.h"
26
+
27
+ namespace grpc_core {
28
+
29
+ // A fire and forget class used by DNSResolver::Request implementations to
30
+ // schedule DNS resolution callbacks on the ExecCtx, which is frequently
31
+ // necessary to avoid lock inversion related problems.
32
+ class DNSCallbackExecCtxScheduler {
33
+ public:
34
+ DNSCallbackExecCtxScheduler(
35
+ std::function<void(absl::StatusOr<std::vector<grpc_resolved_address>>)>
36
+ on_done,
37
+ absl::StatusOr<std::vector<grpc_resolved_address>> param)
38
+ : on_done_(std::move(on_done)), param_(std::move(param)) {
39
+ GRPC_CLOSURE_INIT(&closure_, RunCallback, this, grpc_schedule_on_exec_ctx);
40
+ ExecCtx::Run(DEBUG_LOCATION, &closure_, GRPC_ERROR_NONE);
41
+ }
42
+
43
+ private:
44
+ static void RunCallback(void* arg, grpc_error_handle /* error */) {
45
+ DNSCallbackExecCtxScheduler* self =
46
+ static_cast<DNSCallbackExecCtxScheduler*>(arg);
47
+ self->on_done_(std::move(self->param_));
48
+ delete self;
49
+ }
50
+
51
+ const std::function<void(absl::StatusOr<std::vector<grpc_resolved_address>>)>
52
+ on_done_;
53
+ absl::StatusOr<std::vector<grpc_resolved_address>> param_;
54
+ grpc_closure closure_;
55
+ };
56
+
57
+ } // namespace grpc_core
58
+
59
+ #endif /* GRPC_CORE_LIB_IOMGR_RESOLVE_ADDRESS_IMPL_H */