Skip to content

Commit 514afdb

Browse files
committed
inline reqwest_cookie_store to fix clippy
1 parent e4eed02 commit 514afdb

File tree

4 files changed

+95
-21
lines changed

4 files changed

+95
-21
lines changed

Cargo.lock

Lines changed: 2 additions & 13 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: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ 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 }
44+
cookie_store = { version = "0.21.1", optional = true, features = ["serde"] }
45+
bytes = { version = "1.9", optional = true }
4546
tracing = { workspace = true, optional = true }
4647

4748
[features]
@@ -63,7 +64,7 @@ rustls-tls-manual-roots = ["reqwest/rustls-tls-manual-roots"]
6364
rustls-tls-webpki-roots = ["reqwest/rustls-tls-webpki-roots"]
6465
rustls-tls-native-roots = ["reqwest/rustls-tls-native-roots"]
6566
blocking = ["reqwest/blocking"]
66-
cookies = ["reqwest/cookies", "dep:reqwest_cookie_store"]
67+
cookies = ["reqwest/cookies", "dep:cookie_store", "dep:bytes"]
6768
gzip = ["reqwest/gzip"]
6869
brotli = ["reqwest/brotli"]
6970
deflate = ["reqwest/deflate"]

plugins/http/src/lib.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,23 @@ pub use error::{Error, Result};
1414

1515
mod commands;
1616
mod error;
17+
#[cfg(feature = "cookies")]
18+
mod reqwest_cookie_store;
1719
mod scope;
1820

1921
pub(crate) struct Http {
2022
#[cfg(feature = "cookies")]
2123
cookies_jar_path: std::path::PathBuf,
2224
#[cfg(feature = "cookies")]
23-
cookies_jar: std::sync::Arc<reqwest_cookie_store::CookieStoreMutex>,
25+
cookies_jar: std::sync::Arc<crate::reqwest_cookie_store::CookieStoreMutex>,
2426
}
2527

2628
pub fn init<R: Runtime>() -> TauriPlugin<R> {
2729
Builder::<R>::new("http")
2830
.setup(|app, _| {
2931
#[cfg(feature = "cookies")]
3032
let (cookies_jar_path, cookies_jar) = {
31-
use reqwest_cookie_store::*;
33+
use crate::reqwest_cookie_store::*;
3234
use std::fs::File;
3335
use std::io::BufReader;
3436
use std::sync::Arc;
@@ -44,9 +46,9 @@ pub fn init<R: Runtime>() -> TauriPlugin<R> {
4446
.open(&path)?;
4547

4648
let reader = BufReader::new(file);
47-
let store = CookieStore::load_json(reader).map_err(|e| e.to_string())?;
49+
let store = CookieStoreMutex::load(reader).map_err(|e| e.to_string())?;
4850

49-
(path, Arc::new(CookieStoreMutex::new(store)))
51+
(path, Arc::new(store))
5052
};
5153

5254
let state = Http {
@@ -69,9 +71,8 @@ pub fn init<R: Runtime>() -> TauriPlugin<R> {
6971
let state = app.state::<Http>();
7072

7173
if let Ok(file) = File::create(&state.cookies_jar_path) {
72-
let store = state.cookies_jar.lock().expect("poisoned cookie jar mutex");
7374
let mut writer = BufWriter::new(file);
74-
let _ = store.save_json(&mut writer);
75+
let _ = state.cookies_jar.save(&mut writer);
7576
}
7677
}
7778
})
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// taken from https://github.com/pfernie/reqwest_cookie_store/blob/2ec4afabcd55e24d3afe3f0626ee6dc97bed938d/src/lib.rs
2+
3+
use std::sync::{Mutex, MutexGuard, PoisonError};
4+
5+
use cookie_store::{CookieStore, RawCookie, RawCookieParseError};
6+
use reqwest::header::HeaderValue;
7+
use serde::{Deserialize, Serialize};
8+
9+
fn set_cookies(
10+
cookie_store: &mut CookieStore,
11+
cookie_headers: &mut dyn Iterator<Item = &HeaderValue>,
12+
url: &url::Url,
13+
) {
14+
let cookies = cookie_headers.filter_map(|val| {
15+
std::str::from_utf8(val.as_bytes())
16+
.map_err(RawCookieParseError::from)
17+
.and_then(RawCookie::parse)
18+
.map(|c| c.into_owned())
19+
.ok()
20+
});
21+
cookie_store.store_response_cookies(cookies, url);
22+
}
23+
24+
fn cookies(cookie_store: &CookieStore, url: &url::Url) -> Option<HeaderValue> {
25+
let s = cookie_store
26+
.get_request_values(url)
27+
.map(|(name, value)| format!("{}={}", name, value))
28+
.collect::<Vec<_>>()
29+
.join("; ");
30+
31+
if s.is_empty() {
32+
return None;
33+
}
34+
35+
HeaderValue::from_maybe_shared(bytes::Bytes::from(s)).ok()
36+
}
37+
38+
/// A [`cookie_store::CookieStore`] wrapped internally by a [`std::sync::Mutex`], suitable for use in
39+
/// async/concurrent contexts.
40+
#[derive(Debug, Serialize, Deserialize)]
41+
pub struct CookieStoreMutex(Mutex<CookieStore>);
42+
43+
impl Default for CookieStoreMutex {
44+
/// Create a new, empty [`CookieStoreMutex`]
45+
fn default() -> Self {
46+
CookieStoreMutex::new(CookieStore::default())
47+
}
48+
}
49+
50+
impl CookieStoreMutex {
51+
/// Create a new [`CookieStoreMutex`] from an existing [`cookie_store::CookieStore`].
52+
pub const fn new(cookie_store: CookieStore) -> CookieStoreMutex {
53+
CookieStoreMutex(Mutex::new(cookie_store))
54+
}
55+
56+
/// Lock and get a handle to the contained [`cookie_store::CookieStore`].
57+
pub fn lock(
58+
&self,
59+
) -> Result<MutexGuard<'_, CookieStore>, PoisonError<MutexGuard<'_, CookieStore>>> {
60+
self.0.lock()
61+
}
62+
63+
pub fn load<R: std::io::BufRead>(reader: R) -> cookie_store::Result<CookieStoreMutex> {
64+
cookie_store::serde::load(reader, |c| serde_json::from_str(c)).map(CookieStoreMutex::new)
65+
}
66+
67+
pub fn save<W: std::io::Write>(&self, writer: &mut W) -> cookie_store::Result<()> {
68+
let store = self.lock().expect("poisoned cookie jar mutex");
69+
cookie_store::serde::save(&store, writer, |c| serde_json::to_string(c))
70+
}
71+
}
72+
73+
impl reqwest::cookie::CookieStore for CookieStoreMutex {
74+
fn set_cookies(&self, cookie_headers: &mut dyn Iterator<Item = &HeaderValue>, url: &url::Url) {
75+
let mut store = self.0.lock().unwrap();
76+
set_cookies(&mut store, cookie_headers, url);
77+
}
78+
79+
fn cookies(&self, url: &url::Url) -> Option<HeaderValue> {
80+
let store = self.0.lock().unwrap();
81+
cookies(&store, url)
82+
}
83+
}

0 commit comments

Comments
 (0)