From 6a8864cc2789c897f046dbd7ab6edbb7c7a99127 Mon Sep 17 00:00:00 2001 From: Stanislav Panferov Date: Tue, 2 Dec 2014 10:38:08 +0300 Subject: [PATCH] Add more functions for client to work with cookies. Fixes #155. --- src/header/common/cookie.rs | 21 +++++++++++++++++++-- src/header/common/set_cookie.rs | 23 +++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/header/common/cookie.rs b/src/header/common/cookie.rs index 7d41f4a2..8e8cbd8d 100644 --- a/src/header/common/cookie.rs +++ b/src/header/common/cookie.rs @@ -66,11 +66,17 @@ impl Cookies { /// to manipulate cookies and create a corresponding `SetCookie` header afterwards. pub fn to_cookie_jar(&self, key: &[u8]) -> CookieJar<'static> { let mut jar = CookieJar::new(key); - for cookie in self.0.iter() { - jar.add_original((*cookie).clone()); + for cookie in self.iter() { + jar.add_original(cookie.clone()); } jar } + + /// Extracts all cookies from `CookieJar` and creates Cookie header. + /// Useful for clients. + pub fn from_cookie_jar(jar: &CookieJar) -> Cookies { + Cookies(jar.iter().collect()) + } } @@ -96,4 +102,15 @@ fn test_fmt() { assert_eq!(headers.to_string()[], "Cookie: foo=bar; baz=quux\r\n"); } +#[test] +fn cookie_jar() { + let cookie = Cookie::new("foo".to_string(), "bar".to_string()); + let cookies = Cookies(vec![cookie]); + let jar = cookies.to_cookie_jar(&[]); + let new_cookies = Cookies::from_cookie_jar(&jar); + + assert_eq!(cookies, new_cookies); +} + + bench_header!(bench, Cookies, { vec![b"foo=bar; baz=quux".to_vec()] }) diff --git a/src/header/common/set_cookie.rs b/src/header/common/set_cookie.rs index 4d845c20..033445ff 100644 --- a/src/header/common/set_cookie.rs +++ b/src/header/common/set_cookie.rs @@ -63,6 +63,14 @@ impl SetCookie { pub fn from_cookie_jar(jar: &CookieJar) -> SetCookie { SetCookie(jar.delta()) } + + /// Use this on client to apply changes from SetCookie to CookieJar. + /// Note that this will `panic!` if `CookieJar` is not root. + pub fn apply_to_cookie_jar(&self, jar: &mut CookieJar) { + for cookie in self.iter() { + jar.add_original(cookie.clone()) + } + } } @@ -88,3 +96,18 @@ fn test_fmt() { assert_eq!(headers.to_string()[], "Set-Cookie: foo=bar; HttpOnly; Path=/p\r\nSet-Cookie: baz=quux; Path=/\r\n"); } + +#[test] +fn cookie_jar() { + let jar = CookieJar::new("secret".as_bytes()); + let cookie = Cookie::new("foo".to_string(), "bar".to_string()); + jar.encrypted().add(cookie); + + let cookies = SetCookie::from_cookie_jar(&jar); + + let mut new_jar = CookieJar::new("secret".as_bytes()); + cookies.apply_to_cookie_jar(&mut new_jar); + + assert_eq!(jar.encrypted().find("foo"), new_jar.encrypted().find("foo")); + assert_eq!(jar.iter().collect::>(), new_jar.iter().collect::>()); +}