From 4f34a7cd49f12caee57af5e271b960cc5bcb31e1 Mon Sep 17 00:00:00 2001 From: Takeshi Yoneda Date: Sat, 15 Feb 2025 11:11:28 -0800 Subject: [PATCH] Demonstrate header removal Signed-off-by: Takeshi Yoneda --- Dockerfile | 2 +- ENVOY_VERSION | 2 +- integration/envoy.yaml | 4 +++- integration/main_test.go | 2 ++ rust/Cargo.lock | 2 +- rust/Cargo.toml | 2 +- rust/src/http_header_mutation.rs | 26 ++++++++++++++++++++++++++ 7 files changed, 35 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index bcb36d0..a4047c8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -28,7 +28,7 @@ RUN cp /build/target/aarch64-unknown-linux-gnu/debug/librust_module.so /build/ar RUN cp /build/target/x86_64-unknown-linux-gnu/debug/librust_module.so /build/amd64_librust_module.so # Finally, copy the built library to the final image. -FROM envoyproxy/envoy-dev:4a113b5118003682833ba612202eb68628861ac6 AS envoy +FROM envoyproxy/envoy-dev:726958228dc292f65b5acde26162a3645a99b067 AS envoy ARG TARGETARCH ENV ENVOY_DYNAMIC_MODULES_SEARCH_PATH=/usr/local/lib COPY --from=rust_builder /build/${TARGETARCH}_librust_module.so /usr/local/lib/librust_module.so diff --git a/ENVOY_VERSION b/ENVOY_VERSION index 61411a3..1dc9478 100644 --- a/ENVOY_VERSION +++ b/ENVOY_VERSION @@ -1 +1 @@ -4a113b5118003682833ba612202eb68628861ac6 \ No newline at end of file +726958228dc292f65b5acde26162a3645a99b067 \ No newline at end of file diff --git a/integration/envoy.yaml b/integration/envoy.yaml index e72f4b5..9ae2b42 100644 --- a/integration/envoy.yaml +++ b/integration/envoy.yaml @@ -50,7 +50,9 @@ static_resources: filter_config: | { "request_headers": [["X-Envoy-Header", "envoy-header"], ["X-Envoy-Header2", "envoy-header2"]], - "response_headers": [["Foo", "bar"], ["Foo2", "bar2"]] + "remove_request_headers": ["apple"], + "response_headers": [["Foo", "bar"], ["Foo2", "bar2"]], + "remove_response_headers": ["Access-Control-Allow-Credentials"] } - name: envoy.filters.http.router typed_config: diff --git a/integration/main_test.go b/integration/main_test.go index eb6e03d..f5c9d5f 100644 --- a/integration/main_test.go +++ b/integration/main_test.go @@ -149,10 +149,12 @@ func TestIntegration(t *testing.T) { require.Equal(t, "envoy-header", headersBody.Headers["X-Envoy-Header"]) require.Equal(t, "envoy-header2", headersBody.Headers["X-Envoy-Header2"]) + require.NotContains(t, headersBody.Headers, "apple") // We also need to check that the response headers were mutated. require.Equal(t, "bar", resp.Header.Get("Foo")) require.Equal(t, "bar2", resp.Header.Get("Foo2")) + require.Equal(t, "", resp.Header.Get("Access-Control-Allow-Credentials")) return true }, 30*time.Second, 200*time.Millisecond) }) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 6426cba..0468034 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -90,7 +90,7 @@ checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "envoy-proxy-dynamic-modules-rust-sdk" version = "0.1.0" -source = "git+https://github.com/envoyproxy/envoy?rev=4a113b5118003682833ba612202eb68628861ac6#4a113b5118003682833ba612202eb68628861ac6" +source = "git+https://github.com/envoyproxy/envoy?rev=726958228dc292f65b5acde26162a3645a99b067#726958228dc292f65b5acde26162a3645a99b067" dependencies = [ "bindgen", "mockall", diff --git a/rust/Cargo.toml b/rust/Cargo.toml index ad0e916..2ec9b05 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -8,7 +8,7 @@ repository = "https://github.com/envoyproxy/dynamic-modules-example" [dependencies] # The SDK version must match the Envoy version due to the strict compatibility requirements. -envoy-proxy-dynamic-modules-rust-sdk = { git = "https://github.com/envoyproxy/envoy", rev = "4a113b5118003682833ba612202eb68628861ac6" } +envoy-proxy-dynamic-modules-rust-sdk = { git = "https://github.com/envoyproxy/envoy", rev = "726958228dc292f65b5acde26162a3645a99b067" } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" rand = "0.9.0" diff --git a/rust/src/http_header_mutation.rs b/rust/src/http_header_mutation.rs index 47666b1..d54846d 100644 --- a/rust/src/http_header_mutation.rs +++ b/rust/src/http_header_mutation.rs @@ -7,7 +7,9 @@ use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Debug)] pub struct FilterConfig { request_headers: Vec<(String, String)>, + remove_request_headers: Vec, response_headers: Vec<(String, String)>, + remove_response_headers: Vec, } impl FilterConfig { @@ -32,7 +34,9 @@ impl HttpFilterConfig fn new_http_filter(&mut self, _envoy: &mut EC) -> Box> { Box::new(Filter { request_headers: self.request_headers.clone(), + remove_request_headers: self.remove_request_headers.clone(), response_headers: self.response_headers.clone(), + remove_response_headers: self.remove_response_headers.clone(), }) } } @@ -42,7 +46,9 @@ impl HttpFilterConfig /// This sets the request and response headers to the values specified in the filter config. pub struct Filter { request_headers: Vec<(String, String)>, + remove_request_headers: Vec, response_headers: Vec<(String, String)>, + remove_response_headers: Vec, } /// This implements the [`envoy_proxy_dynamic_modules_rust_sdk::HttpFilter`] trait. @@ -55,6 +61,9 @@ impl HttpFilter for Filter { for (key, value) in &self.request_headers { envoy_filter.set_request_header(key, value.as_bytes()); } + for key in &self.remove_request_headers { + envoy_filter.remove_request_header(key); + } abi::envoy_dynamic_module_type_on_http_filter_request_headers_status::Continue } @@ -66,6 +75,9 @@ impl HttpFilter for Filter { for (key, value) in &self.response_headers { envoy_filter.set_response_header(key, value.as_bytes()); } + for key in &self.remove_response_headers { + envoy_filter.remove_response_header(key); + } abi::envoy_dynamic_module_type_on_http_filter_response_headers_status::Continue } } @@ -80,7 +92,9 @@ mod tests { let mut envoy_filter = envoy_proxy_dynamic_modules_rust_sdk::MockEnvoyHttpFilter::new(); let mut filter = Filter { request_headers: vec![("X-Foo".to_string(), "bar".to_string())], + remove_request_headers: vec!["To-Remove".to_string()], response_headers: vec![("X-Bar".to_string(), "foo".to_string())], + remove_response_headers: vec!["To-Remove".to_string()], }; envoy_filter @@ -90,6 +104,12 @@ mod tests { assert_eq!(value, b"bar"); return true; }); + envoy_filter + .expect_remove_request_header() + .returning(|key| { + assert_eq!(key, "To-Remove"); + return true; + }); envoy_filter .expect_set_response_header() .returning(|key, value| { @@ -97,6 +117,12 @@ mod tests { assert_eq!(value, b"foo"); return true; }); + envoy_filter + .expect_remove_response_header() + .returning(|key| { + assert_eq!(key, "To-Remove"); + return true; + }); assert_eq!( filter.on_request_headers(&mut envoy_filter, false), abi::envoy_dynamic_module_type_on_http_filter_request_headers_status::Continue