11use  std:: fmt; 
2- use  std:: cell:: RefMut ; 
32
43use  crate :: Header ; 
54use  cookie:: Delta ; 
@@ -128,7 +127,7 @@ mod key {
128127/// 32`. 
129128pub  enum  Cookies < ' a >  { 
130129    #[ doc( hidden) ]  
131-     Jarred ( RefMut < ' a ,   CookieJar > ,  & ' a  Key ) , 
130+     Jarred ( CookieJar ,  & ' a  Key ,   Box < dyn   FnOnce ( CookieJar )  +  Send  +  ' a > ) , 
132131    #[ doc( hidden) ]  
133132    Empty ( CookieJar ) 
134133} 
@@ -137,8 +136,8 @@ impl<'a> Cookies<'a> {
137136    /// WARNING: This is unstable! Do not use this method outside of Rocket! 
138137     #[ inline]  
139138    #[ doc( hidden) ]  
140-     pub  fn  new ( jar :   RefMut < ' a ,  CookieJar > ,  key :  & ' a  Key )  -> Cookies < ' a >  { 
141-         Cookies :: Jarred ( jar,  key) 
139+     pub  fn  new < F :   FnOnce ( CookieJar )  +  Send  +  ' a > ( jar :  CookieJar ,  key :  & ' a  Key ,   on_drop :   F )  -> Cookies < ' a >  { 
140+         Cookies :: Jarred ( jar,  key,   Box :: new ( on_drop ) ) 
142141    } 
143142
144143    /// WARNING: This is unstable! Do not use this method outside of Rocket! 
@@ -160,7 +159,7 @@ impl<'a> Cookies<'a> {
160159     #[ inline]  
161160    #[ doc( hidden) ]  
162161    pub  fn  add_original ( & mut  self ,  cookie :  Cookie < ' static > )  { 
163-         if  let  Cookies :: Jarred ( ref  mut  jar,  _)  = * self  { 
162+         if  let  Cookies :: Jarred ( ref  mut  jar,  _,  _ )  = * self  { 
164163            jar. add_original ( cookie) 
165164        } 
166165    } 
@@ -180,7 +179,7 @@ impl<'a> Cookies<'a> {
180179     /// ``` 
181180     pub  fn  get ( & self ,  name :  & str )  -> Option < & Cookie < ' static > >  { 
182181        match  * self  { 
183-             Cookies :: Jarred ( ref  jar,  _)  => jar. get ( name) , 
182+             Cookies :: Jarred ( ref  jar,  _,  _ )  => jar. get ( name) , 
184183            Cookies :: Empty ( _)  => None 
185184        } 
186185    } 
@@ -205,7 +204,7 @@ impl<'a> Cookies<'a> {
205204     /// } 
206205     /// ``` 
207206     pub  fn  add ( & mut  self ,  cookie :  Cookie < ' static > )  { 
208-         if  let  Cookies :: Jarred ( ref  mut  jar,  _)  = * self  { 
207+         if  let  Cookies :: Jarred ( ref  mut  jar,  _,  _ )  = * self  { 
209208            jar. add ( cookie) 
210209        } 
211210    } 
@@ -231,7 +230,7 @@ impl<'a> Cookies<'a> {
231230     /// } 
232231     /// ``` 
233232     pub  fn  remove ( & mut  self ,  cookie :  Cookie < ' static > )  { 
234-         if  let  Cookies :: Jarred ( ref  mut  jar,  _)  = * self  { 
233+         if  let  Cookies :: Jarred ( ref  mut  jar,  _,  _ )  = * self  { 
235234            jar. remove ( cookie) 
236235        } 
237236    } 
@@ -252,7 +251,7 @@ impl<'a> Cookies<'a> {
252251     /// ``` 
253252     pub  fn  iter ( & self )  -> impl  Iterator < Item =& Cookie < ' static > >  { 
254253        match  * self  { 
255-             Cookies :: Jarred ( ref  jar,  _)  => jar. iter ( ) , 
254+             Cookies :: Jarred ( ref  jar,  _,  _ )  => jar. iter ( ) , 
256255            Cookies :: Empty ( ref  jar)  => jar. iter ( ) 
257256        } 
258257    } 
@@ -262,12 +261,22 @@ impl<'a> Cookies<'a> {
262261    #[ doc( hidden) ]  
263262    pub  fn  delta ( & self )  -> Delta < ' _ >  { 
264263        match  * self  { 
265-             Cookies :: Jarred ( ref  jar,  _)  => jar. delta ( ) , 
264+             Cookies :: Jarred ( ref  jar,  _,  _ )  => jar. delta ( ) , 
266265            Cookies :: Empty ( ref  jar)  => jar. delta ( ) 
267266        } 
268267    } 
269268} 
270269
270+ impl < ' a >  Drop  for  Cookies < ' a >  { 
271+     fn  drop ( & mut  self )  { 
272+         if  let  Cookies :: Jarred ( ref  mut  jar,  _,  ref  mut  on_drop)  = * self  { 
273+             let  jar = std:: mem:: replace ( jar,  CookieJar :: new ( ) ) ; 
274+             let  on_drop = std:: mem:: replace ( on_drop,  Box :: new ( |_| { } ) ) ; 
275+             on_drop ( jar) ; 
276+         } 
277+     } 
278+ } 
279+ 
271280#[ cfg( feature = "private-cookies" ) ]  
272281impl  Cookies < ' _ >  { 
273282    /// Returns a reference to the `Cookie` inside this collection with the name 
@@ -290,7 +299,7 @@ impl Cookies<'_> {
290299     /// ``` 
291300     pub  fn  get_private ( & mut  self ,  name :  & str )  -> Option < Cookie < ' static > >  { 
292301        match  * self  { 
293-             Cookies :: Jarred ( ref  mut  jar,  key)  => jar. private ( key) . get ( name) , 
302+             Cookies :: Jarred ( ref  mut  jar,  key,  _ )  => jar. private ( key) . get ( name) , 
294303            Cookies :: Empty ( _)  => None 
295304        } 
296305    } 
@@ -326,7 +335,7 @@ impl Cookies<'_> {
326335     /// } 
327336     /// ``` 
328337     pub  fn  add_private ( & mut  self ,  mut  cookie :  Cookie < ' static > )  { 
329-         if  let  Cookies :: Jarred ( ref  mut  jar,  key)  = * self  { 
338+         if  let  Cookies :: Jarred ( ref  mut  jar,  key,  _ )  = * self  { 
330339            Cookies :: set_private_defaults ( & mut  cookie) ; 
331340            jar. private ( key) . add ( cookie) 
332341        } 
@@ -336,7 +345,7 @@ impl Cookies<'_> {
336345     /// WARNING: This is unstable! Do not use this method outside of Rocket! 
337346     #[ doc( hidden) ]  
338347    pub  fn  add_original_private ( & mut  self ,  mut  cookie :  Cookie < ' static > )  { 
339-         if  let  Cookies :: Jarred ( ref  mut  jar,  key)  = * self  { 
348+         if  let  Cookies :: Jarred ( ref  mut  jar,  key,  _ )  = * self  { 
340349            Cookies :: set_private_defaults ( & mut  cookie) ; 
341350            jar. private ( key) . add_original ( cookie) 
342351        } 
@@ -390,7 +399,7 @@ impl Cookies<'_> {
390399     /// } 
391400     /// ``` 
392401     pub  fn  remove_private ( & mut  self ,  mut  cookie :  Cookie < ' static > )  { 
393-         if  let  Cookies :: Jarred ( ref  mut  jar,  key)  = * self  { 
402+         if  let  Cookies :: Jarred ( ref  mut  jar,  key,  _ )  = * self  { 
394403            if  cookie. path ( ) . is_none ( )  { 
395404                cookie. set_path ( "/" ) ; 
396405            } 
@@ -403,7 +412,7 @@ impl Cookies<'_> {
403412impl  fmt:: Debug  for  Cookies < ' _ >  { 
404413    fn  fmt ( & self ,  f :  & mut  fmt:: Formatter < ' _ > )  -> fmt:: Result  { 
405414        match  * self  { 
406-             Cookies :: Jarred ( ref  jar,  _)  => jar. fmt ( f) , 
415+             Cookies :: Jarred ( ref  jar,  _,  _ )  => jar. fmt ( f) , 
407416            Cookies :: Empty ( ref  jar)  => jar. fmt ( f) 
408417        } 
409418    } 
0 commit comments