1
1
use std:: fmt;
2
- use std:: cell:: RefMut ;
3
2
4
3
use crate :: Header ;
5
4
use cookie:: Delta ;
@@ -128,7 +127,7 @@ mod key {
128
127
/// 32`.
129
128
pub enum Cookies < ' a > {
130
129
#[ doc( hidden) ]
131
- Jarred ( RefMut < ' a , CookieJar > , & ' a Key ) ,
130
+ Jarred ( CookieJar , & ' a Key , Box < dyn FnOnce ( CookieJar ) + Send + ' a > ) ,
132
131
#[ doc( hidden) ]
133
132
Empty ( CookieJar )
134
133
}
@@ -137,8 +136,8 @@ impl<'a> Cookies<'a> {
137
136
/// WARNING: This is unstable! Do not use this method outside of Rocket!
138
137
#[ inline]
139
138
#[ 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 ) )
142
141
}
143
142
144
143
/// WARNING: This is unstable! Do not use this method outside of Rocket!
@@ -160,7 +159,7 @@ impl<'a> Cookies<'a> {
160
159
#[ inline]
161
160
#[ doc( hidden) ]
162
161
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 {
164
163
jar. add_original ( cookie)
165
164
}
166
165
}
@@ -180,7 +179,7 @@ impl<'a> Cookies<'a> {
180
179
/// ```
181
180
pub fn get ( & self , name : & str ) -> Option < & Cookie < ' static > > {
182
181
match * self {
183
- Cookies :: Jarred ( ref jar, _) => jar. get ( name) ,
182
+ Cookies :: Jarred ( ref jar, _, _ ) => jar. get ( name) ,
184
183
Cookies :: Empty ( _) => None
185
184
}
186
185
}
@@ -205,7 +204,7 @@ impl<'a> Cookies<'a> {
205
204
/// }
206
205
/// ```
207
206
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 {
209
208
jar. add ( cookie)
210
209
}
211
210
}
@@ -231,7 +230,7 @@ impl<'a> Cookies<'a> {
231
230
/// }
232
231
/// ```
233
232
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 {
235
234
jar. remove ( cookie)
236
235
}
237
236
}
@@ -242,7 +241,7 @@ impl<'a> Cookies<'a> {
242
241
#[ doc( hidden) ]
243
242
pub fn reset_delta ( & mut self ) {
244
243
match * self {
245
- Cookies :: Jarred ( ref mut jar, _ ) => jar. reset_delta ( ) ,
244
+ Cookies :: Jarred ( ref mut jar, .. ) => jar. reset_delta ( ) ,
246
245
Cookies :: Empty ( ref mut jar) => jar. reset_delta ( )
247
246
}
248
247
}
@@ -263,7 +262,7 @@ impl<'a> Cookies<'a> {
263
262
/// ```
264
263
pub fn iter ( & self ) -> impl Iterator < Item =& Cookie < ' static > > {
265
264
match * self {
266
- Cookies :: Jarred ( ref jar, _) => jar. iter ( ) ,
265
+ Cookies :: Jarred ( ref jar, _, _ ) => jar. iter ( ) ,
267
266
Cookies :: Empty ( ref jar) => jar. iter ( )
268
267
}
269
268
}
@@ -273,12 +272,22 @@ impl<'a> Cookies<'a> {
273
272
#[ doc( hidden) ]
274
273
pub fn delta ( & self ) -> Delta < ' _ > {
275
274
match * self {
276
- Cookies :: Jarred ( ref jar, _) => jar. delta ( ) ,
275
+ Cookies :: Jarred ( ref jar, _, _ ) => jar. delta ( ) ,
277
276
Cookies :: Empty ( ref jar) => jar. delta ( )
278
277
}
279
278
}
280
279
}
281
280
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
+
282
291
#[ cfg( feature = "private-cookies" ) ]
283
292
impl Cookies < ' _ > {
284
293
/// Returns a reference to the `Cookie` inside this collection with the name
@@ -301,7 +310,7 @@ impl Cookies<'_> {
301
310
/// ```
302
311
pub fn get_private ( & mut self , name : & str ) -> Option < Cookie < ' static > > {
303
312
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) ,
305
314
Cookies :: Empty ( _) => None
306
315
}
307
316
}
@@ -337,7 +346,7 @@ impl Cookies<'_> {
337
346
/// }
338
347
/// ```
339
348
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 {
341
350
Cookies :: set_private_defaults ( & mut cookie) ;
342
351
jar. private ( key) . add ( cookie)
343
352
}
@@ -347,7 +356,7 @@ impl Cookies<'_> {
347
356
/// WARNING: This is unstable! Do not use this method outside of Rocket!
348
357
#[ doc( hidden) ]
349
358
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 {
351
360
Cookies :: set_private_defaults ( & mut cookie) ;
352
361
jar. private ( key) . add_original ( cookie)
353
362
}
@@ -401,7 +410,7 @@ impl Cookies<'_> {
401
410
/// }
402
411
/// ```
403
412
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 {
405
414
if cookie. path ( ) . is_none ( ) {
406
415
cookie. set_path ( "/" ) ;
407
416
}
@@ -414,7 +423,7 @@ impl Cookies<'_> {
414
423
impl fmt:: Debug for Cookies < ' _ > {
415
424
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
416
425
match * self {
417
- Cookies :: Jarred ( ref jar, _) => jar. fmt ( f) ,
426
+ Cookies :: Jarred ( ref jar, _, _ ) => jar. fmt ( f) ,
418
427
Cookies :: Empty ( ref jar) => jar. fmt ( f)
419
428
}
420
429
}
0 commit comments