Skip to content

Commit 87cf021

Browse files
authored
Showcase attributes API (#18)
envoyproxy/envoy#38519 --------- Signed-off-by: Takeshi Yoneda <[email protected]>
1 parent 8a9e19e commit 87cf021

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

integration/main_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,8 @@ func TestIntegration(t *testing.T) {
154154
// We also need to check that the response headers were mutated.
155155
require.Equal(t, "bar", resp.Header.Get("Foo"))
156156
require.Equal(t, "bar2", resp.Header.Get("Foo2"))
157+
require.NotEmpty(t, resp.Header.Get("X-Upstream-Address"), resp.Header.Get("X-Upstream-Address"))
158+
require.Equal(t, "200", resp.Header.Get("X-Response-Code"))
157159
require.Equal(t, "", resp.Header.Get("Access-Control-Allow-Credentials"))
158160
return true
159161
}, 30*time.Second, 200*time.Millisecond)

rust/src/http_header_mutation.rs

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,24 @@ impl<EHF: EnvoyHttpFilter> HttpFilter<EHF> for Filter {
7272
envoy_filter: &mut EHF,
7373
_end_of_stream: bool,
7474
) -> abi::envoy_dynamic_module_type_on_http_filter_response_headers_status {
75+
let downstream_addr = envoy_filter
76+
.get_attribute_string(abi::envoy_dynamic_module_type_attribute_id::SourceAddress)
77+
.expect("Failed to get source address");
78+
let downstream_addr = Vec::from(downstream_addr.as_slice());
79+
envoy_filter.set_response_header("X-Downstream-Address", downstream_addr.as_slice());
80+
81+
let upstream_addr = envoy_filter
82+
.get_attribute_string(abi::envoy_dynamic_module_type_attribute_id::UpstreamAddress)
83+
.expect("Failed to get upstream address");
84+
let upstream_addr = Vec::from(upstream_addr.as_slice());
85+
envoy_filter.set_response_header("X-Upstream-Address", upstream_addr.as_slice());
86+
87+
let response_code = envoy_filter
88+
.get_attribute_int(abi::envoy_dynamic_module_type_attribute_id::ResponseCode)
89+
.expect("Failed to get response code");
90+
let response_code = response_code.to_string();
91+
envoy_filter.set_response_header("X-Response-Code", response_code.as_bytes());
92+
7593
for (key, value) in &self.response_headers {
7694
envoy_filter.set_response_header(key, value.as_bytes());
7795
}
@@ -96,7 +114,49 @@ mod tests {
96114
response_headers: vec![("X-Bar".to_string(), "foo".to_string())],
97115
remove_response_headers: vec!["To-Remove".to_string()],
98116
};
99-
117+
envoy_filter
118+
.expect_get_attribute_string()
119+
.returning(|id| match id {
120+
abi::envoy_dynamic_module_type_attribute_id::SourceAddress => {
121+
return Some(EnvoyBuffer::new("1.1.1.1:12345"));
122+
}
123+
abi::envoy_dynamic_module_type_attribute_id::UpstreamAddress => {
124+
return Some(EnvoyBuffer::new("2.2.2.2:12345"));
125+
}
126+
_ => panic!("Unexpected attribute id"),
127+
});
128+
envoy_filter
129+
.expect_get_attribute_int()
130+
.returning(|id| match id {
131+
abi::envoy_dynamic_module_type_attribute_id::ResponseCode => {
132+
return Some(200);
133+
}
134+
_ => panic!("Unexpected attribute id"),
135+
});
136+
envoy_filter
137+
.expect_set_response_header()
138+
.returning(|key, value| {
139+
assert_eq!(key, "X-Downstream-Address");
140+
assert_eq!(value, b"1.1.1.1:12345");
141+
return true;
142+
})
143+
.once();
144+
envoy_filter
145+
.expect_set_response_header()
146+
.returning(|key, value| {
147+
assert_eq!(key, "X-Upstream-Address");
148+
assert_eq!(value, b"2.2.2.2:12345");
149+
return true;
150+
})
151+
.once();
152+
envoy_filter
153+
.expect_set_response_header()
154+
.returning(|key, value| {
155+
assert_eq!(key, "X-Response-Code");
156+
assert_eq!(value, b"200");
157+
return true;
158+
})
159+
.once();
100160
envoy_filter
101161
.expect_set_request_header()
102162
.returning(|key, value| {

0 commit comments

Comments
 (0)