From 7ef9a007dbb80992b6751c302601d4d1decde6b2 Mon Sep 17 00:00:00 2001 From: amrbashir Date: Mon, 28 Oct 2024 17:53:43 +0300 Subject: [PATCH] enhance(http): persist cookies on disk closes tauri-apps/tauri#11518 --- .changes/persist-cookies.md | 6 +++++ Cargo.lock | 13 +++++++++++ plugins/http/Cargo.toml | 3 ++- plugins/http/src/lib.rs | 46 +++++++++++++++++++++++++++++++++++-- 4 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 .changes/persist-cookies.md diff --git a/.changes/persist-cookies.md b/.changes/persist-cookies.md new file mode 100644 index 00000000..d81a85a2 --- /dev/null +++ b/.changes/persist-cookies.md @@ -0,0 +1,6 @@ +--- +"http": "patch" +--- + +Persist cookies to disk and load it on next app start. + diff --git a/Cargo.lock b/Cargo.lock index 2522f63d..3b9a036a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5323,6 +5323,18 @@ dependencies = [ "windows-registry 0.2.0", ] +[[package]] +name = "reqwest_cookie_store" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0b36498c7452f11b1833900f31fbb01fc46be20992a50269c88cf59d79f54e9" +dependencies = [ + "bytes", + "cookie_store", + "reqwest", + "url", +] + [[package]] name = "rfc6979" version = "0.4.0" @@ -6907,6 +6919,7 @@ dependencies = [ "http", "regex", "reqwest", + "reqwest_cookie_store", "schemars", "serde", "serde_json", diff --git a/plugins/http/Cargo.toml b/plugins/http/Cargo.toml index 8c1801a3..5c7a6c83 100644 --- a/plugins/http/Cargo.toml +++ b/plugins/http/Cargo.toml @@ -41,6 +41,7 @@ http = "1" reqwest = { version = "0.12", default-features = false } url = { workspace = true } data-url = "0.3" +reqwest_cookie_store = { version = "0.8", optional = true } [features] default = [ @@ -61,7 +62,7 @@ rustls-tls-manual-roots = ["reqwest/rustls-tls-manual-roots"] rustls-tls-webpki-roots = ["reqwest/rustls-tls-webpki-roots"] rustls-tls-native-roots = ["reqwest/rustls-tls-native-roots"] blocking = ["reqwest/blocking"] -cookies = ["reqwest/cookies"] +cookies = ["reqwest/cookies", "dep:reqwest_cookie_store"] gzip = ["reqwest/gzip"] brotli = ["reqwest/brotli"] deflate = ["reqwest/deflate"] diff --git a/plugins/http/src/lib.rs b/plugins/http/src/lib.rs index cdffeb6e..d19bc2ad 100644 --- a/plugins/http/src/lib.rs +++ b/plugins/http/src/lib.rs @@ -20,21 +20,63 @@ mod scope; pub(crate) struct Http { #[cfg(feature = "cookies")] - cookies_jar: std::sync::Arc, + cookies_jar_path: std::path::PathBuf, + #[cfg(feature = "cookies")] + cookies_jar: std::sync::Arc, } pub fn init() -> TauriPlugin { Builder::::new("http") .setup(|app, _| { + #[cfg(feature = "cookies")] + let (cookies_jar_path, cookies_jar) = { + use reqwest_cookie_store::*; + use std::fs::File; + use std::io::BufReader; + use std::sync::Arc; + + let cache_dir = app.path().app_cache_dir()?; + std::fs::create_dir_all(&cache_dir)?; + + let path = cache_dir.join("Cookies"); + let file = File::options() + .create(true) + .write(true) + .read(true) + .open(&path)?; + + let reader = BufReader::new(file); + let store = CookieStore::load_json(reader).map_err(|e| e.to_string())?; + + (path, Arc::new(CookieStoreMutex::new(store))) + }; + let state = Http { #[cfg(feature = "cookies")] - cookies_jar: std::sync::Arc::new(reqwest::cookie::Jar::default()), + cookies_jar_path, + #[cfg(feature = "cookies")] + cookies_jar, }; app.manage(state); Ok(()) }) + .on_event(|app, event| { + #[cfg(feature = "cookies")] + if let tauri::RunEvent::Exit = event { + use std::fs::File; + use std::io::BufWriter; + + let state = app.state::(); + + if let Ok(file) = File::create(&state.cookies_jar_path) { + let store = state.cookies_jar.lock().expect("poisoned cookie jar mutex"); + let mut writer = BufWriter::new(file); + let _ = store.save_json(&mut writer); + } + } + }) .invoke_handler(tauri::generate_handler![ commands::fetch, commands::fetch_cancel,