Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 1 addition & 1 deletion ENVOY_VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
4a113b5118003682833ba612202eb68628861ac6
726958228dc292f65b5acde26162a3645a99b067
4 changes: 3 additions & 1 deletion integration/envoy.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
2 changes: 2 additions & 0 deletions integration/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
})
Expand Down
2 changes: 1 addition & 1 deletion rust/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion rust/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
26 changes: 26 additions & 0 deletions rust/src/http_header_mutation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug)]
pub struct FilterConfig {
request_headers: Vec<(String, String)>,
remove_request_headers: Vec<String>,
response_headers: Vec<(String, String)>,
remove_response_headers: Vec<String>,
}

impl FilterConfig {
Expand All @@ -32,7 +34,9 @@ impl<EC: EnvoyHttpFilterConfig, EHF: EnvoyHttpFilter> HttpFilterConfig<EC, EHF>
fn new_http_filter(&mut self, _envoy: &mut EC) -> Box<dyn HttpFilter<EHF>> {
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(),
})
}
}
Expand All @@ -42,7 +46,9 @@ impl<EC: EnvoyHttpFilterConfig, EHF: EnvoyHttpFilter> HttpFilterConfig<EC, EHF>
/// 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<String>,
response_headers: Vec<(String, String)>,
remove_response_headers: Vec<String>,
}

/// This implements the [`envoy_proxy_dynamic_modules_rust_sdk::HttpFilter`] trait.
Expand All @@ -55,6 +61,9 @@ impl<EHF: EnvoyHttpFilter> HttpFilter<EHF> 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
}

Expand All @@ -66,6 +75,9 @@ impl<EHF: EnvoyHttpFilter> HttpFilter<EHF> 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
}
}
Expand All @@ -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
Expand All @@ -90,13 +104,25 @@ 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| {
assert_eq!(key, "X-Bar");
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
Expand Down