Skip to content

Commit 7ef9a00

Browse files
committed
enhance(http): persist cookies on disk
closes tauri-apps/tauri#11518
1 parent 4341d7f commit 7ef9a00

File tree

4 files changed

+65
-3
lines changed

4 files changed

+65
-3
lines changed

.changes/persist-cookies.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"http": "patch"
3+
---
4+
5+
Persist cookies to disk and load it on next app start.
6+

Cargo.lock

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

plugins/http/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ http = "1"
4141
reqwest = { version = "0.12", default-features = false }
4242
url = { workspace = true }
4343
data-url = "0.3"
44+
reqwest_cookie_store = { version = "0.8", optional = true }
4445

4546
[features]
4647
default = [
@@ -61,7 +62,7 @@ rustls-tls-manual-roots = ["reqwest/rustls-tls-manual-roots"]
6162
rustls-tls-webpki-roots = ["reqwest/rustls-tls-webpki-roots"]
6263
rustls-tls-native-roots = ["reqwest/rustls-tls-native-roots"]
6364
blocking = ["reqwest/blocking"]
64-
cookies = ["reqwest/cookies"]
65+
cookies = ["reqwest/cookies", "dep:reqwest_cookie_store"]
6566
gzip = ["reqwest/gzip"]
6667
brotli = ["reqwest/brotli"]
6768
deflate = ["reqwest/deflate"]

plugins/http/src/lib.rs

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,63 @@ mod scope;
2020

2121
pub(crate) struct Http {
2222
#[cfg(feature = "cookies")]
23-
cookies_jar: std::sync::Arc<reqwest::cookie::Jar>,
23+
cookies_jar_path: std::path::PathBuf,
24+
#[cfg(feature = "cookies")]
25+
cookies_jar: std::sync::Arc<reqwest_cookie_store::CookieStoreMutex>,
2426
}
2527

2628
pub fn init<R: Runtime>() -> TauriPlugin<R> {
2729
Builder::<R>::new("http")
2830
.setup(|app, _| {
31+
#[cfg(feature = "cookies")]
32+
let (cookies_jar_path, cookies_jar) = {
33+
use reqwest_cookie_store::*;
34+
use std::fs::File;
35+
use std::io::BufReader;
36+
use std::sync::Arc;
37+
38+
let cache_dir = app.path().app_cache_dir()?;
39+
std::fs::create_dir_all(&cache_dir)?;
40+
41+
let path = cache_dir.join("Cookies");
42+
let file = File::options()
43+
.create(true)
44+
.write(true)
45+
.read(true)
46+
.open(&path)?;
47+
48+
let reader = BufReader::new(file);
49+
let store = CookieStore::load_json(reader).map_err(|e| e.to_string())?;
50+
51+
(path, Arc::new(CookieStoreMutex::new(store)))
52+
};
53+
2954
let state = Http {
3055
#[cfg(feature = "cookies")]
31-
cookies_jar: std::sync::Arc::new(reqwest::cookie::Jar::default()),
56+
cookies_jar_path,
57+
#[cfg(feature = "cookies")]
58+
cookies_jar,
3259
};
3360

3461
app.manage(state);
3562

3663
Ok(())
3764
})
65+
.on_event(|app, event| {
66+
#[cfg(feature = "cookies")]
67+
if let tauri::RunEvent::Exit = event {
68+
use std::fs::File;
69+
use std::io::BufWriter;
70+
71+
let state = app.state::<Http>();
72+
73+
if let Ok(file) = File::create(&state.cookies_jar_path) {
74+
let store = state.cookies_jar.lock().expect("poisoned cookie jar mutex");
75+
let mut writer = BufWriter::new(file);
76+
let _ = store.save_json(&mut writer);
77+
}
78+
}
79+
})
3880
.invoke_handler(tauri::generate_handler![
3981
commands::fetch,
4082
commands::fetch_cancel,

0 commit comments

Comments
 (0)