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