enhance(http): persist cookies on disk

closes tauri-apps/tauri#11518
pull/1978/head
amrbashir 9 months ago
parent 4341d7f500
commit 7ef9a007db
No known key found for this signature in database
GPG Key ID: BBD7A47A2003FF33

@ -0,0 +1,6 @@
---
"http": "patch"
---
Persist cookies to disk and load it on next app start.

13
Cargo.lock generated

@ -5323,6 +5323,18 @@ dependencies = [
"windows-registry 0.2.0", "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]] [[package]]
name = "rfc6979" name = "rfc6979"
version = "0.4.0" version = "0.4.0"
@ -6907,6 +6919,7 @@ dependencies = [
"http", "http",
"regex", "regex",
"reqwest", "reqwest",
"reqwest_cookie_store",
"schemars", "schemars",
"serde", "serde",
"serde_json", "serde_json",

@ -41,6 +41,7 @@ http = "1"
reqwest = { version = "0.12", default-features = false } reqwest = { version = "0.12", default-features = false }
url = { workspace = true } url = { workspace = true }
data-url = "0.3" data-url = "0.3"
reqwest_cookie_store = { version = "0.8", optional = true }
[features] [features]
default = [ 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-webpki-roots = ["reqwest/rustls-tls-webpki-roots"]
rustls-tls-native-roots = ["reqwest/rustls-tls-native-roots"] rustls-tls-native-roots = ["reqwest/rustls-tls-native-roots"]
blocking = ["reqwest/blocking"] blocking = ["reqwest/blocking"]
cookies = ["reqwest/cookies"] cookies = ["reqwest/cookies", "dep:reqwest_cookie_store"]
gzip = ["reqwest/gzip"] gzip = ["reqwest/gzip"]
brotli = ["reqwest/brotli"] brotli = ["reqwest/brotli"]
deflate = ["reqwest/deflate"] deflate = ["reqwest/deflate"]

@ -20,21 +20,63 @@ mod scope;
pub(crate) struct Http { pub(crate) struct Http {
#[cfg(feature = "cookies")] #[cfg(feature = "cookies")]
cookies_jar: std::sync::Arc<reqwest::cookie::Jar>, cookies_jar_path: std::path::PathBuf,
#[cfg(feature = "cookies")]
cookies_jar: std::sync::Arc<reqwest_cookie_store::CookieStoreMutex>,
} }
pub fn init<R: Runtime>() -> TauriPlugin<R> { pub fn init<R: Runtime>() -> TauriPlugin<R> {
Builder::<R>::new("http") Builder::<R>::new("http")
.setup(|app, _| { .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 { let state = Http {
#[cfg(feature = "cookies")] #[cfg(feature = "cookies")]
cookies_jar: std::sync::Arc::new(reqwest::cookie::Jar::default()), cookies_jar_path,
#[cfg(feature = "cookies")]
cookies_jar,
}; };
app.manage(state); app.manage(state);
Ok(()) 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::<Http>();
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![ .invoke_handler(tauri::generate_handler![
commands::fetch, commands::fetch,
commands::fetch_cancel, commands::fetch_cancel,

Loading…
Cancel
Save