@@ -51,6 +51,9 @@ pub struct HttpConnectionManager {
5151 #[ serde( with = "humantime_serde" ) ]
5252 #[ serde( skip_serializing_if = "Option::is_none" , default ) ]
5353 pub request_timeout : Option < Duration > ,
54+ #[ serde( with = "humantime_serde" ) ]
55+ #[ serde( skip_serializing_if = "Option::is_none" , default ) ]
56+ pub drain_timeout : Option < Duration > ,
5457 #[ serde( skip_serializing_if = "Vec::is_empty" , default ) ]
5558 pub http_filters : Vec < HttpFilter > ,
5659 #[ serde( skip_serializing_if = "Vec::is_empty" , default ) ]
@@ -564,6 +567,61 @@ mod tests {
564567 assert ! ( MatchHostScoreLPM :: Wildcard < MatchHostScoreLPM :: Suffix ( "foo.bar.test.com" . len( ) ) ) ;
565568 assert ! ( MatchHostScoreLPM :: Wildcard == MatchHostScoreLPM :: Wildcard ) ;
566569 }
570+
571+ #[ test]
572+ fn test_drain_timeout_configuration ( ) {
573+ let config = HttpConnectionManager {
574+ codec_type : CodecType :: Auto ,
575+ route_specifier : RouteSpecifier :: RouteConfig ( RouteConfiguration {
576+ name : "test_route" . into ( ) ,
577+ most_specific_header_mutations_wins : false ,
578+ response_header_modifier : Default :: default ( ) ,
579+ request_headers_to_add : vec ! [ ] ,
580+ request_headers_to_remove : vec ! [ ] ,
581+ virtual_hosts : vec ! [ ] ,
582+ } ) ,
583+ http_filters : vec ! [ ] ,
584+ enabled_upgrades : vec ! [ ] ,
585+ access_log : vec ! [ ] ,
586+ xff_settings : Default :: default ( ) ,
587+ generate_request_id : false ,
588+ preserve_external_request_id : false ,
589+ always_set_request_id_in_response : false ,
590+ tracing : None ,
591+ request_timeout : Some ( Duration :: from_secs ( 30 ) ) ,
592+ drain_timeout : Some ( Duration :: from_secs ( 10 ) ) ,
593+ } ;
594+
595+ assert_eq ! ( config. drain_timeout, Some ( Duration :: from_secs( 10 ) ) ) ;
596+ assert_eq ! ( config. request_timeout, Some ( Duration :: from_secs( 30 ) ) ) ;
597+ }
598+
599+ #[ test]
600+ fn test_drain_timeout_default ( ) {
601+ let config = HttpConnectionManager {
602+ codec_type : CodecType :: Http1 ,
603+ route_specifier : RouteSpecifier :: RouteConfig ( RouteConfiguration {
604+ name : "test_route_default" . into ( ) ,
605+ most_specific_header_mutations_wins : false ,
606+ response_header_modifier : Default :: default ( ) ,
607+ request_headers_to_add : vec ! [ ] ,
608+ request_headers_to_remove : vec ! [ ] ,
609+ virtual_hosts : vec ! [ ] ,
610+ } ) ,
611+ http_filters : vec ! [ ] ,
612+ enabled_upgrades : vec ! [ ] ,
613+ access_log : vec ! [ ] ,
614+ xff_settings : Default :: default ( ) ,
615+ generate_request_id : false ,
616+ preserve_external_request_id : false ,
617+ always_set_request_id_in_response : false ,
618+ tracing : None ,
619+ request_timeout : None ,
620+ drain_timeout : None ,
621+ } ;
622+
623+ assert_eq ! ( config. drain_timeout, None ) ;
624+ }
567625}
568626
569627#[ cfg( feature = "envoy-conversions" ) ]
@@ -702,7 +760,7 @@ mod envoy_conversions {
702760 stream_idle_timeout,
703761 // request_timeout,
704762 request_headers_timeout,
705- drain_timeout,
763+ // drain_timeout,
706764 delayed_close_timeout,
707765 // access_log,
708766 access_log_flush_interval,
@@ -753,6 +811,11 @@ mod envoy_conversions {
753811 . transpose ( )
754812 . map_err ( |_| GenericError :: from_msg ( "failed to convert into Duration" ) )
755813 . with_node ( "request_timeout" ) ?;
814+ let drain_timeout = drain_timeout
815+ . map ( duration_from_envoy)
816+ . transpose ( )
817+ . map_err ( |_| GenericError :: from_msg ( "failed to convert into Duration" ) )
818+ . with_node ( "drain_timeout" ) ?;
756819 let enabled_upgrades = upgrade_configs
757820 . iter ( )
758821 . filter ( |upgrade_config| upgrade_config. enabled . map ( |enabled| enabled. value ) . unwrap_or ( true ) )
@@ -819,6 +882,7 @@ mod envoy_conversions {
819882 enabled_upgrades,
820883 route_specifier,
821884 request_timeout,
885+ drain_timeout,
822886 access_log,
823887 xff_settings,
824888 generate_request_id : generate_request_id. map ( |v| v. value ) . unwrap_or ( true ) ,
0 commit comments