Struct cookie::CookieJar [−][src]
pub struct CookieJar { /* fields omitted */ }
A collection of cookies that tracks its modifications.
A CookieJar
provides storage for any number of cookies. Any changes made
to the jar are tracked; the changes can be retrieved via the
delta method which returns an interator over the changes.
Usage
A jar's life begins via new and calls to
add_original
:
use cookie::{Cookie, CookieJar}; let mut jar = CookieJar::new(); jar.add_original(Cookie::new("name", "value")); jar.add_original(Cookie::new("second", "another"));
Cookies can be added via add and removed via remove. Finally, cookies can be looked up via get:
let mut jar = CookieJar::new(); jar.add(Cookie::new("a", "one")); jar.add(Cookie::new("b", "two")); assert_eq!(jar.get("a").map(|c| c.value()), Some("one")); assert_eq!(jar.get("b").map(|c| c.value()), Some("two")); jar.remove(Cookie::named("b")); assert!(jar.get("b").is_none());
Deltas
A jar keeps track of any modifications made to it over time. The
modifications are recorded as cookies. The modifications can be retrieved
via delta. Any new Cookie
added to a jar via add
results in the same Cookie
appearing in the delta
; cookies added via
add_original
do not count towards the delta. Any original cookie that is
removed from a jar results in a "removal" cookie appearing in the delta. A
"removal" cookie is a cookie that a server sends so that the cookie is
removed from the client's machine.
Deltas are typically used to create Set-Cookie
headers corresponding to
the changes made to a cookie jar over a period of time.
let mut jar = CookieJar::new(); // original cookies don't affect the delta jar.add_original(Cookie::new("original", "value")); assert_eq!(jar.delta().count(), 0); // new cookies result in an equivalent `Cookie` in the delta jar.add(Cookie::new("a", "one")); jar.add(Cookie::new("b", "two")); assert_eq!(jar.delta().count(), 2); // removing an original cookie adds a "removal" cookie to the delta jar.remove(Cookie::named("original")); assert_eq!(jar.delta().count(), 3); // removing a new cookie that was added removes that `Cookie` from the delta jar.remove(Cookie::named("a")); assert_eq!(jar.delta().count(), 2);
Methods
impl CookieJar
[src]
impl CookieJar
pub fn new() -> CookieJar
[src]
pub fn new() -> CookieJar
Creates an empty cookie jar.
Example
use cookie::CookieJar; let jar = CookieJar::new(); assert_eq!(jar.iter().count(), 0);
pub fn get(&self, name: &str) -> Option<&Cookie<'static>>
[src]
pub fn get(&self, name: &str) -> Option<&Cookie<'static>>
Returns a reference to the Cookie
inside this jar with the name
name
. If no such cookie exists, returns None
.
Example
use cookie::{CookieJar, Cookie}; let mut jar = CookieJar::new(); assert!(jar.get("name").is_none()); jar.add(Cookie::new("name", "value")); assert_eq!(jar.get("name").map(|c| c.value()), Some("value"));
pub fn add_original(&mut self, cookie: Cookie<'static>)
[src]
pub fn add_original(&mut self, cookie: Cookie<'static>)
Adds an "original" cookie
to this jar. Adding an original cookie does
not affect the delta computation. This method is
intended to be used to seed the cookie jar with cookies received from a
client's HTTP message.
For accurate delta
computations, this method should not be called
after calling remove
.
Example
use cookie::{CookieJar, Cookie}; let mut jar = CookieJar::new(); jar.add_original(Cookie::new("name", "value")); jar.add_original(Cookie::new("second", "two")); assert_eq!(jar.get("name").map(|c| c.value()), Some("value")); assert_eq!(jar.get("second").map(|c| c.value()), Some("two")); assert_eq!(jar.iter().count(), 2); assert_eq!(jar.delta().count(), 0);
pub fn add(&mut self, cookie: Cookie<'static>)
[src]
pub fn add(&mut self, cookie: Cookie<'static>)
Adds cookie
to this jar.
Example
use cookie::{CookieJar, Cookie}; let mut jar = CookieJar::new(); jar.add(Cookie::new("name", "value")); jar.add(Cookie::new("second", "two")); assert_eq!(jar.get("name").map(|c| c.value()), Some("value")); assert_eq!(jar.get("second").map(|c| c.value()), Some("two")); assert_eq!(jar.iter().count(), 2); assert_eq!(jar.delta().count(), 2);
pub fn remove(&mut self, cookie: Cookie<'static>)
[src]
pub fn remove(&mut self, cookie: Cookie<'static>)
Removes cookie
from this jar. If an original cookie with the same
name as cookie
is present in the jar, a removal cookie will be
present in the delta
computation. To properly generate the removal
cookie, cookie
must contain the same path
and domain
as the cookie
that was initially set.
A "removal" cookie is a cookie that has the same name as the original cookie but has an empty value, a max-age of 0, and an expiration date far in the past.
Example
Removing an original cookie results in a removal cookie:
extern crate time; use cookie::{CookieJar, Cookie}; use time::Duration; let mut jar = CookieJar::new(); // Assume this cookie originally had a path of "/" and domain of "a.b". jar.add_original(Cookie::new("name", "value")); // If the path and domain were set, they must be provided to `remove`. jar.remove(Cookie::build("name", "").path("/").domain("a.b").finish()); // The delta will contain the removal cookie. let delta: Vec<_> = jar.delta().collect(); assert_eq!(delta.len(), 1); assert_eq!(delta[0].name(), "name"); assert_eq!(delta[0].max_age(), Some(Duration::seconds(0)));
Removing a new cookie does not result in a removal cookie:
use cookie::{CookieJar, Cookie}; let mut jar = CookieJar::new(); jar.add(Cookie::new("name", "value")); assert_eq!(jar.delta().count(), 1); jar.remove(Cookie::named("name")); assert_eq!(jar.delta().count(), 0);
pub fn clear(&mut self)
[src]
pub fn clear(&mut self)
: calling this method may not remove all cookies since the path and domain are not specified; use remove
instead
Removes all cookies from this cookie jar.
ⓘImportant traits for Delta<'a>pub fn delta(&self) -> Delta
[src]
pub fn delta(&self) -> Delta
Returns an iterator over cookies that represent the changes to this jar
over time. These cookies can be rendered directly as Set-Cookie
header
values to affect the changes made to this jar on the client.
Example
use cookie::{CookieJar, Cookie}; let mut jar = CookieJar::new(); jar.add_original(Cookie::new("name", "value")); jar.add_original(Cookie::new("second", "two")); // Add new cookies. jar.add(Cookie::new("new", "third")); jar.add(Cookie::new("another", "fourth")); jar.add(Cookie::new("yac", "fifth")); // Remove some cookies. jar.remove(Cookie::named("name")); jar.remove(Cookie::named("another")); // Delta contains two new cookies ("new", "yac") and a removal ("name"). assert_eq!(jar.delta().count(), 3);
ⓘImportant traits for Iter<'a>pub fn iter(&self) -> Iter
[src]
pub fn iter(&self) -> Iter
Returns an iterator over all of the cookies present in this jar.
Example
use cookie::{CookieJar, Cookie}; let mut jar = CookieJar::new(); jar.add_original(Cookie::new("name", "value")); jar.add_original(Cookie::new("second", "two")); jar.add(Cookie::new("new", "third")); jar.add(Cookie::new("another", "fourth")); jar.add(Cookie::new("yac", "fifth")); jar.remove(Cookie::named("name")); jar.remove(Cookie::named("another")); // There are three cookies in the jar: "second", "new", and "yac". for cookie in jar.iter() { match cookie.name() { "second" => assert_eq!(cookie.value(), "two"), "new" => assert_eq!(cookie.value(), "third"), "yac" => assert_eq!(cookie.value(), "fifth"), _ => unreachable!("there are only three cookies in the jar") } }
pub fn private(&mut self, key: &Key) -> PrivateJar
[src]
pub fn private(&mut self, key: &Key) -> PrivateJar
Returns a PrivateJar
with self
as its parent jar using the key key
to sign/encrypt and verify/decrypt cookies added/retrieved from the
child jar.
Any modifications to the child jar will be reflected on the parent jar, and any retrievals from the child jar will be made from the parent jar.
This method is only available when the secure
feature is enabled.
Example
use cookie::{Cookie, CookieJar, Key}; // Generate a secure key. let key = Key::generate(); // Add a private (signed + encrypted) cookie. let mut jar = CookieJar::new(); jar.private(&key).add(Cookie::new("private", "text")); // The cookie's contents are encrypted. assert_ne!(jar.get("private").unwrap().value(), "text"); // They can be decrypted and verified through the child jar. assert_eq!(jar.private(&key).get("private").unwrap().value(), "text"); // A tampered with cookie does not validate but still exists. let mut cookie = jar.get("private").unwrap().clone(); jar.add(Cookie::new("private", cookie.value().to_string() + "!")); assert!(jar.private(&key).get("private").is_none()); assert!(jar.get("private").is_some());
pub fn signed(&mut self, key: &Key) -> SignedJar
[src]
pub fn signed(&mut self, key: &Key) -> SignedJar
Returns a SignedJar
with self
as its parent jar using the key key
to sign/verify cookies added/retrieved from the child jar.
Any modifications to the child jar will be reflected on the parent jar, and any retrievals from the child jar will be made from the parent jar.
This method is only available when the secure
feature is enabled.
Example
use cookie::{Cookie, CookieJar, Key}; // Generate a secure key. let key = Key::generate(); // Add a signed cookie. let mut jar = CookieJar::new(); jar.signed(&key).add(Cookie::new("signed", "text")); // The cookie's contents are signed but still in plaintext. assert_ne!(jar.get("signed").unwrap().value(), "text"); assert!(jar.get("signed").unwrap().value().contains("text")); // They can be verified through the child jar. assert_eq!(jar.signed(&key).get("signed").unwrap().value(), "text"); // A tampered with cookie does not validate but still exists. let mut cookie = jar.get("signed").unwrap().clone(); jar.add(Cookie::new("signed", cookie.value().to_string() + "!")); assert!(jar.signed(&key).get("signed").is_none()); assert!(jar.get("signed").is_some());
Trait Implementations
impl Default for CookieJar
[src]
impl Default for CookieJar
impl Debug for CookieJar
[src]
impl Debug for CookieJar
fn fmt(&self, f: &mut Formatter) -> Result
[src]
fn fmt(&self, f: &mut Formatter) -> Result
Formats the value using the given formatter. Read more
impl Clone for CookieJar
[src]
impl Clone for CookieJar