grpc 1.83.1 → 1.84.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 (322) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +21 -17
  3. data/include/grpc/credentials.h +10 -0
  4. data/include/grpc/grpc_security_constants.h +2 -0
  5. data/include/grpc/impl/channel_arg_names.h +9 -0
  6. data/src/core/call/call_filters.h +4 -2
  7. data/src/core/call/client_call.cc +20 -8
  8. data/src/core/call/client_call.h +4 -0
  9. data/src/core/call/interception_chain.cc +2 -0
  10. data/src/core/call/interception_chain.h +14 -1
  11. data/src/core/call/metadata.cc +1 -3
  12. data/src/core/call/metadata_batch.h +13 -5
  13. data/src/core/call/server_call.cc +31 -14
  14. data/src/core/call/server_call.h +4 -0
  15. data/src/core/channelz/text_encode.cc +9 -4
  16. data/src/core/channelz/v2tov1/convert.cc +2 -2
  17. data/src/core/client_channel/backup_poller.cc +1 -2
  18. data/src/core/client_channel/client_channel.cc +6 -33
  19. data/src/core/client_channel/client_channel_filter.cc +22 -55
  20. data/src/core/client_channel/client_channel_filter.h +2 -2
  21. data/src/core/client_channel/client_channel_service_config.cc +3 -19
  22. data/src/core/client_channel/direct_channel.cc +7 -1
  23. data/src/core/client_channel/direct_channel.h +2 -2
  24. data/src/core/client_channel/load_balanced_call_destination.cc +5 -3
  25. data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -12
  26. data/src/core/client_channel/subchannel.cc +310 -1058
  27. data/src/core/client_channel/subchannel.h +44 -329
  28. data/src/core/client_channel/subchannel_metrics.cc +48 -0
  29. data/src/core/client_channel/subchannel_metrics.h +60 -0
  30. data/src/core/credentials/call/external/file_external_account_credentials.cc +1 -1
  31. data/src/core/credentials/call/external/url_external_account_credentials.cc +2 -3
  32. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +8 -24
  33. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.h +3 -6
  34. data/src/core/credentials/call/gdch_service_account/gdch_service_account_credentials.cc +525 -0
  35. data/src/core/credentials/call/gdch_service_account/gdch_service_account_credentials.h +138 -0
  36. data/src/core/credentials/call/json_util.h +1 -0
  37. data/src/core/credentials/call/jwt/json_token.cc +10 -2
  38. data/src/core/credentials/call/jwt/jwt_verifier.cc +15 -1
  39. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +1 -1
  40. data/src/core/credentials/call/oauth2/oauth2_credentials.cc +42 -79
  41. data/src/core/credentials/call/oauth2/oauth2_credentials.h +2 -5
  42. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.cc +52 -31
  43. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.h +21 -8
  44. data/src/core/credentials/transport/google_default/google_default_credentials.cc +3 -4
  45. data/src/core/credentials/transport/ssl/ssl_credentials.cc +59 -72
  46. data/src/core/credentials/transport/ssl/ssl_credentials.h +9 -8
  47. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +12 -6
  48. data/src/core/credentials/transport/ssl/ssl_security_connector.h +4 -4
  49. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +29 -18
  50. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +9 -6
  51. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +45 -56
  52. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +5 -4
  53. data/src/core/credentials/transport/tls/grpc_tls_certificate_selector.h +26 -0
  54. data/src/core/credentials/transport/tls/grpc_tls_crl_provider.cc +1 -1
  55. data/src/core/credentials/transport/tls/load_system_roots.h +2 -6
  56. data/src/core/credentials/transport/tls/load_system_roots_fallback.cc +2 -4
  57. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +13 -15
  58. data/src/core/credentials/transport/tls/load_system_roots_supported.h +3 -2
  59. data/src/core/credentials/transport/tls/load_system_roots_windows.cc +5 -8
  60. data/src/core/credentials/transport/tls/spiffe_utils.cc +1 -1
  61. data/src/core/credentials/transport/tls/ssl_utils.cc +39 -28
  62. data/src/core/credentials/transport/tls/ssl_utils.h +12 -49
  63. data/src/core/credentials/transport/tls/tls_security_connector.cc +48 -33
  64. data/src/core/credentials/transport/tls/tls_security_connector.h +31 -10
  65. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +15 -11
  66. data/src/core/ext/filters/http/http_filters_plugin.cc +20 -9
  67. data/src/core/ext/filters/rbac/rbac_filter.cc +43 -21
  68. data/src/core/ext/filters/rbac/rbac_filter.h +21 -3
  69. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +2 -2
  70. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +1 -1
  71. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +6 -20
  72. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +32 -67
  73. data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -0
  74. data/src/core/ext/transport/chttp2/transport/flow_control.h +78 -4
  75. data/src/core/ext/transport/chttp2/transport/frame.h +2 -0
  76. data/src/core/ext/transport/chttp2/transport/frame_data.cc +3 -4
  77. data/src/core/ext/transport/chttp2/transport/goaway.h +7 -0
  78. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +5 -3
  79. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +3 -1
  80. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +141 -130
  81. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +22 -22
  82. data/src/core/ext/transport/chttp2/transport/http2_server_transport.cc +402 -269
  83. data/src/core/ext/transport/chttp2/transport/http2_server_transport.h +80 -49
  84. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +1 -2
  85. data/src/core/ext/transport/chttp2/transport/http2_status.h +38 -37
  86. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +178 -5
  87. data/src/core/ext/transport/chttp2/transport/http2_transport.h +345 -5
  88. data/src/core/ext/transport/chttp2/transport/parsing.cc +5 -5
  89. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +3 -2
  90. data/src/core/ext/transport/chttp2/transport/ping_promise.h +25 -5
  91. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +3 -4
  92. data/src/core/ext/transport/chttp2/transport/read_context.h +30 -3
  93. data/src/core/ext/transport/chttp2/transport/stream.h +65 -23
  94. data/src/core/ext/transport/chttp2/transport/writing.cc +0 -3
  95. data/src/core/ext/transport/inproc/inproc_transport.cc +1 -5
  96. data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +4 -17
  97. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upb.h +1912 -0
  98. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upb_minitable.c +300 -0
  99. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upb_minitable.h +37 -0
  100. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upb.h +187 -0
  101. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upb_minitable.c +64 -0
  102. data/src/core/ext/upb-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upb_minitable.h +31 -0
  103. data/src/core/ext/upb-gen/envoy/service/ext_proc/v3/external_processor.upb.h +2362 -0
  104. data/src/core/ext/upb-gen/envoy/service/ext_proc/v3/external_processor.upb_minitable.c +556 -0
  105. data/src/core/ext/upb-gen/envoy/service/ext_proc/v3/external_processor.upb_minitable.h +47 -0
  106. data/src/core/ext/upb-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upb.h +5 -5
  107. data/src/core/ext/upb-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upb_minitable.c +3 -3
  108. data/src/core/ext/upb-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upb_minitable.h +5 -5
  109. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upbdefs.c +453 -0
  110. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/ext_proc.upbdefs.h +67 -0
  111. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upbdefs.c +142 -0
  112. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/ext_proc/v3/processing_mode.upbdefs.h +37 -0
  113. data/src/core/ext/upbdefs-gen/grpc/channelz/v1/channelz.upbdefs.c +715 -0
  114. data/src/core/ext/upbdefs-gen/{src/proto/grpc/channelz → grpc/channelz/v1}/channelz.upbdefs.h +44 -44
  115. data/src/core/filter/auth/server_auth_filter.cc +2 -3
  116. data/src/core/filter/composite/composite_filter.cc +45 -33
  117. data/src/core/filter/composite/composite_filter.h +5 -4
  118. data/src/core/filter/ext_proc/ext_proc_filter.cc +224 -0
  119. data/src/core/filter/ext_proc/ext_proc_filter.h +155 -0
  120. data/src/core/filter/ext_proc/ext_proc_messages.cc +701 -0
  121. data/src/core/filter/ext_proc/ext_proc_messages.h +297 -0
  122. data/src/core/filter/filter_args.h +13 -2
  123. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +30 -3
  124. data/src/core/handshaker/security/security_handshaker.cc +9 -6
  125. data/src/core/lib/channel/channel_stack.cc +3 -0
  126. data/src/core/lib/channel/channel_stack.h +2 -0
  127. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -2
  128. data/src/core/lib/channel/promise_based_filter.cc +132 -20
  129. data/src/core/lib/channel/promise_based_filter.h +42 -12
  130. data/src/core/lib/compression/compression_internal.cc +4 -5
  131. data/src/core/lib/debug/trace_flags.cc +8 -0
  132. data/src/core/lib/debug/trace_flags.h +3 -0
  133. data/src/core/lib/event_engine/ares_resolver.cc +54 -50
  134. data/src/core/lib/event_engine/ares_resolver.h +3 -2
  135. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +3 -3
  136. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +4 -10
  137. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +74 -33
  138. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +4 -4
  139. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +6 -2
  140. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +3 -0
  141. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +3 -0
  142. data/src/core/lib/event_engine/windows/windows_endpoint.cc +1 -3
  143. data/src/core/lib/experiments/experiments.cc +60 -96
  144. data/src/core/lib/experiments/experiments.h +34 -50
  145. data/src/core/lib/iomgr/cfstream_handle.cc +2 -6
  146. data/src/core/lib/iomgr/endpoint_cfstream.cc +3 -10
  147. data/src/core/lib/iomgr/error.cc +2 -6
  148. data/src/core/lib/iomgr/error_cfstream.cc +1 -1
  149. data/src/core/lib/iomgr/ev_poll_posix.cc +5 -9
  150. data/src/core/lib/iomgr/event_engine_shims/closure.cc +1 -1
  151. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +1 -2
  152. data/src/core/lib/iomgr/event_engine_shims/tcp_client.cc +1 -2
  153. data/src/core/lib/iomgr/iomgr_posix.cc +0 -4
  154. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +0 -4
  155. data/src/core/lib/iomgr/iomgr_windows.cc +0 -4
  156. data/src/core/lib/iomgr/socket_factory_posix.h +1 -1
  157. data/src/core/lib/iomgr/socket_utils_posix.cc +3 -0
  158. data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
  159. data/src/core/lib/iomgr/systemd_utils.cc +0 -1
  160. data/src/core/lib/iomgr/tcp_client.h +1 -1
  161. data/src/core/lib/iomgr/tcp_posix.cc +23 -15
  162. data/src/core/lib/iomgr/tcp_server.h +1 -1
  163. data/src/core/lib/iomgr/tcp_server_posix.cc +2 -3
  164. data/src/core/lib/iomgr/tcp_server_utils_posix.h +0 -1
  165. data/src/core/lib/iomgr/tcp_server_windows.cc +0 -1
  166. data/src/core/lib/iomgr/tcp_windows.cc +5 -10
  167. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -4
  168. data/src/core/lib/iomgr/unix_sockets_posix.h +3 -1
  169. data/src/core/lib/iomgr/vsock.h +3 -1
  170. data/src/core/lib/resource_quota/memory_quota.cc +1 -1
  171. data/src/core/lib/security/authorization/rbac_policy.cc +139 -56
  172. data/src/core/lib/security/authorization/rbac_policy.h +21 -3
  173. data/src/core/lib/surface/call.cc +3 -9
  174. data/src/core/lib/surface/call_utils.h +113 -0
  175. data/src/core/lib/surface/channel_create.cc +1 -1
  176. data/src/core/lib/surface/channel_create.h +0 -2
  177. data/src/core/lib/surface/channel_init.cc +77 -38
  178. data/src/core/lib/surface/channel_init.h +30 -16
  179. data/src/core/lib/surface/filter_stack_call.cc +5 -10
  180. data/src/core/lib/surface/init.cc +13 -27
  181. data/src/core/lib/surface/version.cc +1 -1
  182. data/src/core/lib/transport/error_utils.cc +0 -27
  183. data/src/core/lib/transport/error_utils.h +0 -16
  184. data/src/core/lib/transport/transport.h +7 -5
  185. data/src/core/load_balancing/pick_first/pick_first.cc +2 -0
  186. data/src/core/load_balancing/rls/rls.cc +28 -11
  187. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +33 -42
  188. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.h +0 -2
  189. data/src/core/load_balancing/xds/cds.cc +3 -1
  190. data/src/core/load_balancing/xds/xds_cluster_impl.cc +0 -1
  191. data/src/core/mitigation_engine/mitigation.h +14 -5
  192. data/src/core/mitigation_engine/mitigation_engine.h +7 -3
  193. data/src/core/mitigation_engine/mitigation_provider.h +2 -1
  194. data/src/core/plugin_registry/grpc_plugin_registry.cc +39 -8
  195. data/src/core/resolver/dns/{event_engine/event_engine_client_channel_resolver.cc → dns_resolver.cc} +42 -41
  196. data/src/core/resolver/dns/{event_engine/event_engine_client_channel_resolver.h → dns_resolver.h} +8 -5
  197. data/src/core/resolver/dns/{event_engine/service_config_helper.cc → service_config_helper.cc} +1 -1
  198. data/src/core/resolver/dns/{event_engine/service_config_helper.h → service_config_helper.h} +3 -3
  199. data/src/core/resolver/endpoint_addresses.h +3 -0
  200. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +2 -1
  201. data/src/core/resolver/xds/xds_resolver.cc +35 -9
  202. data/src/core/server/server.cc +2 -6
  203. data/src/core/server/server_config_selector.h +18 -3
  204. data/src/core/server/server_config_selector_filter.cc +178 -91
  205. data/src/core/server/server_config_selector_filter.h +58 -3
  206. data/src/core/server/xds_server_config_fetcher.cc +196 -129
  207. data/src/core/server/xds_server_config_fetcher.h +49 -0
  208. data/src/core/server/xds_server_config_fetcher_legacy.cc +41 -37
  209. data/src/core/telemetry/histogram.h +94 -14
  210. data/src/core/telemetry/instrument.cc +179 -74
  211. data/src/core/telemetry/instrument.h +78 -30
  212. data/src/core/telemetry/metrics.h +5 -0
  213. data/src/core/{resolver/dns/dns_resolver_plugin.h → telemetry/telemetry_label.h} +12 -8
  214. data/src/core/tsi/alts/crypt/aes_gcm.cc +10 -13
  215. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +2 -2
  216. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +3 -1
  217. data/src/core/tsi/ssl_telemetry_utils.cc +216 -259
  218. data/src/core/tsi/ssl_telemetry_utils.h +12 -2
  219. data/src/core/tsi/ssl_transport_security.cc +238 -80
  220. data/src/core/tsi/ssl_transport_security.h +63 -33
  221. data/src/core/tsi/tls_telemetry.cc +31 -0
  222. data/src/core/tsi/tls_telemetry.h +47 -0
  223. data/src/core/tsi/transport_security.cc +2 -2
  224. data/src/core/tsi/transport_security.h +1 -1
  225. data/src/core/tsi/transport_security_interface.h +1 -1
  226. data/src/core/{resolver/dns/native/dns_resolver.h → util/address_sorting_init.cc} +21 -8
  227. data/src/core/{resolver/dns/c_ares/grpc_ares_wrapper_posix.cc → util/address_sorting_init.h} +7 -8
  228. data/src/core/util/http_client/httpcli.cc +16 -53
  229. data/src/core/util/http_client/httpcli.h +0 -7
  230. data/src/core/util/http_client/httpcli_security_connector.cc +13 -8
  231. data/src/core/util/linux/cpu.cc +1 -1
  232. data/src/core/util/load_file.cc +3 -9
  233. data/src/core/util/load_file.h +3 -4
  234. data/src/core/util/matchers.h +8 -0
  235. data/src/core/util/posix/cpu.cc +1 -1
  236. data/src/core/util/status_helper.cc +0 -20
  237. data/src/core/util/status_helper.h +3 -14
  238. data/src/core/xds/grpc/xds_audit_logger_registry.cc +51 -31
  239. data/src/core/xds/grpc/xds_audit_logger_registry.h +17 -3
  240. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -10
  241. data/src/core/xds/grpc/xds_bootstrap_grpc.h +8 -6
  242. data/src/core/xds/grpc/xds_bootstrap_grpc_builder.cc +488 -0
  243. data/src/core/xds/grpc/xds_bootstrap_grpc_builder.h +97 -0
  244. data/src/core/xds/grpc/xds_certificate_provider.cc +7 -7
  245. data/src/core/xds/grpc/xds_client_grpc.cc +4 -8
  246. data/src/core/xds/grpc/xds_client_grpc.h +0 -4
  247. data/src/core/xds/grpc/xds_cluster.h +1 -0
  248. data/src/core/xds/grpc/xds_cluster_parser.cc +1 -5
  249. data/src/core/xds/grpc/xds_cluster_parser.h +0 -2
  250. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +0 -2
  251. data/src/core/xds/grpc/xds_cluster_specifier_plugin.h +0 -2
  252. data/src/core/xds/grpc/xds_common_types.cc +0 -91
  253. data/src/core/xds/grpc/xds_common_types.h +1 -47
  254. data/src/core/xds/grpc/xds_common_types_parser.cc +84 -378
  255. data/src/core/xds/grpc/xds_common_types_parser.h +9 -11
  256. data/src/core/xds/grpc/xds_endpoint_parser.cc +0 -2
  257. data/src/core/xds/grpc/xds_grpc_service_parser.cc +177 -0
  258. data/src/core/{resolver/dns/c_ares/dns_resolver_ares.h → xds/grpc/xds_grpc_service_parser.h} +14 -9
  259. data/src/core/xds/grpc/xds_http_composite_filter.cc +26 -21
  260. data/src/core/xds/grpc/xds_http_composite_filter.h +4 -3
  261. data/src/core/xds/grpc/xds_http_ext_proc_filter.cc +418 -0
  262. data/src/core/xds/grpc/xds_http_ext_proc_filter.h +89 -0
  263. data/src/core/xds/grpc/xds_http_fault_filter.cc +9 -12
  264. data/src/core/xds/grpc/xds_http_fault_filter.h +1 -4
  265. data/src/core/xds/grpc/xds_http_filter.cc +2 -1
  266. data/src/core/xds/grpc/xds_http_filter.h +6 -5
  267. data/src/core/xds/grpc/xds_http_filter_registry.cc +10 -127
  268. data/src/core/xds/grpc/xds_http_filter_registry.h +7 -59
  269. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +13 -14
  270. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +3 -2
  271. data/src/core/xds/grpc/xds_http_rbac_filter.cc +403 -25
  272. data/src/core/xds/grpc/xds_http_rbac_filter.h +1 -3
  273. data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +8 -13
  274. data/src/core/xds/grpc/xds_http_stateful_session_filter.h +1 -4
  275. data/src/core/xds/grpc/xds_lb_policy_registry.cc +0 -292
  276. data/src/core/xds/grpc/xds_lb_policy_registry.h +7 -3
  277. data/src/core/xds/grpc/xds_listener.cc +2 -0
  278. data/src/core/xds/grpc/xds_listener.h +5 -0
  279. data/src/core/xds/grpc/xds_listener_parser.cc +16 -11
  280. data/src/core/xds/grpc/xds_matcher_parse.h +3 -1
  281. data/src/core/xds/grpc/xds_metadata_parser.cc +6 -1
  282. data/src/core/xds/grpc/xds_metadata_parser.h +2 -0
  283. data/src/core/xds/grpc/xds_route_config.cc +2 -0
  284. data/src/core/xds/grpc/xds_route_config.h +3 -1
  285. data/src/core/xds/grpc/xds_route_config_parser.cc +13 -79
  286. data/src/core/xds/grpc/xds_route_config_parser.h +0 -3
  287. data/src/core/xds/grpc/xds_routing.cc +116 -69
  288. data/src/core/xds/grpc/xds_routing.h +19 -8
  289. data/src/core/xds/grpc/xds_tls_context.cc +117 -0
  290. data/src/core/xds/grpc/xds_tls_context.h +76 -0
  291. data/src/core/xds/grpc/xds_tls_context_parser.cc +275 -0
  292. data/src/core/xds/grpc/xds_tls_context_parser.h +35 -0
  293. data/src/core/xds/grpc/xds_transport_grpc.cc +41 -38
  294. data/src/core/xds/grpc/xds_transport_grpc.h +4 -2
  295. data/src/ruby/ext/grpc/rb_call.c +26 -15
  296. data/src/ruby/ext/grpc/rb_completion_queue.c +6 -5
  297. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  298. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
  299. data/src/ruby/lib/grpc/version.rb +1 -1
  300. data/src/ruby/pb/test/client.rb +5 -4
  301. data/src/ruby/spec/call_spec.rb +14 -0
  302. data/src/ruby/spec/generic/server_interceptors_spec.rb +3 -6
  303. metadata +50 -35
  304. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.c +0 -716
  305. data/src/core/lib/iomgr/resolve_address.cc +0 -59
  306. data/src/core/lib/iomgr/resolve_address.h +0 -125
  307. data/src/core/lib/iomgr/resolve_address_impl.h +0 -58
  308. data/src/core/lib/iomgr/resolve_address_posix.cc +0 -184
  309. data/src/core/lib/iomgr/resolve_address_posix.h +0 -78
  310. data/src/core/lib/iomgr/resolve_address_windows.cc +0 -169
  311. data/src/core/lib/iomgr/resolve_address_windows.h +0 -76
  312. data/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +0 -781
  313. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +0 -93
  314. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +0 -203
  315. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +0 -838
  316. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +0 -1237
  317. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +0 -130
  318. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +0 -35
  319. data/src/core/resolver/dns/dns_resolver_plugin.cc +0 -64
  320. data/src/core/resolver/dns/native/dns_resolver.cc +0 -173
  321. data/src/core/util/json/json_util.cc +0 -101
  322. data/src/core/util/json/json_util.h +0 -163
@@ -0,0 +1,701 @@
1
+ //
2
+ // Copyright 2026 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/filter/ext_proc/ext_proc_messages.h"
18
+
19
+ #include <grpc/status.h>
20
+
21
+ #include <cstddef>
22
+ #include <cstdint>
23
+ #include <optional>
24
+ #include <string>
25
+ #include <utility>
26
+ #include <vector>
27
+
28
+ #include "envoy/config/core/v3/base.upb.h"
29
+ #include "envoy/extensions/filters/http/ext_proc/v3/processing_mode.upb.h"
30
+ #include "envoy/service/ext_proc/v3/external_processor.upb.h"
31
+ #include "google/protobuf/struct.upb.h"
32
+ #include "src/core/call/metadata_batch.h"
33
+ #include "src/core/call/status_util.h"
34
+ #include "src/core/lib/slice/slice.h"
35
+ #include "src/core/util/matchers.h"
36
+ #include "src/core/util/string.h"
37
+ #include "src/core/util/upb_utils.h"
38
+ #include "src/core/util/validation_errors.h"
39
+ #include "src/core/xds/grpc/xds_common_types_parser.h"
40
+ #include "upb/base/string_view.h"
41
+ #include "upb/mem/arena.h"
42
+ #include "upb/mem/arena.hpp"
43
+ #include "absl/functional/function_ref.h"
44
+ #include "absl/status/status.h"
45
+ #include "absl/status/statusor.h"
46
+ #include "absl/strings/str_cat.h"
47
+ #include "absl/strings/string_view.h"
48
+
49
+ namespace grpc_core {
50
+
51
+ //
52
+ // ExtProcProcessingMode
53
+ //
54
+
55
+ std::string ExtProcProcessingMode::ToString() const {
56
+ std::string result = "{";
57
+ StrAppend(result, "send_request_headers=");
58
+ StrAppend(result, send_request_headers ? "true" : "false");
59
+ StrAppend(result, ", send_response_headers=");
60
+ StrAppend(result, send_response_headers ? "true" : "false");
61
+ StrAppend(result, ", send_response_trailers=");
62
+ StrAppend(result, send_response_trailers ? "true" : "false");
63
+ StrAppend(result, ", send_request_body=");
64
+ StrAppend(result, send_request_body ? "true" : "false");
65
+ StrAppend(result, ", send_response_body=");
66
+ StrAppend(result, send_response_body ? "true" : "false");
67
+ StrAppend(result, "}");
68
+ return result;
69
+ }
70
+
71
+ //
72
+ // ExtProcResponse::Parse()
73
+ //
74
+
75
+ namespace {
76
+
77
+ absl::StatusOr<ExtProcResponse::HeaderMutation> ParseExtProcHeaderMutation(
78
+ const envoy_service_ext_proc_v3_HeaderMutation* header_mutation) {
79
+ if (header_mutation == nullptr) {
80
+ return ExtProcResponse::HeaderMutation{};
81
+ }
82
+ ExtProcResponse::HeaderMutation header_mutation_response;
83
+ size_t set_headers_size = 0;
84
+ const envoy_config_core_v3_HeaderValueOption* const* set_headers =
85
+ envoy_service_ext_proc_v3_HeaderMutation_set_headers(header_mutation,
86
+ &set_headers_size);
87
+ for (size_t i = 0; i < set_headers_size; ++i) {
88
+ ValidationErrors errors;
89
+ auto parsed = ParseXdsHeaderValueOption(set_headers[i], &errors);
90
+ if (!errors.ok()) {
91
+ return errors.status(absl::StatusCode::kInternal,
92
+ "Failed to parse XdsHeaderValueOption");
93
+ }
94
+ header_mutation_response.set_headers.push_back(std::move(parsed));
95
+ }
96
+ size_t remove_headers_size = 0;
97
+ upb_StringView const* remove_headers =
98
+ envoy_service_ext_proc_v3_HeaderMutation_remove_headers(
99
+ header_mutation, &remove_headers_size);
100
+ for (size_t i = 0; i < remove_headers_size; ++i) {
101
+ header_mutation_response.remove_headers.emplace_back(
102
+ UpbStringToStdString(remove_headers[i]));
103
+ }
104
+ return header_mutation_response;
105
+ }
106
+
107
+ absl::Status ValidateCommonResponse(
108
+ const envoy_service_ext_proc_v3_CommonResponse* common_response) {
109
+ if (common_response == nullptr) {
110
+ return absl::InternalError("common_response is not set");
111
+ }
112
+ int32_t status =
113
+ envoy_service_ext_proc_v3_CommonResponse_status(common_response);
114
+ if (status == envoy_service_ext_proc_v3_CommonResponse_CONTINUE_AND_REPLACE) {
115
+ return absl::InternalError("CONTINUE_AND_REPLACE is not supported");
116
+ }
117
+ return absl::OkStatus();
118
+ }
119
+
120
+ absl::StatusOr<ExtProcResponse::HeaderMutation> ParseExtProcHeaders(
121
+ const envoy_service_ext_proc_v3_CommonResponse* common_response) {
122
+ auto status = ValidateCommonResponse(common_response);
123
+ if (!status.ok()) return status;
124
+ const envoy_service_ext_proc_v3_HeaderMutation* header_mutation =
125
+ envoy_service_ext_proc_v3_CommonResponse_header_mutation(common_response);
126
+ return ParseExtProcHeaderMutation(header_mutation);
127
+ }
128
+
129
+ absl::StatusOr<ExtProcResponse::BodyMutation> ParseExtProcBodyMutation(
130
+ const envoy_service_ext_proc_v3_CommonResponse* common_response) {
131
+ auto status = ValidateCommonResponse(common_response);
132
+ if (!status.ok()) return status;
133
+ const envoy_service_ext_proc_v3_BodyMutation* body_mutation =
134
+ envoy_service_ext_proc_v3_CommonResponse_body_mutation(common_response);
135
+ if (body_mutation == nullptr) {
136
+ return absl::InternalError("body_mutation is not set");
137
+ }
138
+ auto streamed_response =
139
+ envoy_service_ext_proc_v3_BodyMutation_streamed_response(body_mutation);
140
+ if (streamed_response == nullptr) {
141
+ return absl::InternalError("streamed_response is not set");
142
+ }
143
+ if (envoy_service_ext_proc_v3_StreamedBodyResponse_grpc_message_compressed(
144
+ streamed_response)) {
145
+ return absl::InternalError("grpc_message_compressed is not supported");
146
+ }
147
+ auto body =
148
+ envoy_service_ext_proc_v3_StreamedBodyResponse_body(streamed_response);
149
+ bool end_of_stream =
150
+ envoy_service_ext_proc_v3_StreamedBodyResponse_end_of_stream(
151
+ streamed_response);
152
+ bool end_of_stream_without_message =
153
+ envoy_service_ext_proc_v3_StreamedBodyResponse_end_of_stream_without_message(
154
+ streamed_response);
155
+ return ExtProcResponse::BodyMutation{
156
+ UpbStringToStdString(body), end_of_stream, end_of_stream_without_message};
157
+ }
158
+ } // namespace
159
+
160
+ absl::StatusOr<ExtProcResponse> ExtProcResponse::Parse(
161
+ absl::string_view serialized_response) {
162
+ upb::Arena arena;
163
+ const auto* response = envoy_service_ext_proc_v3_ProcessingResponse_parse(
164
+ serialized_response.data(), serialized_response.size(), arena.ptr());
165
+ if (response == nullptr) {
166
+ return absl::InternalError("Failed to parse ProcessingResponse");
167
+ }
168
+ ExtProcResponse ext_proc_response;
169
+ // parse request_drain
170
+ ext_proc_response.request_drain =
171
+ envoy_service_ext_proc_v3_ProcessingResponse_request_drain(response);
172
+ switch (
173
+ envoy_service_ext_proc_v3_ProcessingResponse_response_case(response)) {
174
+ case envoy_service_ext_proc_v3_ProcessingResponse_response_request_headers: {
175
+ const envoy_service_ext_proc_v3_HeadersResponse* request_headers =
176
+ envoy_service_ext_proc_v3_ProcessingResponse_request_headers(
177
+ response);
178
+ if (request_headers == nullptr) {
179
+ return absl::InternalError("request_headers is not set");
180
+ }
181
+ const envoy_service_ext_proc_v3_CommonResponse* common_response =
182
+ envoy_service_ext_proc_v3_HeadersResponse_response(request_headers);
183
+ auto mutation = ParseExtProcHeaders(common_response);
184
+ if (!mutation.ok()) return mutation.status();
185
+ ext_proc_response.response = RequestHeaders{std::move(*mutation)};
186
+ break;
187
+ }
188
+ case envoy_service_ext_proc_v3_ProcessingResponse_response_response_headers: {
189
+ const envoy_service_ext_proc_v3_HeadersResponse* response_headers =
190
+ envoy_service_ext_proc_v3_ProcessingResponse_response_headers(
191
+ response);
192
+ if (response_headers == nullptr) {
193
+ return absl::InternalError("response_headers is not set");
194
+ }
195
+ const envoy_service_ext_proc_v3_CommonResponse* common_response =
196
+ envoy_service_ext_proc_v3_HeadersResponse_response(response_headers);
197
+ auto mutation = ParseExtProcHeaders(common_response);
198
+ if (!mutation.ok()) return mutation.status();
199
+ ext_proc_response.response = ResponseHeaders{std::move(*mutation)};
200
+ break;
201
+ }
202
+ case envoy_service_ext_proc_v3_ProcessingResponse_response_response_trailers: {
203
+ const envoy_service_ext_proc_v3_TrailersResponse* response_trailer =
204
+ envoy_service_ext_proc_v3_ProcessingResponse_response_trailers(
205
+ response);
206
+ if (response_trailer == nullptr) {
207
+ return absl::InternalError("response_trailer is not set");
208
+ }
209
+ const envoy_service_ext_proc_v3_HeaderMutation* header_mutation =
210
+ envoy_service_ext_proc_v3_TrailersResponse_header_mutation(
211
+ response_trailer);
212
+ auto mutation = ParseExtProcHeaderMutation(header_mutation);
213
+ if (!mutation.ok()) return mutation.status();
214
+ ext_proc_response.response = ResponseTrailers{std::move(*mutation)};
215
+ break;
216
+ }
217
+ case envoy_service_ext_proc_v3_ProcessingResponse_response_request_body: {
218
+ const envoy_service_ext_proc_v3_BodyResponse* request_body =
219
+ envoy_service_ext_proc_v3_ProcessingResponse_request_body(response);
220
+ if (request_body == nullptr) {
221
+ return absl::InternalError("request_body is not set");
222
+ }
223
+ const envoy_service_ext_proc_v3_CommonResponse* common_response =
224
+ envoy_service_ext_proc_v3_BodyResponse_response(request_body);
225
+ auto mutation = ParseExtProcBodyMutation(common_response);
226
+ if (!mutation.ok()) return mutation.status();
227
+ ext_proc_response.response = RequestBody{std::move(*mutation)};
228
+ break;
229
+ }
230
+ case envoy_service_ext_proc_v3_ProcessingResponse_response_response_body: {
231
+ const envoy_service_ext_proc_v3_BodyResponse* response_body =
232
+ envoy_service_ext_proc_v3_ProcessingResponse_response_body(response);
233
+ if (response_body == nullptr) {
234
+ return absl::InternalError("response_body is not set");
235
+ }
236
+ const envoy_service_ext_proc_v3_CommonResponse* common_response =
237
+ envoy_service_ext_proc_v3_BodyResponse_response(response_body);
238
+ auto mutation = ParseExtProcBodyMutation(common_response);
239
+ if (!mutation.ok()) return mutation.status();
240
+ if (mutation->end_of_stream || mutation->end_of_stream_without_message) {
241
+ return absl::InternalError(
242
+ "end_of_stream / end_of_stream_without_message is not supported "
243
+ "for response_body");
244
+ }
245
+ ext_proc_response.response = ResponseBody{std::move(*mutation)};
246
+ break;
247
+ }
248
+ case envoy_service_ext_proc_v3_ProcessingResponse_response_immediate_response: {
249
+ const envoy_service_ext_proc_v3_ImmediateResponse* immediate_response =
250
+ envoy_service_ext_proc_v3_ProcessingResponse_immediate_response(
251
+ response);
252
+ if (immediate_response == nullptr) {
253
+ return absl::InternalError("immediate_response is not set");
254
+ }
255
+ ExtProcResponse::ImmediateResponse immediate_response_value;
256
+ immediate_response_value.details = UpbStringToStdString(
257
+ envoy_service_ext_proc_v3_ImmediateResponse_details(
258
+ immediate_response));
259
+ auto header_mutation = ParseExtProcHeaderMutation(
260
+ envoy_service_ext_proc_v3_ImmediateResponse_headers(
261
+ immediate_response));
262
+ if (!header_mutation.ok()) return header_mutation.status();
263
+ immediate_response_value.header_mutation = std::move(*header_mutation);
264
+ auto grpc_status =
265
+ envoy_service_ext_proc_v3_ImmediateResponse_grpc_status(
266
+ immediate_response);
267
+ if (grpc_status == nullptr) {
268
+ return absl::InternalError(
269
+ "grpc_status is not set in ImmediateResponse");
270
+ }
271
+ grpc_status_code status_code;
272
+ if (!grpc_status_code_from_int(
273
+ envoy_service_ext_proc_v3_GrpcStatus_status(grpc_status),
274
+ &status_code)) {
275
+ return absl::InternalError(
276
+ "Invalid grpc status code in ImmediateResponse");
277
+ }
278
+ immediate_response_value.status = status_code;
279
+ ext_proc_response.response = std::move(immediate_response_value);
280
+ break;
281
+ }
282
+ case envoy_service_ext_proc_v3_ProcessingResponse_response_NOT_SET:
283
+ break;
284
+ default:
285
+ return absl::InternalError(absl::StrCat(
286
+ "Unsupported ProcessingResponse response case: ",
287
+ envoy_service_ext_proc_v3_ProcessingResponse_response_case(
288
+ response)));
289
+ }
290
+ return ext_proc_response;
291
+ }
292
+
293
+ //
294
+ // CreateExtProcRequest()
295
+ //
296
+
297
+ namespace {
298
+
299
+ // An encoder class used with grpc_metadata_batch::Encode() to iterate over all
300
+ // metadata entries in a batch and populate a upb envoy.config.core.v3.HeaderMap
301
+ // message.
302
+ //
303
+ // Filters metadata entries against allowed and disallowed StringMatcher lists:
304
+ // - If disallowed matchers are specified and a header key matches, it is
305
+ // skipped.
306
+ // - If allowed matchers are specified, only matching header keys are included.
307
+ // - In accordance with gRFC A102, for each forwarded header, the raw_value
308
+ // field is
309
+ // populated instead of the value field to preserve exact binary/raw header
310
+ // bytes.
311
+ class UpbHeaderMapEncoder {
312
+ public:
313
+ UpbHeaderMapEncoder(envoy_config_core_v3_HeaderMap* header_map,
314
+ upb_Arena* arena,
315
+ const std::vector<StringMatcher>& allowed_headers,
316
+ const std::vector<StringMatcher>& disallowed_headers)
317
+ : header_map_(header_map),
318
+ arena_(arena),
319
+ allowed_headers_(allowed_headers),
320
+ disallowed_headers_(disallowed_headers) {}
321
+
322
+ void Encode(const Slice& key, const Slice& value) {
323
+ Append(key.as_string_view(), value.as_string_view());
324
+ }
325
+
326
+ template <typename Which>
327
+ void Encode(Which, const typename Which::ValueType& value) {
328
+ Append(Which::key(), Which::Encode(value).as_string_view());
329
+ }
330
+
331
+ private:
332
+ ABSL_ATTRIBUTE_NOINLINE static bool HeaderInMatcher(
333
+ absl::string_view key, const std::vector<StringMatcher>& matchers) {
334
+ for (const auto& matcher : matchers) {
335
+ if (matcher.Match(key)) return true;
336
+ }
337
+ return false;
338
+ }
339
+
340
+ ABSL_ATTRIBUTE_NOINLINE bool ShouldForwardHeader(
341
+ absl::string_view key) const {
342
+ if (disallowed_headers_.empty()) {
343
+ return allowed_headers_.empty() || HeaderInMatcher(key, allowed_headers_);
344
+ }
345
+ if (HeaderInMatcher(key, disallowed_headers_)) {
346
+ return false;
347
+ }
348
+ return allowed_headers_.empty() || HeaderInMatcher(key, allowed_headers_);
349
+ }
350
+
351
+ ABSL_ATTRIBUTE_NOINLINE void Append(absl::string_view key,
352
+ absl::string_view value) {
353
+ if (!ShouldForwardHeader(key)) {
354
+ return;
355
+ }
356
+ auto* value_msg =
357
+ envoy_config_core_v3_HeaderMap_add_headers(header_map_, arena_);
358
+ envoy_config_core_v3_HeaderValue_set_key(
359
+ value_msg, upb_StringView_FromDataAndSize(key.data(), key.size()));
360
+ // Per gRFC A102, when writing, we always set the raw_value field and never
361
+ // the value field.
362
+ envoy_config_core_v3_HeaderValue_set_raw_value(
363
+ value_msg, upb_StringView_FromDataAndSize(value.data(), value.size()));
364
+ }
365
+
366
+ envoy_config_core_v3_HeaderMap* header_map_;
367
+ upb_Arena* arena_;
368
+ const std::vector<StringMatcher>& allowed_headers_;
369
+ const std::vector<StringMatcher>& disallowed_headers_;
370
+ };
371
+
372
+ void PopulateMetadataBatchToHeaderMap(
373
+ grpc_metadata_batch& batch,
374
+ const std::vector<StringMatcher>& allowed_headers,
375
+ const std::vector<StringMatcher>& disallowed_headers, upb_Arena* arena,
376
+ envoy_config_core_v3_HeaderMap* header_map) {
377
+ UpbHeaderMapEncoder encoder(header_map, arena, allowed_headers,
378
+ disallowed_headers);
379
+ batch.Encode(&encoder);
380
+ }
381
+
382
+ void SetExtProcRequestHeaders(
383
+ upb_Arena* arena, envoy_config_core_v3_HeaderMap* headers,
384
+ envoy_service_ext_proc_v3_ProcessingRequest* request) {
385
+ auto http_headers = envoy_service_ext_proc_v3_HttpHeaders_new(arena);
386
+ envoy_service_ext_proc_v3_HttpHeaders_set_headers(http_headers, headers);
387
+ envoy_service_ext_proc_v3_HttpHeaders_set_end_of_stream(http_headers, false);
388
+ envoy_service_ext_proc_v3_ProcessingRequest_set_request_headers(request,
389
+ http_headers);
390
+ }
391
+
392
+ void SetExtProcResponseHeaders(
393
+ upb_Arena* arena, envoy_config_core_v3_HeaderMap* headers,
394
+ bool end_of_stream, envoy_service_ext_proc_v3_ProcessingRequest* request) {
395
+ auto http_headers = envoy_service_ext_proc_v3_HttpHeaders_new(arena);
396
+ envoy_service_ext_proc_v3_HttpHeaders_set_headers(http_headers, headers);
397
+ if (end_of_stream) {
398
+ envoy_service_ext_proc_v3_HttpHeaders_set_end_of_stream(http_headers,
399
+ end_of_stream);
400
+ }
401
+ envoy_service_ext_proc_v3_ProcessingRequest_set_response_headers(
402
+ request, http_headers);
403
+ }
404
+
405
+ void SetExtProcRequestBody(
406
+ upb_Arena* arena, upb_StringView buf, bool end_of_stream,
407
+ bool end_of_stream_without_message,
408
+ envoy_service_ext_proc_v3_ProcessingRequest* request) {
409
+ envoy_service_ext_proc_v3_HttpBody* body =
410
+ envoy_service_ext_proc_v3_HttpBody_new(arena);
411
+ envoy_service_ext_proc_v3_HttpBody_set_body(body, buf);
412
+ if (end_of_stream) {
413
+ envoy_service_ext_proc_v3_HttpBody_set_end_of_stream(body, end_of_stream);
414
+ }
415
+ if (end_of_stream_without_message) {
416
+ envoy_service_ext_proc_v3_HttpBody_set_end_of_stream_without_message(body,
417
+ true);
418
+ }
419
+ envoy_service_ext_proc_v3_ProcessingRequest_set_request_body(request, body);
420
+ }
421
+
422
+ void SetExtProcResponseBody(
423
+ upb_Arena* arena, upb_StringView buf,
424
+ envoy_service_ext_proc_v3_ProcessingRequest* request) {
425
+ envoy_service_ext_proc_v3_HttpBody* body =
426
+ envoy_service_ext_proc_v3_HttpBody_new(arena);
427
+ envoy_service_ext_proc_v3_HttpBody_set_body(body, buf);
428
+ envoy_service_ext_proc_v3_ProcessingRequest_set_response_body(request, body);
429
+ }
430
+
431
+ void SetExtProcResponseTrailers(
432
+ upb_Arena* arena, envoy_config_core_v3_HeaderMap* trailer,
433
+ envoy_service_ext_proc_v3_ProcessingRequest* request) {
434
+ auto http_trailers = envoy_service_ext_proc_v3_HttpTrailers_new(arena);
435
+ envoy_service_ext_proc_v3_HttpTrailers_set_trailers(http_trailers, trailer);
436
+ envoy_service_ext_proc_v3_ProcessingRequest_set_response_trailers(
437
+ request, http_trailers);
438
+ }
439
+
440
+ void SetExtProcAttributes(
441
+ upb_Arena* arena, ::google_protobuf_Struct* attributes,
442
+ envoy_service_ext_proc_v3_ProcessingRequest* request) {
443
+ if (attributes == nullptr) return;
444
+ constexpr absl::string_view kAttributeKey = "envoy.filters.http.ext_proc";
445
+ envoy_service_ext_proc_v3_ProcessingRequest_attributes_set(
446
+ request,
447
+ upb_StringView_FromDataAndSize(kAttributeKey.data(),
448
+ kAttributeKey.size()),
449
+ attributes, arena);
450
+ }
451
+
452
+ void SetExtProcProtocolConfig(
453
+ upb_Arena* arena, const ExtProcProcessingMode& processing_mode,
454
+ envoy_service_ext_proc_v3_ProcessingRequest* request) {
455
+ auto* protocol_config =
456
+ envoy_service_ext_proc_v3_ProcessingRequest_mutable_protocol_config(
457
+ request, arena);
458
+ envoy_service_ext_proc_v3_ProtocolConfiguration_set_request_body_mode(
459
+ protocol_config,
460
+ processing_mode.send_request_body
461
+ ? envoy_extensions_filters_http_ext_proc_v3_ProcessingMode_GRPC
462
+ : envoy_extensions_filters_http_ext_proc_v3_ProcessingMode_NONE);
463
+ envoy_service_ext_proc_v3_ProtocolConfiguration_set_response_body_mode(
464
+ protocol_config,
465
+ processing_mode.send_response_body
466
+ ? envoy_extensions_filters_http_ext_proc_v3_ProcessingMode_GRPC
467
+ : envoy_extensions_filters_http_ext_proc_v3_ProcessingMode_NONE);
468
+ }
469
+
470
+ absl::StatusOr<std::string> SerializeExtProcMessage(
471
+ envoy_service_ext_proc_v3_ProcessingRequest* request, upb_Arena* arena) {
472
+ size_t size;
473
+ auto message = envoy_service_ext_proc_v3_ProcessingRequest_serialize(
474
+ request, arena, &size);
475
+ if (message == nullptr) {
476
+ return absl::InternalError("Failed to serialize ProcessingRequest");
477
+ }
478
+ return std::string(message, size);
479
+ }
480
+
481
+ envoy_service_ext_proc_v3_ProcessingRequest* CreateCommonRequest(
482
+ upb_Arena* arena, ::google_protobuf_Struct* attributes,
483
+ bool observability_mode,
484
+ std::optional<ExtProcProcessingMode> processing_mode) {
485
+ auto* request = envoy_service_ext_proc_v3_ProcessingRequest_new(arena);
486
+ SetExtProcAttributes(arena, attributes, request);
487
+ envoy_service_ext_proc_v3_ProcessingRequest_set_observability_mode(
488
+ request, observability_mode);
489
+ if (processing_mode.has_value()) {
490
+ SetExtProcProtocolConfig(arena, *processing_mode, request);
491
+ }
492
+ return request;
493
+ }
494
+
495
+ // An encoder class used with grpc_metadata_batch::Encode() to iterate over all
496
+ // metadata entries in a batch and insert them as key-value pairs into a upb
497
+ // google.protobuf.Struct message.
498
+ //
499
+ // For each metadata entry encountered, it converts the key and value to string
500
+ // views and creates a google.protobuf.Value string field in the target Struct
501
+ // message on the arena.
502
+ class UpbStructHeadersEncoder {
503
+ public:
504
+ UpbStructHeadersEncoder(::google_protobuf_Struct* struct_msg,
505
+ upb_Arena* arena)
506
+ : struct_msg_(struct_msg), arena_(arena) {}
507
+
508
+ void Encode(const Slice& key, const Slice& value) {
509
+ Append(key.as_string_view(), value.as_string_view());
510
+ }
511
+
512
+ template <typename Which>
513
+ void Encode(Which, const typename Which::ValueType& value) {
514
+ Append(Which::key(), Which::Encode(value).as_string_view());
515
+ }
516
+
517
+ private:
518
+ ABSL_ATTRIBUTE_NOINLINE void Append(absl::string_view key,
519
+ absl::string_view value) {
520
+ ::google_protobuf_Value* val_msg = ::google_protobuf_Value_new(arena_);
521
+ ::google_protobuf_Value_set_string_value(
522
+ val_msg, upb_StringView_FromDataAndSize(value.data(), value.size()));
523
+ ::google_protobuf_Struct_fields_set(
524
+ struct_msg_, upb_StringView_FromDataAndSize(key.data(), key.size()),
525
+ val_msg, arena_);
526
+ }
527
+
528
+ ::google_protobuf_Struct* struct_msg_;
529
+ upb_Arena* arena_;
530
+ };
531
+
532
+ } // namespace
533
+
534
+ //
535
+ // CreateExtProcAttributesProtoStruct()
536
+ //
537
+
538
+ // TODO(rishesh): Support CEL attributes from A103 (except
539
+ // xds.cluster_metadata.filter_metadata) when adding support for ext_proc on
540
+ // the server side. See
541
+ // https://github.com/grpc/proposal/blob/master/A103-xds-composite-filter.md#cel-attributes
542
+ ::google_protobuf_Struct* CreateExtProcAttributesProtoStruct(
543
+ upb_Arena* arena, const std::vector<std::string>& attributes,
544
+ const grpc_metadata_batch& metadata) {
545
+ if (attributes.empty()) return nullptr;
546
+ ::google_protobuf_Struct* struct_msg = ::google_protobuf_Struct_new(arena);
547
+ auto add_field = [&](absl::string_view name, absl::string_view value) {
548
+ ::google_protobuf_Value* val_msg = ::google_protobuf_Value_new(arena);
549
+ ::google_protobuf_Value_set_string_value(
550
+ val_msg, upb_StringView_FromDataAndSize(value.data(), value.size()));
551
+ ::google_protobuf_Struct_fields_set(
552
+ struct_msg, upb_StringView_FromDataAndSize(name.data(), name.size()),
553
+ val_msg, arena);
554
+ };
555
+ for (const auto& attr : attributes) {
556
+ if (attr == "request.path" || attr == "request.url_path") {
557
+ if (const Slice* path = metadata.get_pointer(HttpPathMetadata())) {
558
+ add_field(attr, path->as_string_view());
559
+ }
560
+ } else if (attr == "request.host") {
561
+ if (const Slice* auth = metadata.get_pointer(HttpAuthorityMetadata())) {
562
+ add_field(attr, auth->as_string_view());
563
+ } else if (const Slice* host = metadata.get_pointer(HostMetadata())) {
564
+ add_field(attr, host->as_string_view());
565
+ }
566
+ } else if (attr == "request.method") {
567
+ if (auto* method = metadata.get_pointer(HttpMethodMetadata())) {
568
+ add_field(attr, HttpMethodMetadata::Encode(*method).as_string_view());
569
+ } else {
570
+ add_field(attr, "POST");
571
+ }
572
+ } else if (attr == "request.headers") {
573
+ ::google_protobuf_Struct* headers_struct =
574
+ ::google_protobuf_Struct_new(arena);
575
+ UpbStructHeadersEncoder encoder(headers_struct, arena);
576
+ metadata.Encode(&encoder);
577
+ ::google_protobuf_Value* val_msg = ::google_protobuf_Value_new(arena);
578
+ ::google_protobuf_Value_set_struct_value(val_msg, headers_struct);
579
+ ::google_protobuf_Struct_fields_set(
580
+ struct_msg, upb_StringView_FromDataAndSize(attr.data(), attr.size()),
581
+ val_msg, arena);
582
+ } else if (attr == "request.referer" || attr == "request.useragent" ||
583
+ attr == "request.id") {
584
+ absl::string_view key;
585
+ if (attr == "request.referer") {
586
+ key = "referer";
587
+ } else if (attr == "request.useragent") {
588
+ key = "user-agent";
589
+ } else {
590
+ key = "x-request-id";
591
+ }
592
+ std::string backing_str;
593
+ std::optional<absl::string_view> val =
594
+ metadata.GetStringValue(key, &backing_str);
595
+ if (val.has_value()) add_field(attr, *val);
596
+ } else if (attr == "request.query") {
597
+ add_field(attr, "");
598
+ }
599
+ }
600
+ return struct_msg;
601
+ }
602
+
603
+ namespace {
604
+
605
+ envoy_config_core_v3_HeaderMap* CreateUpbHeaderMap(
606
+ upb_Arena* arena, grpc_metadata_batch& metadata,
607
+ const std::vector<StringMatcher>& allowed_headers,
608
+ const std::vector<StringMatcher>& disallowed_headers) {
609
+ auto* upb_headers = envoy_config_core_v3_HeaderMap_new(arena);
610
+ PopulateMetadataBatchToHeaderMap(metadata, allowed_headers,
611
+ disallowed_headers, arena, upb_headers);
612
+ return upb_headers;
613
+ }
614
+
615
+ absl::StatusOr<std::string> CreateRequestAndSerialize(
616
+ upb_Arena* arena, ::google_protobuf_Struct* attributes,
617
+ bool observability_mode,
618
+ std::optional<ExtProcProcessingMode> processing_mode,
619
+ absl::FunctionRef<void(envoy_service_ext_proc_v3_ProcessingRequest*)>
620
+ populate_payload) {
621
+ auto* request = CreateCommonRequest(arena, attributes, observability_mode,
622
+ processing_mode);
623
+ populate_payload(request);
624
+ return SerializeExtProcMessage(request, arena);
625
+ }
626
+
627
+ } // namespace
628
+
629
+ absl::StatusOr<std::string> CreateExtProcClientHeadersRequest(
630
+ upb_Arena* arena, grpc_metadata_batch* metadata,
631
+ const std::vector<StringMatcher>& allowed_headers,
632
+ const std::vector<StringMatcher>& disallowed_headers,
633
+ ::google_protobuf_Struct* attributes, bool observability_mode,
634
+ std::optional<ExtProcProcessingMode> processing_mode) {
635
+ return CreateRequestAndSerialize(
636
+ arena, attributes, observability_mode, processing_mode,
637
+ [&](envoy_service_ext_proc_v3_ProcessingRequest* request) {
638
+ auto* upb_headers = CreateUpbHeaderMap(
639
+ arena, *metadata, allowed_headers, disallowed_headers);
640
+ SetExtProcRequestHeaders(arena, upb_headers, request);
641
+ });
642
+ }
643
+
644
+ absl::StatusOr<std::string> CreateExtProcServerHeadersRequest(
645
+ upb_Arena* arena, grpc_metadata_batch* metadata,
646
+ const std::vector<StringMatcher>& allowed_headers,
647
+ const std::vector<StringMatcher>& disallowed_headers,
648
+ ::google_protobuf_Struct* attributes, bool observability_mode,
649
+ std::optional<ExtProcProcessingMode> processing_mode, bool end_of_stream) {
650
+ return CreateRequestAndSerialize(
651
+ arena, attributes, observability_mode, processing_mode,
652
+ [&](envoy_service_ext_proc_v3_ProcessingRequest* request) {
653
+ auto* upb_headers = CreateUpbHeaderMap(
654
+ arena, *metadata, allowed_headers, disallowed_headers);
655
+ SetExtProcResponseHeaders(arena, upb_headers, end_of_stream, request);
656
+ });
657
+ }
658
+
659
+ absl::StatusOr<std::string> CreateExtProcClientBodyRequest(
660
+ upb_Arena* arena, absl::string_view body,
661
+ ::google_protobuf_Struct* attributes, bool observability_mode,
662
+ std::optional<ExtProcProcessingMode> processing_mode, bool end_of_stream,
663
+ bool end_of_stream_without_message) {
664
+ return CreateRequestAndSerialize(
665
+ arena, attributes, observability_mode, processing_mode,
666
+ [&](envoy_service_ext_proc_v3_ProcessingRequest* request) {
667
+ SetExtProcRequestBody(
668
+ arena, upb_StringView_FromDataAndSize(body.data(), body.size()),
669
+ end_of_stream, end_of_stream_without_message, request);
670
+ });
671
+ }
672
+
673
+ absl::StatusOr<std::string> CreateExtProcServerBodyRequest(
674
+ upb_Arena* arena, absl::string_view body,
675
+ ::google_protobuf_Struct* attributes, bool observability_mode,
676
+ std::optional<ExtProcProcessingMode> processing_mode) {
677
+ return CreateRequestAndSerialize(
678
+ arena, attributes, observability_mode, processing_mode,
679
+ [&](envoy_service_ext_proc_v3_ProcessingRequest* request) {
680
+ SetExtProcResponseBody(
681
+ arena, upb_StringView_FromDataAndSize(body.data(), body.size()),
682
+ request);
683
+ });
684
+ }
685
+
686
+ absl::StatusOr<std::string> CreateExtProcServerTrailersRequest(
687
+ upb_Arena* arena, grpc_metadata_batch* trailers,
688
+ const std::vector<StringMatcher>& allowed_headers,
689
+ const std::vector<StringMatcher>& disallowed_headers,
690
+ ::google_protobuf_Struct* attributes, bool observability_mode,
691
+ std::optional<ExtProcProcessingMode> processing_mode) {
692
+ return CreateRequestAndSerialize(
693
+ arena, attributes, observability_mode, processing_mode,
694
+ [&](envoy_service_ext_proc_v3_ProcessingRequest* request) {
695
+ auto* upb_trailers = CreateUpbHeaderMap(
696
+ arena, *trailers, allowed_headers, disallowed_headers);
697
+ SetExtProcResponseTrailers(arena, upb_trailers, request);
698
+ });
699
+ }
700
+
701
+ } // namespace grpc_core