grpc 1.73.0 → 1.74.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +38 -17
  3. data/include/grpc/create_channel_from_endpoint.h +54 -0
  4. data/include/grpc/credentials.h +11 -5
  5. data/include/grpc/event_engine/event_engine.h +74 -17
  6. data/include/grpc/grpc_posix.h +20 -1
  7. data/include/grpc/impl/channel_arg_names.h +2 -4
  8. data/include/grpc/module.modulemap +1 -0
  9. data/include/grpc/support/json.h +24 -0
  10. data/src/core/call/interception_chain.h +7 -11
  11. data/src/core/channelz/channel_trace.cc +213 -115
  12. data/src/core/channelz/channel_trace.h +380 -86
  13. data/src/core/channelz/channelz.cc +270 -181
  14. data/src/core/channelz/channelz.h +168 -55
  15. data/src/core/channelz/channelz_registry.cc +2 -1
  16. data/src/core/channelz/channelz_registry.h +24 -0
  17. data/src/core/channelz/property_list.cc +357 -0
  18. data/src/core/channelz/property_list.h +202 -0
  19. data/src/core/channelz/ztrace_collector.h +3 -2
  20. data/src/core/client_channel/backup_poller.cc +17 -2
  21. data/src/core/client_channel/client_channel.cc +17 -28
  22. data/src/core/client_channel/client_channel_filter.cc +19 -29
  23. data/src/core/client_channel/config_selector.h +8 -2
  24. data/src/core/client_channel/dynamic_filters.cc +5 -6
  25. data/src/core/client_channel/dynamic_filters.h +1 -1
  26. data/src/core/client_channel/global_subchannel_pool.cc +4 -1
  27. data/src/core/client_channel/retry_filter.cc +21 -27
  28. data/src/core/client_channel/retry_filter.h +10 -7
  29. data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -5
  30. data/src/core/client_channel/retry_filter_legacy_call_data.h +1 -1
  31. data/src/core/client_channel/retry_interceptor.cc +30 -44
  32. data/src/core/client_channel/retry_interceptor.h +18 -17
  33. data/src/core/client_channel/retry_throttle.cc +46 -61
  34. data/src/core/client_channel/retry_throttle.h +17 -39
  35. data/src/core/client_channel/subchannel.cc +43 -19
  36. data/src/core/client_channel/subchannel.h +8 -0
  37. data/src/core/config/config_vars.cc +2 -0
  38. data/src/core/config/core_configuration.cc +1 -0
  39. data/src/core/config/core_configuration.h +11 -0
  40. data/src/core/credentials/call/call_creds_registry.h +125 -0
  41. data/src/core/credentials/call/call_creds_registry_init.cc +91 -0
  42. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +6 -48
  43. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +86 -0
  44. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.h +74 -0
  45. data/src/core/credentials/call/jwt_util.cc +70 -0
  46. data/src/core/credentials/call/jwt_util.h +32 -0
  47. data/src/core/credentials/transport/channel_creds_registry_init.cc +1 -1
  48. data/src/core/credentials/transport/google_default/google_default_credentials.cc +72 -4
  49. data/src/core/credentials/transport/ssl/ssl_credentials.cc +0 -1
  50. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +1 -0
  51. data/src/core/credentials/transport/xds/xds_credentials.cc +0 -3
  52. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +8 -8
  53. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +16 -16
  54. data/src/core/ext/filters/http/client_authority_filter.cc +2 -4
  55. data/src/core/ext/filters/http/message_compress/compression_filter.h +25 -22
  56. data/src/core/ext/filters/http/server/http_server_filter.h +12 -11
  57. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +120 -35
  58. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +6 -5
  59. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +162 -115
  60. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +0 -3
  61. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +1239 -3514
  62. data/src/core/ext/transport/chttp2/transport/decode_huff.h +1008 -1486
  63. data/src/core/ext/transport/chttp2/transport/flow_control.h +22 -17
  64. data/src/core/ext/transport/chttp2/transport/frame.cc +10 -0
  65. data/src/core/ext/transport/chttp2/transport/frame.h +2 -2
  66. data/src/core/ext/transport/chttp2/transport/frame_data.cc +1 -1
  67. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +7 -8
  68. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -5
  69. data/src/core/ext/transport/chttp2/transport/header_assembler.h +299 -0
  70. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +1 -1
  71. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +11 -5
  72. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +12 -1
  73. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +1017 -0
  74. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +593 -0
  75. data/src/core/ext/transport/chttp2/transport/http2_settings.h +19 -22
  76. data/{third_party/abseil-cpp/absl/strings/cord_buffer.cc → src/core/ext/transport/chttp2/transport/http2_stats_collector.cc} +14 -14
  77. data/src/core/ext/transport/chttp2/transport/http2_stats_collector.h +33 -0
  78. data/src/core/ext/transport/chttp2/transport/http2_status.h +6 -1
  79. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +43 -0
  80. data/src/core/ext/transport/chttp2/transport/http2_transport.h +65 -0
  81. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +0 -29
  82. data/src/core/ext/transport/chttp2/transport/internal.h +18 -8
  83. data/src/core/ext/transport/chttp2/transport/keepalive.cc +105 -0
  84. data/src/core/ext/transport/chttp2/transport/keepalive.h +138 -0
  85. data/src/core/ext/transport/chttp2/transport/message_assembler.h +185 -0
  86. data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -4
  87. data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +19 -0
  88. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +151 -0
  89. data/src/core/ext/transport/chttp2/transport/ping_promise.h +180 -0
  90. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +5 -9
  91. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.h +11 -0
  92. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +39 -1
  93. data/src/core/ext/transport/chttp2/transport/transport_common.cc +19 -0
  94. data/src/core/ext/transport/chttp2/transport/transport_common.h +27 -0
  95. data/src/core/ext/transport/chttp2/transport/writing.cc +37 -11
  96. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb.h +571 -0
  97. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.c +120 -0
  98. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.h +36 -0
  99. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb.h +1272 -0
  100. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.c +312 -0
  101. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.h +50 -0
  102. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb.h +984 -0
  103. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.c +226 -0
  104. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.h +44 -0
  105. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.c +175 -0
  106. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.h +82 -0
  107. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.c +135 -0
  108. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.h +67 -0
  109. data/src/core/filter/auth/auth_filters.h +0 -25
  110. data/src/core/filter/auth/client_auth_filter.cc +0 -118
  111. data/src/core/filter/filter_args.h +9 -23
  112. data/src/core/handshaker/handshaker.cc +23 -14
  113. data/src/core/handshaker/handshaker.h +3 -0
  114. data/src/core/handshaker/http_connect/http_connect_handshaker.cc +3 -1
  115. data/src/core/handshaker/security/legacy_secure_endpoint.cc +6 -5
  116. data/src/core/handshaker/security/secure_endpoint.cc +70 -25
  117. data/src/core/handshaker/security/security_handshaker.cc +4 -1
  118. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +7 -1
  119. data/src/core/lib/channel/channel_args.cc +15 -0
  120. data/src/core/lib/channel/channel_args.h +3 -0
  121. data/src/core/lib/channel/channel_stack.cc +22 -23
  122. data/src/core/lib/channel/channel_stack.h +9 -7
  123. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
  124. data/src/core/lib/channel/channel_stack_builder_impl.h +2 -7
  125. data/src/core/lib/channel/promise_based_filter.h +5 -5
  126. data/src/core/lib/debug/trace_impl.h +0 -1
  127. data/src/core/lib/event_engine/ares_resolver.cc +165 -46
  128. data/src/core/lib/event_engine/ares_resolver.h +48 -2
  129. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +3 -1
  130. data/src/core/lib/event_engine/cf_engine/cf_engine.h +1 -4
  131. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +2 -6
  132. data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.cc +40 -0
  133. data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.h +60 -0
  134. data/src/core/lib/event_engine/event_engine.cc +7 -0
  135. data/src/core/lib/event_engine/extensions/channelz.h +10 -6
  136. data/src/core/lib/event_engine/grpc_polled_fd.h +5 -0
  137. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +130 -162
  138. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +11 -15
  139. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +75 -117
  140. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +7 -9
  141. data/src/core/lib/event_engine/posix_engine/event_poller.h +18 -15
  142. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +0 -18
  143. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +124 -0
  144. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.h +243 -0
  145. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +29 -19
  146. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +6 -2
  147. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +6 -1
  148. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +145 -92
  149. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +9 -19
  150. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +333 -116
  151. data/src/core/lib/event_engine/posix_engine/posix_engine.h +61 -18
  152. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +45 -37
  153. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +6 -4
  154. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +32 -142
  155. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +6 -5
  156. data/src/core/lib/event_engine/posix_engine/posix_interface.h +211 -0
  157. data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +1083 -0
  158. data/src/core/lib/event_engine/posix_engine/posix_interface_windows.cc +281 -0
  159. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.cc +154 -0
  160. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.h +174 -0
  161. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +3 -719
  162. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +10 -170
  163. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +33 -22
  164. data/src/core/lib/event_engine/posix_engine/timer_manager.h +13 -11
  165. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +117 -151
  166. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +26 -94
  167. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +26 -25
  168. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +6 -2
  169. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +36 -62
  170. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +6 -2
  171. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +7 -6
  172. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +12 -6
  173. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +3 -1
  174. data/src/core/lib/event_engine/shim.cc +9 -0
  175. data/src/core/lib/event_engine/shim.h +3 -0
  176. data/src/core/lib/event_engine/thread_pool/thread_pool.h +7 -3
  177. data/src/core/lib/event_engine/thread_pool/thread_pool_factory.cc +0 -17
  178. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +4 -2
  179. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -2
  180. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +4 -0
  181. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.h +4 -0
  182. data/src/core/lib/event_engine/windows/windows_endpoint.h +2 -6
  183. data/src/core/lib/event_engine/windows/windows_engine.cc +0 -1
  184. data/src/core/lib/event_engine/windows/windows_engine.h +1 -3
  185. data/src/core/lib/event_engine/windows/windows_listener.cc +14 -2
  186. data/src/core/lib/experiments/experiments.cc +45 -93
  187. data/src/core/lib/experiments/experiments.h +21 -51
  188. data/src/core/lib/iomgr/endpoint.cc +4 -3
  189. data/src/core/lib/iomgr/endpoint.h +7 -4
  190. data/src/core/lib/iomgr/endpoint_cfstream.cc +3 -2
  191. data/src/core/lib/iomgr/ev_epoll1_linux.cc +7 -2
  192. data/src/core/lib/iomgr/ev_poll_posix.cc +7 -2
  193. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +4 -6
  194. data/src/core/lib/iomgr/tcp_posix.cc +12 -6
  195. data/src/core/lib/iomgr/tcp_windows.cc +3 -2
  196. data/src/core/lib/promise/activity.h +1 -0
  197. data/src/core/lib/promise/arena_promise.h +23 -7
  198. data/src/core/lib/promise/detail/promise_factory.h +10 -0
  199. data/src/core/lib/promise/detail/promise_like.h +118 -11
  200. data/src/core/lib/promise/detail/promise_variant.h +50 -0
  201. data/src/core/lib/promise/detail/seq_state.h +687 -548
  202. data/src/core/lib/promise/if.h +20 -0
  203. data/src/core/lib/promise/inter_activity_latch.h +147 -0
  204. data/src/core/lib/promise/inter_activity_mutex.h +547 -0
  205. data/src/core/lib/promise/loop.h +65 -3
  206. data/src/core/lib/promise/map.h +24 -0
  207. data/src/core/lib/promise/match_promise.h +103 -0
  208. data/src/core/lib/promise/mpsc.cc +425 -0
  209. data/src/core/lib/promise/mpsc.h +490 -0
  210. data/src/core/lib/promise/party.cc +50 -1
  211. data/src/core/lib/promise/party.h +66 -1
  212. data/src/core/lib/promise/race.h +31 -0
  213. data/src/core/lib/promise/seq.h +4 -1
  214. data/src/core/lib/promise/status_flag.h +7 -0
  215. data/src/core/lib/promise/try_seq.h +4 -1
  216. data/src/core/lib/promise/wait_set.cc +28 -0
  217. data/src/core/lib/promise/wait_set.h +86 -0
  218. data/src/core/lib/resource_quota/arena.h +19 -0
  219. data/src/core/lib/slice/slice.h +5 -0
  220. data/src/core/lib/surface/channel_create.cc +88 -13
  221. data/src/core/lib/surface/channel_create.h +4 -0
  222. data/src/core/lib/surface/channel_init.cc +164 -47
  223. data/src/core/lib/surface/channel_init.h +64 -1
  224. data/src/core/lib/surface/filter_stack_call.cc +18 -9
  225. data/src/core/lib/surface/init.cc +6 -15
  226. data/src/core/lib/surface/legacy_channel.cc +3 -5
  227. data/src/core/lib/surface/legacy_channel.h +3 -1
  228. data/src/core/lib/surface/version.cc +2 -2
  229. data/src/core/lib/transport/promise_endpoint.cc +110 -0
  230. data/src/core/lib/transport/promise_endpoint.h +307 -0
  231. data/src/core/load_balancing/child_policy_handler.cc +2 -4
  232. data/src/core/load_balancing/delegating_helper.h +2 -3
  233. data/src/core/load_balancing/health_check_client.cc +1 -5
  234. data/src/core/load_balancing/lb_policy.h +1 -3
  235. data/src/core/load_balancing/oob_backend_metric.cc +1 -5
  236. data/src/core/load_balancing/pick_first/pick_first.cc +3 -0
  237. data/src/core/load_balancing/xds/cds.cc +10 -1
  238. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -0
  239. data/src/core/resolver/xds/xds_config.cc +6 -3
  240. data/src/core/resolver/xds/xds_config.h +9 -4
  241. data/src/core/resolver/xds/xds_dependency_manager.cc +21 -6
  242. data/src/core/resolver/xds/xds_dependency_manager.h +2 -1
  243. data/src/core/resolver/xds/xds_resolver.cc +31 -11
  244. data/src/core/server/server.cc +83 -12
  245. data/src/core/server/server.h +21 -2
  246. data/src/core/server/xds_server_config_fetcher.cc +63 -25
  247. data/src/core/service_config/service_config.h +1 -1
  248. data/src/core/service_config/service_config_impl.h +1 -1
  249. data/src/core/telemetry/context_list_entry.cc +38 -0
  250. data/src/core/telemetry/context_list_entry.h +42 -12
  251. data/src/core/telemetry/stats_data.cc +233 -207
  252. data/src/core/telemetry/stats_data.h +250 -153
  253. data/src/core/telemetry/tcp_tracer.h +1 -1
  254. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +11 -3
  255. data/src/core/tsi/fake_transport_security.cc +17 -0
  256. data/src/core/tsi/ssl_transport_security.cc +2 -0
  257. data/src/core/tsi/transport_security_grpc.cc +8 -0
  258. data/src/core/tsi/transport_security_grpc.h +15 -0
  259. data/src/core/util/backoff.cc +1 -5
  260. data/src/core/util/backoff.h +1 -0
  261. data/src/core/util/down_cast.h +1 -1
  262. data/src/core/util/function_signature.h +15 -1
  263. data/src/core/util/http_client/httpcli.cc +12 -5
  264. data/src/core/util/http_client/httpcli.h +4 -1
  265. data/src/core/util/latent_see.h +8 -5
  266. data/src/core/util/log.cc +4 -0
  267. data/src/core/util/memory_usage.h +268 -0
  268. data/src/core/util/per_cpu.cc +2 -0
  269. data/src/core/util/per_cpu.h +7 -0
  270. data/src/core/util/shared_bit_gen.h +20 -0
  271. data/src/core/util/single_set_ptr.h +2 -2
  272. data/src/core/util/upb_utils.h +42 -0
  273. data/src/core/util/uri.cc +3 -2
  274. data/src/core/util/useful.h +53 -2
  275. data/src/core/util/wait_for_single_owner.cc +31 -0
  276. data/src/core/util/wait_for_single_owner.h +24 -0
  277. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -0
  278. data/src/core/xds/grpc/xds_bootstrap_grpc.h +5 -0
  279. data/src/core/xds/grpc/xds_client_grpc.cc +6 -2
  280. data/src/core/xds/grpc/xds_common_types_parser.cc +138 -50
  281. data/src/core/xds/grpc/xds_common_types_parser.h +12 -0
  282. data/src/core/xds/grpc/xds_http_filter.h +7 -0
  283. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +22 -0
  284. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +3 -0
  285. data/src/core/xds/grpc/xds_route_config_parser.cc +15 -38
  286. data/src/core/xds/grpc/xds_server_grpc.cc +63 -13
  287. data/src/core/xds/grpc/xds_server_grpc.h +10 -2
  288. data/src/core/xds/grpc/xds_server_grpc_interface.h +4 -0
  289. data/src/core/xds/grpc/xds_transport_grpc.cc +18 -0
  290. data/src/core/xds/xds_client/xds_bootstrap.h +2 -0
  291. data/src/core/xds/xds_client/xds_client.cc +26 -5
  292. data/src/ruby/ext/grpc/extconf.rb +2 -0
  293. data/src/ruby/ext/grpc/rb_call.c +1 -8
  294. data/src/ruby/ext/grpc/rb_channel.c +72 -568
  295. data/src/ruby/ext/grpc/rb_channel.h +0 -3
  296. data/src/ruby/ext/grpc/rb_completion_queue.c +26 -14
  297. data/src/ruby/ext/grpc/rb_completion_queue.h +1 -7
  298. data/src/ruby/ext/grpc/rb_grpc.c +9 -5
  299. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  300. data/src/ruby/ext/grpc/rb_loader.c +0 -4
  301. data/src/ruby/ext/grpc/rb_server.c +31 -50
  302. data/src/ruby/lib/grpc/generic/client_stub.rb +4 -4
  303. data/src/ruby/lib/grpc/version.rb +1 -1
  304. data/src/ruby/spec/core_spec.rb +22 -0
  305. data/src/ruby/spec/generic/active_call_spec.rb +1 -1
  306. data/third_party/abseil-cpp/absl/algorithm/container.h +2 -19
  307. data/third_party/abseil-cpp/absl/base/attributes.h +76 -7
  308. data/third_party/abseil-cpp/absl/base/call_once.h +11 -12
  309. data/third_party/abseil-cpp/absl/base/config.h +20 -129
  310. data/third_party/abseil-cpp/absl/base/{internal/fast_type_id.h → fast_type_id.h} +11 -16
  311. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +0 -5
  312. data/third_party/abseil-cpp/absl/base/internal/cycleclock_config.h +7 -7
  313. data/third_party/abseil-cpp/absl/base/internal/endian.h +34 -38
  314. data/third_party/abseil-cpp/absl/base/internal/iterator_traits.h +71 -0
  315. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +6 -5
  316. data/third_party/abseil-cpp/absl/base/internal/{nullability_impl.h → nullability_deprecated.h} +45 -8
  317. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +0 -9
  318. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -13
  319. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +6 -6
  320. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +8 -3
  321. data/third_party/abseil-cpp/absl/base/no_destructor.h +11 -32
  322. data/third_party/abseil-cpp/absl/base/nullability.h +84 -72
  323. data/third_party/abseil-cpp/absl/base/options.h +3 -80
  324. data/third_party/abseil-cpp/absl/base/policy_checks.h +7 -7
  325. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +1 -3
  326. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -4
  327. data/third_party/abseil-cpp/absl/container/btree_map.h +4 -2
  328. data/third_party/abseil-cpp/absl/container/btree_set.h +4 -2
  329. data/third_party/abseil-cpp/absl/container/fixed_array.h +7 -14
  330. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +5 -0
  331. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +6 -1
  332. data/third_party/abseil-cpp/absl/container/inlined_vector.h +8 -5
  333. data/third_party/abseil-cpp/absl/container/internal/btree.h +132 -29
  334. data/third_party/abseil-cpp/absl/container/internal/btree_container.h +175 -71
  335. data/third_party/abseil-cpp/absl/container/internal/common.h +43 -0
  336. data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -2
  337. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +9 -10
  338. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +1 -8
  339. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +0 -4
  340. data/third_party/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +527 -0
  341. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +20 -4
  342. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +31 -12
  343. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +2 -7
  344. data/third_party/abseil-cpp/absl/container/internal/layout.h +26 -42
  345. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +199 -68
  346. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +1354 -183
  347. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +881 -1424
  348. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +80 -0
  349. data/third_party/abseil-cpp/absl/crc/crc32c.cc +0 -4
  350. data/third_party/abseil-cpp/absl/crc/crc32c.h +7 -5
  351. data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +0 -22
  352. data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +45 -74
  353. data/third_party/abseil-cpp/absl/debugging/internal/addresses.h +57 -0
  354. data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc +1 -1
  355. data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.h +5 -5
  356. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +8 -35
  357. data/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.cc +16 -16
  358. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +40 -37
  359. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +16 -7
  360. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +14 -5
  361. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +10 -4
  362. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +27 -16
  363. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +13 -4
  364. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +4 -3
  365. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +15 -28
  366. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +19 -9
  367. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +144 -27
  368. data/third_party/abseil-cpp/absl/debugging/stacktrace.h +73 -5
  369. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +19 -9
  370. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -2
  371. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +25 -6
  372. data/third_party/abseil-cpp/absl/flags/commandlineflag.h +2 -2
  373. data/third_party/abseil-cpp/absl/flags/flag.h +4 -3
  374. data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +2 -2
  375. data/third_party/abseil-cpp/absl/flags/internal/flag.cc +2 -1
  376. data/third_party/abseil-cpp/absl/flags/internal/flag.h +7 -6
  377. data/third_party/abseil-cpp/absl/flags/internal/registry.h +4 -3
  378. data/third_party/abseil-cpp/absl/flags/reflection.cc +2 -3
  379. data/third_party/abseil-cpp/absl/functional/any_invocable.h +8 -10
  380. data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -9
  381. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +110 -226
  382. data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +10 -12
  383. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +2 -5
  384. data/third_party/abseil-cpp/absl/hash/hash.h +18 -0
  385. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +1 -5
  386. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -61
  387. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +25 -68
  388. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.h +2 -6
  389. data/third_party/abseil-cpp/absl/hash/internal/weakly_mixed_integer.h +38 -0
  390. data/third_party/abseil-cpp/absl/log/check.h +2 -1
  391. data/third_party/abseil-cpp/absl/log/globals.h +4 -5
  392. data/third_party/abseil-cpp/absl/log/internal/append_truncated.h +28 -0
  393. data/third_party/abseil-cpp/absl/log/internal/check_op.cc +22 -22
  394. data/third_party/abseil-cpp/absl/log/internal/check_op.h +65 -62
  395. data/third_party/abseil-cpp/absl/log/internal/conditions.cc +5 -3
  396. data/third_party/abseil-cpp/absl/log/internal/conditions.h +7 -2
  397. data/third_party/abseil-cpp/absl/log/internal/log_message.cc +85 -43
  398. data/third_party/abseil-cpp/absl/log/internal/log_message.h +84 -59
  399. data/third_party/abseil-cpp/absl/log/internal/nullstream.h +1 -0
  400. data/third_party/abseil-cpp/absl/log/internal/proto.cc +3 -2
  401. data/third_party/abseil-cpp/absl/log/internal/proto.h +3 -3
  402. data/third_party/abseil-cpp/absl/log/internal/strip.h +4 -12
  403. data/third_party/abseil-cpp/absl/log/internal/vlog_config.h +8 -6
  404. data/third_party/abseil-cpp/absl/log/internal/voidify.h +10 -4
  405. data/third_party/abseil-cpp/absl/log/log.h +48 -35
  406. data/third_party/abseil-cpp/absl/log/log_sink_registry.h +2 -2
  407. data/third_party/abseil-cpp/absl/meta/type_traits.h +46 -175
  408. data/third_party/abseil-cpp/absl/numeric/bits.h +68 -2
  409. data/third_party/abseil-cpp/absl/numeric/int128.cc +0 -52
  410. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +7 -3
  411. data/third_party/abseil-cpp/absl/profiling/internal/exponential_biased.cc +1 -1
  412. data/third_party/abseil-cpp/absl/random/bit_gen_ref.h +10 -11
  413. data/third_party/abseil-cpp/absl/random/distributions.h +6 -8
  414. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +1 -1
  415. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +5 -6
  416. data/third_party/abseil-cpp/absl/random/internal/{pool_urbg.cc → entropy_pool.cc} +22 -90
  417. data/third_party/abseil-cpp/absl/random/internal/entropy_pool.h +35 -0
  418. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +5 -6
  419. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +1 -1
  420. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +20 -12
  421. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +5 -5
  422. data/third_party/abseil-cpp/absl/random/random.h +88 -53
  423. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +6 -2
  424. data/third_party/abseil-cpp/absl/status/internal/status_internal.cc +3 -4
  425. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +3 -4
  426. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -3
  427. data/third_party/abseil-cpp/absl/status/status.cc +4 -8
  428. data/third_party/abseil-cpp/absl/status/status.h +8 -8
  429. data/third_party/abseil-cpp/absl/status/status_payload_printer.h +2 -2
  430. data/third_party/abseil-cpp/absl/status/statusor.cc +2 -2
  431. data/third_party/abseil-cpp/absl/status/statusor.h +6 -6
  432. data/third_party/abseil-cpp/absl/strings/ascii.cc +9 -9
  433. data/third_party/abseil-cpp/absl/strings/ascii.h +18 -18
  434. data/third_party/abseil-cpp/absl/strings/charconv.cc +21 -22
  435. data/third_party/abseil-cpp/absl/strings/charconv.h +5 -5
  436. data/third_party/abseil-cpp/absl/strings/cord.cc +54 -58
  437. data/third_party/abseil-cpp/absl/strings/cord.h +94 -83
  438. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +11 -11
  439. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +3 -3
  440. data/third_party/abseil-cpp/absl/strings/escaping.cc +130 -149
  441. data/third_party/abseil-cpp/absl/strings/escaping.h +9 -10
  442. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  443. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +6 -8
  444. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +0 -4
  445. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +0 -4
  446. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +7 -63
  447. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -11
  448. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +0 -22
  449. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.cc +5 -3
  450. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  451. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +3 -3
  452. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +0 -5
  453. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +96 -1
  454. data/third_party/abseil-cpp/absl/strings/internal/utf8.h +15 -1
  455. data/third_party/abseil-cpp/absl/strings/numbers.cc +53 -32
  456. data/third_party/abseil-cpp/absl/strings/numbers.h +87 -58
  457. data/third_party/abseil-cpp/absl/strings/str_cat.cc +6 -7
  458. data/third_party/abseil-cpp/absl/strings/str_cat.h +32 -32
  459. data/third_party/abseil-cpp/absl/strings/str_format.h +18 -18
  460. data/third_party/abseil-cpp/absl/strings/str_replace.cc +3 -3
  461. data/third_party/abseil-cpp/absl/strings/str_replace.h +6 -6
  462. data/third_party/abseil-cpp/absl/strings/string_view.cc +4 -9
  463. data/third_party/abseil-cpp/absl/strings/string_view.h +27 -32
  464. data/third_party/abseil-cpp/absl/strings/strip.h +4 -4
  465. data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -4
  466. data/third_party/abseil-cpp/absl/strings/substitute.h +66 -64
  467. data/third_party/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +0 -4
  468. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +0 -5
  469. data/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +0 -4
  470. data/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +0 -4
  471. data/third_party/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +0 -4
  472. data/third_party/abseil-cpp/absl/synchronization/internal/waiter_base.cc +0 -4
  473. data/third_party/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +0 -4
  474. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +1 -1
  475. data/third_party/abseil-cpp/absl/synchronization/mutex.h +97 -69
  476. data/third_party/abseil-cpp/absl/synchronization/notification.h +1 -1
  477. data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -0
  478. data/third_party/abseil-cpp/absl/time/duration.cc +12 -7
  479. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -1
  480. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +90 -111
  481. data/third_party/abseil-cpp/absl/time/time.h +20 -15
  482. data/third_party/abseil-cpp/absl/types/optional.h +7 -747
  483. data/third_party/abseil-cpp/absl/types/span.h +13 -11
  484. data/third_party/abseil-cpp/absl/types/variant.h +5 -784
  485. data/third_party/abseil-cpp/absl/utility/utility.h +10 -185
  486. metadata +72 -20
  487. data/src/core/lib/event_engine/forkable.cc +0 -105
  488. data/src/core/lib/event_engine/forkable.h +0 -67
  489. data/src/core/lib/iomgr/python_util.h +0 -46
  490. data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +0 -108
  491. data/third_party/abseil-cpp/absl/base/internal/invoke.h +0 -241
  492. data/third_party/abseil-cpp/absl/log/log_entry.cc +0 -41
  493. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +0 -131
  494. data/third_party/abseil-cpp/absl/types/bad_optional_access.cc +0 -66
  495. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +0 -78
  496. data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +0 -82
  497. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +0 -82
  498. data/third_party/abseil-cpp/absl/types/internal/optional.h +0 -352
  499. data/third_party/abseil-cpp/absl/types/internal/variant.h +0 -1622
@@ -16,23 +16,16 @@
16
16
 
17
17
  #include "src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.h"
18
18
 
19
- #include <grpc/support/time.h>
20
-
21
19
  #include "absl/functional/any_invocable.h"
22
20
  #include "absl/status/status.h"
23
21
  #include "absl/status/statusor.h"
24
- #include "absl/strings/escaping.h"
25
22
  #include "absl/strings/str_cat.h"
26
- #include "absl/strings/str_split.h"
27
23
  #include "absl/strings/string_view.h"
28
24
  #include "src/core/call/metadata.h"
25
+ #include "src/core/credentials/call/jwt_util.h"
29
26
  #include "src/core/credentials/transport/transport_credentials.h"
30
27
  #include "src/core/lib/iomgr/error.h"
31
28
  #include "src/core/lib/transport/status_conversion.h"
32
- #include "src/core/util/json/json.h"
33
- #include "src/core/util/json/json_args.h"
34
- #include "src/core/util/json/json_object_loader.h"
35
- #include "src/core/util/json/json_reader.h"
36
29
  #include "src/core/util/ref_counted_ptr.h"
37
30
  #include "src/core/util/status_helper.h"
38
31
  #include "src/core/util/uri.h"
@@ -88,51 +81,16 @@ class JwtTokenFetcherCallCredentials::HttpFetchRequest final
88
81
  self->response_.status)));
89
82
  return;
90
83
  }
84
+ // Return token object.
91
85
  absl::string_view body(self->response_.body, self->response_.body_length);
92
- // Parse JWT token based on https://datatracker.ietf.org/doc/html/rfc7519.
93
- // We don't do full verification here, just enough to extract the
94
- // expiration time.
95
- // First, split the 3 '.'-delimited parts.
96
- std::vector<absl::string_view> parts = absl::StrSplit(body, '.');
97
- if (parts.size() != 3) {
98
- self->on_done_(absl::UnauthenticatedError("error parsing JWT token"));
99
- return;
100
- }
101
- // Base64-decode the payload.
102
- std::string payload;
103
- if (!absl::WebSafeBase64Unescape(parts[1], &payload)) {
104
- self->on_done_(absl::UnauthenticatedError("error parsing JWT token"));
105
- return;
106
- }
107
- // Parse as JSON.
108
- auto json = JsonParse(payload);
109
- if (!json.ok()) {
110
- self->on_done_(absl::UnauthenticatedError("error parsing JWT token"));
86
+ auto expiration_time = GetJwtExpirationTime(body);
87
+ if (!expiration_time.ok()) {
88
+ self->on_done_(expiration_time.status());
111
89
  return;
112
90
  }
113
- // Extract "exp" field.
114
- struct ParsedPayload {
115
- uint64_t exp = 0;
116
-
117
- static const JsonLoaderInterface* JsonLoader(const JsonArgs&) {
118
- static const auto kJsonLoader = JsonObjectLoader<ParsedPayload>()
119
- .Field("exp", &ParsedPayload::exp)
120
- .Finish();
121
- return kJsonLoader;
122
- }
123
- };
124
- auto parsed_payload = LoadFromJson<ParsedPayload>(*json, JsonArgs(), "");
125
- if (!parsed_payload.ok()) {
126
- self->on_done_(absl::UnauthenticatedError("error parsing JWT token"));
127
- return;
128
- }
129
- gpr_timespec ts = gpr_time_0(GPR_CLOCK_REALTIME);
130
- ts.tv_sec = parsed_payload->exp;
131
- Timestamp expiration_time = Timestamp::FromTimespecRoundDown(ts);
132
- // Return token object.
133
91
  self->on_done_(MakeRefCounted<Token>(
134
92
  Slice::FromCopiedString(absl::StrCat("Bearer ", body)),
135
- expiration_time));
93
+ *expiration_time));
136
94
  }
137
95
 
138
96
  OrphanablePtr<HttpRequest> http_request_;
@@ -0,0 +1,86 @@
1
+ //
2
+ // Copyright 2025 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
+ #include "src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.h"
18
+
19
+ #include "absl/status/status.h"
20
+ #include "absl/strings/str_cat.h"
21
+ #include "src/core/credentials/call/jwt_util.h"
22
+ #include "src/core/util/load_file.h"
23
+
24
+ namespace grpc_core {
25
+
26
+ class JwtTokenFileCallCredentials::FileReader final
27
+ : public TokenFetcherCredentials::FetchRequest {
28
+ public:
29
+ FileReader(JwtTokenFileCallCredentials* creds,
30
+ absl::AnyInvocable<void(
31
+ absl::StatusOr<RefCountedPtr<TokenFetcherCredentials::Token>>)>
32
+ on_done)
33
+ : creds_(creds), on_done_(std::move(on_done)) {
34
+ creds->event_engine().Run([self = RefAsSubclass<FileReader>()]() {
35
+ ExecCtx exec_ctx;
36
+ self->ReadFile();
37
+ });
38
+ }
39
+
40
+ void Orphan() override {
41
+ // Can't really do anything to cancel in this case.
42
+ Unref();
43
+ }
44
+
45
+ private:
46
+ void ReadFile() {
47
+ auto contents = LoadFile(creds_->path_, /*add_null_terminator=*/false);
48
+ if (!contents.ok()) {
49
+ on_done_(absl::UnavailableError(contents.status().message()));
50
+ return;
51
+ }
52
+ absl::string_view body = contents->as_string_view();
53
+ auto expiration_time = GetJwtExpirationTime(body);
54
+ if (!expiration_time.ok()) {
55
+ on_done_(expiration_time.status());
56
+ return;
57
+ }
58
+ on_done_(MakeRefCounted<Token>(
59
+ Slice::FromCopiedString(absl::StrCat("Bearer ", body)),
60
+ *expiration_time));
61
+ }
62
+
63
+ JwtTokenFileCallCredentials* creds_;
64
+ absl::AnyInvocable<void(
65
+ absl::StatusOr<RefCountedPtr<TokenFetcherCredentials::Token>>)>
66
+ on_done_;
67
+ };
68
+
69
+ std::string JwtTokenFileCallCredentials::debug_string() {
70
+ return absl::StrCat("JwtTokenFileCallCredentials(", path_, ")");
71
+ }
72
+
73
+ UniqueTypeName JwtTokenFileCallCredentials::Type() {
74
+ return GRPC_UNIQUE_TYPE_NAME_HERE("JwtTokenFile");
75
+ }
76
+
77
+ OrphanablePtr<TokenFetcherCredentials::FetchRequest>
78
+ JwtTokenFileCallCredentials::FetchToken(
79
+ Timestamp /*deadline*/,
80
+ absl::AnyInvocable<
81
+ void(absl::StatusOr<RefCountedPtr<TokenFetcherCredentials::Token>>)>
82
+ on_done) {
83
+ return MakeOrphanable<FileReader>(this, std::move(on_done));
84
+ }
85
+
86
+ } // namespace grpc_core
@@ -0,0 +1,74 @@
1
+ //
2
+ // Copyright 2025 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_SRC_CORE_CREDENTIALS_CALL_JWT_TOKEN_FILE_JWT_TOKEN_FILE_CALL_CREDENTIALS_H
18
+ #define GRPC_SRC_CORE_CREDENTIALS_CALL_JWT_TOKEN_FILE_JWT_TOKEN_FILE_CALL_CREDENTIALS_H
19
+
20
+ #include <grpc/credentials.h>
21
+ #include <grpc/grpc_security.h>
22
+
23
+ #include <string>
24
+
25
+ #include "absl/functional/any_invocable.h"
26
+ #include "absl/status/statusor.h"
27
+ #include "absl/strings/string_view.h"
28
+ #include "src/core/credentials/call/call_credentials.h"
29
+ #include "src/core/credentials/call/token_fetcher/token_fetcher_credentials.h"
30
+ #include "src/core/util/orphanable.h"
31
+ #include "src/core/util/ref_counted_ptr.h"
32
+ #include "src/core/util/time.h"
33
+ #include "src/core/util/unique_type_name.h"
34
+
35
+ namespace grpc_core {
36
+
37
+ // JWT token file call credentials.
38
+ // See gRFC A97 (https://github.com/grpc/proposal/pull/492).
39
+ class JwtTokenFileCallCredentials : public TokenFetcherCredentials {
40
+ public:
41
+ explicit JwtTokenFileCallCredentials(
42
+ absl::string_view path,
43
+ std::shared_ptr<grpc_event_engine::experimental::EventEngine>
44
+ event_engine = nullptr)
45
+ : TokenFetcherCredentials(std::move(event_engine)), path_(path) {}
46
+
47
+ std::string debug_string() override;
48
+
49
+ static UniqueTypeName Type();
50
+
51
+ UniqueTypeName type() const override { return Type(); }
52
+
53
+ absl::string_view path() const { return path_; }
54
+
55
+ private:
56
+ class FileReader;
57
+
58
+ OrphanablePtr<FetchRequest> FetchToken(
59
+ Timestamp /*deadline*/,
60
+ absl::AnyInvocable<
61
+ void(absl::StatusOr<RefCountedPtr<TokenFetcherCredentials::Token>>)>
62
+ on_done) final;
63
+
64
+ int cmp_impl(const grpc_call_credentials* other) const override {
65
+ // TODO(yashykt): Check if we can do something better here
66
+ return QsortCompare(static_cast<const grpc_call_credentials*>(this), other);
67
+ }
68
+
69
+ std::string path_;
70
+ };
71
+
72
+ } // namespace grpc_core
73
+
74
+ #endif // GRPC_SRC_CORE_CREDENTIALS_CALL_JWT_TOKEN_FILE_JWT_TOKEN_FILE_CALL_CREDENTIALS_H
@@ -0,0 +1,70 @@
1
+ //
2
+ // Copyright 2025 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
+ #include "src/core/credentials/call/jwt_util.h"
18
+
19
+ #include <grpc/support/time.h>
20
+
21
+ #include <string>
22
+ #include <vector>
23
+
24
+ #include "absl/status/status.h"
25
+ #include "absl/strings/escaping.h"
26
+ #include "absl/strings/str_split.h"
27
+ #include "src/core/util/json/json.h"
28
+ #include "src/core/util/json/json_args.h"
29
+ #include "src/core/util/json/json_object_loader.h"
30
+ #include "src/core/util/json/json_reader.h"
31
+
32
+ namespace grpc_core {
33
+
34
+ absl::StatusOr<Timestamp> GetJwtExpirationTime(absl::string_view jwt) {
35
+ // First, split the 3 '.'-delimited parts.
36
+ std::vector<absl::string_view> parts = absl::StrSplit(jwt, '.');
37
+ if (parts.size() != 3) {
38
+ return absl::UnauthenticatedError("error parsing JWT token");
39
+ }
40
+ // Base64-decode the payload.
41
+ std::string payload;
42
+ if (!absl::WebSafeBase64Unescape(parts[1], &payload)) {
43
+ return absl::UnauthenticatedError("error parsing JWT token");
44
+ }
45
+ // Parse as JSON.
46
+ auto json = JsonParse(payload);
47
+ if (!json.ok()) {
48
+ return absl::UnauthenticatedError("error parsing JWT token");
49
+ }
50
+ // Extract "exp" field.
51
+ struct ParsedPayload {
52
+ uint64_t exp = 0;
53
+
54
+ static const JsonLoaderInterface* JsonLoader(const JsonArgs&) {
55
+ static const auto kJsonLoader = JsonObjectLoader<ParsedPayload>()
56
+ .Field("exp", &ParsedPayload::exp)
57
+ .Finish();
58
+ return kJsonLoader;
59
+ }
60
+ };
61
+ auto parsed_payload = LoadFromJson<ParsedPayload>(*json, JsonArgs(), "");
62
+ if (!parsed_payload.ok()) {
63
+ return absl::UnauthenticatedError("error parsing JWT token");
64
+ }
65
+ gpr_timespec ts = gpr_time_0(GPR_CLOCK_REALTIME);
66
+ ts.tv_sec = parsed_payload->exp;
67
+ return Timestamp::FromTimespecRoundDown(ts);
68
+ }
69
+
70
+ } // namespace grpc_core
@@ -0,0 +1,32 @@
1
+ //
2
+ // Copyright 2025 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_SRC_CORE_CREDENTIALS_CALL_JWT_UTIL_H
18
+ #define GRPC_SRC_CORE_CREDENTIALS_CALL_JWT_UTIL_H
19
+
20
+ #include "absl/status/statusor.h"
21
+ #include "absl/strings/string_view.h"
22
+ #include "src/core/util/time.h"
23
+
24
+ namespace grpc_core {
25
+
26
+ // Extract the expiration time from a JWT token based on
27
+ // https://datatracker.ietf.org/doc/html/rfc7519.
28
+ absl::StatusOr<Timestamp> GetJwtExpirationTime(absl::string_view jwt);
29
+
30
+ } // namespace grpc_core
31
+
32
+ #endif // GRPC_SRC_CORE_CREDENTIALS_CALL_JWT_UTIL_H
@@ -57,7 +57,7 @@ class GoogleDefaultChannelCredsFactory : public ChannelCredsFactory<> {
57
57
  RefCountedPtr<grpc_channel_credentials> CreateChannelCreds(
58
58
  RefCountedPtr<ChannelCredsConfig> /*config*/) const override {
59
59
  return RefCountedPtr<grpc_channel_credentials>(
60
- grpc_google_default_credentials_create(nullptr));
60
+ grpc_google_default_credentials_create(nullptr, nullptr));
61
61
  }
62
62
 
63
63
  private:
@@ -42,6 +42,7 @@
42
42
  #include "src/core/credentials/call/jwt/json_token.h"
43
43
  #include "src/core/credentials/call/jwt/jwt_credentials.h"
44
44
  #include "src/core/credentials/call/oauth2/oauth2_credentials.h"
45
+ #include "src/core/credentials/transport/alts/alts_security_connector.h"
45
46
  #include "src/core/credentials/transport/alts/check_gcp_environment.h"
46
47
  #include "src/core/credentials/transport/transport_credentials.h"
47
48
  #include "src/core/lib/channel/channel_args.h"
@@ -338,6 +339,65 @@ static bool metadata_server_available() {
338
339
  return static_cast<bool>(g_metadata_server_available);
339
340
  }
340
341
 
342
+ // A grpc_call_credentials implementation that uses two
343
+ // underlying credentials: one for TLS and one for ALTS.
344
+ // The implementation will pick the right credentials based on the auth
345
+ // context's GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME property.
346
+ class GoogleDefaultCallCredentialsWrapper : public grpc_call_credentials {
347
+ public:
348
+ GoogleDefaultCallCredentialsWrapper(
349
+ grpc_core::RefCountedPtr<grpc_call_credentials> tls_credentials,
350
+ grpc_core::RefCountedPtr<grpc_call_credentials> alts_credentials)
351
+ : tls_credentials_(std::move(tls_credentials)),
352
+ alts_credentials_(std::move(alts_credentials)) {};
353
+
354
+ void Orphaned() override {
355
+ tls_credentials_.reset();
356
+ alts_credentials_.reset();
357
+ }
358
+
359
+ static grpc_core::UniqueTypeName Type() {
360
+ static grpc_core::UniqueTypeName::Factory kFactory("Dual");
361
+ return kFactory.Create();
362
+ }
363
+
364
+ grpc_core::UniqueTypeName type() const override { return Type(); }
365
+
366
+ grpc_core::ArenaPromise<absl::StatusOr<grpc_core::ClientMetadataHandle>>
367
+ GetRequestMetadata(grpc_core::ClientMetadataHandle initial_metadata,
368
+ const GetRequestMetadataArgs* args) override {
369
+ bool use_alts = false;
370
+ if (args != nullptr) {
371
+ auto auth_context = args->auth_context;
372
+ if (auth_context != nullptr &&
373
+ grpc_auth_context_peer_is_authenticated(auth_context.get()) == 1) {
374
+ // This channel is authenticated.
375
+ grpc_auth_property_iterator property_it =
376
+ grpc_auth_context_find_properties_by_name(
377
+ auth_context.get(), GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME);
378
+ const grpc_auth_property* property =
379
+ grpc_auth_property_iterator_next(&property_it);
380
+ use_alts =
381
+ property != nullptr &&
382
+ strcmp(property->value, GRPC_ALTS_TRANSPORT_SECURITY_TYPE) == 0;
383
+ }
384
+ }
385
+ return (use_alts ? alts_credentials_ : tls_credentials_)
386
+ ->GetRequestMetadata(std::move(initial_metadata), args);
387
+ }
388
+
389
+ private:
390
+ int cmp_impl(const grpc_call_credentials* other) const override {
391
+ return QsortCompare(static_cast<const grpc_call_credentials*>(this), other);
392
+ }
393
+ std::string debug_string() override {
394
+ return "GoogleDefaultCallCredentialsWrapper";
395
+ }
396
+
397
+ grpc_core::RefCountedPtr<grpc_call_credentials> tls_credentials_;
398
+ grpc_core::RefCountedPtr<grpc_call_credentials> alts_credentials_;
399
+ };
400
+
341
401
  static grpc_core::RefCountedPtr<grpc_call_credentials> make_default_call_creds(
342
402
  grpc_error_handle* error) {
343
403
  grpc_core::RefCountedPtr<grpc_call_credentials> call_creds;
@@ -373,14 +433,16 @@ static grpc_core::RefCountedPtr<grpc_call_credentials> make_default_call_creds(
373
433
  }
374
434
 
375
435
  grpc_channel_credentials* grpc_google_default_credentials_create(
376
- grpc_call_credentials* call_credentials) {
436
+ grpc_call_credentials* call_creds_for_tls,
437
+ grpc_call_credentials* call_creds_for_alts) {
377
438
  grpc_channel_credentials* result = nullptr;
378
- grpc_core::RefCountedPtr<grpc_call_credentials> call_creds(call_credentials);
439
+ grpc_core::RefCountedPtr<grpc_call_credentials> call_creds(
440
+ call_creds_for_tls);
379
441
  grpc_error_handle error;
380
442
  grpc_core::ExecCtx exec_ctx;
381
443
 
382
444
  GRPC_TRACE_LOG(api, INFO)
383
- << "grpc_google_default_credentials_create(" << call_credentials << ")";
445
+ << "grpc_google_default_credentials_create(" << call_creds_for_tls << ")";
384
446
 
385
447
  if (call_creds == nullptr) {
386
448
  call_creds = make_default_call_creds(&error);
@@ -400,6 +462,13 @@ grpc_channel_credentials* grpc_google_default_credentials_create(
400
462
  grpc_core::MakeRefCounted<grpc_google_default_channel_credentials>(
401
463
  grpc_core::RefCountedPtr<grpc_channel_credentials>(alts_creds),
402
464
  grpc_core::RefCountedPtr<grpc_channel_credentials>(ssl_creds));
465
+ if (call_creds_for_alts != nullptr) {
466
+ grpc_core::RefCountedPtr<grpc_call_credentials> alts_call_creds(
467
+ call_creds_for_alts);
468
+ call_creds =
469
+ grpc_core::MakeRefCounted<GoogleDefaultCallCredentialsWrapper>(
470
+ std::move(call_creds), std::move(alts_call_creds));
471
+ }
403
472
  result = grpc_composite_channel_credentials_create(
404
473
  creds.get(), call_creds.get(), nullptr);
405
474
  CHECK_NE(result, nullptr);
@@ -412,7 +481,6 @@ grpc_channel_credentials* grpc_google_default_credentials_create(
412
481
 
413
482
  namespace grpc_core {
414
483
  namespace internal {
415
-
416
484
  void set_gce_tenancy_checker_for_testing(grpc_gce_tenancy_checker checker) {
417
485
  g_gce_tenancy_checker = checker;
418
486
  }
@@ -58,7 +58,6 @@ grpc_ssl_credentials::grpc_ssl_credentials(
58
58
  root_store_ = grpc_core::DefaultSslRootStore::GetRootStore();
59
59
  }
60
60
  } else {
61
- config_.pem_root_certs = config_.pem_root_certs;
62
61
  root_store_ = nullptr;
63
62
  }
64
63
 
@@ -131,6 +131,7 @@ grpc_slice CreateRootCertsBundle(const char* certs_directory) {
131
131
  } else {
132
132
  LOG(ERROR) << "failed to read file: " << roots_filenames[i].path;
133
133
  }
134
+ close(file_descriptor);
134
135
  }
135
136
  }
136
137
  bundle_slice = grpc_slice_new(bundle_string, bytes_read, gpr_free);
@@ -134,9 +134,6 @@ RefCountedPtr<grpc_channel_security_connector>
134
134
  XdsCredentials::create_security_connector(
135
135
  RefCountedPtr<grpc_call_credentials> call_creds, const char* target_name,
136
136
  ChannelArgs* args) {
137
- // TODO(yashykt): This arg will no longer need to be added after b/173119596
138
- // is fixed.
139
- *args = args->SetIfUnset(GRPC_SSL_TARGET_NAME_OVERRIDE_ARG, target_name);
140
137
  RefCountedPtr<grpc_channel_security_connector> security_connector;
141
138
  auto xds_certificate_provider = args->GetObjectRef<XdsCertificateProvider>();
142
139
  if (xds_certificate_provider != nullptr) {
@@ -167,14 +167,14 @@ GcpAuthenticationFilter::Create(const ChannelArgs& args,
167
167
  return absl::InvalidArgumentError(
168
168
  "gcp_auth: xds config not found in channel args");
169
169
  }
170
- // Get existing cache or create new one.
171
- auto cache = filter_args.GetOrCreateState<CallCredentialsCache>(
172
- filter_config->filter_instance_name, [&]() {
173
- return MakeRefCounted<CallCredentialsCache>(filter_config->cache_size);
174
- });
175
- // Make sure size is updated, in case we're reusing a pre-existing
176
- // cache but it has the wrong size.
177
- cache->SetMaxSize(filter_config->cache_size);
170
+ // Get cache from blackboard. This must have been populated
171
+ // previously by the XdsConfigSelector.
172
+ auto cache = filter_args.GetState<CallCredentialsCache>(
173
+ filter_config->filter_instance_name);
174
+ if (cache == nullptr) {
175
+ return absl::InvalidArgumentError(
176
+ "gcp_auth: cache object not found in filter state");
177
+ }
178
178
  // Instantiate filter.
179
179
  return std::unique_ptr<GcpAuthenticationFilter>(
180
180
  new GcpAuthenticationFilter(std::move(service_config), filter_config,
@@ -42,6 +42,22 @@ namespace grpc_core {
42
42
  class GcpAuthenticationFilter
43
43
  : public ImplementChannelFilter<GcpAuthenticationFilter> {
44
44
  public:
45
+ class CallCredentialsCache : public Blackboard::Entry {
46
+ public:
47
+ explicit CallCredentialsCache(size_t max_size) : cache_(max_size) {}
48
+
49
+ static UniqueTypeName Type();
50
+
51
+ void SetMaxSize(size_t max_size);
52
+
53
+ RefCountedPtr<grpc_call_credentials> Get(const std::string& audience);
54
+
55
+ private:
56
+ Mutex mu_;
57
+ LruCache<std::string /*audience*/, RefCountedPtr<grpc_call_credentials>>
58
+ cache_ ABSL_GUARDED_BY(&mu_);
59
+ };
60
+
45
61
  static const grpc_channel_filter kFilter;
46
62
 
47
63
  static absl::string_view TypeName() { return "gcp_authentication_filter"; }
@@ -62,22 +78,6 @@ class GcpAuthenticationFilter
62
78
  };
63
79
 
64
80
  private:
65
- class CallCredentialsCache : public Blackboard::Entry {
66
- public:
67
- explicit CallCredentialsCache(size_t max_size) : cache_(max_size) {}
68
-
69
- static UniqueTypeName Type();
70
-
71
- void SetMaxSize(size_t max_size);
72
-
73
- RefCountedPtr<grpc_call_credentials> Get(const std::string& audience);
74
-
75
- private:
76
- Mutex mu_;
77
- LruCache<std::string /*audience*/, RefCountedPtr<grpc_call_credentials>>
78
- cache_ ABSL_GUARDED_BY(&mu_);
79
- };
80
-
81
81
  GcpAuthenticationFilter(
82
82
  RefCountedPtr<ServiceConfig> service_config,
83
83
  const GcpAuthenticationParsedConfig::Config* filter_config,
@@ -73,13 +73,11 @@ void RegisterClientAuthorityFilter(CoreConfiguration::Builder* builder) {
73
73
  builder->channel_init()
74
74
  ->RegisterFilter<ClientAuthorityFilter>(GRPC_CLIENT_SUBCHANNEL)
75
75
  .If(NeedsClientAuthorityFilter)
76
- .Before<ClientAuthFilter>()
77
- .Before<LegacyClientAuthFilter>();
76
+ .Before<ClientAuthFilter>();
78
77
  builder->channel_init()
79
78
  ->RegisterFilter<ClientAuthorityFilter>(GRPC_CLIENT_DIRECT_CHANNEL)
80
79
  .If(NeedsClientAuthorityFilter)
81
- .Before<ClientAuthFilter>()
82
- .Before<LegacyClientAuthFilter>();
80
+ .Before<ClientAuthFilter>();
83
81
  }
84
82
 
85
83
  } // namespace grpc_core
@@ -24,11 +24,13 @@
24
24
  #include <stddef.h>
25
25
  #include <stdint.h>
26
26
 
27
+ #include <cstddef>
27
28
  #include <optional>
28
29
 
29
30
  #include "absl/status/statusor.h"
30
31
  #include "absl/strings/string_view.h"
31
32
  #include "src/core/call/metadata_batch.h"
33
+ #include "src/core/channelz/property_list.h"
32
34
  #include "src/core/lib/channel/channel_args.h"
33
35
  #include "src/core/lib/channel/channel_fwd.h"
34
36
  #include "src/core/lib/channel/promise_based_filter.h"
@@ -91,18 +93,15 @@ class ChannelCompression {
91
93
  bool is_client, MessageHandle message, DecompressArgs args,
92
94
  CallTracerInterface* call_tracer) const;
93
95
 
94
- Json::Object ToJsonObject() const {
95
- Json::Object object;
96
- if (max_recv_size_.has_value()) {
97
- object["maxRecvSize"] = Json::FromNumber(*max_recv_size_);
98
- }
99
- object["defaultCompressionAlgorithm"] = Json::FromString(
100
- CompressionAlgorithmAsString(default_compression_algorithm_));
101
- object["enabledCompressionAlgorithms"] = Json::FromString(
102
- std::string(enabled_compression_algorithms_.ToString()));
103
- object["enableCompression"] = Json::FromBool(enable_compression_);
104
- object["enableDecompression"] = Json::FromBool(enable_decompression_);
105
- return object;
96
+ channelz::PropertyList ChannelzProperties() const {
97
+ return channelz::PropertyList()
98
+ .Set("max_recv_size", max_recv_size_)
99
+ .Set("default_compression_algorithm",
100
+ CompressionAlgorithmAsString(default_compression_algorithm_))
101
+ .Set("enabled_compression_algorithms",
102
+ enabled_compression_algorithms_.ToString())
103
+ .Set("enable_compression", enable_compression_)
104
+ .Set("enable_decompression", enable_decompression_);
106
105
  }
107
106
 
108
107
  private:
@@ -132,12 +131,14 @@ class ClientCompressionFilter final
132
131
 
133
132
  explicit ClientCompressionFilter(const ChannelArgs& args)
134
133
  : channelz::DataSource(args.GetObjectRef<channelz::BaseNode>()),
135
- compression_engine_(args) {}
136
- ~ClientCompressionFilter() override { ResetDataSource(); }
134
+ compression_engine_(args) {
135
+ SourceConstructed();
136
+ }
137
+ ~ClientCompressionFilter() override { SourceDestructing(); }
137
138
 
138
- void AddData(channelz::DataSink& sink) override {
139
- sink.AddAdditionalInfo("clientCompressionFilter",
140
- compression_engine_.ToJsonObject());
139
+ void AddData(channelz::DataSink sink) override {
140
+ sink.AddData("clientCompressionFilter",
141
+ compression_engine_.ChannelzProperties());
141
142
  }
142
143
 
143
144
  // Construct a promise for one call.
@@ -182,12 +183,14 @@ class ServerCompressionFilter final
182
183
 
183
184
  explicit ServerCompressionFilter(const ChannelArgs& args)
184
185
  : channelz::DataSource(args.GetObjectRef<channelz::BaseNode>()),
185
- compression_engine_(args) {}
186
- ~ServerCompressionFilter() override { ResetDataSource(); }
186
+ compression_engine_(args) {
187
+ SourceConstructed();
188
+ }
189
+ ~ServerCompressionFilter() override { SourceDestructing(); }
187
190
 
188
- void AddData(channelz::DataSink& sink) override {
189
- sink.AddAdditionalInfo("serverCompressionFilter",
190
- compression_engine_.ToJsonObject());
191
+ void AddData(channelz::DataSink sink) override {
192
+ sink.AddData("serverCompressionFilter",
193
+ compression_engine_.ChannelzProperties());
191
194
  }
192
195
 
193
196
  // Construct a promise for one call.