@@ -289,7 +289,7 @@ impl Invariant for Cache {
289289 . trace ( & trace_name)
290290 } ) )
291291 . fuse ( self . config . schema . unify ( other. config . schema ) )
292- . map ( |( merged_types, merged_enums, schema) | {
292+ . map ( |( merged_types, merged_enums, schema) | {
293293 types. extend ( merged_types) ;
294294 enums. extend ( merged_enums) ;
295295
@@ -298,6 +298,7 @@ impl Invariant for Cache {
298298 enums,
299299 unions : self . config . unions . merge_right ( other. config . unions ) ,
300300 schema,
301+ upstream : self . config . upstream . merge_right ( other. config . upstream ) ,
301302 ..self . config
302303 } ;
303304
@@ -505,6 +506,91 @@ mod tests {
505506 Ok ( ( ) )
506507 }
507508
509+ #[ test]
510+ fn test_upstream_allowed_headers_propagation ( ) -> Result < ( ) > {
511+ use std:: collections:: BTreeSet ;
512+
513+ use crate :: core:: config:: Config ;
514+
515+ // Create a Config with no allowed_headers
516+ let config1 = Config :: default ( ) ;
517+
518+ // Create a Config with allowed_headers
519+ let mut config2 = Config :: default ( ) ;
520+ let mut headers = BTreeSet :: new ( ) ;
521+ headers. insert ( "x-user-id" . to_string ( ) ) ;
522+ headers. insert ( "authorization" . to_string ( ) ) ;
523+ config2. upstream . allowed_headers = Some ( headers. clone ( ) ) ;
524+
525+ // Create Cache instances
526+ let cache1 = Cache :: from ( config1. clone ( ) ) ;
527+ let cache2 = Cache :: from ( config2. clone ( ) ) ;
528+
529+ // Verify initial state
530+ assert_eq ! ( cache1. config. upstream. allowed_headers, None ) ;
531+ assert_eq ! (
532+ cache2. config. upstream. allowed_headers,
533+ Some ( headers. clone( ) )
534+ ) ;
535+
536+ // Test merging cache1 and cache2
537+ let merged = cache1. clone ( ) . unify ( cache2. clone ( ) ) . to_result ( ) ?;
538+
539+ // Verify that allowed_headers from cache2 are preserved in the merged cache
540+ assert_eq ! (
541+ merged. config. upstream. allowed_headers,
542+ Some ( headers. clone( ) )
543+ ) ;
544+
545+ // Test the reverse order (cache2 and cache1)
546+ let merged_reverse = cache2. unify ( cache1) . to_result ( ) ?;
547+
548+ // Verify that allowed_headers from cache2 are still preserved
549+ assert_eq ! (
550+ merged_reverse. config. upstream. allowed_headers,
551+ Some ( headers)
552+ ) ;
553+
554+ Ok ( ( ) )
555+ }
556+
557+ #[ test]
558+ fn test_upstream_merge_right_order ( ) -> Result < ( ) > {
559+ use crate :: core:: config:: Config ;
560+
561+ // Create a Config with specific upstream settings
562+ let mut config1 = Config :: default ( ) ;
563+ config1. upstream . connect_timeout = Some ( 30 ) ;
564+ config1. upstream . timeout = Some ( 60 ) ;
565+
566+ // Create another Config with different upstream settings
567+ let mut config2 = Config :: default ( ) ;
568+ config2. upstream . timeout = Some ( 120 ) ; // This should override config1's timeout
569+ config2. upstream . http_cache = Some ( 1000 ) ; // This should be added to the merged config
570+
571+ // Create Cache instances
572+ let cache1 = Cache :: from ( config1. clone ( ) ) ;
573+ let cache2 = Cache :: from ( config2. clone ( ) ) ;
574+
575+ // Test merging cache1 and cache2
576+ let merged = cache1. clone ( ) . unify ( cache2. clone ( ) ) . to_result ( ) ?;
577+
578+ // Verify that values from cache2 override those from cache1
579+ assert_eq ! ( merged. config. upstream. connect_timeout, Some ( 30 ) ) ;
580+ assert_eq ! ( merged. config. upstream. timeout, Some ( 120 ) ) ; // Should be from config2
581+ assert_eq ! ( merged. config. upstream. http_cache, Some ( 1000 ) ) ; // Should be from config2
582+
583+ // Test the reverse order (cache2 and cache1)
584+ let merged_reverse = cache2. unify ( cache1) . to_result ( ) ?;
585+
586+ // Verify that values from cache1 override those from cache2
587+ assert_eq ! ( merged_reverse. config. upstream. connect_timeout, Some ( 30 ) ) ; // Should be from config1
588+ assert_eq ! ( merged_reverse. config. upstream. timeout, Some ( 60 ) ) ; // Should be from config1
589+ assert_eq ! ( merged_reverse. config. upstream. http_cache, Some ( 1000 ) ) ; // Should be from config2
590+
591+ Ok ( ( ) )
592+ }
593+
508594 mod core_type {
509595 use super :: * ;
510596 use crate :: core:: Type ;
0 commit comments