@@ -26,6 +26,8 @@ use crate::connect::{
2626} ;
2727#[ cfg( feature = "cookies" ) ]
2828use crate :: cookie;
29+ #[ cfg( feature = "cookies" ) ]
30+ use crate :: cookie:: service:: CookieService ;
2931#[ cfg( feature = "hickory-dns" ) ]
3032use crate :: dns:: hickory:: HickoryDnsResolver ;
3133use crate :: dns:: { gai:: GaiResolver , DnsResolverWithOverrides , DynResolver , Resolve } ;
@@ -96,8 +98,6 @@ enum HttpVersionPref {
9698
9799#[ derive( Clone ) ]
98100struct HyperService {
99- #[ cfg( feature = "cookies" ) ]
100- cookie_store : Option < Arc < dyn cookie:: CookieStore > > ,
101101 hyper : HyperClient ,
102102}
103103
@@ -110,43 +110,11 @@ impl Service<hyper::Request<crate::async_impl::body::Body>> for HyperService {
110110 self . hyper . poll_ready ( cx) . map_err ( crate :: error:: request)
111111 }
112112
113- #[ cfg( not( feature = "cookies" ) ) ]
114113 fn call ( & mut self , req : hyper:: Request < crate :: async_impl:: body:: Body > ) -> Self :: Future {
115114 let clone = self . hyper . clone ( ) ;
116115 let mut inner = std:: mem:: replace ( & mut self . hyper , clone) ;
117116 Box :: pin ( async move { inner. call ( req) . await . map_err ( crate :: error:: request) } )
118117 }
119-
120- #[ cfg( feature = "cookies" ) ]
121- fn call ( & mut self , mut req : hyper:: Request < crate :: async_impl:: body:: Body > ) -> Self :: Future {
122- let clone = self . hyper . clone ( ) ;
123- let mut inner = std:: mem:: replace ( & mut self . hyper , clone) ;
124- let url = Url :: parse ( req. uri ( ) . to_string ( ) . as_str ( ) ) . expect ( "invalid URL" ) ;
125-
126- if let Some ( cookie_store) = self . cookie_store . as_ref ( ) {
127- if req. headers ( ) . get ( crate :: header:: COOKIE ) . is_none ( ) {
128- let headers = req. headers_mut ( ) ;
129- crate :: util:: add_cookie_header ( headers, & * * cookie_store, & url) ;
130- }
131- }
132-
133- let cookie_store = self . cookie_store . clone ( ) ;
134- Box :: pin ( async move {
135- let res = inner. call ( req) . await . map_err ( crate :: error:: request) ;
136-
137- if let Some ( ref cookie_store) = cookie_store {
138- if let Ok ( res) = & res {
139- let mut cookies =
140- cookie:: extract_response_cookie_headers ( res. headers ( ) ) . peekable ( ) ;
141- if cookies. peek ( ) . is_some ( ) {
142- cookie_store. set_cookies ( & mut cookies, & url) ;
143- }
144- }
145- }
146-
147- res
148- } )
149- }
150118}
151119
152120struct Config {
@@ -993,8 +961,6 @@ impl ClientBuilder {
993961
994962 let hyper_client = builder. build ( connector_builder. build ( config. connector_layers ) ) ;
995963 let hyper_service = HyperService {
996- #[ cfg( feature = "cookies" ) ]
997- cookie_store : config. cookie_store . clone ( ) ,
998964 hyper : hyper_client,
999965 } ;
1000966
@@ -1007,9 +973,11 @@ impl ClientBuilder {
1007973
1008974 let retry_policy = config. retry_policy . into_policy ( ) ;
1009975
1010- let retries = tower:: retry:: Retry :: new ( retry_policy. clone ( ) , hyper_service) ;
976+ let svc = tower:: retry:: Retry :: new ( retry_policy. clone ( ) , hyper_service) ;
1011977
1012- let hyper = FollowRedirect :: with_policy ( retries, redirect_policy. clone ( ) ) ;
978+ #[ cfg( feature = "cookies" ) ]
979+ let svc = CookieService :: new ( svc, config. cookie_store . clone ( ) ) ;
980+ let hyper = FollowRedirect :: with_policy ( svc, redirect_policy. clone ( ) ) ;
1013981
1014982 Ok ( Client {
1015983 inner : Arc :: new ( ClientRef {
@@ -1021,16 +989,11 @@ impl ClientBuilder {
1021989 #[ cfg( feature = "http3" ) ]
1022990 h3_client : match h3_connector {
1023991 Some ( h3_connector) => {
1024- #[ cfg( not( feature = "cookies" ) ) ]
1025992 let h3_service = H3Client :: new ( h3_connector, config. pool_idle_timeout ) ;
993+ let svc = tower:: retry:: Retry :: new ( retry_policy, h3_service) ;
1026994 #[ cfg( feature = "cookies" ) ]
1027- let h3_service = H3Client :: new (
1028- h3_connector,
1029- config. pool_idle_timeout ,
1030- config. cookie_store ,
1031- ) ;
1032- let retries = tower:: retry:: Retry :: new ( retry_policy, h3_service) ;
1033- Some ( FollowRedirect :: with_policy ( retries, redirect_policy) )
995+ let svc = CookieService :: new ( svc, config. cookie_store ) ;
996+ Some ( FollowRedirect :: with_policy ( svc, redirect_policy) )
1034997 }
1035998 None => None ,
1036999 } ,
@@ -2812,8 +2775,14 @@ impl Config {
28122775 }
28132776}
28142777
2778+ #[ cfg( not( feature = "cookies" ) ) ]
28152779type LayeredService < T > =
28162780 FollowRedirect < tower:: retry:: Retry < crate :: retry:: Policy , T > , TowerRedirectPolicy > ;
2781+ #[ cfg( feature = "cookies" ) ]
2782+ type LayeredService < T > = FollowRedirect <
2783+ CookieService < tower:: retry:: Retry < crate :: retry:: Policy , T > > ,
2784+ TowerRedirectPolicy ,
2785+ > ;
28172786type LayeredFuture < T > = <LayeredService < T > as Service < http:: Request < Body > > >:: Future ;
28182787
28192788struct ClientRef {
0 commit comments