// Copyright 2019-2023 Tauri Programme within The Commons Conservancy // SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: MIT //! Access the HTTP client written in Rust. pub use reqwest; use tauri::{ plugin::{Builder, TauriPlugin}, Manager, Runtime, }; pub use error::{Error, Result}; mod commands; mod error; #[cfg(feature = "cookies")] mod reqwest_cookie_store; mod scope; pub(crate) struct Http { #[cfg(feature = "cookies")] cookies_jar: crate::reqwest_cookie_store::CookieStoreMutex, } pub fn init() -> TauriPlugin { Builder::::new("http") .setup(|app, _| { #[cfg(feature = "cookies")] let cookies_jar = { use crate::reqwest_cookie_store::*; use std::fs::File; use std::io::BufReader; 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) .append(true) .read(true) .open(&path)?; let reader = BufReader::new(file); let store = CookieStoreMutex::load(path.clone(), reader).unwrap_or_else(|_e| { #[cfg(feature = "tracing")] tracing::warn!( "failed to load cookie store: {_e}, falling back to empty store" ); CookieStoreMutex::new(path, Default::default()) }); store }; let state = Http { #[cfg(feature = "cookies")] cookies_jar, }; app.manage(state); Ok(()) }) .on_event(|app, event| { #[cfg(feature = "cookies")] if let tauri::RunEvent::Exit = event { let state = app.state::(); if let Err(_e) = state.cookies_jar.save() { #[cfg(feature = "tracing")] tracing::error!("failed to save cookie jar: {_e}"); } } }) .invoke_handler(tauri::generate_handler![ commands::fetch, commands::fetch_cancel, commands::fetch_send, commands::fetch_read_body ]) .build() }