@@ -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