diff --git a/BUILD b/BUILD
index c6137df4eb0..ba954150eb6 100644
--- a/BUILD
+++ b/BUILD
@@ -3664,6 +3664,31 @@ grpc_upb_proto_reflection_library(
deps = ["@envoy_api//envoy/extensions/filters/http/router/v3:pkg"],
)
+grpc_upb_proto_library(
+ name = "envoy_extensions_filters_http_stateful_session_upb",
+ deps = ["@envoy_api//envoy/extensions/filters/http/stateful_session/v3:pkg"],
+)
+
+grpc_upb_proto_reflection_library(
+ name = "envoy_extensions_filters_http_stateful_session_upbdefs",
+ deps = ["@envoy_api//envoy/extensions/filters/http/stateful_session/v3:pkg"],
+)
+
+grpc_upb_proto_library(
+ name = "envoy_extensions_http_stateful_session_cookie_upb",
+ deps = ["@envoy_api//envoy/extensions/http/stateful_session/cookie/v3:pkg"],
+)
+
+grpc_upb_proto_reflection_library(
+ name = "envoy_extensions_http_stateful_session_cookie_upbdefs",
+ deps = ["@envoy_api//envoy/extensions/http/stateful_session/cookie/v3:pkg"],
+)
+
+grpc_upb_proto_library(
+ name = "envoy_type_http_upb",
+ deps = ["@envoy_api//envoy/type/http/v3:pkg"],
+)
+
grpc_upb_proto_library(
name = "envoy_extensions_load_balancing_policies_ring_hash_upb",
deps = ["@envoy_api//envoy/extensions/load_balancing_policies/ring_hash/v3:pkg"],
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6c82b671450..3f6656dbe62 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -652,6 +652,9 @@ protobuf_generate_grpc_cpp_with_import_path_correction(
protobuf_generate_grpc_cpp_with_import_path_correction(
src/proto/grpc/testing/xds/v3/config_source.proto src/proto/grpc/testing/xds/v3/config_source.proto
)
+protobuf_generate_grpc_cpp_with_import_path_correction(
+ src/proto/grpc/testing/xds/v3/cookie.proto src/proto/grpc/testing/xds/v3/cookie.proto
+)
protobuf_generate_grpc_cpp_with_import_path_correction(
src/proto/grpc/testing/xds/v3/csds.proto src/proto/grpc/testing/xds/v3/csds.proto
)
@@ -730,6 +733,12 @@ protobuf_generate_grpc_cpp_with_import_path_correction(
protobuf_generate_grpc_cpp_with_import_path_correction(
src/proto/grpc/testing/xds/v3/router.proto src/proto/grpc/testing/xds/v3/router.proto
)
+protobuf_generate_grpc_cpp_with_import_path_correction(
+ src/proto/grpc/testing/xds/v3/stateful_session.proto src/proto/grpc/testing/xds/v3/stateful_session.proto
+)
+protobuf_generate_grpc_cpp_with_import_path_correction(
+ src/proto/grpc/testing/xds/v3/stateful_session_cookie.proto src/proto/grpc/testing/xds/v3/stateful_session_cookie.proto
+)
protobuf_generate_grpc_cpp_with_import_path_correction(
src/proto/grpc/testing/xds/v3/string.proto src/proto/grpc/testing/xds/v3/string.proto
)
@@ -1835,7 +1844,9 @@ add_library(grpc
src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c
src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c
src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c
+ src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c
src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c
+ src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c
src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c
src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c
@@ -1982,7 +1993,9 @@ add_library(grpc
src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c
src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c
src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c
+ src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c
src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c
+ src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c
@@ -2068,6 +2081,7 @@ add_library(grpc
src/core/ext/xds/xds_http_fault_filter.cc
src/core/ext/xds/xds_http_filters.cc
src/core/ext/xds/xds_http_rbac_filter.cc
+ src/core/ext/xds/xds_http_stateful_session_filter.cc
src/core/ext/xds/xds_lb_policy_registry.cc
src/core/ext/xds/xds_listener.cc
src/core/ext/xds/xds_route_config.cc
@@ -23510,6 +23524,10 @@ add_executable(xds_http_filters_test
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/base.grpc.pb.cc
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/base.pb.h
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/base.grpc.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/cookie.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/cookie.grpc.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/cookie.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/cookie.grpc.pb.h
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/expr.pb.cc
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/expr.grpc.pb.cc
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/expr.pb.h
@@ -23562,10 +23580,22 @@ add_executable(xds_http_filters_test
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/router.grpc.pb.cc
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/router.pb.h
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/router.grpc.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/stateful_session.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/stateful_session.grpc.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/stateful_session.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/stateful_session.grpc.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/stateful_session_cookie.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/stateful_session_cookie.grpc.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/stateful_session_cookie.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/stateful_session_cookie.grpc.pb.h
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.pb.cc
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.grpc.pb.cc
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.pb.h
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.grpc.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/typed_struct.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/typed_struct.grpc.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/typed_struct.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/typed_struct.grpc.pb.h
test/core/xds/xds_http_filters_test.cc
test/cpp/util/cli_call.cc
test/cpp/util/cli_credentials.cc
diff --git a/Makefile b/Makefile
index 25deb30b39c..ae67135f8c2 100644
--- a/Makefile
+++ b/Makefile
@@ -1128,7 +1128,9 @@ LIBGRPC_SRC = \
src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c \
+ src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c \
+ src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c \
src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c \
src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c \
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c \
@@ -1275,7 +1277,9 @@ LIBGRPC_SRC = \
src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c \
+ src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c \
+ src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c \
@@ -1361,6 +1365,7 @@ LIBGRPC_SRC = \
src/core/ext/xds/xds_http_fault_filter.cc \
src/core/ext/xds/xds_http_filters.cc \
src/core/ext/xds/xds_http_rbac_filter.cc \
+ src/core/ext/xds/xds_http_stateful_session_filter.cc \
src/core/ext/xds/xds_lb_policy_registry.cc \
src/core/ext/xds/xds_listener.cc \
src/core/ext/xds/xds_route_config.cc \
@@ -2984,7 +2989,9 @@ src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c:
src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c: $(OPENSSL_DEP)
+src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c: $(OPENSSL_DEP)
+src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c: $(OPENSSL_DEP)
@@ -3112,7 +3119,9 @@ src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.up
src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c: $(OPENSSL_DEP)
@@ -3197,6 +3206,7 @@ src/core/ext/xds/xds_endpoint.cc: $(OPENSSL_DEP)
src/core/ext/xds/xds_http_fault_filter.cc: $(OPENSSL_DEP)
src/core/ext/xds/xds_http_filters.cc: $(OPENSSL_DEP)
src/core/ext/xds/xds_http_rbac_filter.cc: $(OPENSSL_DEP)
+src/core/ext/xds/xds_http_stateful_session_filter.cc: $(OPENSSL_DEP)
src/core/ext/xds/xds_lb_policy_registry.cc: $(OPENSSL_DEP)
src/core/ext/xds/xds_listener.cc: $(OPENSSL_DEP)
src/core/ext/xds/xds_route_config.cc: $(OPENSSL_DEP)
diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml
index 4062e449ecf..19195de96ec 100644
--- a/build_autogenerated.yaml
+++ b/build_autogenerated.yaml
@@ -469,7 +469,9 @@ libs:
- src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h
- src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h
- src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h
+ - src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h
- src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h
+ - src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h
- src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h
- src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h
- src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h
@@ -616,7 +618,9 @@ libs:
- src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h
+ - src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h
+ - src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h
@@ -704,6 +708,7 @@ libs:
- src/core/ext/xds/xds_http_fault_filter.h
- src/core/ext/xds/xds_http_filters.h
- src/core/ext/xds/xds_http_rbac_filter.h
+ - src/core/ext/xds/xds_http_stateful_session_filter.h
- src/core/ext/xds/xds_lb_policy_registry.h
- src/core/ext/xds/xds_listener.h
- src/core/ext/xds/xds_resource_type.h
@@ -1218,7 +1223,9 @@ libs:
- src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c
- src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c
- src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c
+ - src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c
- src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c
+ - src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c
- src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c
- src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c
- src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c
@@ -1365,7 +1372,9 @@ libs:
- src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c
+ - src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c
+ - src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c
@@ -1451,6 +1460,7 @@ libs:
- src/core/ext/xds/xds_http_fault_filter.cc
- src/core/ext/xds/xds_http_filters.cc
- src/core/ext/xds/xds_http_rbac_filter.cc
+ - src/core/ext/xds/xds_http_stateful_session_filter.cc
- src/core/ext/xds/xds_lb_policy_registry.cc
- src/core/ext/xds/xds_listener.cc
- src/core/ext/xds/xds_route_config.cc
@@ -12922,6 +12932,7 @@ targets:
- src/proto/grpc/reflection/v1alpha/reflection.proto
- src/proto/grpc/testing/xds/v3/address.proto
- src/proto/grpc/testing/xds/v3/base.proto
+ - src/proto/grpc/testing/xds/v3/cookie.proto
- src/proto/grpc/testing/xds/v3/expr.proto
- src/proto/grpc/testing/xds/v3/extension.proto
- src/proto/grpc/testing/xds/v3/fault.proto
@@ -12935,7 +12946,10 @@ targets:
- src/proto/grpc/testing/xds/v3/regex.proto
- src/proto/grpc/testing/xds/v3/route.proto
- src/proto/grpc/testing/xds/v3/router.proto
+ - src/proto/grpc/testing/xds/v3/stateful_session.proto
+ - src/proto/grpc/testing/xds/v3/stateful_session_cookie.proto
- src/proto/grpc/testing/xds/v3/string.proto
+ - src/proto/grpc/testing/xds/v3/typed_struct.proto
- test/core/xds/xds_http_filters_test.cc
- test/cpp/util/cli_call.cc
- test/cpp/util/cli_credentials.cc
diff --git a/config.m4 b/config.m4
index be56c6d24f9..d08006262f6 100644
--- a/config.m4
+++ b/config.m4
@@ -211,7 +211,9 @@ if test "$PHP_GRPC" != "no"; then
src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c \
+ src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c \
+ src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c \
src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c \
src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c \
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c \
@@ -358,7 +360,9 @@ if test "$PHP_GRPC" != "no"; then
src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c \
+ src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c \
+ src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c \
@@ -444,6 +448,7 @@ if test "$PHP_GRPC" != "no"; then
src/core/ext/xds/xds_http_fault_filter.cc \
src/core/ext/xds/xds_http_filters.cc \
src/core/ext/xds/xds_http_rbac_filter.cc \
+ src/core/ext/xds/xds_http_stateful_session_filter.cc \
src/core/ext/xds/xds_lb_policy_registry.cc \
src/core/ext/xds/xds_listener.cc \
src/core/ext/xds/xds_route_config.cc \
@@ -1276,7 +1281,9 @@ if test "$PHP_GRPC" != "no"; then
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3)
+ PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3)
+ PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3)
@@ -1325,7 +1332,9 @@ if test "$PHP_GRPC" != "no"; then
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3)
+ PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3)
+ PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/service/discovery/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3)
diff --git a/config.w32 b/config.w32
index dc38be5b9b7..a18ab80c5c1 100644
--- a/config.w32
+++ b/config.w32
@@ -177,7 +177,9 @@ if (PHP_GRPC != "no") {
"src\\core\\ext\\upb-generated\\envoy\\extensions\\filters\\http\\fault\\v3\\fault.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\extensions\\filters\\http\\rbac\\v3\\rbac.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\extensions\\filters\\http\\router\\v3\\router.upb.c " +
+ "src\\core\\ext\\upb-generated\\envoy\\extensions\\filters\\http\\stateful_session\\v3\\stateful_session.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\extensions\\filters\\network\\http_connection_manager\\v3\\http_connection_manager.upb.c " +
+ "src\\core\\ext\\upb-generated\\envoy\\extensions\\http\\stateful_session\\cookie\\v3\\cookie.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\extensions\\load_balancing_policies\\ring_hash\\v3\\ring_hash.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\extensions\\load_balancing_policies\\wrr_locality\\v3\\wrr_locality.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\extensions\\transport_sockets\\tls\\v3\\cert.upb.c " +
@@ -324,7 +326,9 @@ if (PHP_GRPC != "no") {
"src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\filters\\http\\fault\\v3\\fault.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\filters\\http\\rbac\\v3\\rbac.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\filters\\http\\router\\v3\\router.upbdefs.c " +
+ "src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\filters\\http\\stateful_session\\v3\\stateful_session.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\filters\\network\\http_connection_manager\\v3\\http_connection_manager.upbdefs.c " +
+ "src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\http\\stateful_session\\cookie\\v3\\cookie.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\transport_sockets\\tls\\v3\\cert.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\transport_sockets\\tls\\v3\\common.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\transport_sockets\\tls\\v3\\secret.upbdefs.c " +
@@ -410,6 +414,7 @@ if (PHP_GRPC != "no") {
"src\\core\\ext\\xds\\xds_http_fault_filter.cc " +
"src\\core\\ext\\xds\\xds_http_filters.cc " +
"src\\core\\ext\\xds\\xds_http_rbac_filter.cc " +
+ "src\\core\\ext\\xds\\xds_http_stateful_session_filter.cc " +
"src\\core\\ext\\xds\\xds_lb_policy_registry.cc " +
"src\\core\\ext\\xds\\xds_listener.cc " +
"src\\core\\ext\\xds\\xds_route_config.cc " +
@@ -1304,9 +1309,15 @@ if (PHP_GRPC != "no") {
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\filters\\http\\rbac\\v3");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\filters\\http\\router");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\filters\\http\\router\\v3");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\filters\\http\\stateful_session");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\filters\\http\\stateful_session\\v3");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\filters\\network");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\filters\\network\\http_connection_manager");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\filters\\network\\http_connection_manager\\v3");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\http");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\http\\stateful_session");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\http\\stateful_session\\cookie");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\http\\stateful_session\\cookie\\v3");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\load_balancing_policies");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\load_balancing_policies\\ring_hash");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\load_balancing_policies\\ring_hash\\v3");
@@ -1418,9 +1429,15 @@ if (PHP_GRPC != "no") {
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\filters\\http\\rbac\\v3");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\filters\\http\\router");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\filters\\http\\router\\v3");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\filters\\http\\stateful_session");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\filters\\http\\stateful_session\\v3");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\filters\\network");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\filters\\network\\http_connection_manager");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\filters\\network\\http_connection_manager\\v3");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\http");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\http\\stateful_session");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\http\\stateful_session\\cookie");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\http\\stateful_session\\cookie\\v3");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\transport_sockets");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\transport_sockets\\tls");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\transport_sockets\\tls\\v3");
diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec
index 06e4d6f03a4..0216c9aebd4 100644
--- a/gRPC-C++.podspec
+++ b/gRPC-C++.podspec
@@ -428,7 +428,9 @@ Pod::Spec.new do |s|
'src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h',
'src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h',
'src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h',
+ 'src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h',
'src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h',
+ 'src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h',
'src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h',
'src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h',
@@ -575,7 +577,9 @@ Pod::Spec.new do |s|
'src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h',
@@ -663,6 +667,7 @@ Pod::Spec.new do |s|
'src/core/ext/xds/xds_http_fault_filter.h',
'src/core/ext/xds/xds_http_filters.h',
'src/core/ext/xds/xds_http_rbac_filter.h',
+ 'src/core/ext/xds/xds_http_stateful_session_filter.h',
'src/core/ext/xds/xds_lb_policy_registry.h',
'src/core/ext/xds/xds_listener.h',
'src/core/ext/xds/xds_resource_type.h',
@@ -1318,7 +1323,9 @@ Pod::Spec.new do |s|
'src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h',
'src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h',
'src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h',
+ 'src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h',
'src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h',
+ 'src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h',
'src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h',
'src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h',
@@ -1465,7 +1472,9 @@ Pod::Spec.new do |s|
'src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h',
@@ -1553,6 +1562,7 @@ Pod::Spec.new do |s|
'src/core/ext/xds/xds_http_fault_filter.h',
'src/core/ext/xds/xds_http_filters.h',
'src/core/ext/xds/xds_http_rbac_filter.h',
+ 'src/core/ext/xds/xds_http_stateful_session_filter.h',
'src/core/ext/xds/xds_lb_policy_registry.h',
'src/core/ext/xds/xds_listener.h',
'src/core/ext/xds/xds_resource_type.h',
diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec
index fe346f0874d..46e9cf99f5c 100644
--- a/gRPC-Core.podspec
+++ b/gRPC-Core.podspec
@@ -523,8 +523,12 @@ Pod::Spec.new do |s|
'src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h',
'src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c',
'src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h',
+ 'src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c',
+ 'src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h',
'src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c',
'src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h',
+ 'src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c',
+ 'src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h',
'src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c',
'src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h',
'src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c',
@@ -817,8 +821,12 @@ Pod::Spec.new do |s|
'src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c',
@@ -991,6 +999,8 @@ Pod::Spec.new do |s|
'src/core/ext/xds/xds_http_filters.h',
'src/core/ext/xds/xds_http_rbac_filter.cc',
'src/core/ext/xds/xds_http_rbac_filter.h',
+ 'src/core/ext/xds/xds_http_stateful_session_filter.cc',
+ 'src/core/ext/xds/xds_http_stateful_session_filter.h',
'src/core/ext/xds/xds_lb_policy_registry.cc',
'src/core/ext/xds/xds_lb_policy_registry.h',
'src/core/ext/xds/xds_listener.cc',
@@ -1953,7 +1963,9 @@ Pod::Spec.new do |s|
'src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h',
'src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h',
'src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h',
+ 'src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h',
'src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h',
+ 'src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h',
'src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h',
'src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h',
@@ -2100,7 +2112,9 @@ Pod::Spec.new do |s|
'src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h',
@@ -2188,6 +2202,7 @@ Pod::Spec.new do |s|
'src/core/ext/xds/xds_http_fault_filter.h',
'src/core/ext/xds/xds_http_filters.h',
'src/core/ext/xds/xds_http_rbac_filter.h',
+ 'src/core/ext/xds/xds_http_stateful_session_filter.h',
'src/core/ext/xds/xds_lb_policy_registry.h',
'src/core/ext/xds/xds_listener.h',
'src/core/ext/xds/xds_resource_type.h',
diff --git a/grpc.gemspec b/grpc.gemspec
index cc9b64b2d28..bc0f98bf74c 100644
--- a/grpc.gemspec
+++ b/grpc.gemspec
@@ -434,8 +434,12 @@ Gem::Specification.new do |s|
s.files += %w( src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h )
s.files += %w( src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c )
s.files += %w( src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h )
+ s.files += %w( src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c )
+ s.files += %w( src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h )
s.files += %w( src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c )
s.files += %w( src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h )
+ s.files += %w( src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c )
+ s.files += %w( src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h )
s.files += %w( src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c )
s.files += %w( src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h )
s.files += %w( src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c )
@@ -728,8 +732,12 @@ Gem::Specification.new do |s|
s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h )
s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c )
s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h )
+ s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c )
+ s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h )
s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c )
s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h )
+ s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c )
+ s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h )
s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c )
s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h )
s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c )
@@ -902,6 +910,8 @@ Gem::Specification.new do |s|
s.files += %w( src/core/ext/xds/xds_http_filters.h )
s.files += %w( src/core/ext/xds/xds_http_rbac_filter.cc )
s.files += %w( src/core/ext/xds/xds_http_rbac_filter.h )
+ s.files += %w( src/core/ext/xds/xds_http_stateful_session_filter.cc )
+ s.files += %w( src/core/ext/xds/xds_http_stateful_session_filter.h )
s.files += %w( src/core/ext/xds/xds_lb_policy_registry.cc )
s.files += %w( src/core/ext/xds/xds_lb_policy_registry.h )
s.files += %w( src/core/ext/xds/xds_listener.cc )
diff --git a/grpc.gyp b/grpc.gyp
index a358e00870a..98e9c959390 100644
--- a/grpc.gyp
+++ b/grpc.gyp
@@ -541,7 +541,9 @@
'src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c',
'src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c',
'src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c',
+ 'src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c',
'src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c',
+ 'src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c',
'src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c',
'src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c',
@@ -688,7 +690,9 @@
'src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c',
@@ -774,6 +778,7 @@
'src/core/ext/xds/xds_http_fault_filter.cc',
'src/core/ext/xds/xds_http_filters.cc',
'src/core/ext/xds/xds_http_rbac_filter.cc',
+ 'src/core/ext/xds/xds_http_stateful_session_filter.cc',
'src/core/ext/xds/xds_lb_policy_registry.cc',
'src/core/ext/xds/xds_listener.cc',
'src/core/ext/xds/xds_route_config.cc',
diff --git a/package.xml b/package.xml
index 103c7702837..63c51853081 100644
--- a/package.xml
+++ b/package.xml
@@ -416,8 +416,12 @@
+
+
+
+
@@ -710,8 +714,12 @@
+
+
+
+
@@ -884,6 +892,8 @@
+
+
diff --git a/src/core/BUILD b/src/core/BUILD
index 904b77f0cb1..51ca51c268c 100644
--- a/src/core/BUILD
+++ b/src/core/BUILD
@@ -3564,6 +3564,7 @@ grpc_cc_library(
"ext/xds/xds_http_fault_filter.cc",
"ext/xds/xds_http_filters.cc",
"ext/xds/xds_http_rbac_filter.cc",
+ "ext/xds/xds_http_stateful_session_filter.cc",
"ext/xds/xds_lb_policy_registry.cc",
"ext/xds/xds_listener.cc",
"ext/xds/xds_route_config.cc",
@@ -3584,6 +3585,7 @@ grpc_cc_library(
"ext/xds/xds_http_fault_filter.h",
"ext/xds/xds_http_filters.h",
"ext/xds/xds_http_rbac_filter.h",
+ "ext/xds/xds_http_stateful_session_filter.h",
"ext/xds/xds_lb_policy_registry.h",
"ext/xds/xds_listener.h",
"ext/xds/xds_route_config.h",
@@ -3639,8 +3641,12 @@ grpc_cc_library(
"envoy_extensions_filters_http_rbac_upbdefs",
"envoy_extensions_filters_http_router_upb",
"envoy_extensions_filters_http_router_upbdefs",
+ "envoy_extensions_filters_http_stateful_session_upb",
+ "envoy_extensions_filters_http_stateful_session_upbdefs",
"envoy_extensions_filters_network_http_connection_manager_upb",
"envoy_extensions_filters_network_http_connection_manager_upbdefs",
+ "envoy_extensions_http_stateful_session_cookie_upb",
+ "envoy_extensions_http_stateful_session_cookie_upbdefs",
"envoy_extensions_load_balancing_policies_ring_hash_upb",
"envoy_extensions_load_balancing_policies_wrr_locality_upb",
"envoy_extensions_transport_sockets_tls_upb",
@@ -3651,6 +3657,7 @@ grpc_cc_library(
"envoy_service_load_stats_upbdefs",
"envoy_service_status_upb",
"envoy_service_status_upbdefs",
+ "envoy_type_http_upb",
"envoy_type_matcher_upb",
"envoy_type_upb",
"error",
@@ -3662,6 +3669,7 @@ grpc_cc_library(
"grpc_outlier_detection_header",
"grpc_rbac_filter",
"grpc_sockaddr",
+ "grpc_stateful_session_filter",
"grpc_tls_credentials",
"grpc_transport_chttp2_client_connector",
"init_internally",
@@ -5046,6 +5054,31 @@ grpc_upb_proto_reflection_library(
deps = ["@envoy_api//envoy/extensions/filters/http/router/v3:pkg"],
)
+grpc_upb_proto_library(
+ name = "envoy_extensions_filters_http_stateful_session_upb",
+ deps = ["@envoy_api//envoy/extensions/filters/http/stateful_session/v3:pkg"],
+)
+
+grpc_upb_proto_reflection_library(
+ name = "envoy_extensions_filters_http_stateful_session_upbdefs",
+ deps = ["@envoy_api//envoy/extensions/filters/http/stateful_session/v3:pkg"],
+)
+
+grpc_upb_proto_library(
+ name = "envoy_extensions_http_stateful_session_cookie_upb",
+ deps = ["@envoy_api//envoy/extensions/http/stateful_session/cookie/v3:pkg"],
+)
+
+grpc_upb_proto_reflection_library(
+ name = "envoy_extensions_http_stateful_session_cookie_upbdefs",
+ deps = ["@envoy_api//envoy/extensions/http/stateful_session/cookie/v3:pkg"],
+)
+
+grpc_upb_proto_library(
+ name = "envoy_type_http_upb",
+ deps = ["@envoy_api//envoy/type/http/v3:pkg"],
+)
+
grpc_upb_proto_library(
name = "envoy_extensions_load_balancing_policies_ring_hash_upb",
deps = ["@envoy_api//envoy/extensions/load_balancing_policies/ring_hash/v3:pkg"],
diff --git a/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c b/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c
new file mode 100644
index 00000000000..ad2079ab164
--- /dev/null
+++ b/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c
@@ -0,0 +1,62 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/extensions/filters/http/stateful_session/v3/stateful_session.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include
+#include "upb/msg_internal.h"
+#include "envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h"
+#include "envoy/config/core/v3/extension.upb.h"
+#include "udpa/annotations/status.upb.h"
+#include "validate/validate.upb.h"
+
+#include "upb/port_def.inc"
+
+static const upb_MiniTable_Sub envoy_extensions_filters_http_stateful_session_v3_StatefulSession_submsgs[1] = {
+ {.submsg = &envoy_config_core_v3_TypedExtensionConfig_msginit},
+};
+
+static const upb_MiniTable_Field envoy_extensions_filters_http_stateful_session_v3_StatefulSession__fields[1] = {
+ {1, UPB_SIZE(4, 8), UPB_SIZE(1, 1), 0, 11, kUpb_FieldMode_Scalar | (kUpb_FieldRep_Pointer << kUpb_FieldRep_Shift)},
+};
+
+const upb_MiniTable envoy_extensions_filters_http_stateful_session_v3_StatefulSession_msginit = {
+ &envoy_extensions_filters_http_stateful_session_v3_StatefulSession_submsgs[0],
+ &envoy_extensions_filters_http_stateful_session_v3_StatefulSession__fields[0],
+ UPB_SIZE(8, 16), 1, kUpb_ExtMode_NonExtendable, 1, 255, 0,
+};
+
+static const upb_MiniTable_Sub envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_submsgs[1] = {
+ {.submsg = &envoy_extensions_filters_http_stateful_session_v3_StatefulSession_msginit},
+};
+
+static const upb_MiniTable_Field envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute__fields[2] = {
+ {1, UPB_SIZE(4, 8), UPB_SIZE(-1, -1), kUpb_NoSub, 8, kUpb_FieldMode_Scalar | (kUpb_FieldRep_1Byte << kUpb_FieldRep_Shift)},
+ {2, UPB_SIZE(4, 8), UPB_SIZE(-1, -1), 0, 11, kUpb_FieldMode_Scalar | (kUpb_FieldRep_Pointer << kUpb_FieldRep_Shift)},
+};
+
+const upb_MiniTable envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_msginit = {
+ &envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_submsgs[0],
+ &envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute__fields[0],
+ UPB_SIZE(8, 16), 2, kUpb_ExtMode_NonExtendable, 2, 255, 0,
+};
+
+static const upb_MiniTable *messages_layout[2] = {
+ &envoy_extensions_filters_http_stateful_session_v3_StatefulSession_msginit,
+ &envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_msginit,
+};
+
+const upb_MiniTable_File envoy_extensions_filters_http_stateful_session_v3_stateful_session_proto_upb_file_layout = {
+ messages_layout,
+ NULL,
+ NULL,
+ 2,
+ 0,
+ 0,
+};
+
+#include "upb/port_undef.inc"
+
diff --git a/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h b/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h
new file mode 100644
index 00000000000..d93a0593580
--- /dev/null
+++ b/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h
@@ -0,0 +1,179 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/extensions/filters/http/stateful_session/v3/stateful_session.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef ENVOY_EXTENSIONS_FILTERS_HTTP_STATEFUL_SESSION_V3_STATEFUL_SESSION_PROTO_UPB_H_
+#define ENVOY_EXTENSIONS_FILTERS_HTTP_STATEFUL_SESSION_V3_STATEFUL_SESSION_PROTO_UPB_H_
+
+#include "upb/msg_internal.h"
+#include "upb/decode.h"
+#include "upb/decode_fast.h"
+#include "upb/encode.h"
+
+#include "upb/port_def.inc"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct envoy_extensions_filters_http_stateful_session_v3_StatefulSession;
+struct envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute;
+typedef struct envoy_extensions_filters_http_stateful_session_v3_StatefulSession envoy_extensions_filters_http_stateful_session_v3_StatefulSession;
+typedef struct envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute;
+extern const upb_MiniTable envoy_extensions_filters_http_stateful_session_v3_StatefulSession_msginit;
+extern const upb_MiniTable envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_msginit;
+struct envoy_config_core_v3_TypedExtensionConfig;
+extern const upb_MiniTable envoy_config_core_v3_TypedExtensionConfig_msginit;
+
+
+
+/* envoy.extensions.filters.http.stateful_session.v3.StatefulSession */
+
+UPB_INLINE envoy_extensions_filters_http_stateful_session_v3_StatefulSession* envoy_extensions_filters_http_stateful_session_v3_StatefulSession_new(upb_Arena* arena) {
+ return (envoy_extensions_filters_http_stateful_session_v3_StatefulSession*)_upb_Message_New(&envoy_extensions_filters_http_stateful_session_v3_StatefulSession_msginit, arena);
+}
+UPB_INLINE envoy_extensions_filters_http_stateful_session_v3_StatefulSession* envoy_extensions_filters_http_stateful_session_v3_StatefulSession_parse(const char* buf, size_t size, upb_Arena* arena) {
+ envoy_extensions_filters_http_stateful_session_v3_StatefulSession* ret = envoy_extensions_filters_http_stateful_session_v3_StatefulSession_new(arena);
+ if (!ret) return NULL;
+ if (upb_Decode(buf, size, ret, &envoy_extensions_filters_http_stateful_session_v3_StatefulSession_msginit, NULL, 0, arena) != kUpb_DecodeStatus_Ok) {
+ return NULL;
+ }
+ return ret;
+}
+UPB_INLINE envoy_extensions_filters_http_stateful_session_v3_StatefulSession* envoy_extensions_filters_http_stateful_session_v3_StatefulSession_parse_ex(const char* buf, size_t size,
+ const upb_ExtensionRegistry* extreg,
+ int options, upb_Arena* arena) {
+ envoy_extensions_filters_http_stateful_session_v3_StatefulSession* ret = envoy_extensions_filters_http_stateful_session_v3_StatefulSession_new(arena);
+ if (!ret) return NULL;
+ if (upb_Decode(buf, size, ret, &envoy_extensions_filters_http_stateful_session_v3_StatefulSession_msginit, extreg, options, arena) !=
+ kUpb_DecodeStatus_Ok) {
+ return NULL;
+ }
+ return ret;
+}
+UPB_INLINE char* envoy_extensions_filters_http_stateful_session_v3_StatefulSession_serialize(const envoy_extensions_filters_http_stateful_session_v3_StatefulSession* msg, upb_Arena* arena, size_t* len) {
+ char* ptr;
+ (void)upb_Encode(msg, &envoy_extensions_filters_http_stateful_session_v3_StatefulSession_msginit, 0, arena, &ptr, len);
+ return ptr;
+}
+UPB_INLINE char* envoy_extensions_filters_http_stateful_session_v3_StatefulSession_serialize_ex(const envoy_extensions_filters_http_stateful_session_v3_StatefulSession* msg, int options,
+ upb_Arena* arena, size_t* len) {
+ char* ptr;
+ (void)upb_Encode(msg, &envoy_extensions_filters_http_stateful_session_v3_StatefulSession_msginit, options, arena, &ptr, len);
+ return ptr;
+}
+UPB_INLINE bool envoy_extensions_filters_http_stateful_session_v3_StatefulSession_has_session_state(const envoy_extensions_filters_http_stateful_session_v3_StatefulSession* msg) {
+ return _upb_hasbit(msg, 1);
+}
+UPB_INLINE void envoy_extensions_filters_http_stateful_session_v3_StatefulSession_clear_session_state(const envoy_extensions_filters_http_stateful_session_v3_StatefulSession* msg) {
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const upb_Message*) = NULL;
+}
+UPB_INLINE const struct envoy_config_core_v3_TypedExtensionConfig* envoy_extensions_filters_http_stateful_session_v3_StatefulSession_session_state(const envoy_extensions_filters_http_stateful_session_v3_StatefulSession* msg) {
+ return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const struct envoy_config_core_v3_TypedExtensionConfig*);
+}
+
+UPB_INLINE void envoy_extensions_filters_http_stateful_session_v3_StatefulSession_set_session_state(envoy_extensions_filters_http_stateful_session_v3_StatefulSession *msg, struct envoy_config_core_v3_TypedExtensionConfig* value) {
+ _upb_sethas(msg, 1);
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), struct envoy_config_core_v3_TypedExtensionConfig*) = value;
+}
+UPB_INLINE struct envoy_config_core_v3_TypedExtensionConfig* envoy_extensions_filters_http_stateful_session_v3_StatefulSession_mutable_session_state(envoy_extensions_filters_http_stateful_session_v3_StatefulSession* msg, upb_Arena* arena) {
+ struct envoy_config_core_v3_TypedExtensionConfig* sub = (struct envoy_config_core_v3_TypedExtensionConfig*)envoy_extensions_filters_http_stateful_session_v3_StatefulSession_session_state(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_core_v3_TypedExtensionConfig*)_upb_Message_New(&envoy_config_core_v3_TypedExtensionConfig_msginit, arena);
+ if (!sub) return NULL;
+ envoy_extensions_filters_http_stateful_session_v3_StatefulSession_set_session_state(msg, sub);
+ }
+ return sub;
+}
+
+/* envoy.extensions.filters.http.stateful_session.v3.StatefulSessionPerRoute */
+
+UPB_INLINE envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute* envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_new(upb_Arena* arena) {
+ return (envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute*)_upb_Message_New(&envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_msginit, arena);
+}
+UPB_INLINE envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute* envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_parse(const char* buf, size_t size, upb_Arena* arena) {
+ envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute* ret = envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_new(arena);
+ if (!ret) return NULL;
+ if (upb_Decode(buf, size, ret, &envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_msginit, NULL, 0, arena) != kUpb_DecodeStatus_Ok) {
+ return NULL;
+ }
+ return ret;
+}
+UPB_INLINE envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute* envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_parse_ex(const char* buf, size_t size,
+ const upb_ExtensionRegistry* extreg,
+ int options, upb_Arena* arena) {
+ envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute* ret = envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_new(arena);
+ if (!ret) return NULL;
+ if (upb_Decode(buf, size, ret, &envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_msginit, extreg, options, arena) !=
+ kUpb_DecodeStatus_Ok) {
+ return NULL;
+ }
+ return ret;
+}
+UPB_INLINE char* envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_serialize(const envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute* msg, upb_Arena* arena, size_t* len) {
+ char* ptr;
+ (void)upb_Encode(msg, &envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_msginit, 0, arena, &ptr, len);
+ return ptr;
+}
+UPB_INLINE char* envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_serialize_ex(const envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute* msg, int options,
+ upb_Arena* arena, size_t* len) {
+ char* ptr;
+ (void)upb_Encode(msg, &envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_msginit, options, arena, &ptr, len);
+ return ptr;
+}
+typedef enum {
+ envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_override_disabled = 1,
+ envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_override_stateful_session = 2,
+ envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_override_NOT_SET = 0
+} envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_override_oneofcases;
+UPB_INLINE envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_override_oneofcases envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_override_case(const envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute* msg) {
+ return (envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_override_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(0, 0), int32_t);
+}
+UPB_INLINE bool envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_has_disabled(const envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute* msg) {
+ return _upb_getoneofcase(msg, UPB_SIZE(0, 0)) == 1;
+}
+UPB_INLINE void envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_clear_disabled(const envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute* msg) {
+ UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(4, 8), 0, UPB_SIZE(0, 0), envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_override_NOT_SET);
+}
+UPB_INLINE bool envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_disabled(const envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute* msg) {
+ return UPB_READ_ONEOF(msg, bool, UPB_SIZE(4, 8), UPB_SIZE(0, 0), 1, false);
+}
+UPB_INLINE bool envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_has_stateful_session(const envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute* msg) {
+ return _upb_getoneofcase(msg, UPB_SIZE(0, 0)) == 2;
+}
+UPB_INLINE void envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_clear_stateful_session(const envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute* msg) {
+ UPB_WRITE_ONEOF(msg, envoy_extensions_filters_http_stateful_session_v3_StatefulSession*, UPB_SIZE(4, 8), 0, UPB_SIZE(0, 0), envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_override_NOT_SET);
+}
+UPB_INLINE const envoy_extensions_filters_http_stateful_session_v3_StatefulSession* envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_stateful_session(const envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute* msg) {
+ return UPB_READ_ONEOF(msg, const envoy_extensions_filters_http_stateful_session_v3_StatefulSession*, UPB_SIZE(4, 8), UPB_SIZE(0, 0), 2, NULL);
+}
+
+UPB_INLINE void envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_set_disabled(envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute *msg, bool value) {
+ UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(4, 8), value, UPB_SIZE(0, 0), 1);
+}
+UPB_INLINE void envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_set_stateful_session(envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute *msg, envoy_extensions_filters_http_stateful_session_v3_StatefulSession* value) {
+ UPB_WRITE_ONEOF(msg, envoy_extensions_filters_http_stateful_session_v3_StatefulSession*, UPB_SIZE(4, 8), value, UPB_SIZE(0, 0), 2);
+}
+UPB_INLINE struct envoy_extensions_filters_http_stateful_session_v3_StatefulSession* envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_mutable_stateful_session(envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute* msg, upb_Arena* arena) {
+ struct envoy_extensions_filters_http_stateful_session_v3_StatefulSession* sub = (struct envoy_extensions_filters_http_stateful_session_v3_StatefulSession*)envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_stateful_session(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_extensions_filters_http_stateful_session_v3_StatefulSession*)_upb_Message_New(&envoy_extensions_filters_http_stateful_session_v3_StatefulSession_msginit, arena);
+ if (!sub) return NULL;
+ envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_set_stateful_session(msg, sub);
+ }
+ return sub;
+}
+
+extern const upb_MiniTable_File envoy_extensions_filters_http_stateful_session_v3_stateful_session_proto_upb_file_layout;
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* ENVOY_EXTENSIONS_FILTERS_HTTP_STATEFUL_SESSION_V3_STATEFUL_SESSION_PROTO_UPB_H_ */
diff --git a/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c b/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c
new file mode 100644
index 00000000000..08c4a4a2765
--- /dev/null
+++ b/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c
@@ -0,0 +1,46 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/extensions/http/stateful_session/cookie/v3/cookie.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include
+#include "upb/msg_internal.h"
+#include "envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h"
+#include "envoy/type/http/v3/cookie.upb.h"
+#include "udpa/annotations/status.upb.h"
+#include "validate/validate.upb.h"
+
+#include "upb/port_def.inc"
+
+static const upb_MiniTable_Sub envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_submsgs[1] = {
+ {.submsg = &envoy_type_http_v3_Cookie_msginit},
+};
+
+static const upb_MiniTable_Field envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState__fields[1] = {
+ {1, UPB_SIZE(4, 8), UPB_SIZE(1, 1), 0, 11, kUpb_FieldMode_Scalar | (kUpb_FieldRep_Pointer << kUpb_FieldRep_Shift)},
+};
+
+const upb_MiniTable envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_msginit = {
+ &envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_submsgs[0],
+ &envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState__fields[0],
+ UPB_SIZE(8, 16), 1, kUpb_ExtMode_NonExtendable, 1, 255, 0,
+};
+
+static const upb_MiniTable *messages_layout[1] = {
+ &envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_msginit,
+};
+
+const upb_MiniTable_File envoy_extensions_http_stateful_session_cookie_v3_cookie_proto_upb_file_layout = {
+ messages_layout,
+ NULL,
+ NULL,
+ 1,
+ 0,
+ 0,
+};
+
+#include "upb/port_undef.inc"
+
diff --git a/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h b/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h
new file mode 100644
index 00000000000..84010d82e2c
--- /dev/null
+++ b/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h
@@ -0,0 +1,98 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/extensions/http/stateful_session/cookie/v3/cookie.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef ENVOY_EXTENSIONS_HTTP_STATEFUL_SESSION_COOKIE_V3_COOKIE_PROTO_UPB_H_
+#define ENVOY_EXTENSIONS_HTTP_STATEFUL_SESSION_COOKIE_V3_COOKIE_PROTO_UPB_H_
+
+#include "upb/msg_internal.h"
+#include "upb/decode.h"
+#include "upb/decode_fast.h"
+#include "upb/encode.h"
+
+#include "upb/port_def.inc"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState;
+typedef struct envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState;
+extern const upb_MiniTable envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_msginit;
+struct envoy_type_http_v3_Cookie;
+extern const upb_MiniTable envoy_type_http_v3_Cookie_msginit;
+
+
+
+/* envoy.extensions.http.stateful_session.cookie.v3.CookieBasedSessionState */
+
+UPB_INLINE envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState* envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_new(upb_Arena* arena) {
+ return (envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState*)_upb_Message_New(&envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_msginit, arena);
+}
+UPB_INLINE envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState* envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_parse(const char* buf, size_t size, upb_Arena* arena) {
+ envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState* ret = envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_new(arena);
+ if (!ret) return NULL;
+ if (upb_Decode(buf, size, ret, &envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_msginit, NULL, 0, arena) != kUpb_DecodeStatus_Ok) {
+ return NULL;
+ }
+ return ret;
+}
+UPB_INLINE envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState* envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_parse_ex(const char* buf, size_t size,
+ const upb_ExtensionRegistry* extreg,
+ int options, upb_Arena* arena) {
+ envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState* ret = envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_new(arena);
+ if (!ret) return NULL;
+ if (upb_Decode(buf, size, ret, &envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_msginit, extreg, options, arena) !=
+ kUpb_DecodeStatus_Ok) {
+ return NULL;
+ }
+ return ret;
+}
+UPB_INLINE char* envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_serialize(const envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState* msg, upb_Arena* arena, size_t* len) {
+ char* ptr;
+ (void)upb_Encode(msg, &envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_msginit, 0, arena, &ptr, len);
+ return ptr;
+}
+UPB_INLINE char* envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_serialize_ex(const envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState* msg, int options,
+ upb_Arena* arena, size_t* len) {
+ char* ptr;
+ (void)upb_Encode(msg, &envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_msginit, options, arena, &ptr, len);
+ return ptr;
+}
+UPB_INLINE bool envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_has_cookie(const envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState* msg) {
+ return _upb_hasbit(msg, 1);
+}
+UPB_INLINE void envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_clear_cookie(const envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState* msg) {
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const upb_Message*) = NULL;
+}
+UPB_INLINE const struct envoy_type_http_v3_Cookie* envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_cookie(const envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState* msg) {
+ return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const struct envoy_type_http_v3_Cookie*);
+}
+
+UPB_INLINE void envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_set_cookie(envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState *msg, struct envoy_type_http_v3_Cookie* value) {
+ _upb_sethas(msg, 1);
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), struct envoy_type_http_v3_Cookie*) = value;
+}
+UPB_INLINE struct envoy_type_http_v3_Cookie* envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_mutable_cookie(envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState* msg, upb_Arena* arena) {
+ struct envoy_type_http_v3_Cookie* sub = (struct envoy_type_http_v3_Cookie*)envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_cookie(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_type_http_v3_Cookie*)_upb_Message_New(&envoy_type_http_v3_Cookie_msginit, arena);
+ if (!sub) return NULL;
+ envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_set_cookie(msg, sub);
+ }
+ return sub;
+}
+
+extern const upb_MiniTable_File envoy_extensions_http_stateful_session_cookie_v3_cookie_proto_upb_file_layout;
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* ENVOY_EXTENSIONS_HTTP_STATEFUL_SESSION_COOKIE_V3_COOKIE_PROTO_UPB_H_ */
diff --git a/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c
new file mode 100644
index 00000000000..8885ebe1566
--- /dev/null
+++ b/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c
@@ -0,0 +1,60 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/extensions/filters/http/stateful_session/v3/stateful_session.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include "upb/def.h"
+#include "envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h"
+#include "envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h"
+
+extern _upb_DefPool_Init envoy_config_core_v3_extension_proto_upbdefinit;
+extern _upb_DefPool_Init udpa_annotations_status_proto_upbdefinit;
+extern _upb_DefPool_Init validate_validate_proto_upbdefinit;
+static const char descriptor[733] = {'\n', 'H', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 'f', 'i', 'l', 't', 'e', 'r',
+'s', '/', 'h', 't', 't', 'p', '/', 's', 't', 'a', 't', 'e', 'f', 'u', 'l', '_', 's', 'e', 's', 's', 'i', 'o', 'n', '/', 'v',
+'3', '/', 's', 't', 'a', 't', 'e', 'f', 'u', 'l', '_', 's', 'e', 's', 's', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\022',
+'1', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's',
+'.', 'h', 't', 't', 'p', '.', 's', 't', 'a', 't', 'e', 'f', 'u', 'l', '_', 's', 'e', 's', 's', 'i', 'o', 'n', '.', 'v', '3',
+'\032', '$', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'e', 'x',
+'t', 'e', 'n', 's', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't',
+'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i',
+'d', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', 'b', '\n', '\017', 'S', 't',
+'a', 't', 'e', 'f', 'u', 'l', 'S', 'e', 's', 's', 'i', 'o', 'n', '\022', 'O', '\n', '\r', 's', 'e', 's', 's', 'i', 'o', 'n', '_',
+'s', 't', 'a', 't', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C',
+'o', 'n', 'f', 'i', 'g', 'R', '\014', 's', 'e', 's', 's', 'i', 'o', 'n', 'S', 't', 'a', 't', 'e', '\"', '\302', '\001', '\n', '\027', 'S',
+'t', 'a', 't', 'e', 'f', 'u', 'l', 'S', 'e', 's', 's', 'i', 'o', 'n', 'P', 'e', 'r', 'R', 'o', 'u', 't', 'e', '\022', '%', '\n',
+'\010', 'd', 'i', 's', 'a', 'b', 'l', 'e', 'd', '\030', '\001', ' ', '\001', '(', '\010', 'B', '\007', '\372', 'B', '\004', 'j', '\002', '\010', '\001', 'H',
+'\000', 'R', '\010', 'd', 'i', 's', 'a', 'b', 'l', 'e', 'd', '\022', 'o', '\n', '\020', 's', 't', 'a', 't', 'e', 'f', 'u', 'l', '_', 's',
+'e', 's', 's', 'i', 'o', 'n', '\030', '\002', ' ', '\001', '(', '\013', '2', 'B', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e',
+'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'h', 't', 't', 'p', '.', 's', 't', 'a', 't', 'e',
+'f', 'u', 'l', '_', 's', 'e', 's', 's', 'i', 'o', 'n', '.', 'v', '3', '.', 'S', 't', 'a', 't', 'e', 'f', 'u', 'l', 'S', 'e',
+'s', 's', 'i', 'o', 'n', 'H', '\000', 'R', '\017', 's', 't', 'a', 't', 'e', 'f', 'u', 'l', 'S', 'e', 's', 's', 'i', 'o', 'n', 'B',
+'\017', '\n', '\010', 'o', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '\022', '\003', '\370', 'B', '\001', 'B', '\316', '\001', '\n', '?', 'i', 'o', '.', 'e',
+'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n',
+'s', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'h', 't', 't', 'p', '.', 's', 't', 'a', 't', 'e', 'f', 'u', 'l', '_', 's',
+'e', 's', 's', 'i', 'o', 'n', '.', 'v', '3', 'B', '\024', 'S', 't', 'a', 't', 'e', 'f', 'u', 'l', 'S', 'e', 's', 's', 'i', 'o',
+'n', 'P', 'r', 'o', 't', 'o', 'P', '\001', 'Z', 'k', 'g', 'i', 't', 'h', 'u', 'b', '.', 'c', 'o', 'm', '/', 'e', 'n', 'v', 'o',
+'y', 'p', 'r', 'o', 'x', 'y', '/', 'g', 'o', '-', 'c', 'o', 'n', 't', 'r', 'o', 'l', '-', 'p', 'l', 'a', 'n', 'e', '/', 'e',
+'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 'f', 'i', 'l', 't', 'e', 'r', 's', '/', 'h',
+'t', 't', 'p', '/', 's', 't', 'a', 't', 'e', 'f', 'u', 'l', '_', 's', 'e', 's', 's', 'i', 'o', 'n', '/', 'v', '3', ';', 's',
+'t', 'a', 't', 'e', 'f', 'u', 'l', '_', 's', 'e', 's', 's', 'i', 'o', 'n', 'v', '3', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002',
+'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+};
+
+static _upb_DefPool_Init *deps[4] = {
+ &envoy_config_core_v3_extension_proto_upbdefinit,
+ &udpa_annotations_status_proto_upbdefinit,
+ &validate_validate_proto_upbdefinit,
+ NULL
+};
+
+_upb_DefPool_Init envoy_extensions_filters_http_stateful_session_v3_stateful_session_proto_upbdefinit = {
+ deps,
+ &envoy_extensions_filters_http_stateful_session_v3_stateful_session_proto_upb_file_layout,
+ "envoy/extensions/filters/http/stateful_session/v3/stateful_session.proto",
+ UPB_STRINGVIEW_INIT(descriptor, 733)
+};
diff --git a/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h b/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h
new file mode 100644
index 00000000000..a1f0e5910ae
--- /dev/null
+++ b/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h
@@ -0,0 +1,40 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/extensions/filters/http/stateful_session/v3/stateful_session.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef ENVOY_EXTENSIONS_FILTERS_HTTP_STATEFUL_SESSION_V3_STATEFUL_SESSION_PROTO_UPBDEFS_H_
+#define ENVOY_EXTENSIONS_FILTERS_HTTP_STATEFUL_SESSION_V3_STATEFUL_SESSION_PROTO_UPBDEFS_H_
+
+#include "upb/def.h"
+#include "upb/port_def.inc"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "upb/def.h"
+
+#include "upb/port_def.inc"
+
+extern _upb_DefPool_Init envoy_extensions_filters_http_stateful_session_v3_stateful_session_proto_upbdefinit;
+
+UPB_INLINE const upb_MessageDef *envoy_extensions_filters_http_stateful_session_v3_StatefulSession_getmsgdef(upb_DefPool *s) {
+ _upb_DefPool_LoadDefInit(s, &envoy_extensions_filters_http_stateful_session_v3_stateful_session_proto_upbdefinit);
+ return upb_DefPool_FindMessageByName(s, "envoy.extensions.filters.http.stateful_session.v3.StatefulSession");
+}
+
+UPB_INLINE const upb_MessageDef *envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_getmsgdef(upb_DefPool *s) {
+ _upb_DefPool_LoadDefInit(s, &envoy_extensions_filters_http_stateful_session_v3_stateful_session_proto_upbdefinit);
+ return upb_DefPool_FindMessageByName(s, "envoy.extensions.filters.http.stateful_session.v3.StatefulSessionPerRoute");
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* ENVOY_EXTENSIONS_FILTERS_HTTP_STATEFUL_SESSION_V3_STATEFUL_SESSION_PROTO_UPBDEFS_H_ */
diff --git a/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c b/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c
new file mode 100644
index 00000000000..492b1802ae4
--- /dev/null
+++ b/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c
@@ -0,0 +1,50 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/extensions/http/stateful_session/cookie/v3/cookie.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include "upb/def.h"
+#include "envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h"
+#include "envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h"
+
+extern _upb_DefPool_Init envoy_type_http_v3_cookie_proto_upbdefinit;
+extern _upb_DefPool_Init udpa_annotations_status_proto_upbdefinit;
+extern _upb_DefPool_Init validate_validate_proto_upbdefinit;
+static const char descriptor[487] = {'\n', '=', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 'h', 't', 't', 'p', '/', 's',
+'t', 'a', 't', 'e', 'f', 'u', 'l', '_', 's', 'e', 's', 's', 'i', 'o', 'n', '/', 'c', 'o', 'o', 'k', 'i', 'e', '/', 'v', '3',
+'/', 'c', 'o', 'o', 'k', 'i', 'e', '.', 'p', 'r', 'o', 't', 'o', '\022', '0', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e',
+'n', 's', 'i', 'o', 'n', 's', '.', 'h', 't', 't', 'p', '.', 's', 't', 'a', 't', 'e', 'f', 'u', 'l', '_', 's', 'e', 's', 's',
+'i', 'o', 'n', '.', 'c', 'o', 'o', 'k', 'i', 'e', '.', 'v', '3', '\032', '\037', 'e', 'n', 'v', 'o', 'y', '/', 't', 'y', 'p', 'e',
+'/', 'h', 't', 't', 'p', '/', 'v', '3', '/', 'c', 'o', 'o', 'k', 'i', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd',
+'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o',
+'t', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o',
+'t', 'o', '\"', 'W', '\n', '\027', 'C', 'o', 'o', 'k', 'i', 'e', 'B', 'a', 's', 'e', 'd', 'S', 'e', 's', 's', 'i', 'o', 'n', 'S',
+'t', 'a', 't', 'e', '\022', '<', '\n', '\006', 'c', 'o', 'o', 'k', 'i', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\032', '.', 'e', 'n',
+'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'h', 't', 't', 'p', '.', 'v', '3', '.', 'C', 'o', 'o', 'k', 'i', 'e', 'B', '\010',
+'\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\006', 'c', 'o', 'o', 'k', 'i', 'e', 'B', '\271', '\001', '\n', '>', 'i', 'o', '.', 'e',
+'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n',
+'s', '.', 'h', 't', 't', 'p', '.', 's', 't', 'a', 't', 'e', 'f', 'u', 'l', '_', 's', 'e', 's', 's', 'i', 'o', 'n', '.', 'c',
+'o', 'o', 'k', 'i', 'e', '.', 'v', '3', 'B', '\013', 'C', 'o', 'o', 'k', 'i', 'e', 'P', 'r', 'o', 't', 'o', 'P', '\001', 'Z', '`',
+'g', 'i', 't', 'h', 'u', 'b', '.', 'c', 'o', 'm', '/', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '/', 'g', 'o', '-',
+'c', 'o', 'n', 't', 'r', 'o', 'l', '-', 'p', 'l', 'a', 'n', 'e', '/', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n',
+'s', 'i', 'o', 'n', 's', '/', 'h', 't', 't', 'p', '/', 's', 't', 'a', 't', 'e', 'f', 'u', 'l', '_', 's', 'e', 's', 's', 'i',
+'o', 'n', '/', 'c', 'o', 'o', 'k', 'i', 'e', '/', 'v', '3', ';', 'c', 'o', 'o', 'k', 'i', 'e', 'v', '3', '\272', '\200', '\310', '\321',
+'\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+};
+
+static _upb_DefPool_Init *deps[4] = {
+ &envoy_type_http_v3_cookie_proto_upbdefinit,
+ &udpa_annotations_status_proto_upbdefinit,
+ &validate_validate_proto_upbdefinit,
+ NULL
+};
+
+_upb_DefPool_Init envoy_extensions_http_stateful_session_cookie_v3_cookie_proto_upbdefinit = {
+ deps,
+ &envoy_extensions_http_stateful_session_cookie_v3_cookie_proto_upb_file_layout,
+ "envoy/extensions/http/stateful_session/cookie/v3/cookie.proto",
+ UPB_STRINGVIEW_INIT(descriptor, 487)
+};
diff --git a/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h b/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h
new file mode 100644
index 00000000000..cd4011ae179
--- /dev/null
+++ b/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h
@@ -0,0 +1,35 @@
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/extensions/http/stateful_session/cookie/v3/cookie.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef ENVOY_EXTENSIONS_HTTP_STATEFUL_SESSION_COOKIE_V3_COOKIE_PROTO_UPBDEFS_H_
+#define ENVOY_EXTENSIONS_HTTP_STATEFUL_SESSION_COOKIE_V3_COOKIE_PROTO_UPBDEFS_H_
+
+#include "upb/def.h"
+#include "upb/port_def.inc"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "upb/def.h"
+
+#include "upb/port_def.inc"
+
+extern _upb_DefPool_Init envoy_extensions_http_stateful_session_cookie_v3_cookie_proto_upbdefinit;
+
+UPB_INLINE const upb_MessageDef *envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_getmsgdef(upb_DefPool *s) {
+ _upb_DefPool_LoadDefInit(s, &envoy_extensions_http_stateful_session_cookie_v3_cookie_proto_upbdefinit);
+ return upb_DefPool_FindMessageByName(s, "envoy.extensions.http.stateful_session.cookie.v3.CookieBasedSessionState");
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* ENVOY_EXTENSIONS_HTTP_STATEFUL_SESSION_COOKIE_V3_COOKIE_PROTO_UPBDEFS_H_ */
diff --git a/src/core/ext/xds/xds_cluster.cc b/src/core/ext/xds/xds_cluster.cc
index d6a9a3020d5..554abb363e8 100644
--- a/src/core/ext/xds/xds_cluster.cc
+++ b/src/core/ext/xds/xds_cluster.cc
@@ -74,6 +74,15 @@ bool XdsCustomLbPolicyEnabled() {
return parse_succeeded && parsed_value;
}
+// TODO(eostroukhov): Remove once this feature is no longer experimental.
+bool XdsHostOverrideEnabled() {
+ auto value = GetEnv("GRPC_EXPERIMENTAL_XDS_ENABLE_HOST_OVERRIDE");
+ if (!value.has_value()) return false;
+ bool parsed_value;
+ bool parse_succeeded = gpr_parse_bool_value(value->c_str(), &parsed_value);
+ return parse_succeeded && parsed_value;
+}
+
//
// XdsClusterResource
//
diff --git a/src/core/ext/xds/xds_cluster.h b/src/core/ext/xds/xds_cluster.h
index 830fc052d74..8c29d8e3a75 100644
--- a/src/core/ext/xds/xds_cluster.h
+++ b/src/core/ext/xds/xds_cluster.h
@@ -45,6 +45,7 @@
namespace grpc_core {
bool XdsCustomLbPolicyEnabled();
+bool XdsHostOverrideEnabled();
struct XdsClusterResource : public XdsResourceType::ResourceData {
enum ClusterType { EDS, LOGICAL_DNS, AGGREGATE };
diff --git a/src/core/ext/xds/xds_http_fault_filter.cc b/src/core/ext/xds/xds_http_fault_filter.cc
index 7604d00e726..b16fdb762c3 100644
--- a/src/core/ext/xds/xds_http_fault_filter.cc
+++ b/src/core/ext/xds/xds_http_fault_filter.cc
@@ -85,9 +85,9 @@ void XdsHttpFaultFilter::PopulateSymtab(upb_DefPool* symtab) const {
}
absl::optional
-XdsHttpFaultFilter::GenerateFilterConfig(XdsExtension extension,
- upb_Arena* arena,
- ValidationErrors* errors) const {
+XdsHttpFaultFilter::GenerateFilterConfig(
+ const XdsResourceType::DecodeContext& context, XdsExtension extension,
+ ValidationErrors* errors) const {
absl::string_view* serialized_filter_config =
absl::get_if(&extension.value);
if (serialized_filter_config == nullptr) {
@@ -96,7 +96,7 @@ XdsHttpFaultFilter::GenerateFilterConfig(XdsExtension extension,
}
auto* http_fault = envoy_extensions_filters_http_fault_v3_HTTPFault_parse(
serialized_filter_config->data(), serialized_filter_config->size(),
- arena);
+ context.arena);
if (http_fault == nullptr) {
errors->AddError("could not parse fault injection filter config");
return absl::nullopt;
@@ -206,10 +206,11 @@ XdsHttpFaultFilter::GenerateFilterConfig(XdsExtension extension,
absl::optional
XdsHttpFaultFilter::GenerateFilterConfigOverride(
- XdsExtension extension, upb_Arena* arena, ValidationErrors* errors) const {
+ const XdsResourceType::DecodeContext& context, XdsExtension extension,
+ ValidationErrors* errors) const {
// HTTPFault filter has the same message type in HTTP connection manager's
// filter config and in overriding filter config field.
- return GenerateFilterConfig(std::move(extension), arena, errors);
+ return GenerateFilterConfig(context, std::move(extension), errors);
}
const grpc_channel_filter* XdsHttpFaultFilter::channel_filter() const {
diff --git a/src/core/ext/xds/xds_http_fault_filter.h b/src/core/ext/xds/xds_http_fault_filter.h
index a72a6c5cab5..63e20de6946 100644
--- a/src/core/ext/xds/xds_http_fault_filter.h
+++ b/src/core/ext/xds/xds_http_fault_filter.h
@@ -39,10 +39,10 @@ class XdsHttpFaultFilter : public XdsHttpFilterImpl {
absl::string_view OverrideConfigProtoName() const override;
void PopulateSymtab(upb_DefPool* symtab) const override;
absl::optional GenerateFilterConfig(
- XdsExtension extension, upb_Arena* arena,
+ const XdsResourceType::DecodeContext& context, XdsExtension extension,
ValidationErrors* errors) const override;
absl::optional GenerateFilterConfigOverride(
- XdsExtension extension, upb_Arena* arena,
+ const XdsResourceType::DecodeContext& context, XdsExtension extension,
ValidationErrors* errors) const override;
const grpc_channel_filter* channel_filter() const override;
ChannelArgs ModifyChannelArgs(const ChannelArgs& args) const override;
diff --git a/src/core/ext/xds/xds_http_filters.cc b/src/core/ext/xds/xds_http_filters.cc
index c6b8c0b47f0..28bae2317eb 100644
--- a/src/core/ext/xds/xds_http_filters.cc
+++ b/src/core/ext/xds/xds_http_filters.cc
@@ -29,8 +29,10 @@
#include
+#include "src/core/ext/xds/xds_cluster.h"
#include "src/core/ext/xds/xds_http_fault_filter.h"
#include "src/core/ext/xds/xds_http_rbac_filter.h"
+#include "src/core/ext/xds/xds_http_stateful_session_filter.h"
namespace grpc_core {
@@ -51,9 +53,9 @@ void XdsHttpRouterFilter::PopulateSymtab(upb_DefPool* symtab) const {
}
absl::optional
-XdsHttpRouterFilter::GenerateFilterConfig(XdsExtension extension,
- upb_Arena* arena,
- ValidationErrors* errors) const {
+XdsHttpRouterFilter::GenerateFilterConfig(
+ const XdsResourceType::DecodeContext& context, XdsExtension extension,
+ ValidationErrors* errors) const {
absl::string_view* serialized_filter_config =
absl::get_if(&extension.value);
if (serialized_filter_config == nullptr) {
@@ -62,7 +64,7 @@ XdsHttpRouterFilter::GenerateFilterConfig(XdsExtension extension,
}
if (envoy_extensions_filters_http_router_v3_Router_parse(
serialized_filter_config->data(), serialized_filter_config->size(),
- arena) == nullptr) {
+ context.arena) == nullptr) {
errors->AddError("could not parse router filter config");
return absl::nullopt;
}
@@ -71,8 +73,8 @@ XdsHttpRouterFilter::GenerateFilterConfig(XdsExtension extension,
absl::optional
XdsHttpRouterFilter::GenerateFilterConfigOverride(
- XdsExtension /*extension*/, upb_Arena* /*arena*/,
- ValidationErrors* errors) const {
+ const XdsResourceType::DecodeContext& /*context*/,
+ XdsExtension /*extension*/, ValidationErrors* errors) const {
errors->AddError("router filter does not support config override");
return absl::nullopt;
}
@@ -86,6 +88,9 @@ XdsHttpFilterRegistry::XdsHttpFilterRegistry(bool register_builtins) {
RegisterFilter(std::make_unique());
RegisterFilter(std::make_unique());
RegisterFilter(std::make_unique());
+ if (XdsHostOverrideEnabled()) {
+ RegisterFilter(std::make_unique());
+ }
}
}
diff --git a/src/core/ext/xds/xds_http_filters.h b/src/core/ext/xds/xds_http_filters.h
index 7693d270ca9..7f9926068c4 100644
--- a/src/core/ext/xds/xds_http_filters.h
+++ b/src/core/ext/xds/xds_http_filters.h
@@ -34,6 +34,7 @@
#include "upb/def.h"
#include "src/core/ext/xds/xds_common_types.h"
+#include "src/core/ext/xds/xds_resource_type.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/channel_fwd.h"
#include "src/core/lib/gprpp/validation_errors.h"
@@ -85,13 +86,13 @@ class XdsHttpFilterImpl {
// Generates a Config from the xDS filter config proto.
// Used for the top-level config in the HCM HTTP filter list.
virtual absl::optional GenerateFilterConfig(
- XdsExtension extension, upb_Arena* arena,
+ const XdsResourceType::DecodeContext& context, XdsExtension extension,
ValidationErrors* errors) const = 0;
// Generates a Config from the xDS filter config proto.
// Used for the typed_per_filter_config override in VirtualHost and Route.
virtual absl::optional GenerateFilterConfigOverride(
- XdsExtension extension, upb_Arena* arena,
+ const XdsResourceType::DecodeContext& context, XdsExtension extension,
ValidationErrors* errors) const = 0;
// C-core channel filter implementation.
@@ -129,10 +130,10 @@ class XdsHttpRouterFilter : public XdsHttpFilterImpl {
absl::string_view OverrideConfigProtoName() const override;
void PopulateSymtab(upb_DefPool* symtab) const override;
absl::optional GenerateFilterConfig(
- XdsExtension extension, upb_Arena* arena,
+ const XdsResourceType::DecodeContext& context, XdsExtension extension,
ValidationErrors* errors) const override;
absl::optional GenerateFilterConfigOverride(
- XdsExtension extension, upb_Arena* arena,
+ const XdsResourceType::DecodeContext& context, XdsExtension extension,
ValidationErrors* errors) const override;
const grpc_channel_filter* channel_filter() const override { return nullptr; }
absl::StatusOr GenerateServiceConfig(
diff --git a/src/core/ext/xds/xds_http_rbac_filter.cc b/src/core/ext/xds/xds_http_rbac_filter.cc
index e8cd4c79c00..fcd34240b95 100644
--- a/src/core/ext/xds/xds_http_rbac_filter.cc
+++ b/src/core/ext/xds/xds_http_rbac_filter.cc
@@ -434,9 +434,9 @@ void XdsHttpRbacFilter::PopulateSymtab(upb_DefPool* symtab) const {
}
absl::optional
-XdsHttpRbacFilter::GenerateFilterConfig(XdsExtension extension,
- upb_Arena* arena,
- ValidationErrors* errors) const {
+XdsHttpRbacFilter::GenerateFilterConfig(
+ const XdsResourceType::DecodeContext& context, XdsExtension extension,
+ ValidationErrors* errors) const {
absl::string_view* serialized_filter_config =
absl::get_if(&extension.value);
if (serialized_filter_config == nullptr) {
@@ -445,7 +445,7 @@ XdsHttpRbacFilter::GenerateFilterConfig(XdsExtension extension,
}
auto* rbac = envoy_extensions_filters_http_rbac_v3_RBAC_parse(
serialized_filter_config->data(), serialized_filter_config->size(),
- arena);
+ context.arena);
if (rbac == nullptr) {
errors->AddError("could not parse HTTP RBAC filter config");
return absl::nullopt;
@@ -455,7 +455,8 @@ XdsHttpRbacFilter::GenerateFilterConfig(XdsExtension extension,
absl::optional
XdsHttpRbacFilter::GenerateFilterConfigOverride(
- XdsExtension extension, upb_Arena* arena, ValidationErrors* errors) const {
+ const XdsResourceType::DecodeContext& context, XdsExtension extension,
+ ValidationErrors* errors) const {
absl::string_view* serialized_filter_config =
absl::get_if(&extension.value);
if (serialized_filter_config == nullptr) {
@@ -465,7 +466,7 @@ XdsHttpRbacFilter::GenerateFilterConfigOverride(
auto* rbac_per_route =
envoy_extensions_filters_http_rbac_v3_RBACPerRoute_parse(
serialized_filter_config->data(), serialized_filter_config->size(),
- arena);
+ context.arena);
if (rbac_per_route == nullptr) {
errors->AddError("could not parse RBACPerRoute");
return absl::nullopt;
diff --git a/src/core/ext/xds/xds_http_rbac_filter.h b/src/core/ext/xds/xds_http_rbac_filter.h
index a582f06f625..7d031eda60a 100644
--- a/src/core/ext/xds/xds_http_rbac_filter.h
+++ b/src/core/ext/xds/xds_http_rbac_filter.h
@@ -39,10 +39,10 @@ class XdsHttpRbacFilter : public XdsHttpFilterImpl {
absl::string_view OverrideConfigProtoName() const override;
void PopulateSymtab(upb_DefPool* symtab) const override;
absl::optional GenerateFilterConfig(
- XdsExtension extension, upb_Arena* arena,
+ const XdsResourceType::DecodeContext& context, XdsExtension extension,
ValidationErrors* errors) const override;
absl::optional GenerateFilterConfigOverride(
- XdsExtension extension, upb_Arena* arena,
+ const XdsResourceType::DecodeContext& context, XdsExtension extension,
ValidationErrors* errors) const override;
const grpc_channel_filter* channel_filter() const override;
ChannelArgs ModifyChannelArgs(const ChannelArgs& args) const override;
diff --git a/src/core/ext/xds/xds_http_stateful_session_filter.cc b/src/core/ext/xds/xds_http_stateful_session_filter.cc
new file mode 100644
index 00000000000..fbe871e2db1
--- /dev/null
+++ b/src/core/ext/xds/xds_http_stateful_session_filter.cc
@@ -0,0 +1,227 @@
+//
+// Copyright 2022 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include
+
+#include "src/core/ext/xds/xds_http_stateful_session_filter.h"
+
+#include
+
+#include
+#include
+
+#include "absl/status/statusor.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "absl/types/variant.h"
+#include "envoy/config/core/v3/extension.upb.h"
+#include "envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h"
+#include "envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h"
+#include "envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h"
+#include "envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h"
+#include "envoy/type/http/v3/cookie.upb.h"
+#include "envoy/type/v3/percent.upb.h"
+#include "google/protobuf/wrappers.upb.h"
+#include "upb/def.h"
+
+#include
+
+#include "src/core/ext/filters/stateful_session/stateful_session_filter.h"
+#include "src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h"
+#include "src/core/ext/xds/upb_utils.h"
+#include "src/core/ext/xds/xds_common_types.h"
+#include "src/core/ext/xds/xds_http_filters.h"
+#include "src/core/lib/channel/channel_args.h"
+#include "src/core/lib/channel/status_util.h"
+#include "src/core/lib/gprpp/time.h"
+#include "src/core/lib/gprpp/validation_errors.h"
+#include "src/core/lib/json/json.h"
+#include "src/core/lib/transport/status_conversion.h"
+
+namespace grpc_core {
+
+absl::string_view XdsHttpStatefulSessionFilter::ConfigProtoName() const {
+ return "envoy.extensions.filters.http.stateful_session.v3.StatefulSession";
+}
+
+absl::string_view XdsHttpStatefulSessionFilter::OverrideConfigProtoName()
+ const {
+ return "envoy.extensions.filters.http.stateful_session.v3"
+ ".StatefulSessionPerRoute";
+}
+
+void XdsHttpStatefulSessionFilter::PopulateSymtab(upb_DefPool* symtab) const {
+ envoy_extensions_filters_http_stateful_session_v3_StatefulSession_getmsgdef(
+ symtab);
+ envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_getmsgdef(
+ symtab);
+ envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_getmsgdef(
+ symtab);
+}
+
+namespace {
+
+Json::Object ValidateStatefulSession(
+ const XdsResourceType::DecodeContext& context,
+ const envoy_extensions_filters_http_stateful_session_v3_StatefulSession*
+ stateful_session,
+ ValidationErrors* errors) {
+ ValidationErrors::ScopedField field(errors, ".session_state");
+ const auto* session_state =
+ envoy_extensions_filters_http_stateful_session_v3_StatefulSession_session_state(
+ stateful_session);
+ if (session_state == nullptr) {
+ errors->AddError("field not present");
+ return {};
+ }
+ ValidationErrors::ScopedField field2(errors, ".typed_config");
+ const auto* typed_config =
+ envoy_config_core_v3_TypedExtensionConfig_typed_config(session_state);
+ auto extension = ExtractXdsExtension(context, typed_config, errors);
+ if (!extension.has_value()) return {};
+ if (extension->type !=
+ "envoy.extensions.http.stateful_session.cookie.v3"
+ ".CookieBasedSessionState") {
+ errors->AddError("unsupported session state type");
+ return {};
+ }
+ absl::string_view* serialized_session_state =
+ absl::get_if(&extension->value);
+ if (serialized_session_state == nullptr) {
+ errors->AddError("could not parse session state config");
+ return {};
+ }
+ auto* cookie_state =
+ envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_parse(
+ serialized_session_state->data(), serialized_session_state->size(),
+ context.arena);
+ if (cookie_state == nullptr) {
+ errors->AddError("could not parse session state config");
+ return {};
+ }
+ ValidationErrors::ScopedField field3(errors, ".cookie");
+ const auto* cookie =
+ envoy_extensions_http_stateful_session_cookie_v3_CookieBasedSessionState_cookie(
+ cookie_state);
+ if (cookie == nullptr) {
+ errors->AddError("field not present");
+ return {};
+ }
+ Json::Object cookie_config;
+ // name
+ std::string cookie_name =
+ UpbStringToStdString(envoy_type_http_v3_Cookie_name(cookie));
+ if (cookie_name.empty()) {
+ ValidationErrors::ScopedField field(errors, ".name");
+ errors->AddError("field not present");
+ }
+ cookie_config["name"] = std::move(cookie_name);
+ // ttl
+ {
+ ValidationErrors::ScopedField field(errors, ".ttl");
+ const auto* duration = envoy_type_http_v3_Cookie_ttl(cookie);
+ if (duration != nullptr) {
+ Duration ttl = ParseDuration(duration, errors);
+ cookie_config["ttl"] = ttl.ToJsonString();
+ }
+ }
+ // path
+ std::string path =
+ UpbStringToStdString(envoy_type_http_v3_Cookie_path(cookie));
+ if (!path.empty()) cookie_config["path"] = std::move(path);
+ return cookie_config;
+}
+
+} // namespace
+
+absl::optional
+XdsHttpStatefulSessionFilter::GenerateFilterConfig(
+ const XdsResourceType::DecodeContext& context, XdsExtension extension,
+ ValidationErrors* errors) const {
+ absl::string_view* serialized_filter_config =
+ absl::get_if(&extension.value);
+ if (serialized_filter_config == nullptr) {
+ errors->AddError("could not parse stateful session filter config");
+ return absl::nullopt;
+ }
+ auto* stateful_session =
+ envoy_extensions_filters_http_stateful_session_v3_StatefulSession_parse(
+ serialized_filter_config->data(), serialized_filter_config->size(),
+ context.arena);
+ if (stateful_session == nullptr) {
+ errors->AddError("could not parse stateful session filter config");
+ return absl::nullopt;
+ }
+ return FilterConfig{
+ ConfigProtoName(),
+ ValidateStatefulSession(context, stateful_session, errors)};
+}
+
+absl::optional
+XdsHttpStatefulSessionFilter::GenerateFilterConfigOverride(
+ const XdsResourceType::DecodeContext& context, XdsExtension extension,
+ ValidationErrors* errors) const {
+ absl::string_view* serialized_filter_config =
+ absl::get_if(&extension.value);
+ if (serialized_filter_config == nullptr) {
+ errors->AddError("could not parse stateful session filter override config");
+ return absl::nullopt;
+ }
+ auto* stateful_session_per_route =
+ envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_parse(
+ serialized_filter_config->data(), serialized_filter_config->size(),
+ context.arena);
+ if (stateful_session_per_route == nullptr) {
+ errors->AddError("could not parse stateful session filter override config");
+ return absl::nullopt;
+ }
+ Json::Object config;
+ if (!envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_disabled(
+ stateful_session_per_route)) {
+ ValidationErrors::ScopedField field(errors, ".stateful_session");
+ const auto* stateful_session =
+ envoy_extensions_filters_http_stateful_session_v3_StatefulSessionPerRoute_stateful_session(
+ stateful_session_per_route);
+ if (stateful_session == nullptr) {
+ errors->AddError("field not present");
+ } else {
+ config = ValidateStatefulSession(context, stateful_session, errors);
+ }
+ }
+ return FilterConfig{OverrideConfigProtoName(), Json(std::move(config))};
+}
+
+const grpc_channel_filter* XdsHttpStatefulSessionFilter::channel_filter()
+ const {
+ return &StatefulSessionFilter::kFilter;
+}
+
+ChannelArgs XdsHttpStatefulSessionFilter::ModifyChannelArgs(
+ const ChannelArgs& args) const {
+ return args.Set(GRPC_ARG_PARSE_STATEFUL_SESSION_METHOD_CONFIG, 1);
+}
+
+absl::StatusOr
+XdsHttpStatefulSessionFilter::GenerateServiceConfig(
+ const FilterConfig& hcm_filter_config,
+ const FilterConfig* filter_config_override) const {
+ Json config = filter_config_override != nullptr
+ ? filter_config_override->config
+ : hcm_filter_config.config;
+ return ServiceConfigJsonEntry{"stateful_session", config.Dump()};
+}
+
+} // namespace grpc_core
diff --git a/src/core/ext/xds/xds_http_stateful_session_filter.h b/src/core/ext/xds/xds_http_stateful_session_filter.h
new file mode 100644
index 00000000000..008ba28ab7a
--- /dev/null
+++ b/src/core/ext/xds/xds_http_stateful_session_filter.h
@@ -0,0 +1,58 @@
+//
+// Copyright 2022 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#ifndef GRPC_CORE_EXT_XDS_XDS_HTTP_STATEFUL_SESSION_FILTER_H
+#define GRPC_CORE_EXT_XDS_XDS_HTTP_STATEFUL_SESSION_FILTER_H
+
+#include
+
+#include "absl/status/statusor.h"
+#include "absl/strings/string_view.h"
+#include "absl/types/optional.h"
+#include "upb/arena.h"
+#include "upb/def.h"
+
+#include "src/core/ext/xds/xds_common_types.h"
+#include "src/core/ext/xds/xds_http_filters.h"
+#include "src/core/lib/channel/channel_args.h"
+#include "src/core/lib/channel/channel_fwd.h"
+#include "src/core/lib/gprpp/validation_errors.h"
+
+namespace grpc_core {
+
+class XdsHttpStatefulSessionFilter : public XdsHttpFilterImpl {
+ public:
+ absl::string_view ConfigProtoName() const override;
+ absl::string_view OverrideConfigProtoName() const override;
+ void PopulateSymtab(upb_DefPool* symtab) const override;
+ absl::optional GenerateFilterConfig(
+ const XdsResourceType::DecodeContext& context, XdsExtension extension,
+ ValidationErrors* errors) const override;
+ absl::optional GenerateFilterConfigOverride(
+ const XdsResourceType::DecodeContext& context, XdsExtension extension,
+ ValidationErrors* errors) const override;
+ const grpc_channel_filter* channel_filter() const override;
+ ChannelArgs ModifyChannelArgs(const ChannelArgs& args) const override;
+ absl::StatusOr GenerateServiceConfig(
+ const FilterConfig& hcm_filter_config,
+ const FilterConfig* filter_config_override) const override;
+ bool IsSupportedOnClients() const override { return true; }
+ bool IsSupportedOnServers() const override { return false; }
+};
+
+} // namespace grpc_core
+
+#endif // GRPC_CORE_EXT_XDS_XDS_HTTP_STATEFUL_SESSION_FILTER_H
diff --git a/src/core/ext/xds/xds_lb_policy_registry.cc b/src/core/ext/xds/xds_lb_policy_registry.cc
index ad99b012d05..7d90457299a 100644
--- a/src/core/ext/xds/xds_lb_policy_registry.cc
+++ b/src/core/ext/xds/xds_lb_policy_registry.cc
@@ -208,10 +208,6 @@ Json::Array XdsLbPolicyRegistry::ConvertXdsLbPolicyConfig(
const auto* typed_config =
envoy_config_core_v3_TypedExtensionConfig_typed_config(
typed_extension_config);
- if (typed_config == nullptr) {
- errors->AddError("field not present");
- return {};
- }
auto extension = ExtractXdsExtension(context, typed_config, errors);
if (!extension.has_value()) return {};
// Check for registered LB policy type.
diff --git a/src/core/ext/xds/xds_listener.cc b/src/core/ext/xds/xds_listener.cc
index 4da36a9d592..35fc6efe05a 100644
--- a/src/core/ext/xds/xds_listener.cc
+++ b/src/core/ext/xds/xds_listener.cc
@@ -411,8 +411,8 @@ XdsListenerResource::HttpConnectionManager HttpConnectionManagerParse(
continue;
}
absl::optional filter_config =
- filter_impl->GenerateFilterConfig(std::move(*extension),
- context.arena, errors);
+ filter_impl->GenerateFilterConfig(context, std::move(*extension),
+ errors);
if (filter_config.has_value()) {
http_connection_manager.http_filters.emplace_back(
XdsListenerResource::HttpConnectionManager::HttpFilter{
diff --git a/src/core/ext/xds/xds_route_config.cc b/src/core/ext/xds/xds_route_config.cc
index 25478580839..cb48d930dc3 100644
--- a/src/core/ext/xds/xds_route_config.cc
+++ b/src/core/ext/xds/xds_route_config.cc
@@ -620,8 +620,8 @@ XdsRouteConfigResource::TypedPerFilterConfig ParseTypedPerFilterConfig(
continue;
}
absl::optional filter_config =
- filter_impl->GenerateFilterConfigOverride(std::move(*extension_to_use),
- context.arena, errors);
+ filter_impl->GenerateFilterConfigOverride(
+ context, std::move(*extension_to_use), errors);
if (filter_config.has_value()) {
typed_per_filter_config[std::string(key)] = std::move(*filter_config);
}
diff --git a/src/proto/grpc/testing/xds/v3/BUILD b/src/proto/grpc/testing/xds/v3/BUILD
index 8fe155cba3b..890eb54eff6 100644
--- a/src/proto/grpc/testing/xds/v3/BUILD
+++ b/src/proto/grpc/testing/xds/v3/BUILD
@@ -419,6 +419,34 @@ grpc_proto_library(
well_known_protos = True,
)
+grpc_proto_library(
+ name = "cookie_proto",
+ srcs = [
+ "cookie.proto",
+ ],
+ well_known_protos = True,
+)
+
+grpc_proto_library(
+ name = "stateful_session_cookie_proto",
+ srcs = [
+ "stateful_session_cookie.proto",
+ ],
+ deps = [
+ "cookie_proto",
+ ],
+)
+
+grpc_proto_library(
+ name = "stateful_session_proto",
+ srcs = [
+ "stateful_session.proto",
+ ],
+ deps = [
+ "extension_proto",
+ ],
+)
+
py_proto_library(
name = "csds_py_pb2",
deps = [":_csds_proto_only"],
diff --git a/src/proto/grpc/testing/xds/v3/cookie.proto b/src/proto/grpc/testing/xds/v3/cookie.proto
new file mode 100644
index 00000000000..8f2515f13cf
--- /dev/null
+++ b/src/proto/grpc/testing/xds/v3/cookie.proto
@@ -0,0 +1,38 @@
+// Copyright 2022 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Local copy of Envoy xDS proto file, used for testing only.
+
+syntax = "proto3";
+
+package envoy.type.http.v3;
+
+import "google/protobuf/duration.proto";
+
+// [#protodoc-title: Http cookie API]
+
+// Cookie defines an API for obtaining or generating HTTP cookie.
+message Cookie {
+ // The name that will be used to obtain cookie value from downstream HTTP request or generate
+ // new cookie for downstream.
+ string name = 1;
+
+ // Duration of cookie. This will be used to set the expiry time of a new cookie when it is
+ // generated. Set this to 0 to use a session cookie.
+ google.protobuf.Duration ttl = 2;
+
+ // Path of cookie. This will be used to set the path of a new cookie when it is generated.
+ // If no path is specified here, no path will be set for the cookie.
+ string path = 3;
+}
diff --git a/src/proto/grpc/testing/xds/v3/stateful_session.proto b/src/proto/grpc/testing/xds/v3/stateful_session.proto
new file mode 100644
index 00000000000..a033ec6a5bd
--- /dev/null
+++ b/src/proto/grpc/testing/xds/v3/stateful_session.proto
@@ -0,0 +1,44 @@
+// Copyright 2022 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Local copy of Envoy xDS proto file, used for testing only.
+
+syntax = "proto3";
+
+package envoy.extensions.filters.http.stateful_session.v3;
+
+import "src/proto/grpc/testing/xds/v3/extension.proto";
+
+// [#protodoc-title: Stateful session filter]
+// Stateful session :ref:`configuration overview `.
+// [#extension: envoy.filters.http.stateful_session]
+
+message StatefulSession {
+ // Specific implementation of session state. This session state will be used to store and
+ // get address of the upstream host to which the session is assigned.
+ //
+ // [#extension-category: envoy.http.stateful_session]
+ config.core.v3.TypedExtensionConfig session_state = 1;
+}
+
+message StatefulSessionPerRoute {
+ oneof override {
+ // Disable the stateful session filter for this particular vhost or route. If disabled is
+ // specified in multiple per-filter-configs, the most specific one will be used.
+ bool disabled = 1;
+
+ // Per-route stateful session configuration that can be served by RDS or static route table.
+ StatefulSession stateful_session = 2;
+ }
+}
diff --git a/src/proto/grpc/testing/xds/v3/stateful_session_cookie.proto b/src/proto/grpc/testing/xds/v3/stateful_session_cookie.proto
new file mode 100644
index 00000000000..09354b8a28a
--- /dev/null
+++ b/src/proto/grpc/testing/xds/v3/stateful_session_cookie.proto
@@ -0,0 +1,50 @@
+// Copyright 2022 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Local copy of Envoy xDS proto file, used for testing only.
+
+syntax = "proto3";
+
+package envoy.extensions.http.stateful_session.cookie.v3;
+
+import "src/proto/grpc/testing/xds/v3/cookie.proto";
+
+// [#protodoc-title: Cookie based stateful session extension]
+
+// This extension allows the session state to be tracked via cookies.
+//
+// This extension first encodes the address of the upstream host selected by the load balancer
+// into a ``set-cookie`` response header with the :ref:`cookie configuration
+// `.
+// when new requests are incoming, this extension will try to parse the specific upstream host
+// address by the cookie name. If the address parsed from the cookie corresponds to a valid
+// upstream host, this upstream host will be selected first. See :ref:`stateful session filter
+// `.
+//
+// For example, if the cookie name is set to ``sticky-host``, envoy will prefer ``1.2.3.4:80``
+// as the upstream host when the request contains the following header:
+//
+// .. code-block:: none
+//
+// cookie: sticky-host="MS4yLjMuNDo4MA=="
+//
+// When processing the upstream response, if ``1.2.3.4:80`` is indeed the final choice the extension
+// does nothing. If ``1.2.3.4:80`` is not the final choice, the new selected host will be used to
+// update the cookie (via the ``set-cookie`` response header).
+//
+// [#extension: envoy.http.stateful_session.cookie]
+message CookieBasedSessionState {
+ // The cookie configuration used to track session state.
+ type.http.v3.Cookie cookie = 1;
+}
diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py
index 2a90435c5b2..c73edf19488 100644
--- a/src/python/grpcio/grpc_core_dependencies.py
+++ b/src/python/grpcio/grpc_core_dependencies.py
@@ -186,7 +186,9 @@ CORE_SOURCE_FILES = [
'src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c',
'src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c',
'src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c',
+ 'src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c',
'src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c',
+ 'src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c',
'src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c',
'src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c',
@@ -333,7 +335,9 @@ CORE_SOURCE_FILES = [
'src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c',
@@ -419,6 +423,7 @@ CORE_SOURCE_FILES = [
'src/core/ext/xds/xds_http_fault_filter.cc',
'src/core/ext/xds/xds_http_filters.cc',
'src/core/ext/xds/xds_http_rbac_filter.cc',
+ 'src/core/ext/xds/xds_http_stateful_session_filter.cc',
'src/core/ext/xds/xds_lb_policy_registry.cc',
'src/core/ext/xds/xds_listener.cc',
'src/core/ext/xds/xds_route_config.cc',
diff --git a/test/core/xds/BUILD b/test/core/xds/BUILD
index c7b9d276f16..8bdc344a9e3 100644
--- a/test/core/xds/BUILD
+++ b/test/core/xds/BUILD
@@ -219,6 +219,9 @@ grpc_cc_test(
"//src/proto/grpc/testing/xds/v3:fault_proto",
"//src/proto/grpc/testing/xds/v3:http_filter_rbac_proto",
"//src/proto/grpc/testing/xds/v3:router_proto",
+ "//src/proto/grpc/testing/xds/v3:stateful_session_cookie_proto",
+ "//src/proto/grpc/testing/xds/v3:stateful_session_proto",
+ "//src/proto/grpc/testing/xds/v3:typed_struct_proto",
"//test/core/util:grpc_test_util",
"//test/cpp/util:grpc_cli_utils",
],
diff --git a/test/core/xds/xds_http_filters_test.cc b/test/core/xds/xds_http_filters_test.cc
index 5dd14fad35f..17b5d0b73a7 100644
--- a/test/core/xds/xds_http_filters_test.cc
+++ b/test/core/xds/xds_http_filters_test.cc
@@ -29,6 +29,7 @@
#include "absl/strings/strip.h"
#include "absl/types/variant.h"
#include "gtest/gtest.h"
+#include "upb/def.hpp"
#include "upb/upb.hpp"
#include
@@ -40,6 +41,10 @@
#include "src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h"
#include "src/core/ext/filters/rbac/rbac_filter.h"
#include "src/core/ext/filters/rbac/rbac_service_config_parser.h"
+#include "src/core/ext/filters/stateful_session/stateful_session_filter.h"
+#include "src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h"
+#include "src/core/ext/xds/xds_bootstrap_grpc.h"
+#include "src/core/lib/gprpp/env.h"
#include "src/proto/grpc/testing/xds/v3/address.pb.h"
#include "src/proto/grpc/testing/xds/v3/fault.pb.h"
#include "src/proto/grpc/testing/xds/v3/fault_common.pb.h"
@@ -52,7 +57,10 @@
#include "src/proto/grpc/testing/xds/v3/regex.pb.h"
#include "src/proto/grpc/testing/xds/v3/route.pb.h"
#include "src/proto/grpc/testing/xds/v3/router.pb.h"
+#include "src/proto/grpc/testing/xds/v3/stateful_session.pb.h"
+#include "src/proto/grpc/testing/xds/v3/stateful_session_cookie.pb.h"
#include "src/proto/grpc/testing/xds/v3/string.pb.h"
+#include "src/proto/grpc/testing/xds/v3/typed_struct.pb.h"
#include "test/core/util/test_config.h"
// IWYU pragma: no_include
@@ -65,6 +73,11 @@ using ::envoy::extensions::filters::http::fault::v3::HTTPFault;
using ::envoy::extensions::filters::http::rbac::v3::RBAC;
using ::envoy::extensions::filters::http::rbac::v3::RBACPerRoute;
using ::envoy::extensions::filters::http::router::v3::Router;
+using ::envoy::extensions::filters::http::stateful_session::v3::StatefulSession;
+using ::envoy::extensions::filters::http::stateful_session::v3 ::
+ StatefulSessionPerRoute;
+using ::envoy::extensions::http::stateful_session::cookie::v3 ::
+ CookieBasedSessionState;
//
// base class for filter tests
@@ -72,6 +85,10 @@ using ::envoy::extensions::filters::http::router::v3::Router;
class XdsHttpFilterTest : public ::testing::Test {
protected:
+ XdsHttpFilterTest()
+ : decode_context_{nullptr, xds_server_, nullptr, upb_def_pool_.ptr(),
+ upb_arena_.ptr()} {}
+
XdsExtension MakeXdsExtension(const grpc::protobuf::Message& message) {
google::protobuf::Any any;
any.PackFrom(message);
@@ -92,9 +109,12 @@ class XdsHttpFilterTest : public ::testing::Test {
absl::StripPrefix(type, "type.googleapis.com/"));
}
+ GrpcXdsBootstrap::GrpcXdsServer xds_server_;
+ upb::DefPool upb_def_pool_;
+ upb::Arena upb_arena_;
+ XdsResourceType::DecodeContext decode_context_;
XdsHttpFilterRegistry registry_;
ValidationErrors errors_;
- upb::Arena arena_;
std::string type_url_storage_;
std::string serialized_storage_;
};
@@ -155,8 +175,8 @@ TEST_F(XdsRouterFilterTest, Accessors) {
TEST_F(XdsRouterFilterTest, GenerateFilterConfig) {
XdsExtension extension = MakeXdsExtension(Router());
- auto config = filter_->GenerateFilterConfig(std::move(extension),
- arena_.ptr(), &errors_);
+ auto config = filter_->GenerateFilterConfig(decode_context_,
+ std::move(extension), &errors_);
ASSERT_TRUE(errors_.ok()) << errors_.status("unexpected errors");
ASSERT_TRUE(config.has_value());
EXPECT_EQ(config->config_proto_type_name, filter_->ConfigProtoName());
@@ -166,8 +186,8 @@ TEST_F(XdsRouterFilterTest, GenerateFilterConfig) {
TEST_F(XdsRouterFilterTest, GenerateFilterConfigTypedStruct) {
XdsExtension extension = MakeXdsExtension(Router());
extension.value = Json();
- auto config = filter_->GenerateFilterConfig(std::move(extension),
- arena_.ptr(), &errors_);
+ auto config = filter_->GenerateFilterConfig(decode_context_,
+ std::move(extension), &errors_);
absl::Status status = errors_.status("errors validating filter config");
EXPECT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
EXPECT_EQ(
@@ -182,8 +202,8 @@ TEST_F(XdsRouterFilterTest, GenerateFilterConfigUnparseable) {
XdsExtension extension = MakeXdsExtension(Router());
std::string serialized_resource("\0", 1);
extension.value = absl::string_view(serialized_resource);
- auto config = filter_->GenerateFilterConfig(std::move(extension),
- arena_.ptr(), &errors_);
+ auto config = filter_->GenerateFilterConfig(decode_context_,
+ std::move(extension), &errors_);
absl::Status status = errors_.status("errors validating filter config");
EXPECT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
EXPECT_EQ(
@@ -196,8 +216,8 @@ TEST_F(XdsRouterFilterTest, GenerateFilterConfigUnparseable) {
TEST_F(XdsRouterFilterTest, GenerateFilterConfigOverride) {
XdsExtension extension = MakeXdsExtension(Router());
- auto config = filter_->GenerateFilterConfigOverride(std::move(extension),
- arena_.ptr(), &errors_);
+ auto config = filter_->GenerateFilterConfigOverride(
+ decode_context_, std::move(extension), &errors_);
absl::Status status = errors_.status("errors validating filter config");
EXPECT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
EXPECT_EQ(
@@ -271,10 +291,10 @@ class XdsFaultInjectionFilterConfigTest
absl::optional GenerateConfig(
XdsExtension extension) {
if (GetParam()) {
- return filter_->GenerateFilterConfigOverride(std::move(extension),
- arena_.ptr(), &errors_);
+ return filter_->GenerateFilterConfigOverride(
+ decode_context_, std::move(extension), &errors_);
}
- return filter_->GenerateFilterConfig(std::move(extension), arena_.ptr(),
+ return filter_->GenerateFilterConfig(decode_context_, std::move(extension),
&errors_);
}
};
@@ -439,8 +459,8 @@ TEST_F(XdsRbacFilterTest, ModifyChannelArgs) {
TEST_F(XdsRbacFilterTest, GenerateFilterConfig) {
XdsExtension extension = MakeXdsExtension(RBAC());
- auto config = filter_->GenerateFilterConfig(std::move(extension),
- arena_.ptr(), &errors_);
+ auto config = filter_->GenerateFilterConfig(decode_context_,
+ std::move(extension), &errors_);
ASSERT_TRUE(errors_.ok()) << errors_.status("unexpected errors");
ASSERT_TRUE(config.has_value());
EXPECT_EQ(config->config_proto_type_name, filter_->ConfigProtoName());
@@ -450,8 +470,8 @@ TEST_F(XdsRbacFilterTest, GenerateFilterConfig) {
TEST_F(XdsRbacFilterTest, GenerateFilterConfigTypedStruct) {
XdsExtension extension = MakeXdsExtension(RBAC());
extension.value = Json();
- auto config = filter_->GenerateFilterConfig(std::move(extension),
- arena_.ptr(), &errors_);
+ auto config = filter_->GenerateFilterConfig(decode_context_,
+ std::move(extension), &errors_);
absl::Status status = errors_.status("errors validating filter config");
EXPECT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
EXPECT_EQ(
@@ -466,8 +486,8 @@ TEST_F(XdsRbacFilterTest, GenerateFilterConfigUnparseable) {
XdsExtension extension = MakeXdsExtension(RBAC());
std::string serialized_resource("\0", 1);
extension.value = absl::string_view(serialized_resource);
- auto config = filter_->GenerateFilterConfig(std::move(extension),
- arena_.ptr(), &errors_);
+ auto config = filter_->GenerateFilterConfig(decode_context_,
+ std::move(extension), &errors_);
absl::Status status = errors_.status("errors validating filter config");
EXPECT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
EXPECT_EQ(
@@ -480,8 +500,8 @@ TEST_F(XdsRbacFilterTest, GenerateFilterConfigUnparseable) {
TEST_F(XdsRbacFilterTest, GenerateFilterConfigOverride) {
XdsExtension extension = MakeXdsExtension(RBACPerRoute());
- auto config = filter_->GenerateFilterConfigOverride(std::move(extension),
- arena_.ptr(), &errors_);
+ auto config = filter_->GenerateFilterConfigOverride(
+ decode_context_, std::move(extension), &errors_);
ASSERT_TRUE(errors_.ok()) << errors_.status("unexpected errors");
ASSERT_TRUE(config.has_value());
EXPECT_EQ(config->config_proto_type_name, filter_->OverrideConfigProtoName());
@@ -491,8 +511,8 @@ TEST_F(XdsRbacFilterTest, GenerateFilterConfigOverride) {
TEST_F(XdsRbacFilterTest, GenerateFilterConfigOverrideTypedStruct) {
XdsExtension extension = MakeXdsExtension(RBACPerRoute());
extension.value = Json();
- auto config = filter_->GenerateFilterConfigOverride(std::move(extension),
- arena_.ptr(), &errors_);
+ auto config = filter_->GenerateFilterConfigOverride(
+ decode_context_, std::move(extension), &errors_);
absl::Status status = errors_.status("errors validating filter config");
EXPECT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
EXPECT_EQ(status.message(),
@@ -506,8 +526,8 @@ TEST_F(XdsRbacFilterTest, GenerateFilterConfigOverrideUnparseable) {
XdsExtension extension = MakeXdsExtension(RBACPerRoute());
std::string serialized_resource("\0", 1);
extension.value = absl::string_view(serialized_resource);
- auto config = filter_->GenerateFilterConfigOverride(std::move(extension),
- arena_.ptr(), &errors_);
+ auto config = filter_->GenerateFilterConfigOverride(
+ decode_context_, std::move(extension), &errors_);
absl::Status status = errors_.status("errors validating filter config");
EXPECT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
EXPECT_EQ(status.message(),
@@ -528,11 +548,11 @@ class XdsRbacFilterConfigTest : public XdsRbacFilterTest,
RBACPerRoute rbac_per_route;
*rbac_per_route.mutable_rbac() = rbac;
XdsExtension extension = MakeXdsExtension(rbac_per_route);
- return filter_->GenerateFilterConfigOverride(std::move(extension),
- arena_.ptr(), &errors_);
+ return filter_->GenerateFilterConfigOverride(
+ decode_context_, std::move(extension), &errors_);
}
XdsExtension extension = MakeXdsExtension(rbac);
- return filter_->GenerateFilterConfig(std::move(extension), arena_.ptr(),
+ return filter_->GenerateFilterConfig(decode_context_, std::move(extension),
&errors_);
}
@@ -907,6 +927,348 @@ TEST_P(XdsRbacFilterConfigTest, InvalidPermissionAndPrincipal) {
<< status;
}
+//
+// StatefulSession filter tests
+//
+
+using XdsStatefulSessionFilterDisabledTest = XdsHttpFilterTest;
+
+TEST_F(XdsStatefulSessionFilterDisabledTest, FilterNotRegistered) {
+ XdsExtension extension = MakeXdsExtension(StatefulSession());
+ EXPECT_EQ(GetFilter(extension.type), nullptr);
+}
+
+class XdsStatefulSessionFilterTest : public XdsHttpFilterTest {
+ protected:
+ void SetUp() override {
+ SetEnv("GRPC_EXPERIMENTAL_XDS_ENABLE_HOST_OVERRIDE", "true");
+ registry_ = XdsHttpFilterRegistry();
+ XdsExtension extension = MakeXdsExtension(StatefulSession());
+ filter_ = GetFilter(extension.type);
+ GPR_ASSERT(filter_ != nullptr);
+ }
+
+ void TearDown() override {
+ UnsetEnv("GRPC_EXPERIMENTAL_XDS_ENABLE_HOST_OVERRIDE");
+ }
+
+ const XdsHttpFilterImpl* filter_;
+};
+
+TEST_F(XdsStatefulSessionFilterTest, Accessors) {
+ EXPECT_EQ(
+ filter_->ConfigProtoName(),
+ "envoy.extensions.filters.http.stateful_session.v3.StatefulSession");
+ EXPECT_EQ(filter_->OverrideConfigProtoName(),
+ "envoy.extensions.filters.http.stateful_session.v3"
+ ".StatefulSessionPerRoute");
+ EXPECT_EQ(filter_->channel_filter(), &StatefulSessionFilter::kFilter);
+ EXPECT_TRUE(filter_->IsSupportedOnClients());
+ EXPECT_FALSE(filter_->IsSupportedOnServers());
+ EXPECT_FALSE(filter_->IsTerminalFilter());
+}
+
+TEST_F(XdsStatefulSessionFilterTest, ModifyChannelArgs) {
+ ChannelArgs args = filter_->ModifyChannelArgs(ChannelArgs());
+ auto value = args.GetInt(GRPC_ARG_PARSE_STATEFUL_SESSION_METHOD_CONFIG);
+ ASSERT_TRUE(value.has_value());
+ EXPECT_EQ(*value, 1);
+}
+
+TEST_F(XdsStatefulSessionFilterTest, OverrideConfigDisabled) {
+ StatefulSessionPerRoute stateful_session_per_route;
+ stateful_session_per_route.set_disabled(true);
+ XdsExtension extension = MakeXdsExtension(stateful_session_per_route);
+ auto config = filter_->GenerateFilterConfigOverride(
+ decode_context_, std::move(extension), &errors_);
+ ASSERT_TRUE(errors_.ok()) << errors_.status("unexpected errors");
+ ASSERT_TRUE(config.has_value());
+ EXPECT_EQ(config->config_proto_type_name, filter_->OverrideConfigProtoName());
+ EXPECT_EQ(config->config, Json(Json::Object{})) << config->config.Dump();
+}
+
+TEST_F(XdsStatefulSessionFilterTest, GenerateServiceConfigNoOverride) {
+ XdsHttpFilterImpl::FilterConfig hcm_config = {filter_->ConfigProtoName(),
+ Json::Object{{"name", "foo"}}};
+ auto config = filter_->GenerateServiceConfig(hcm_config, nullptr);
+ ASSERT_TRUE(config.ok()) << config.status();
+ EXPECT_EQ(config->service_config_field_name, "stateful_session");
+ EXPECT_EQ(config->element, Json(Json::Object{{"name", "foo"}}).Dump());
+}
+
+TEST_F(XdsStatefulSessionFilterTest, GenerateServiceConfigWithOverride) {
+ XdsHttpFilterImpl::FilterConfig hcm_config = {filter_->ConfigProtoName(),
+ Json::Object{{"name", "foo"}}};
+ XdsHttpFilterImpl::FilterConfig override_config = {
+ filter_->OverrideConfigProtoName(), Json::Object{{"name", "bar"}}};
+ auto config = filter_->GenerateServiceConfig(hcm_config, &override_config);
+ ASSERT_TRUE(config.ok()) << config.status();
+ EXPECT_EQ(config->service_config_field_name, "stateful_session");
+ EXPECT_EQ(config->element, Json(Json::Object{{"name", "bar"}}).Dump());
+}
+
+TEST_F(XdsStatefulSessionFilterTest, GenerateFilterConfigTypedStruct) {
+ XdsExtension extension = MakeXdsExtension(StatefulSession());
+ extension.value = Json();
+ auto config = filter_->GenerateFilterConfig(decode_context_,
+ std::move(extension), &errors_);
+ absl::Status status = errors_.status("errors validating filter config");
+ EXPECT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
+ EXPECT_EQ(
+ status.message(),
+ "errors validating filter config: ["
+ "field:http_filter.value["
+ "envoy.extensions.filters.http.stateful_session.v3.StatefulSession] "
+ "error:could not parse stateful session filter config]")
+ << status;
+}
+
+TEST_F(XdsStatefulSessionFilterTest, GenerateFilterConfigUnparseable) {
+ XdsExtension extension = MakeXdsExtension(StatefulSession());
+ std::string serialized_resource("\0", 1);
+ extension.value = absl::string_view(serialized_resource);
+ auto config = filter_->GenerateFilterConfig(decode_context_,
+ std::move(extension), &errors_);
+ absl::Status status = errors_.status("errors validating filter config");
+ EXPECT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
+ EXPECT_EQ(
+ status.message(),
+ "errors validating filter config: ["
+ "field:http_filter.value["
+ "envoy.extensions.filters.http.stateful_session.v3.StatefulSession] "
+ "error:could not parse stateful session filter config]")
+ << status;
+}
+
+TEST_F(XdsStatefulSessionFilterTest, GenerateFilterConfigOverrideTypedStruct) {
+ XdsExtension extension = MakeXdsExtension(StatefulSessionPerRoute());
+ extension.value = Json();
+ auto config = filter_->GenerateFilterConfigOverride(
+ decode_context_, std::move(extension), &errors_);
+ absl::Status status = errors_.status("errors validating filter config");
+ EXPECT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
+ EXPECT_EQ(status.message(),
+ "errors validating filter config: ["
+ "field:http_filter.value["
+ "envoy.extensions.filters.http.stateful_session.v3"
+ ".StatefulSessionPerRoute] "
+ "error:could not parse stateful session filter override config]")
+ << status;
+}
+
+TEST_F(XdsStatefulSessionFilterTest, GenerateFilterConfigOverrideUnparseable) {
+ XdsExtension extension = MakeXdsExtension(StatefulSessionPerRoute());
+ std::string serialized_resource("\0", 1);
+ extension.value = absl::string_view(serialized_resource);
+ auto config = filter_->GenerateFilterConfigOverride(
+ decode_context_, std::move(extension), &errors_);
+ absl::Status status = errors_.status("errors validating filter config");
+ EXPECT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
+ EXPECT_EQ(status.message(),
+ "errors validating filter config: ["
+ "field:http_filter.value["
+ "envoy.extensions.filters.http.stateful_session.v3"
+ ".StatefulSessionPerRoute] "
+ "error:could not parse stateful session filter override config]")
+ << status;
+}
+
+// For the stateful session filter, the override config is a superset of the
+// top-level config, so we test all of the common fields as input for
+// both GenerateFilterConfig() and GenerateFilterConfigOverride().
+class XdsStatefulSessionFilterConfigTest
+ : public XdsStatefulSessionFilterTest,
+ public ::testing::WithParamInterface {
+ protected:
+ absl::optional GenerateConfig(
+ StatefulSession stateful_session) {
+ if (GetParam()) {
+ StatefulSessionPerRoute stateful_session_per_route;
+ *stateful_session_per_route.mutable_stateful_session() = stateful_session;
+ XdsExtension extension = MakeXdsExtension(stateful_session_per_route);
+ return filter_->GenerateFilterConfigOverride(
+ decode_context_, std::move(extension), &errors_);
+ }
+ XdsExtension extension = MakeXdsExtension(stateful_session);
+ return filter_->GenerateFilterConfig(decode_context_, std::move(extension),
+ &errors_);
+ }
+
+ std::string FieldPrefix() {
+ return absl::StrCat("http_filter.value[",
+ (GetParam() ? filter_->OverrideConfigProtoName()
+ : filter_->ConfigProtoName()),
+ "]", (GetParam() ? ".stateful_session" : ""));
+ }
+};
+
+INSTANTIATE_TEST_SUITE_P(XdsStatefulSessionFilter,
+ XdsStatefulSessionFilterConfigTest, ::testing::Bool());
+
+TEST_P(XdsStatefulSessionFilterConfigTest, MinimalConfig) {
+ CookieBasedSessionState cookie_state;
+ cookie_state.mutable_cookie()->set_name("foo");
+ StatefulSession stateful_session;
+ stateful_session.mutable_session_state()->mutable_typed_config()->PackFrom(
+ cookie_state);
+ auto config = GenerateConfig(stateful_session);
+ ASSERT_TRUE(errors_.ok()) << errors_.status("unexpected errors");
+ ASSERT_TRUE(config.has_value());
+ EXPECT_EQ(config->config_proto_type_name,
+ GetParam() ? filter_->OverrideConfigProtoName()
+ : filter_->ConfigProtoName());
+ EXPECT_EQ(config->config, Json(Json::Object{{"name", "foo"}}))
+ << config->config.Dump();
+}
+
+TEST_P(XdsStatefulSessionFilterConfigTest, PathAndTtl) {
+ CookieBasedSessionState cookie_state;
+ auto* cookie = cookie_state.mutable_cookie();
+ cookie->set_name("foo");
+ cookie->set_path("/service/method");
+ cookie->mutable_ttl()->set_seconds(3);
+ StatefulSession stateful_session;
+ stateful_session.mutable_session_state()->mutable_typed_config()->PackFrom(
+ cookie_state);
+ auto config = GenerateConfig(stateful_session);
+ ASSERT_TRUE(errors_.ok()) << errors_.status("unexpected errors");
+ ASSERT_TRUE(config.has_value());
+ EXPECT_EQ(config->config_proto_type_name,
+ GetParam() ? filter_->OverrideConfigProtoName()
+ : filter_->ConfigProtoName());
+ EXPECT_EQ(config->config, Json(Json::Object{
+ {"name", "foo"},
+ {"path", "/service/method"},
+ {"ttl", "3.000000000s"},
+ }))
+ << config->config.Dump();
+}
+
+TEST_P(XdsStatefulSessionFilterConfigTest, SessionStateUnset) {
+ auto config = GenerateConfig(StatefulSession());
+ absl::Status status = errors_.status("errors validating filter config");
+ ASSERT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
+ EXPECT_EQ(
+ status.message(),
+ absl::StrCat("errors validating filter config: [field:", FieldPrefix(),
+ ".session_state error:field not present]"))
+ << status;
+}
+
+TEST_P(XdsStatefulSessionFilterConfigTest, CookieNotPresent) {
+ StatefulSession stateful_session;
+ stateful_session.mutable_session_state()->mutable_typed_config()->PackFrom(
+ CookieBasedSessionState());
+ auto config = GenerateConfig(stateful_session);
+ absl::Status status = errors_.status("errors validating filter config");
+ ASSERT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
+ EXPECT_EQ(
+ status.message(),
+ absl::StrCat("errors validating filter config: [field:", FieldPrefix(),
+ ".session_state.typed_config.value["
+ "envoy.extensions.http.stateful_session.cookie.v3"
+ ".CookieBasedSessionState].cookie "
+ "error:field not present]"))
+ << status;
+}
+
+TEST_P(XdsStatefulSessionFilterConfigTest, CookieNameNotPresent) {
+ CookieBasedSessionState cookie_state;
+ cookie_state.mutable_cookie();
+ StatefulSession stateful_session;
+ stateful_session.mutable_session_state()->mutable_typed_config()->PackFrom(
+ cookie_state);
+ auto config = GenerateConfig(stateful_session);
+ absl::Status status = errors_.status("errors validating filter config");
+ ASSERT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
+ EXPECT_EQ(
+ status.message(),
+ absl::StrCat("errors validating filter config: [field:", FieldPrefix(),
+ ".session_state.typed_config.value["
+ "envoy.extensions.http.stateful_session.cookie.v3"
+ ".CookieBasedSessionState].cookie.name "
+ "error:field not present]"))
+ << status;
+}
+
+TEST_P(XdsStatefulSessionFilterConfigTest, InvalidTtl) {
+ CookieBasedSessionState cookie_state;
+ auto* cookie = cookie_state.mutable_cookie();
+ cookie->set_name("foo");
+ cookie->mutable_ttl()->set_seconds(-1);
+ StatefulSession stateful_session;
+ stateful_session.mutable_session_state()->mutable_typed_config()->PackFrom(
+ cookie_state);
+ auto config = GenerateConfig(stateful_session);
+ absl::Status status = errors_.status("errors validating filter config");
+ ASSERT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
+ EXPECT_EQ(
+ status.message(),
+ absl::StrCat("errors validating filter config: [field:", FieldPrefix(),
+ ".session_state.typed_config.value["
+ "envoy.extensions.http.stateful_session.cookie.v3"
+ ".CookieBasedSessionState].cookie.ttl.seconds "
+ "error:value must be in the range [0, 315576000000]]"))
+ << status;
+}
+
+TEST_P(XdsStatefulSessionFilterConfigTest, UnknownSessionStateType) {
+ StatefulSession stateful_session;
+ stateful_session.mutable_session_state()->mutable_typed_config()->PackFrom(
+ Router());
+ auto config = GenerateConfig(stateful_session);
+ absl::Status status = errors_.status("errors validating filter config");
+ ASSERT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
+ EXPECT_EQ(
+ status.message(),
+ absl::StrCat("errors validating filter config: [field:", FieldPrefix(),
+ ".session_state.typed_config.value["
+ "envoy.extensions.filters.http.router.v3.Router] "
+ "error:unsupported session state type]"))
+ << status;
+}
+
+TEST_P(XdsStatefulSessionFilterConfigTest, TypedStructSessionState) {
+ StatefulSession stateful_session;
+ auto* typed_config =
+ stateful_session.mutable_session_state()->mutable_typed_config();
+ typed_config->PackFrom(CookieBasedSessionState());
+ ::xds::type::v3::TypedStruct typed_struct;
+ typed_struct.set_type_url(typed_config->type_url());
+ typed_config->PackFrom(typed_struct);
+ auto config = GenerateConfig(stateful_session);
+ absl::Status status = errors_.status("errors validating filter config");
+ ASSERT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
+ EXPECT_EQ(
+ status.message(),
+ absl::StrCat("errors validating filter config: [field:", FieldPrefix(),
+ ".session_state.typed_config.value["
+ "xds.type.v3.TypedStruct].value["
+ "envoy.extensions.http.stateful_session.cookie.v3"
+ ".CookieBasedSessionState] "
+ "error:could not parse session state config]"))
+ << status;
+}
+
+TEST_P(XdsStatefulSessionFilterConfigTest, UnparseableSessionState) {
+ StatefulSession stateful_session;
+ stateful_session.mutable_session_state()->mutable_typed_config()->PackFrom(
+ CookieBasedSessionState());
+ stateful_session.mutable_session_state()->mutable_typed_config()->set_value(
+ std::string("\0", 1));
+ auto config = GenerateConfig(stateful_session);
+ absl::Status status = errors_.status("errors validating filter config");
+ ASSERT_EQ(status.code(), absl::StatusCode::kInvalidArgument);
+ EXPECT_EQ(
+ status.message(),
+ absl::StrCat("errors validating filter config: [field:", FieldPrefix(),
+ ".session_state.typed_config.value["
+ "envoy.extensions.http.stateful_session.cookie.v3"
+ ".CookieBasedSessionState] "
+ "error:could not parse session state config]"))
+ << status;
+}
+
} // namespace
} // namespace testing
} // namespace grpc_core
diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal
index a7266ff5c11..9d477a0b7e2 100644
--- a/tools/doxygen/Doxyfile.c++.internal
+++ b/tools/doxygen/Doxyfile.c++.internal
@@ -1432,8 +1432,12 @@ src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h \
src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h \
+src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c \
+src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h \
src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h \
+src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c \
+src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h \
src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c \
src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h \
src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c \
@@ -1726,8 +1730,12 @@ src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdef
src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c \
@@ -1900,6 +1908,8 @@ src/core/ext/xds/xds_http_filters.cc \
src/core/ext/xds/xds_http_filters.h \
src/core/ext/xds/xds_http_rbac_filter.cc \
src/core/ext/xds/xds_http_rbac_filter.h \
+src/core/ext/xds/xds_http_stateful_session_filter.cc \
+src/core/ext/xds/xds_http_stateful_session_filter.h \
src/core/ext/xds/xds_lb_policy_registry.cc \
src/core/ext/xds/xds_lb_policy_registry.h \
src/core/ext/xds/xds_listener.cc \
diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal
index 422a4b0a8e9..be269c413f7 100644
--- a/tools/doxygen/Doxyfile.core.internal
+++ b/tools/doxygen/Doxyfile.core.internal
@@ -1205,8 +1205,12 @@ src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h \
src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h \
+src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c \
+src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h \
src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h \
+src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c \
+src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h \
src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c \
src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h \
src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c \
@@ -1499,8 +1503,12 @@ src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdef
src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c \
@@ -1673,6 +1681,8 @@ src/core/ext/xds/xds_http_filters.cc \
src/core/ext/xds/xds_http_filters.h \
src/core/ext/xds/xds_http_rbac_filter.cc \
src/core/ext/xds/xds_http_rbac_filter.h \
+src/core/ext/xds/xds_http_stateful_session_filter.cc \
+src/core/ext/xds/xds_http_stateful_session_filter.h \
src/core/ext/xds/xds_lb_policy_registry.cc \
src/core/ext/xds/xds_lb_policy_registry.h \
src/core/ext/xds/xds_listener.cc \