@@ -11,7 +11,9 @@ use std::sync::Arc;
1111// TODO(wbpcode): to support ip range in the future.
1212#[ derive( Serialize , Deserialize , Debug ) ]
1313pub struct RawFilterConfig {
14+ #[ serde( default ) ]
1415 denied_addresses : HashSet < String > ,
16+ #[ serde( default ) ]
1517 allowed_addresses : HashSet < String > ,
1618}
1719
@@ -26,7 +28,7 @@ pub struct FilterConfigImpl {
2628// The trait corresponds to a Envoy filter chain configuration.
2729#[ derive( Debug , Clone ) ]
2830pub struct FilterConfig {
29- config : Arc < FilterConfigImpl > ,
31+ config : Arc < FilterConfigImpl > , // use Arc to make it is cheap to clone the FilterConfig.
3032}
3133
3234impl FilterConfig {
@@ -44,7 +46,7 @@ impl FilterConfig {
4446 } ;
4547
4648 // One and only one of denied_addresses and allowed_addresses should be set.
47- if filter_config. denied_addresses . is_empty ( ) ! = filter_config. allowed_addresses . is_empty ( ) {
49+ if filter_config. denied_addresses . is_empty ( ) = = filter_config. allowed_addresses . is_empty ( ) {
4850 eprintln ! (
4951 "Error parsing filter config: one and only one of denied_addresses\
5052 and allowed_addresses should be set"
@@ -119,6 +121,7 @@ impl<EHF: EnvoyHttpFilter> HttpFilter<EHF> for Filter {
119121 }
120122
121123 let mut downstream_addr_str = String :: new ( ) ;
124+
122125 let address_buffer = downstream_addr. unwrap ( ) ;
123126 let downstream_addr_slice = address_buffer. as_slice ( ) ;
124127
@@ -174,4 +177,195 @@ impl<EHF: EnvoyHttpFilter> HttpFilter<EHF> for Filter {
174177#[ cfg( test) ]
175178mod tests {
176179 use super :: * ;
180+
181+ #[ test]
182+ fn test_new_filter_config_both_set ( ) {
183+ let filter_config = FilterConfig :: new (
184+ r#"{
185+ "allowed_addresses": [
186+ "127.0.0.1",
187+ "::1"
188+ ],
189+ "denied_addresses": [
190+ "192.168.1.1"
191+ ]
192+ }"# ,
193+ ) ;
194+ assert ! ( filter_config. is_none( ) ) ; // Only one of allowed_addresses and denied_addresses should be set.
195+ }
196+
197+ #[ test]
198+ fn test_new_filter_config_allowed_set ( ) {
199+ let filter_config = FilterConfig :: new (
200+ r#"{
201+ "allowed_addresses": [
202+ "127.0.0.1",
203+ "::1"
204+ ]
205+ }"# ,
206+ ) ;
207+ assert ! ( filter_config. is_some( ) ) ;
208+ }
209+
210+ #[ test]
211+ fn test_new_filter_config_denied_set ( ) {
212+ let filter_config = FilterConfig :: new (
213+ r#"{
214+ "denied_addresses": [
215+ "192.168.1.1"
216+ ]
217+ }"# ,
218+ ) ;
219+ assert ! ( filter_config. is_some( ) ) ;
220+ }
221+
222+ #[ test]
223+ fn test_new_filter_config_invalid_ip ( ) {
224+ let filter_config = FilterConfig :: new (
225+ r#"{
226+ "allowed_addresses": [
227+ "127.0.0.1",
228+ "invalid_ip"
229+ ]
230+ }"# ,
231+ ) ;
232+ assert ! ( filter_config. is_none( ) ) ;
233+ }
234+
235+ #[ test]
236+ fn test_filter_denied_because_no_address ( ) {
237+ let filter_config = FilterConfig :: new (
238+ r#"{
239+ "denied_addresses": [
240+ "192.168.1.1"
241+ ]
242+ }"# ,
243+ ) ;
244+ assert ! ( filter_config. is_some( ) ) ;
245+
246+ let mut filter = Filter {
247+ filter_config : filter_config. unwrap ( ) ,
248+ } ;
249+
250+ let mut mock_envoy_filter = envoy_proxy_dynamic_modules_rust_sdk:: MockEnvoyHttpFilter :: new ( ) ;
251+
252+ mock_envoy_filter
253+ . expect_get_attribute_string ( )
254+ . times ( 1 )
255+ . returning ( |_| None ) ;
256+ mock_envoy_filter
257+ . expect_get_attribute_int ( )
258+ . times ( 1 )
259+ . returning ( |_| None ) ;
260+ mock_envoy_filter
261+ . expect_send_response ( )
262+ . times ( 1 )
263+ . returning ( |code, _, _| assert ! ( code == 403 ) ) ;
264+
265+ assert_eq ! (
266+ filter. on_request_headers( & mut mock_envoy_filter, true ) ,
267+ abi:: envoy_dynamic_module_type_on_http_filter_request_headers_status:: StopIteration
268+ ) ;
269+ }
270+
271+ #[ test]
272+ fn test_filter_with_allowed_list ( ) {
273+ let filter_config = FilterConfig :: new (
274+ r#"{
275+ "allowed_addresses": [
276+ "127.0.0.1",
277+ "::1"
278+ ]
279+ }"# ,
280+ ) ;
281+ assert ! ( filter_config. is_some( ) ) ;
282+
283+ let mut filter = Filter {
284+ filter_config : filter_config. unwrap ( ) ,
285+ } ;
286+
287+ let mut mock_envoy_filter = envoy_proxy_dynamic_modules_rust_sdk:: MockEnvoyHttpFilter :: new ( ) ;
288+
289+ mock_envoy_filter
290+ . expect_get_attribute_string ( )
291+ . times ( 1 )
292+ . returning ( |_| Some ( EnvoyBuffer :: new ( "127.0.0.1:80" ) ) ) ;
293+ mock_envoy_filter
294+ . expect_get_attribute_int ( )
295+ . times ( 1 )
296+ . returning ( |_| Some ( 80 ) ) ;
297+
298+ assert_eq ! (
299+ filter. on_request_headers( & mut mock_envoy_filter, true ) ,
300+ abi:: envoy_dynamic_module_type_on_http_filter_request_headers_status:: Continue
301+ ) ;
302+
303+ mock_envoy_filter
304+ . expect_get_attribute_string ( )
305+ . times ( 1 )
306+ . returning ( |_| Some ( EnvoyBuffer :: new ( "192.168.1.1:80" ) ) ) ;
307+ mock_envoy_filter
308+ . expect_get_attribute_int ( )
309+ . times ( 1 )
310+ . returning ( |_| Some ( 80 ) ) ;
311+ mock_envoy_filter
312+ . expect_send_response ( )
313+ . times ( 1 )
314+ . returning ( |code, _, _| assert ! ( code == 403 ) ) ;
315+
316+ assert_eq ! (
317+ filter. on_request_headers( & mut mock_envoy_filter, true ) ,
318+ abi:: envoy_dynamic_module_type_on_http_filter_request_headers_status:: StopIteration
319+ ) ;
320+ }
321+
322+ #[ test]
323+ fn test_filter_with_denied_list ( ) {
324+ let filter_config = FilterConfig :: new (
325+ r#"{
326+ "denied_addresses": [
327+ "192.168.1.1"
328+ ]
329+ }"# ,
330+ ) ;
331+ assert ! ( filter_config. is_some( ) ) ;
332+
333+ let mut filter = Filter {
334+ filter_config : filter_config. unwrap ( ) ,
335+ } ;
336+
337+ let mut mock_envoy_filter = envoy_proxy_dynamic_modules_rust_sdk:: MockEnvoyHttpFilter :: new ( ) ;
338+
339+ mock_envoy_filter
340+ . expect_get_attribute_string ( )
341+ . times ( 1 )
342+ . returning ( |_| Some ( EnvoyBuffer :: new ( "192.168.1.1:80" ) ) ) ;
343+ mock_envoy_filter
344+ . expect_get_attribute_int ( )
345+ . times ( 1 )
346+ . returning ( |_| Some ( 80 ) ) ;
347+ mock_envoy_filter
348+ . expect_send_response ( )
349+ . times ( 1 )
350+ . returning ( |code, _, _| assert ! ( code == 403 ) ) ;
351+
352+ assert_eq ! (
353+ filter. on_request_headers( & mut mock_envoy_filter, true ) ,
354+ abi:: envoy_dynamic_module_type_on_http_filter_request_headers_status:: StopIteration
355+ ) ;
356+
357+ mock_envoy_filter
358+ . expect_get_attribute_string ( )
359+ . times ( 1 )
360+ . returning ( |_| Some ( EnvoyBuffer :: new ( "127.0.0.1:80" ) ) ) ;
361+ mock_envoy_filter
362+ . expect_get_attribute_int ( )
363+ . times ( 1 )
364+ . returning ( |_| Some ( 80 ) ) ;
365+
366+ assert_eq ! (
367+ filter. on_request_headers( & mut mock_envoy_filter, true ) ,
368+ abi:: envoy_dynamic_module_type_on_http_filter_request_headers_status:: Continue
369+ ) ;
370+ }
177371}
0 commit comments