diff --git a/plugins/updater/src/commands.rs b/plugins/updater/src/commands.rs index 0039fe46..d7c51ab9 100644 --- a/plugins/updater/src/commands.rs +++ b/plugins/updater/src/commands.rs @@ -4,10 +4,12 @@ use crate::{PendingUpdate, Result, UpdaterExt}; -use serde::Serialize; +use http::header; +use serde::{Deserialize, Deserializer, Serialize}; use tauri::{api::ipc::Channel, AppHandle, Runtime, State}; use std::{ + collections::HashMap, sync::atomic::{AtomicBool, Ordering}, time::Duration, }; @@ -43,17 +45,43 @@ pub(crate) struct Metadata { body: Option, } +#[derive(Debug, Default)] +pub(crate) struct HeaderMap(header::HeaderMap); + +impl<'de> Deserialize<'de> for HeaderMap { + fn deserialize(deserializer: D) -> std::result::Result + where + D: Deserializer<'de>, + { + let map = HashMap::::deserialize(deserializer)?; + let mut headers = header::HeaderMap::default(); + for (key, value) in map { + if let (Ok(key), Ok(value)) = ( + header::HeaderName::from_bytes(key.as_bytes()), + header::HeaderValue::from_str(&value), + ) { + headers.insert(key, value); + } else { + return Err(serde::de::Error::custom(format!( + "invalid header `{key}` `{value}`" + ))); + } + } + Ok(Self(headers)) + } +} + #[tauri::command] pub(crate) async fn check( app: AppHandle, pending: State<'_, PendingUpdate>, - headers: Option>, + headers: Option, timeout: Option, target: Option, ) -> Result { let mut builder = app.updater_builder(); if let Some(headers) = headers { - for (k, v) in headers.into_iter() { + for (k, v) in headers.0.iter() { builder = builder.header(k, v)?; } }