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
}
@@ -252,7 +251,7 @@ impl<'a> Cookies<'a> {
252
251
/// ```
253
252
pub fn iter ( & self ) -> impl Iterator < Item =& Cookie < ' static > > {
254
253
match * self {
255
- Cookies :: Jarred ( ref jar, _) => jar. iter ( ) ,
254
+ Cookies :: Jarred ( ref jar, _, _ ) => jar. iter ( ) ,
256
255
Cookies :: Empty ( ref jar) => jar. iter ( )
257
256
}
258
257
}
@@ -262,12 +261,22 @@ impl<'a> Cookies<'a> {
262
261
#[ doc( hidden) ]
263
262
pub fn delta ( & self ) -> Delta < ' _ > {
264
263
match * self {
265
- Cookies :: Jarred ( ref jar, _) => jar. delta ( ) ,
264
+ Cookies :: Jarred ( ref jar, _, _ ) => jar. delta ( ) ,
266
265
Cookies :: Empty ( ref jar) => jar. delta ( )
267
266
}
268
267
}
269
268
}
270
269
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
+
271
280
#[ cfg( feature = "private-cookies" ) ]
272
281
impl Cookies < ' _ > {
273
282
/// Returns a reference to the `Cookie` inside this collection with the name
@@ -290,7 +299,7 @@ impl Cookies<'_> {
290
299
/// ```
291
300
pub fn get_private ( & mut self , name : & str ) -> Option < Cookie < ' static > > {
292
301
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) ,
294
303
Cookies :: Empty ( _) => None
295
304
}
296
305
}
@@ -326,7 +335,7 @@ impl Cookies<'_> {
326
335
/// }
327
336
/// ```
328
337
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 {
330
339
Cookies :: set_private_defaults ( & mut cookie) ;
331
340
jar. private ( key) . add ( cookie)
332
341
}
@@ -336,7 +345,7 @@ impl Cookies<'_> {
336
345
/// WARNING: This is unstable! Do not use this method outside of Rocket!
337
346
#[ doc( hidden) ]
338
347
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 {
340
349
Cookies :: set_private_defaults ( & mut cookie) ;
341
350
jar. private ( key) . add_original ( cookie)
342
351
}
@@ -390,7 +399,7 @@ impl Cookies<'_> {
390
399
/// }
391
400
/// ```
392
401
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 {
394
403
if cookie. path ( ) . is_none ( ) {
395
404
cookie. set_path ( "/" ) ;
396
405
}
@@ -403,7 +412,7 @@ impl Cookies<'_> {
403
412
impl fmt:: Debug for Cookies < ' _ > {
404
413
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
405
414
match * self {
406
- Cookies :: Jarred ( ref jar, _) => jar. fmt ( f) ,
415
+ Cookies :: Jarred ( ref jar, _, _ ) => jar. fmt ( f) ,
407
416
Cookies :: Empty ( ref jar) => jar. fmt ( f)
408
417
}
409
418
}
0 commit comments