// Copyright 2019-2023 Tauri Programme within The Commons Conservancy // SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: MIT //! [![](https://github.com/tauri-apps/plugins-workspace/raw/v2/plugins/http/banner.png)](https://github.com/tauri-apps/plugins-workspace/tree/v2/plugins/http) //! //! Access the HTTP client written in Rust. use std::sync::atomic::AtomicU32; use std::{collections::HashMap, future::Future, pin::Pin}; pub use reqwest; use reqwest::Response; use tauri::async_runtime::Mutex; use tauri::{ plugin::{Builder, TauriPlugin}, AppHandle, Manager, Runtime, }; use crate::config::{Config, HttpAllowlistScope}; pub use error::{Error, Result}; mod commands; mod config; mod error; mod scope; type RequestId = u32; type CancelableResponseResult = Result>; type CancelableResponseFuture = Pin + Send + Sync>>; type RequestTable = HashMap; type ResponseTable = HashMap; struct FetchRequest(Mutex); impl FetchRequest { fn new(f: CancelableResponseFuture) -> Self { Self(Mutex::new(f)) } } struct Http { #[allow(dead_code)] app: AppHandle, scope: scope::Scope, current_id: AtomicU32, requests: Mutex, responses: Mutex, } impl Http { fn next_id(&self) -> RequestId { self.current_id .fetch_add(1, std::sync::atomic::Ordering::Relaxed) } } trait HttpExt { fn http(&self) -> &Http; } impl> HttpExt for T { fn http(&self) -> &Http { self.state::>().inner() } } pub fn init() -> TauriPlugin> { Builder::>::new("http") .js_init_script(include_str!("api-iife.js").to_string()) .invoke_handler(tauri::generate_handler![ commands::fetch, commands::fetch_cancel, commands::fetch_send, commands::fetch_read_body, ]) .setup(|app, api| { let default_scope = HttpAllowlistScope::default(); app.manage(Http { app: app.clone(), current_id: 0.into(), requests: Default::default(), responses: Default::default(), scope: scope::Scope::new( api.config() .as_ref() .map(|c| &c.scope) .unwrap_or(&default_scope), ), }); Ok(()) }) .build() }