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 }
@@ -242,7 +241,7 @@ impl<'a> Cookies<'a> {
242241 #[ doc( hidden) ]
243242 pub fn reset_delta ( & mut self ) {
244243 match * self {
245- Cookies :: Jarred ( ref mut jar, _ ) => jar. reset_delta ( ) ,
244+ Cookies :: Jarred ( ref mut jar, .. ) => jar. reset_delta ( ) ,
246245 Cookies :: Empty ( ref mut jar) => jar. reset_delta ( )
247246 }
248247 }
@@ -263,7 +262,7 @@ impl<'a> Cookies<'a> {
263262 /// ```
264263 pub fn iter ( & self ) -> impl Iterator < Item =& Cookie < ' static > > {
265264 match * self {
266- Cookies :: Jarred ( ref jar, _) => jar. iter ( ) ,
265+ Cookies :: Jarred ( ref jar, _, _ ) => jar. iter ( ) ,
267266 Cookies :: Empty ( ref jar) => jar. iter ( )
268267 }
269268 }
@@ -273,12 +272,22 @@ impl<'a> Cookies<'a> {
273272 #[ doc( hidden) ]
274273 pub fn delta ( & self ) -> Delta < ' _ > {
275274 match * self {
276- Cookies :: Jarred ( ref jar, _) => jar. delta ( ) ,
275+ Cookies :: Jarred ( ref jar, _, _ ) => jar. delta ( ) ,
277276 Cookies :: Empty ( ref jar) => jar. delta ( )
278277 }
279278 }
280279}
281280
281+ impl < ' a > Drop for Cookies < ' a > {
282+ fn drop ( & mut self ) {
283+ if let Cookies :: Jarred ( ref mut jar, _, ref mut on_drop) = * self {
284+ let jar = std:: mem:: replace ( jar, CookieJar :: new ( ) ) ;
285+ let on_drop = std:: mem:: replace ( on_drop, Box :: new ( |_| { } ) ) ;
286+ on_drop ( jar) ;
287+ }
288+ }
289+ }
290+
282291#[ cfg( feature = "private-cookies" ) ]
283292impl Cookies < ' _ > {
284293 /// Returns a reference to the `Cookie` inside this collection with the name
@@ -301,7 +310,7 @@ impl Cookies<'_> {
301310 /// ```
302311 pub fn get_private ( & mut self , name : & str ) -> Option < Cookie < ' static > > {
303312 match * self {
304- Cookies :: Jarred ( ref mut jar, key) => jar. private ( key) . get ( name) ,
313+ Cookies :: Jarred ( ref mut jar, key, _ ) => jar. private ( key) . get ( name) ,
305314 Cookies :: Empty ( _) => None
306315 }
307316 }
@@ -337,7 +346,7 @@ impl Cookies<'_> {
337346 /// }
338347 /// ```
339348 pub fn add_private ( & mut self , mut cookie : Cookie < ' static > ) {
340- if let Cookies :: Jarred ( ref mut jar, key) = * self {
349+ if let Cookies :: Jarred ( ref mut jar, key, _ ) = * self {
341350 Cookies :: set_private_defaults ( & mut cookie) ;
342351 jar. private ( key) . add ( cookie)
343352 }
@@ -347,7 +356,7 @@ impl Cookies<'_> {
347356 /// WARNING: This is unstable! Do not use this method outside of Rocket!
348357 #[ doc( hidden) ]
349358 pub fn add_original_private ( & mut self , mut cookie : Cookie < ' static > ) {
350- if let Cookies :: Jarred ( ref mut jar, key) = * self {
359+ if let Cookies :: Jarred ( ref mut jar, key, _ ) = * self {
351360 Cookies :: set_private_defaults ( & mut cookie) ;
352361 jar. private ( key) . add_original ( cookie)
353362 }
@@ -401,7 +410,7 @@ impl Cookies<'_> {
401410 /// }
402411 /// ```
403412 pub fn remove_private ( & mut self , mut cookie : Cookie < ' static > ) {
404- if let Cookies :: Jarred ( ref mut jar, key) = * self {
413+ if let Cookies :: Jarred ( ref mut jar, key, _ ) = * self {
405414 if cookie. path ( ) . is_none ( ) {
406415 cookie. set_path ( "/" ) ;
407416 }
@@ -414,7 +423,7 @@ impl Cookies<'_> {
414423impl fmt:: Debug for Cookies < ' _ > {
415424 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
416425 match * self {
417- Cookies :: Jarred ( ref jar, _) => jar. fmt ( f) ,
426+ Cookies :: Jarred ( ref jar, _, _ ) => jar. fmt ( f) ,
418427 Cookies :: Empty ( ref jar) => jar. fmt ( f)
419428 }
420429 }
0 commit comments