aboutsummaryrefslogtreecommitdiffstats
path: root/components/net/cookie.rs
diff options
context:
space:
mode:
authorDaniel <ddefisher@gmail.com>2016-04-16 21:09:43 -0400
committerDaniel <ddefisher@gmail.com>2016-04-20 18:12:00 -0400
commitd4f63cda5ff4607f58d3feec2387e39f13b3411a (patch)
tree276637b3b95ee1c3c85c9cd8b266f950d67ab0be /components/net/cookie.rs
parentf051028ee8cd93168b1abe3742929d43d19cb002 (diff)
downloadservo-d4f63cda5ff4607f58d3feec2387e39f13b3411a.tar.gz
servo-d4f63cda5ff4607f58d3feec2387e39f13b3411a.zip
write cookie_jar, hsts_list, auth_cache, and local_data to file if profile_dir option is present
Diffstat (limited to 'components/net/cookie.rs')
-rw-r--r--components/net/cookie.rs63
1 files changed, 63 insertions, 0 deletions
diff --git a/components/net/cookie.rs b/components/net/cookie.rs
index 0f77a8d6f2c..f5c021e2b91 100644
--- a/components/net/cookie.rs
+++ b/components/net/cookie.rs
@@ -8,6 +8,7 @@
use cookie_rs;
use net_traits::CookieSource;
use pub_domains::PUB_DOMAINS;
+use rustc_serialize::{Encodable, Encoder};
use std::borrow::ToOwned;
use std::net::{Ipv4Addr, Ipv6Addr};
use time::{Tm, now, at, Duration};
@@ -175,3 +176,65 @@ impl Cookie {
true
}
}
+
+impl Encodable for Cookie {
+ fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
+ s.emit_struct("Cookie", 6, |e| {
+ try!(e.emit_struct_field("cookie", 0, |e| RsCookie(self.cookie.clone()).encode(e)));
+ try!(e.emit_struct_field("host_only", 1, |e| self.host_only.encode(e)));
+ try!(e.emit_struct_field("persistent", 2, |e| self.persistent.encode(e)));
+ try!(e.emit_struct_field("creation_time", 3, |e| Time(self.creation_time).encode(e)));
+ try!(e.emit_struct_field("last_access", 4, |e| Time(self.last_access).encode(e)));
+ match self.expiry_time {
+ Some(time) => try!(e.emit_struct_field("expiry_time", 5, |e| Time(time).encode(e))),
+ None => {},
+ }
+ Ok(())
+ })
+ }
+}
+
+struct Time(Tm);
+
+impl Encodable for Time {
+ fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
+ let Time(time) = *self;
+ s.emit_struct("Time", 11, |e| {
+ try!(e.emit_struct_field("tm_sec", 0, |e| time.tm_sec.encode(e)));
+ try!(e.emit_struct_field("tm_min", 1, |e| time.tm_min.encode(e)));
+ try!(e.emit_struct_field("tm_hour", 2, |e| time.tm_hour.encode(e)));
+ try!(e.emit_struct_field("tm_mday", 3, |e| time.tm_mday.encode(e)));
+ try!(e.emit_struct_field("tm_mon", 4, |e| time.tm_mon.encode(e)));
+ try!(e.emit_struct_field("tm_year", 5, |e| time.tm_year.encode(e)));
+ try!(e.emit_struct_field("tm_wday", 6, |e| time.tm_wday.encode(e)));
+ try!(e.emit_struct_field("tm_yday", 7, |e| time.tm_yday.encode(e)));
+ try!(e.emit_struct_field("tm_isdst", 8, |e| time.tm_isdst.encode(e)));
+ try!(e.emit_struct_field("tm_utcoff", 9, |e| time.tm_utcoff.encode(e)));
+ try!(e.emit_struct_field("tm_nsec", 10, |e| time.tm_nsec.encode(e)));
+ Ok(())
+ })
+ }
+}
+
+struct RsCookie(cookie_rs::Cookie);
+
+impl Encodable for RsCookie {
+ fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
+ let RsCookie(ref rs_cookie) = *self;
+ s.emit_struct("RsCookie", 9, |e| {
+ try!(e.emit_struct_field("name", 0, |e| rs_cookie.name.encode(e)));
+ try!(e.emit_struct_field("value", 1, |e| rs_cookie.value.encode(e)));
+ match rs_cookie.expires {
+ Some(time) => try!(e.emit_struct_field("expires", 2, |e| Time(time).encode(e))),
+ None => {},
+ }
+ try!(e.emit_struct_field("max_age", 3, |e| rs_cookie.max_age.encode(e)));
+ try!(e.emit_struct_field("domain", 4, |e| rs_cookie.domain.encode(e)));
+ try!(e.emit_struct_field("path", 5, |e| rs_cookie.path.encode(e)));
+ try!(e.emit_struct_field("secure", 6, |e| rs_cookie.secure.encode(e)));
+ try!(e.emit_struct_field("httponly", 7, |e| rs_cookie.httponly.encode(e)));
+ try!(e.emit_struct_field("custom", 8, |e| rs_cookie.custom.encode(e)));
+ Ok(())
+ })
+ }
+}