browsercookie/
lib.rs

1//! # browsercookie-rs
2//!
3//! Browsercookie-rs crate allows you to gather cookies from browsers
4//! on the system and return them in a CookieJar, so that it can be
5//! used with other http libraries like Hyper etc..
6//!
7//! ```rust,ignore
8//! use Browsercookie::{Browser, Browsercookies};
9//!
10//! let mut bc = Browsercookies::new();
11//! let domain_regex = Regex::new(".*");
12//! bc.from_browser(Browser::Firefox, &domain_regex).expect("Failed to get firefox browser cookies");
13//! if let Ok(cookie_header) = bc.to_header(&domain_regex) as Result<String, Box<Error>> {
14//!     println!("Cookies extracted");
15//! }
16//! ```
17//!
18//! Using above `to_header` returns a string to be used with http clients as a header
19//! directly.
20//!
21//! ```rust,ignore
22//! use reqwest::header;
23//! use Browsercookie::{Browser, Browsercookies};
24//!
25//! let mut bc = Browsercookies::new();
26//! let domain_regex = Regex::new("www.rust-lang.org");
27//! bc.from_browser(Browser::Firefox, &domain_regex).expect("Failed to get firefox browser cookies");
28//!
29//! if let Ok(cookie_header) = bc.to_header(&domain_regex) as Result<String, Box<Error>> {
30//!     let mut headers = header::HeaderMap::new();
31//!     headers.insert(header::COOKIE, header::HeaderValue::from_str(&cookie_header));
32//!
33//!     let client = reqwest::Client::builder()
34//!         .default_headers(headers)
35//!         .build()?;
36//!     let res = client.get("https://www.rust-lang.org").send()?;
37//! }
38//! ```
39use regex::Regex;
40use cookie::CookieJar;
41use std::error::Error;
42
43#[macro_use] extern crate serde;
44
45mod firefox;
46pub mod errors;
47
48/// All supported browsers
49pub enum Browser {
50    Firefox
51}
52
53/// Main struct facilitating operations like collection & parsing of cookies from browsers
54pub struct Browsercookies {
55    pub cj: Box<CookieJar>
56}
57
58impl Browsercookies {
59    pub fn new() -> Browsercookies {
60        Browsercookies {
61            cj: Box::new(CookieJar::new())
62        }
63    }
64
65    pub fn from_browser(&mut self, b: Browser, domain_regex: &Regex) -> Result<(), Box<Error>> {
66        match b {
67            Browser::Firefox => return firefox::load(&mut self.cj, domain_regex)
68        }
69    }
70
71    pub fn to_header(&self, domain_regex: &Regex) -> Result<String, Box<Error>> {
72        let mut header = String::from("");
73        for cookie in self.cj.iter() {
74            if domain_regex.is_match(cookie.domain().unwrap()) {
75                header.push_str(&format!("{}={}; ", cookie.name(), cookie.value()));
76            }
77        }
78        Ok(header)
79    }
80}
81
82#[cfg(test)]
83mod tests {
84    use super::*;
85
86    #[test]
87    fn test_firefox() {
88        let mut bc = Browsercookies::new();
89        let domain_regex = Regex::new(".*").unwrap();
90        bc.from_browser(Browser::Firefox, &domain_regex).expect("Failed to get firefox browser cookies");
91        if let Ok(cookie_header) = bc.to_header(&domain_regex) as Result<String, Box<Error>> {
92            assert_eq!(cookie_header, "name=value; ");
93        }
94    }
95}