grpc 1.34.0 → 1.35.0.pre1

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 (458) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +808 -2787
  3. data/etc/roots.pem +257 -573
  4. data/include/grpc/compression.h +1 -1
  5. data/include/grpc/grpc.h +14 -0
  6. data/include/grpc/grpc_security.h +61 -3
  7. data/include/grpc/impl/codegen/atm_windows.h +4 -0
  8. data/include/grpc/impl/codegen/byte_buffer.h +1 -1
  9. data/include/grpc/impl/codegen/grpc_types.h +1 -1
  10. data/include/grpc/impl/codegen/log.h +0 -2
  11. data/include/grpc/impl/codegen/sync_windows.h +4 -0
  12. data/include/grpc/slice_buffer.h +3 -3
  13. data/include/grpc/support/sync.h +3 -3
  14. data/include/grpc/support/time.h +7 -7
  15. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -4
  16. data/src/core/ext/filters/client_channel/client_channel.cc +2734 -1498
  17. data/src/core/ext/filters/client_channel/client_channel.h +0 -4
  18. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  19. data/src/core/ext/filters/client_channel/config_selector.h +4 -0
  20. data/src/core/ext/filters/client_channel/dynamic_filters.cc +186 -0
  21. data/src/core/ext/filters/client_channel/dynamic_filters.h +99 -0
  22. data/src/core/ext/filters/client_channel/health/health_check_client.cc +6 -6
  23. data/src/core/ext/filters/client_channel/health/health_check_client.h +2 -2
  24. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +4 -5
  25. data/src/core/ext/filters/client_channel/http_proxy.cc +21 -20
  26. data/src/core/ext/filters/client_channel/lb_policy.cc +1 -1
  27. data/src/core/ext/filters/client_channel/lb_policy.h +2 -3
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +32 -30
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +3 -3
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +162 -20
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +0 -8
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +24 -0
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -2
  35. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +1 -1
  36. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +1262 -0
  37. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +7 -14
  38. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -32
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  40. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +454 -16
  41. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -0
  42. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -9
  43. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
  44. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +18 -31
  45. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +3 -5
  46. data/src/core/ext/filters/client_channel/resolver_factory.h +6 -6
  47. data/src/core/ext/filters/client_channel/resolver_registry.cc +40 -39
  48. data/src/core/ext/filters/client_channel/resolver_registry.h +2 -2
  49. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +11 -13
  50. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +8 -8
  51. data/src/core/ext/filters/client_channel/retry_throttle.cc +5 -3
  52. data/src/core/ext/filters/client_channel/retry_throttle.h +3 -1
  53. data/src/core/ext/filters/client_channel/service_config_call_data.h +19 -1
  54. data/src/core/ext/filters/client_channel/subchannel.cc +34 -50
  55. data/src/core/ext/filters/client_channel/subchannel.h +12 -18
  56. data/src/core/ext/filters/deadline/deadline_filter.cc +4 -2
  57. data/src/core/ext/filters/http/client_authority_filter.cc +6 -6
  58. data/src/core/ext/filters/http/http_filters_plugin.cc +6 -3
  59. data/src/core/ext/filters/message_size/message_size_filter.cc +1 -1
  60. data/src/core/ext/filters/workarounds/workaround_utils.cc +1 -1
  61. data/src/core/ext/transport/chttp2/client/authority.cc +3 -3
  62. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +20 -8
  63. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +21 -10
  64. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +26 -14
  65. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +178 -86
  66. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +12 -5
  67. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +7 -8
  68. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -1
  69. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
  70. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +6 -6
  71. data/src/core/ext/transport/chttp2/transport/writing.cc +1 -1
  72. data/src/core/ext/transport/inproc/inproc_transport.cc +42 -8
  73. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +1 -0
  74. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +1 -1
  75. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -0
  76. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +27 -27
  77. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +139 -40
  78. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +13 -13
  79. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +44 -17
  80. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +111 -111
  81. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +424 -241
  82. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +3 -3
  83. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +13 -5
  84. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +22 -22
  85. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +47 -21
  86. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +21 -21
  87. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +88 -39
  88. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +4 -4
  89. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +15 -6
  90. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +44 -44
  91. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +200 -78
  92. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +17 -17
  93. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +72 -35
  94. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +1 -1
  95. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +7 -0
  96. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +7 -7
  97. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +27 -11
  98. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +30 -30
  99. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +136 -49
  100. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +39 -39
  101. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +157 -89
  102. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +4 -4
  103. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +17 -9
  104. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +47 -47
  105. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +163 -78
  106. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +1 -1
  107. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +7 -0
  108. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +2 -2
  109. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +9 -2
  110. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +1 -1
  111. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +7 -0
  112. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +13 -13
  113. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +59 -36
  114. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +16 -16
  115. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +61 -29
  116. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +26 -26
  117. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +101 -66
  118. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +2 -2
  119. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +11 -3
  120. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +28 -28
  121. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +122 -77
  122. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +23 -23
  123. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +106 -54
  124. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +2 -2
  125. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +13 -0
  126. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +16 -16
  127. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +81 -35
  128. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +7 -7
  129. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +38 -22
  130. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +203 -203
  131. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +845 -495
  132. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +5 -5
  133. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +26 -6
  134. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +3 -3
  135. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +17 -3
  136. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +87 -87
  137. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +343 -204
  138. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +1 -0
  139. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +20 -20
  140. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +85 -46
  141. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +7 -7
  142. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +33 -11
  143. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +32 -32
  144. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +118 -67
  145. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +1 -1
  146. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +7 -0
  147. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
  148. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +7 -0
  149. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +29 -29
  150. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +120 -82
  151. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +1 -1
  152. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +7 -0
  153. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +1 -1
  154. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +7 -0
  155. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +7 -7
  156. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +31 -16
  157. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +1 -1
  158. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +7 -0
  159. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +1 -1
  160. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +7 -0
  161. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +5 -5
  162. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +25 -11
  163. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +1 -1
  164. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +7 -0
  165. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +1 -1
  166. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +7 -0
  167. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +6 -6
  168. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +29 -8
  169. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +2 -2
  170. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +16 -3
  171. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +3 -3
  172. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +19 -0
  173. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +7 -7
  174. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +46 -3
  175. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +8 -8
  176. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +41 -8
  177. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +1 -0
  178. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +3 -3
  179. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +15 -2
  180. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +3 -3
  181. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +19 -0
  182. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +1 -1
  183. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +7 -0
  184. data/src/core/ext/upb-generated/google/api/annotations.upb.h +1 -0
  185. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +34 -34
  186. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +149 -72
  187. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +34 -34
  188. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +142 -59
  189. data/src/core/ext/upb-generated/google/api/http.upb.c +3 -3
  190. data/src/core/ext/upb-generated/google/api/http.upb.h +25 -6
  191. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +1 -1
  192. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +7 -0
  193. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +90 -90
  194. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +455 -292
  195. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +1 -1
  196. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +7 -0
  197. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
  198. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +7 -0
  199. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +4 -4
  200. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +22 -3
  201. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +1 -1
  202. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +7 -0
  203. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +9 -9
  204. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +55 -0
  205. data/src/core/ext/upb-generated/google/rpc/status.upb.c +1 -1
  206. data/src/core/ext/upb-generated/google/rpc/status.upb.h +10 -3
  207. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +4 -4
  208. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +11 -3
  209. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +41 -41
  210. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +149 -76
  211. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +5 -5
  212. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +21 -6
  213. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +2 -2
  214. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +13 -0
  215. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +17 -17
  216. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +82 -25
  217. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +3 -3
  218. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +19 -0
  219. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +1 -1
  220. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +7 -0
  221. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +1 -0
  222. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +2 -2
  223. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +9 -2
  224. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +1 -1
  225. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -0
  226. data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.c +1 -1
  227. data/src/core/ext/upb-generated/udpa/core/v1/authority.upb.h +7 -0
  228. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c +5 -5
  229. data/src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h +21 -7
  230. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c +2 -2
  231. data/src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h +7 -0
  232. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.c +4 -4
  233. data/src/core/ext/upb-generated/udpa/core/v1/resource.upb.h +17 -8
  234. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c +7 -7
  235. data/src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h +31 -18
  236. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c +5 -5
  237. data/src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h +19 -11
  238. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +3 -3
  239. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +7 -0
  240. data/src/core/ext/upb-generated/validate/validate.upb.c +64 -64
  241. data/src/core/ext/upb-generated/validate/validate.upb.h +296 -157
  242. data/src/core/ext/xds/certificate_provider_store.cc +10 -7
  243. data/src/core/ext/xds/certificate_provider_store.h +12 -7
  244. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +25 -0
  245. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +1 -4
  246. data/src/core/ext/xds/xds_api.cc +220 -31
  247. data/src/core/ext/xds/xds_api.h +41 -10
  248. data/src/core/ext/xds/xds_bootstrap.h +0 -1
  249. data/src/core/ext/xds/xds_certificate_provider.cc +61 -2
  250. data/src/core/ext/xds/xds_certificate_provider.h +40 -2
  251. data/src/core/ext/xds/xds_client.cc +31 -29
  252. data/src/core/ext/xds/xds_client.h +6 -1
  253. data/src/core/ext/xds/xds_client_stats.cc +2 -2
  254. data/src/core/ext/xds/xds_server_config_fetcher.cc +131 -0
  255. data/src/core/lib/channel/channel_args.cc +8 -8
  256. data/src/core/lib/channel/channel_trace.h +1 -1
  257. data/src/core/lib/channel/channelz.cc +13 -14
  258. data/src/core/lib/channel/channelz.h +0 -1
  259. data/src/core/lib/channel/channelz_registry.h +0 -1
  260. data/src/core/lib/channel/handshaker.cc +2 -2
  261. data/src/core/lib/compression/compression_args.cc +3 -2
  262. data/src/core/lib/debug/stats.h +2 -2
  263. data/src/core/lib/debug/stats_data.h +13 -13
  264. data/src/core/lib/gpr/alloc.cc +3 -2
  265. data/src/core/lib/gpr/log.cc +53 -16
  266. data/src/core/lib/gpr/log_linux.cc +3 -1
  267. data/src/core/lib/gpr/log_posix.cc +3 -1
  268. data/src/core/lib/gpr/log_windows.cc +3 -1
  269. data/src/core/lib/gpr/spinlock.h +10 -2
  270. data/src/core/lib/gpr/string.cc +22 -21
  271. data/src/core/lib/gpr/string.h +5 -6
  272. data/src/core/lib/gpr/sync.cc +4 -4
  273. data/src/core/lib/gpr/time.cc +12 -12
  274. data/src/core/lib/gprpp/arena.h +3 -2
  275. data/src/core/lib/gprpp/ref_counted.h +2 -2
  276. data/src/core/lib/gprpp/ref_counted_ptr.h +9 -1
  277. data/src/core/lib/gprpp/thd_posix.cc +6 -1
  278. data/src/core/lib/gprpp/thd_windows.cc +3 -1
  279. data/src/core/lib/http/httpcli.cc +1 -1
  280. data/src/core/lib/http/httpcli.h +2 -3
  281. data/src/core/lib/http/httpcli_security_connector.cc +1 -1
  282. data/src/core/lib/http/parser.cc +1 -2
  283. data/src/core/lib/iomgr/call_combiner.cc +8 -5
  284. data/src/core/lib/iomgr/combiner.cc +2 -1
  285. data/src/core/lib/iomgr/endpoint.h +1 -1
  286. data/src/core/lib/iomgr/error.cc +15 -11
  287. data/src/core/lib/iomgr/error_internal.h +1 -1
  288. data/src/core/lib/iomgr/ev_epoll1_linux.cc +20 -13
  289. data/src/core/lib/iomgr/ev_epollex_linux.cc +17 -13
  290. data/src/core/lib/iomgr/ev_poll_posix.cc +9 -7
  291. data/src/core/lib/iomgr/exec_ctx.h +6 -4
  292. data/src/core/lib/iomgr/executor.cc +2 -1
  293. data/src/core/lib/iomgr/executor.h +1 -1
  294. data/src/core/lib/iomgr/executor/threadpool.h +1 -1
  295. data/src/core/lib/iomgr/iomgr.cc +1 -1
  296. data/src/core/lib/iomgr/load_file.h +1 -1
  297. data/src/core/lib/iomgr/lockfree_event.cc +19 -14
  298. data/src/core/lib/iomgr/lockfree_event.h +2 -2
  299. data/src/core/lib/iomgr/parse_address.cc +52 -46
  300. data/src/core/lib/iomgr/parse_address.h +13 -9
  301. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +1 -1
  302. data/src/core/lib/iomgr/pollset_set_custom.cc +1 -1
  303. data/src/core/lib/iomgr/python_util.h +1 -1
  304. data/src/core/lib/iomgr/resolve_address.cc +4 -4
  305. data/src/core/lib/iomgr/resource_quota.cc +4 -4
  306. data/src/core/lib/iomgr/sockaddr_utils.cc +10 -10
  307. data/src/core/lib/iomgr/sockaddr_utils.h +1 -1
  308. data/src/core/lib/iomgr/socket_factory_posix.cc +3 -2
  309. data/src/core/lib/iomgr/socket_mutator.cc +3 -2
  310. data/src/core/lib/iomgr/tcp_client.cc +3 -3
  311. data/src/core/lib/iomgr/tcp_client_custom.cc +7 -6
  312. data/src/core/lib/iomgr/tcp_custom.cc +22 -17
  313. data/src/core/lib/iomgr/tcp_posix.cc +9 -6
  314. data/src/core/lib/iomgr/tcp_server_custom.cc +28 -22
  315. data/src/core/lib/iomgr/timer_custom.cc +3 -3
  316. data/src/core/lib/iomgr/timer_generic.cc +3 -3
  317. data/src/core/lib/iomgr/timer_manager.cc +2 -2
  318. data/src/core/lib/iomgr/udp_server.cc +1 -2
  319. data/src/core/lib/iomgr/udp_server.h +1 -2
  320. data/src/core/lib/iomgr/unix_sockets_posix.cc +17 -18
  321. data/src/core/lib/json/json.h +10 -0
  322. data/src/core/lib/security/authorization/evaluate_args.cc +5 -10
  323. data/src/core/lib/security/authorization/evaluate_args.h +1 -1
  324. data/src/core/lib/security/context/security_context.cc +4 -3
  325. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +1 -1
  326. data/src/core/lib/security/credentials/credentials.cc +6 -6
  327. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +413 -0
  328. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +80 -0
  329. data/src/core/lib/security/credentials/external/aws_request_signer.cc +15 -10
  330. data/src/core/lib/security/credentials/external/aws_request_signer.h +1 -2
  331. data/src/core/lib/security/credentials/external/external_account_credentials.cc +217 -31
  332. data/src/core/lib/security/credentials/external/external_account_credentials.h +7 -5
  333. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -6
  334. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +3 -4
  335. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +20 -18
  336. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +5 -6
  337. data/src/core/lib/security/credentials/fake/fake_credentials.cc +2 -1
  338. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +18 -12
  339. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +18 -5
  340. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  341. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +3 -3
  342. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +37 -44
  343. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -4
  344. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +1 -1
  345. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +5 -5
  346. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +1 -1
  347. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +1 -6
  348. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +1 -6
  349. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +326 -5
  350. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +64 -0
  351. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +1 -1
  352. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +0 -1
  353. data/src/core/lib/security/credentials/tls/tls_credentials.cc +1 -1
  354. data/src/core/lib/security/credentials/tls/tls_utils.cc +91 -0
  355. data/src/core/lib/security/credentials/tls/tls_utils.h +38 -0
  356. data/src/core/lib/security/credentials/xds/xds_credentials.cc +140 -10
  357. data/src/core/lib/security/credentials/xds/xds_credentials.h +27 -9
  358. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +1 -1
  359. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -1
  360. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +46 -13
  361. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +23 -6
  362. data/src/core/lib/security/security_connector/local/local_security_connector.cc +1 -1
  363. data/src/core/lib/security/security_connector/security_connector.cc +3 -2
  364. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +4 -4
  365. data/src/core/lib/security/security_connector/ssl_utils.cc +2 -2
  366. data/src/core/lib/security/security_connector/ssl_utils.h +12 -19
  367. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +57 -12
  368. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +2 -3
  369. data/src/core/lib/security/transport/secure_endpoint.cc +2 -2
  370. data/src/core/lib/security/transport/security_handshaker.cc +2 -2
  371. data/src/core/lib/slice/slice_intern.cc +4 -5
  372. data/src/core/lib/slice/slice_internal.h +2 -2
  373. data/src/core/lib/surface/call.cc +32 -24
  374. data/src/core/lib/surface/call_details.cc +8 -8
  375. data/src/core/lib/surface/channel.cc +16 -10
  376. data/src/core/lib/surface/channel.h +3 -2
  377. data/src/core/lib/surface/channel_init.cc +1 -1
  378. data/src/core/lib/surface/completion_queue.cc +23 -18
  379. data/src/core/lib/surface/completion_queue.h +16 -16
  380. data/src/core/lib/surface/init.cc +6 -5
  381. data/src/core/lib/surface/lame_client.cc +20 -46
  382. data/src/core/lib/surface/lame_client.h +4 -0
  383. data/src/core/lib/surface/server.cc +59 -15
  384. data/src/core/lib/surface/server.h +37 -5
  385. data/src/core/lib/surface/version.cc +1 -1
  386. data/src/core/lib/transport/authority_override.cc +6 -4
  387. data/src/core/lib/transport/authority_override.h +5 -2
  388. data/src/core/lib/transport/connectivity_state.h +6 -4
  389. data/src/core/lib/transport/error_utils.h +1 -1
  390. data/src/core/lib/transport/metadata_batch.h +4 -4
  391. data/src/core/lib/transport/static_metadata.cc +1 -1
  392. data/src/core/lib/transport/status_metadata.cc +4 -3
  393. data/src/core/lib/transport/transport.h +7 -7
  394. data/src/core/lib/uri/uri_parser.cc +131 -249
  395. data/src/core/lib/uri/uri_parser.h +57 -21
  396. data/src/core/plugin_registry/grpc_plugin_registry.cc +10 -4
  397. data/src/core/tsi/alts/crypt/gsec.cc +5 -4
  398. data/src/core/tsi/alts/frame_protector/frame_handler.cc +8 -6
  399. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  400. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +23 -23
  401. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +8 -6
  402. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +4 -4
  403. data/src/core/tsi/fake_transport_security.cc +5 -3
  404. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  405. data/src/core/tsi/ssl_transport_security.cc +62 -49
  406. data/src/core/tsi/ssl_transport_security.h +6 -6
  407. data/src/core/tsi/transport_security.cc +6 -6
  408. data/src/core/tsi/transport_security_interface.h +1 -1
  409. data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
  410. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +12 -0
  411. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +31 -13
  412. data/src/ruby/lib/grpc/version.rb +1 -1
  413. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +28 -0
  414. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +18 -0
  415. data/src/ruby/spec/pb/codegen/package_option_spec.rb +2 -6
  416. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +606 -0
  417. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +197 -0
  418. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +399 -0
  419. data/third_party/abseil-cpp/absl/status/statusor.cc +71 -0
  420. data/third_party/abseil-cpp/absl/status/statusor.h +760 -0
  421. data/third_party/upb/third_party/wyhash/wyhash.h +145 -0
  422. data/third_party/upb/upb/decode.c +248 -167
  423. data/third_party/upb/upb/decode.h +20 -1
  424. data/third_party/upb/upb/decode.int.h +163 -0
  425. data/third_party/upb/upb/decode_fast.c +1040 -0
  426. data/third_party/upb/upb/decode_fast.h +126 -0
  427. data/third_party/upb/upb/def.c +525 -516
  428. data/third_party/upb/upb/def.h +16 -31
  429. data/third_party/upb/upb/def.hpp +37 -123
  430. data/third_party/upb/upb/encode.c +227 -169
  431. data/third_party/upb/upb/encode.h +27 -2
  432. data/third_party/upb/upb/json_decode.c +1443 -0
  433. data/third_party/upb/upb/json_decode.h +23 -0
  434. data/third_party/upb/upb/json_encode.c +713 -0
  435. data/third_party/upb/upb/json_encode.h +36 -0
  436. data/third_party/upb/upb/msg.c +167 -88
  437. data/third_party/upb/upb/msg.h +174 -34
  438. data/third_party/upb/upb/port_def.inc +74 -61
  439. data/third_party/upb/upb/port_undef.inc +3 -7
  440. data/third_party/upb/upb/reflection.c +36 -19
  441. data/third_party/upb/upb/table.c +34 -197
  442. data/third_party/upb/upb/table.int.h +14 -5
  443. data/third_party/upb/upb/text_encode.c +45 -22
  444. data/third_party/upb/upb/text_encode.h +4 -1
  445. data/third_party/upb/upb/upb.c +18 -41
  446. data/third_party/upb/upb/upb.h +36 -7
  447. data/third_party/upb/upb/upb.hpp +4 -4
  448. data/third_party/upb/upb/upb.int.h +29 -0
  449. metadata +60 -46
  450. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +0 -909
  451. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +0 -485
  452. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +0 -68
  453. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +0 -355
  454. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +0 -138
  455. data/src/core/ext/xds/google_mesh_ca_certificate_provider_factory.cc +0 -265
  456. data/src/core/ext/xds/google_mesh_ca_certificate_provider_factory.h +0 -104
  457. data/src/core/lib/gprpp/map.h +0 -53
  458. data/third_party/upb/upb/port.c +0 -26
@@ -570,8 +570,7 @@ static int add_socket_to_server(grpc_udp_server* s, int fd,
570
570
  return port;
571
571
  }
572
572
 
573
- int grpc_udp_server_add_port(grpc_udp_server* s,
574
- const grpc_resolved_address* addr,
573
+ int grpc_udp_server_add_port(grpc_udp_server* s, grpc_resolved_address* addr,
575
574
  int rcv_buf_size, int snd_buf_size,
576
575
  GrpcUdpHandlerFactory* handler_factory,
577
576
  size_t num_listeners) {
@@ -93,8 +93,7 @@ int grpc_udp_server_get_fd(grpc_udp_server* s, unsigned port_index);
93
93
 
94
94
  /* TODO(ctiller): deprecate this, and make grpc_udp_server_add_ports to handle
95
95
  all of the multiple socket port matching logic in one place */
96
- int grpc_udp_server_add_port(grpc_udp_server* s,
97
- const grpc_resolved_address* addr,
96
+ int grpc_udp_server_add_port(grpc_udp_server* s, grpc_resolved_address* addr,
98
97
  int rcv_buf_size, int snd_buf_size,
99
98
  GrpcUdpHandlerFactory* handler_factory,
100
99
  size_t num_listeners);
@@ -42,24 +42,24 @@ void grpc_create_socketpair_if_unix(int sv[2]) {
42
42
  GPR_ASSERT(socketpair(AF_UNIX, SOCK_STREAM, 0, sv) == 0);
43
43
  }
44
44
 
45
- grpc_error* grpc_resolve_unix_domain_address(const char* name,
46
- grpc_resolved_addresses** addrs) {
47
- *addrs = static_cast<grpc_resolved_addresses*>(
45
+ grpc_error* grpc_resolve_unix_domain_address(
46
+ const char* name, grpc_resolved_addresses** addresses) {
47
+ *addresses = static_cast<grpc_resolved_addresses*>(
48
48
  gpr_malloc(sizeof(grpc_resolved_addresses)));
49
- (*addrs)->naddrs = 1;
50
- (*addrs)->addrs = static_cast<grpc_resolved_address*>(
49
+ (*addresses)->naddrs = 1;
50
+ (*addresses)->addrs = static_cast<grpc_resolved_address*>(
51
51
  gpr_malloc(sizeof(grpc_resolved_address)));
52
- return grpc_core::UnixSockaddrPopulate(name, (*addrs)->addrs);
52
+ return grpc_core::UnixSockaddrPopulate(name, (*addresses)->addrs);
53
53
  }
54
54
 
55
55
  grpc_error* grpc_resolve_unix_abstract_domain_address(
56
- const absl::string_view name, grpc_resolved_addresses** addrs) {
57
- *addrs = static_cast<grpc_resolved_addresses*>(
56
+ const absl::string_view name, grpc_resolved_addresses** addresses) {
57
+ *addresses = static_cast<grpc_resolved_addresses*>(
58
58
  gpr_malloc(sizeof(grpc_resolved_addresses)));
59
- (*addrs)->naddrs = 1;
60
- (*addrs)->addrs = static_cast<grpc_resolved_address*>(
59
+ (*addresses)->naddrs = 1;
60
+ (*addresses)->addrs = static_cast<grpc_resolved_address*>(
61
61
  gpr_malloc(sizeof(grpc_resolved_address)));
62
- return grpc_core::UnixAbstractSockaddrPopulate(name, (*addrs)->addrs);
62
+ return grpc_core::UnixAbstractSockaddrPopulate(name, (*addresses)->addrs);
63
63
  }
64
64
 
65
65
  int grpc_is_unix_socket(const grpc_resolved_address* resolved_addr) {
@@ -96,16 +96,15 @@ std::string grpc_sockaddr_to_uri_unix_if_possible(
96
96
  if (addr->sa_family != AF_UNIX) {
97
97
  return "";
98
98
  }
99
- if (((struct sockaddr_un*)addr)->sun_path[0] == '\0' &&
100
- ((struct sockaddr_un*)addr)->sun_path[1] != '\0') {
101
- const struct sockaddr_un* un =
102
- reinterpret_cast<const struct sockaddr_un*>(resolved_addr->addr);
99
+ const auto* unix_addr = reinterpret_cast<const struct sockaddr_un*>(addr);
100
+ if (unix_addr->sun_path[0] == '\0' && unix_addr->sun_path[1] != '\0') {
103
101
  return absl::StrCat(
104
102
  "unix-abstract:",
105
- absl::string_view(un->sun_path + 1,
106
- resolved_addr->len - sizeof(un->sun_family) - 1));
103
+ absl::string_view(
104
+ unix_addr->sun_path + 1,
105
+ resolved_addr->len - sizeof(unix_addr->sun_family) - 1));
107
106
  }
108
- return absl::StrCat("unix:", ((struct sockaddr_un*)addr)->sun_path);
107
+ return absl::StrCat("unix:", unix_addr->sun_path);
109
108
  }
110
109
 
111
110
  #endif
@@ -76,6 +76,7 @@ class Json {
76
76
 
77
77
  // Construct from copying a string.
78
78
  // If is_number is true, the type will be NUMBER instead of STRING.
79
+ // NOLINTNEXTLINE(google-explicit-constructor)
79
80
  Json(const std::string& string, bool is_number = false)
80
81
  : type_(is_number ? Type::NUMBER : Type::STRING), string_value_(string) {}
81
82
  Json& operator=(const std::string& string) {
@@ -85,12 +86,14 @@ class Json {
85
86
  }
86
87
 
87
88
  // Same thing for C-style strings, both const and mutable.
89
+ // NOLINTNEXTLINE(google-explicit-constructor)
88
90
  Json(const char* string, bool is_number = false)
89
91
  : Json(std::string(string), is_number) {}
90
92
  Json& operator=(const char* string) {
91
93
  *this = std::string(string);
92
94
  return *this;
93
95
  }
96
+ // NOLINTNEXTLINE(google-explicit-constructor)
94
97
  Json(char* string, bool is_number = false)
95
98
  : Json(std::string(string), is_number) {}
96
99
  Json& operator=(char* string) {
@@ -99,6 +102,7 @@ class Json {
99
102
  }
100
103
 
101
104
  // Construct by moving a string.
105
+ // NOLINTNEXTLINE(google-explicit-constructor)
102
106
  Json(std::string&& string)
103
107
  : type_(Type::STRING), string_value_(std::move(string)) {}
104
108
  Json& operator=(std::string&& string) {
@@ -108,6 +112,7 @@ class Json {
108
112
  }
109
113
 
110
114
  // Construct from bool.
115
+ // NOLINTNEXTLINE(google-explicit-constructor)
111
116
  Json(bool b) : type_(b ? Type::JSON_TRUE : Type::JSON_FALSE) {}
112
117
  Json& operator=(bool b) {
113
118
  type_ = b ? Type::JSON_TRUE : Type::JSON_FALSE;
@@ -116,6 +121,7 @@ class Json {
116
121
 
117
122
  // Construct from any numeric type.
118
123
  template <typename NumericType>
124
+ // NOLINTNEXTLINE(google-explicit-constructor)
119
125
  Json(NumericType number)
120
126
  : type_(Type::NUMBER), string_value_(std::to_string(number)) {}
121
127
  template <typename NumericType>
@@ -126,6 +132,7 @@ class Json {
126
132
  }
127
133
 
128
134
  // Construct by copying object.
135
+ // NOLINTNEXTLINE(google-explicit-constructor)
129
136
  Json(const Object& object) : type_(Type::OBJECT), object_value_(object) {}
130
137
  Json& operator=(const Object& object) {
131
138
  type_ = Type::OBJECT;
@@ -134,6 +141,7 @@ class Json {
134
141
  }
135
142
 
136
143
  // Construct by moving object.
144
+ // NOLINTNEXTLINE(google-explicit-constructor)
137
145
  Json(Object&& object)
138
146
  : type_(Type::OBJECT), object_value_(std::move(object)) {}
139
147
  Json& operator=(Object&& object) {
@@ -143,6 +151,7 @@ class Json {
143
151
  }
144
152
 
145
153
  // Construct by copying array.
154
+ // NOLINTNEXTLINE(google-explicit-constructor)
146
155
  Json(const Array& array) : type_(Type::ARRAY), array_value_(array) {}
147
156
  Json& operator=(const Array& array) {
148
157
  type_ = Type::ARRAY;
@@ -151,6 +160,7 @@ class Json {
151
160
  }
152
161
 
153
162
  // Construct by moving array.
163
+ // NOLINTNEXTLINE(google-explicit-constructor)
154
164
  Json(Array&& array) : type_(Type::ARRAY), array_value_(std::move(array)) {}
155
165
  Json& operator=(Array&& array) {
156
166
  type_ = Type::ARRAY;
@@ -87,14 +87,12 @@ int EvaluateArgs::GetLocalPort() const {
87
87
  if (endpoint_ == nullptr) {
88
88
  return 0;
89
89
  }
90
- grpc_uri* uri = grpc_uri_parse(
91
- std::string(grpc_endpoint_get_local_address(endpoint_)).c_str(), true);
90
+ absl::StatusOr<URI> uri =
91
+ URI::Parse(grpc_endpoint_get_local_address(endpoint_));
92
92
  grpc_resolved_address resolved_addr;
93
- if (uri == nullptr || !grpc_parse_uri(uri, &resolved_addr)) {
94
- grpc_uri_destroy(uri);
93
+ if (!uri.ok() || !grpc_parse_uri(*uri, &resolved_addr)) {
95
94
  return 0;
96
95
  }
97
- grpc_uri_destroy(uri);
98
96
  return grpc_sockaddr_get_port(&resolved_addr);
99
97
  }
100
98
 
@@ -113,14 +111,11 @@ int EvaluateArgs::GetPeerPort() const {
113
111
  if (endpoint_ == nullptr) {
114
112
  return 0;
115
113
  }
116
- grpc_uri* uri = grpc_uri_parse(
117
- std::string(grpc_endpoint_get_peer(endpoint_)).c_str(), true);
114
+ absl::StatusOr<URI> uri = URI::Parse(grpc_endpoint_get_peer(endpoint_));
118
115
  grpc_resolved_address resolved_addr;
119
- if (uri == nullptr || !grpc_parse_uri(uri, &resolved_addr)) {
120
- grpc_uri_destroy(uri);
116
+ if (!uri.ok() || !grpc_parse_uri(*uri, &resolved_addr)) {
121
117
  return 0;
122
118
  }
123
- grpc_uri_destroy(uri);
124
119
  return grpc_sockaddr_get_port(&resolved_addr);
125
120
  }
126
121
 
@@ -46,7 +46,7 @@ class EvaluateArgs {
46
46
  absl::string_view GetSpiffeId() const;
47
47
  absl::string_view GetCertServerName() const;
48
48
 
49
- // TODO: Add a getter function for source.principal
49
+ // TODO(unknown): Add a getter function for source.principal
50
50
 
51
51
  private:
52
52
  grpc_metadata_batch* metadata_;
@@ -294,9 +294,10 @@ static const grpc_arg_pointer_vtable auth_context_pointer_vtable = {
294
294
  auth_context_pointer_arg_copy, auth_context_pointer_arg_destroy,
295
295
  auth_context_pointer_cmp};
296
296
 
297
- grpc_arg grpc_auth_context_to_arg(grpc_auth_context* p) {
298
- return grpc_channel_arg_pointer_create((char*)GRPC_AUTH_CONTEXT_ARG, p,
299
- &auth_context_pointer_vtable);
297
+ grpc_arg grpc_auth_context_to_arg(grpc_auth_context* c) {
298
+ return grpc_channel_arg_pointer_create(
299
+ const_cast<char*>(GRPC_AUTH_CONTEXT_ARG), c,
300
+ &auth_context_pointer_vtable);
300
301
  }
301
302
 
302
303
  grpc_auth_context* grpc_auth_context_from_arg(const grpc_arg* arg) {
@@ -57,7 +57,7 @@ namespace internal {
57
57
  char* read_bios_file(const char* bios_file) {
58
58
  FILE* fp = fopen(bios_file, "r");
59
59
  if (!fp) {
60
- gpr_log(GPR_ERROR, "BIOS data file cannot be opened.");
60
+ gpr_log(GPR_INFO, "BIOS data file does not exist or cannot be opened.");
61
61
  return nullptr;
62
62
  }
63
63
  char buf[kBiosDataBufferSize + 1];
@@ -67,9 +67,9 @@ static const grpc_arg_pointer_vtable credentials_pointer_vtable = {
67
67
 
68
68
  grpc_arg grpc_channel_credentials_to_arg(
69
69
  grpc_channel_credentials* credentials) {
70
- return grpc_channel_arg_pointer_create((char*)GRPC_ARG_CHANNEL_CREDENTIALS,
71
- credentials,
72
- &credentials_pointer_vtable);
70
+ return grpc_channel_arg_pointer_create(
71
+ const_cast<char*>(GRPC_ARG_CHANNEL_CREDENTIALS), credentials,
72
+ &credentials_pointer_vtable);
73
73
  }
74
74
 
75
75
  grpc_channel_credentials* grpc_channel_credentials_from_arg(
@@ -134,9 +134,9 @@ static const grpc_arg_pointer_vtable cred_ptr_vtable = {
134
134
  server_credentials_pointer_arg_copy, server_credentials_pointer_arg_destroy,
135
135
  server_credentials_pointer_cmp};
136
136
 
137
- grpc_arg grpc_server_credentials_to_arg(grpc_server_credentials* p) {
138
- return grpc_channel_arg_pointer_create((char*)GRPC_SERVER_CREDENTIALS_ARG, p,
139
- &cred_ptr_vtable);
137
+ grpc_arg grpc_server_credentials_to_arg(grpc_server_credentials* c) {
138
+ return grpc_channel_arg_pointer_create(
139
+ const_cast<char*>(GRPC_SERVER_CREDENTIALS_ARG), c, &cred_ptr_vtable);
140
140
  }
141
141
 
142
142
  grpc_server_credentials* grpc_server_credentials_from_arg(const grpc_arg* arg) {
@@ -0,0 +1,413 @@
1
+ //
2
+ // Copyright 2020 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
+ #include <grpc/support/port_platform.h>
17
+
18
+ #include "src/core/lib/security/credentials/external/aws_external_account_credentials.h"
19
+
20
+ #include "absl/strings/str_format.h"
21
+ #include "absl/strings/str_join.h"
22
+ #include "absl/strings/str_replace.h"
23
+
24
+ #include "src/core/lib/gpr/env.h"
25
+
26
+ namespace grpc_core {
27
+
28
+ namespace {
29
+
30
+ const char* kExpectedEnvironmentId = "aws1";
31
+
32
+ const char* kRegionEnvVar = "AWS_REGION";
33
+ const char* kAccessKeyIdEnvVar = "AWS_ACCESS_KEY_ID";
34
+ const char* kSecretAccessKeyEnvVar = "AWS_SECRET_ACCESS_KEY";
35
+ const char* kSessionTokenEnvVar = "AWS_SESSION_TOKEN";
36
+
37
+ std::string UrlEncode(const absl::string_view& s) {
38
+ const char* hex = "0123456789ABCDEF";
39
+ std::string result;
40
+ result.reserve(s.length());
41
+ for (auto c : s) {
42
+ if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') ||
43
+ (c >= 'a' && c <= 'z') || c == '-' || c == '_' || c == '!' ||
44
+ c == '\'' || c == '(' || c == ')' || c == '*' || c == '~' || c == '.') {
45
+ result.push_back(c);
46
+ } else {
47
+ result.push_back('%');
48
+ result.push_back(hex[static_cast<unsigned char>(c) >> 4]);
49
+ result.push_back(hex[static_cast<unsigned char>(c) & 15]);
50
+ }
51
+ }
52
+ return result;
53
+ }
54
+
55
+ } // namespace
56
+
57
+ RefCountedPtr<AwsExternalAccountCredentials>
58
+ AwsExternalAccountCredentials::Create(Options options,
59
+ std::vector<std::string> scopes,
60
+ grpc_error** error) {
61
+ auto creds = MakeRefCounted<AwsExternalAccountCredentials>(
62
+ std::move(options), std::move(scopes), error);
63
+ if (*error == GRPC_ERROR_NONE) {
64
+ return creds;
65
+ } else {
66
+ return nullptr;
67
+ }
68
+ }
69
+
70
+ AwsExternalAccountCredentials::AwsExternalAccountCredentials(
71
+ Options options, std::vector<std::string> scopes, grpc_error** error)
72
+ : ExternalAccountCredentials(options, std::move(scopes)) {
73
+ audience_ = options.audience;
74
+ auto it = options.credential_source.object_value().find("environment_id");
75
+ if (it == options.credential_source.object_value().end()) {
76
+ *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
77
+ "environment_id field not present.");
78
+ return;
79
+ }
80
+ if (it->second.type() != Json::Type::STRING) {
81
+ *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
82
+ "environment_id field must be a string.");
83
+ return;
84
+ }
85
+ if (it->second.string_value() != kExpectedEnvironmentId) {
86
+ *error =
87
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("environment_id does not match.");
88
+ return;
89
+ }
90
+ it = options.credential_source.object_value().find("region_url");
91
+ if (it == options.credential_source.object_value().end()) {
92
+ *error =
93
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("region_url field not present.");
94
+ return;
95
+ }
96
+ if (it->second.type() != Json::Type::STRING) {
97
+ *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
98
+ "region_url field must be a string.");
99
+ return;
100
+ }
101
+ region_url_ = it->second.string_value();
102
+ it = options.credential_source.object_value().find("url");
103
+ if (it != options.credential_source.object_value().end() &&
104
+ it->second.type() == Json::Type::STRING) {
105
+ url_ = it->second.string_value();
106
+ }
107
+ it = options.credential_source.object_value().find(
108
+ "regional_cred_verification_url");
109
+ if (it == options.credential_source.object_value().end()) {
110
+ *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
111
+ "regional_cred_verification_url field not present.");
112
+ return;
113
+ }
114
+ if (it->second.type() != Json::Type::STRING) {
115
+ *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
116
+ "regional_cred_verification_url field must be a string.");
117
+ return;
118
+ }
119
+ regional_cred_verification_url_ = it->second.string_value();
120
+ }
121
+
122
+ void AwsExternalAccountCredentials::RetrieveSubjectToken(
123
+ HTTPRequestContext* ctx, const Options& options,
124
+ std::function<void(std::string, grpc_error*)> cb) {
125
+ if (ctx == nullptr) {
126
+ FinishRetrieveSubjectToken(
127
+ "",
128
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING(
129
+ "Missing HTTPRequestContext to start subject token retrieval."));
130
+ return;
131
+ }
132
+ ctx_ = ctx;
133
+ cb_ = cb;
134
+ if (signer_ != nullptr) {
135
+ BuildSubjectToken();
136
+ } else {
137
+ RetrieveRegion();
138
+ }
139
+ }
140
+
141
+ void AwsExternalAccountCredentials::RetrieveRegion() {
142
+ UniquePtr<char> region_from_env(gpr_getenv(kRegionEnvVar));
143
+ if (region_from_env != nullptr) {
144
+ region_ = std::string(region_from_env.get());
145
+ if (url_.empty()) {
146
+ RetrieveSigningKeys();
147
+ } else {
148
+ RetrieveRoleName();
149
+ }
150
+ return;
151
+ }
152
+ absl::StatusOr<URI> uri = URI::Parse(region_url_);
153
+ if (!uri.ok()) {
154
+ FinishRetrieveSubjectToken("", GRPC_ERROR_CREATE_FROM_COPIED_STRING(
155
+ absl::StrFormat("Invalid region url. %s",
156
+ uri.status().ToString())
157
+ .c_str()));
158
+ return;
159
+ }
160
+ grpc_httpcli_request request;
161
+ memset(&request, 0, sizeof(grpc_httpcli_request));
162
+ request.host = const_cast<char*>(uri->authority().c_str());
163
+ request.http.path = gpr_strdup(uri->path().c_str());
164
+ request.handshaker =
165
+ uri->scheme() == "https" ? &grpc_httpcli_ssl : &grpc_httpcli_plaintext;
166
+ grpc_resource_quota* resource_quota =
167
+ grpc_resource_quota_create("external_account_credentials");
168
+ grpc_http_response_destroy(&ctx_->response);
169
+ ctx_->response = {};
170
+ GRPC_CLOSURE_INIT(&ctx_->closure, OnRetrieveRegion, this, nullptr);
171
+ grpc_httpcli_get(ctx_->httpcli_context, ctx_->pollent, resource_quota,
172
+ &request, ctx_->deadline, &ctx_->closure, &ctx_->response);
173
+ grpc_resource_quota_unref_internal(resource_quota);
174
+ grpc_http_request_destroy(&request.http);
175
+ }
176
+
177
+ void AwsExternalAccountCredentials::OnRetrieveRegion(void* arg,
178
+ grpc_error* error) {
179
+ AwsExternalAccountCredentials* self =
180
+ static_cast<AwsExternalAccountCredentials*>(arg);
181
+ self->OnRetrieveRegionInternal(GRPC_ERROR_REF(error));
182
+ }
183
+
184
+ void AwsExternalAccountCredentials::OnRetrieveRegionInternal(
185
+ grpc_error* error) {
186
+ if (error != GRPC_ERROR_NONE) {
187
+ FinishRetrieveSubjectToken("", error);
188
+ return;
189
+ }
190
+ // Remove the last letter of availability zone to get pure region
191
+ absl::string_view response_body(ctx_->response.body,
192
+ ctx_->response.body_length);
193
+ region_ = std::string(response_body.substr(0, response_body.size() - 1));
194
+ if (url_.empty()) {
195
+ RetrieveSigningKeys();
196
+ } else {
197
+ RetrieveRoleName();
198
+ }
199
+ }
200
+
201
+ void AwsExternalAccountCredentials::RetrieveRoleName() {
202
+ absl::StatusOr<URI> uri = URI::Parse(url_);
203
+ if (!uri.ok()) {
204
+ FinishRetrieveSubjectToken(
205
+ "", GRPC_ERROR_CREATE_FROM_COPIED_STRING(
206
+ absl::StrFormat("Invalid url: %s.", uri.status().ToString())
207
+ .c_str()));
208
+ return;
209
+ }
210
+ grpc_httpcli_request request;
211
+ memset(&request, 0, sizeof(grpc_httpcli_request));
212
+ request.host = const_cast<char*>(uri->authority().c_str());
213
+ request.http.path = gpr_strdup(uri->path().c_str());
214
+ request.handshaker =
215
+ uri->scheme() == "https" ? &grpc_httpcli_ssl : &grpc_httpcli_plaintext;
216
+ grpc_resource_quota* resource_quota =
217
+ grpc_resource_quota_create("external_account_credentials");
218
+ grpc_http_response_destroy(&ctx_->response);
219
+ ctx_->response = {};
220
+ GRPC_CLOSURE_INIT(&ctx_->closure, OnRetrieveRoleName, this, nullptr);
221
+ grpc_httpcli_get(ctx_->httpcli_context, ctx_->pollent, resource_quota,
222
+ &request, ctx_->deadline, &ctx_->closure, &ctx_->response);
223
+ grpc_resource_quota_unref_internal(resource_quota);
224
+ grpc_http_request_destroy(&request.http);
225
+ }
226
+
227
+ void AwsExternalAccountCredentials::OnRetrieveRoleName(void* arg,
228
+ grpc_error* error) {
229
+ AwsExternalAccountCredentials* self =
230
+ static_cast<AwsExternalAccountCredentials*>(arg);
231
+ self->OnRetrieveRoleNameInternal(GRPC_ERROR_REF(error));
232
+ }
233
+
234
+ void AwsExternalAccountCredentials::OnRetrieveRoleNameInternal(
235
+ grpc_error* error) {
236
+ if (error != GRPC_ERROR_NONE) {
237
+ FinishRetrieveSubjectToken("", error);
238
+ return;
239
+ }
240
+ role_name_ = std::string(ctx_->response.body, ctx_->response.body_length);
241
+ RetrieveSigningKeys();
242
+ }
243
+
244
+ void AwsExternalAccountCredentials::RetrieveSigningKeys() {
245
+ UniquePtr<char> access_key_id_from_env(gpr_getenv(kAccessKeyIdEnvVar));
246
+ UniquePtr<char> secret_access_key_from_env(
247
+ gpr_getenv(kSecretAccessKeyEnvVar));
248
+ UniquePtr<char> token_from_env(gpr_getenv(kSessionTokenEnvVar));
249
+ if (access_key_id_from_env != nullptr &&
250
+ secret_access_key_from_env != nullptr && token_from_env != nullptr) {
251
+ access_key_id_ = std::string(access_key_id_from_env.get());
252
+ secret_access_key_ = std::string(secret_access_key_from_env.get());
253
+ token_ = std::string(token_from_env.get());
254
+ BuildSubjectToken();
255
+ return;
256
+ }
257
+ if (role_name_.empty()) {
258
+ FinishRetrieveSubjectToken(
259
+ "", GRPC_ERROR_CREATE_FROM_STATIC_STRING(
260
+ "Missing role name when retrieving signing keys."));
261
+ return;
262
+ }
263
+ std::string url_with_role_name = absl::StrCat(url_, "/", role_name_);
264
+ absl::StatusOr<URI> uri = URI::Parse(url_with_role_name);
265
+ if (!uri.ok()) {
266
+ FinishRetrieveSubjectToken(
267
+ "", GRPC_ERROR_CREATE_FROM_COPIED_STRING(
268
+ absl::StrFormat("Invalid url with role name: %s.",
269
+ uri.status().ToString())
270
+ .c_str()));
271
+ return;
272
+ }
273
+ grpc_httpcli_request request;
274
+ memset(&request, 0, sizeof(grpc_httpcli_request));
275
+ request.host = const_cast<char*>(uri->authority().c_str());
276
+ request.http.path = gpr_strdup(uri->path().c_str());
277
+ request.handshaker =
278
+ uri->scheme() == "https" ? &grpc_httpcli_ssl : &grpc_httpcli_plaintext;
279
+ grpc_resource_quota* resource_quota =
280
+ grpc_resource_quota_create("external_account_credentials");
281
+ grpc_http_response_destroy(&ctx_->response);
282
+ ctx_->response = {};
283
+ GRPC_CLOSURE_INIT(&ctx_->closure, OnRetrieveSigningKeys, this, nullptr);
284
+ grpc_httpcli_get(ctx_->httpcli_context, ctx_->pollent, resource_quota,
285
+ &request, ctx_->deadline, &ctx_->closure, &ctx_->response);
286
+ grpc_resource_quota_unref_internal(resource_quota);
287
+ grpc_http_request_destroy(&request.http);
288
+ }
289
+
290
+ void AwsExternalAccountCredentials::OnRetrieveSigningKeys(void* arg,
291
+ grpc_error* error) {
292
+ AwsExternalAccountCredentials* self =
293
+ static_cast<AwsExternalAccountCredentials*>(arg);
294
+ self->OnRetrieveSigningKeysInternal(GRPC_ERROR_REF(error));
295
+ }
296
+
297
+ void AwsExternalAccountCredentials::OnRetrieveSigningKeysInternal(
298
+ grpc_error* error) {
299
+ if (error != GRPC_ERROR_NONE) {
300
+ FinishRetrieveSubjectToken("", error);
301
+ return;
302
+ }
303
+ absl::string_view response_body(ctx_->response.body,
304
+ ctx_->response.body_length);
305
+ Json json = Json::Parse(response_body, &error);
306
+ if (error != GRPC_ERROR_NONE || json.type() != Json::Type::OBJECT) {
307
+ FinishRetrieveSubjectToken(
308
+ "", GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
309
+ "Invalid retrieve signing keys response.", &error, 1));
310
+ GRPC_ERROR_UNREF(error);
311
+ return;
312
+ }
313
+ auto it = json.object_value().find("AccessKeyId");
314
+ if (it != json.object_value().end() &&
315
+ it->second.type() == Json::Type::STRING) {
316
+ access_key_id_ = it->second.string_value();
317
+ } else {
318
+ FinishRetrieveSubjectToken(
319
+ "", GRPC_ERROR_CREATE_FROM_COPIED_STRING(
320
+ absl::StrFormat("Missing or invalid AccessKeyId in %s.",
321
+ response_body)
322
+ .c_str()));
323
+ return;
324
+ }
325
+ it = json.object_value().find("SecretAccessKey");
326
+ if (it != json.object_value().end() &&
327
+ it->second.type() == Json::Type::STRING) {
328
+ secret_access_key_ = it->second.string_value();
329
+ } else {
330
+ FinishRetrieveSubjectToken(
331
+ "", GRPC_ERROR_CREATE_FROM_COPIED_STRING(
332
+ absl::StrFormat("Missing or invalid SecretAccessKey in %s.",
333
+ response_body)
334
+ .c_str()));
335
+ return;
336
+ }
337
+ it = json.object_value().find("Token");
338
+ if (it != json.object_value().end() &&
339
+ it->second.type() == Json::Type::STRING) {
340
+ token_ = it->second.string_value();
341
+ } else {
342
+ FinishRetrieveSubjectToken(
343
+ "",
344
+ GRPC_ERROR_CREATE_FROM_COPIED_STRING(
345
+ absl::StrFormat("Missing or invalid Token in %s.", response_body)
346
+ .c_str()));
347
+ return;
348
+ }
349
+ BuildSubjectToken();
350
+ }
351
+
352
+ void AwsExternalAccountCredentials::BuildSubjectToken() {
353
+ grpc_error* error = GRPC_ERROR_NONE;
354
+ if (signer_ == nullptr) {
355
+ cred_verification_url_ = absl::StrReplaceAll(
356
+ regional_cred_verification_url_, {{"{region}", region_}});
357
+ signer_ = absl::make_unique<AwsRequestSigner>(
358
+ access_key_id_, secret_access_key_, token_, "POST",
359
+ cred_verification_url_, region_, "",
360
+ std::map<std::string, std::string>(), &error);
361
+ if (error != GRPC_ERROR_NONE) {
362
+ FinishRetrieveSubjectToken(
363
+ "", GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
364
+ "Creating aws request signer failed.", &error, 1));
365
+ GRPC_ERROR_UNREF(error);
366
+ return;
367
+ }
368
+ }
369
+ auto signed_headers = signer_->GetSignedRequestHeaders();
370
+ if (error != GRPC_ERROR_NONE) {
371
+ FinishRetrieveSubjectToken("",
372
+ GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
373
+ "Invalid getting signed request"
374
+ "headers.",
375
+ &error, 1));
376
+ GRPC_ERROR_UNREF(error);
377
+ return;
378
+ }
379
+ // Construct subject token
380
+ Json::Array headers;
381
+ headers.push_back(Json(
382
+ {{"key", "Authorization"}, {"value", signed_headers["Authorization"]}}));
383
+ headers.push_back(Json({{"key", "host"}, {"value", signed_headers["host"]}}));
384
+ headers.push_back(
385
+ Json({{"key", "x-amz-date"}, {"value", signed_headers["x-amz-date"]}}));
386
+ headers.push_back(Json({{"key", "x-amz-security-token"},
387
+ {"value", signed_headers["x-amz-security-token"]}}));
388
+ headers.push_back(
389
+ Json({{"key", "x-goog-cloud-target-resource"}, {"value", audience_}}));
390
+ Json::Object object{{"url", Json(cred_verification_url_)},
391
+ {"method", Json("POST")},
392
+ {"headers", Json(headers)}};
393
+ Json subject_token_json(object);
394
+ std::string subject_token = UrlEncode(subject_token_json.Dump());
395
+ FinishRetrieveSubjectToken(subject_token, GRPC_ERROR_NONE);
396
+ }
397
+
398
+ void AwsExternalAccountCredentials::FinishRetrieveSubjectToken(
399
+ std::string subject_token, grpc_error* error) {
400
+ // Reset context
401
+ ctx_ = nullptr;
402
+ // Move object state into local variables.
403
+ auto cb = cb_;
404
+ cb_ = nullptr;
405
+ // Invoke the callback.
406
+ if (error != GRPC_ERROR_NONE) {
407
+ cb("", error);
408
+ } else {
409
+ cb(subject_token, GRPC_ERROR_NONE);
410
+ }
411
+ }
412
+
413
+ } // namespace grpc_core