feat: support more options for remote profile

This commit is contained in:
GyDi
2022-03-10 02:03:55 +08:00
parent afe767e28a
commit ca0e936f7c
7 changed files with 135 additions and 28 deletions

View File

@@ -1,5 +1,5 @@
use crate::{
core::{ClashInfo, PrfItem, Profiles, VergeConfig},
core::{ClashInfo, PrfItem, PrfOption, Profiles, VergeConfig},
states::{ClashState, ProfilesState, VergeState},
utils::{dirs, sysopt::SysProxyConfig},
};
@@ -28,10 +28,10 @@ pub fn sync_profiles(profiles_state: State<'_, ProfilesState>) -> Result<(), Str
#[tauri::command]
pub async fn import_profile(
url: String,
with_proxy: bool,
option: Option<PrfOption>,
profiles_state: State<'_, ProfilesState>,
) -> Result<(), String> {
let item = wrap_err!(PrfItem::from_url(&url, None, None, with_proxy).await)?;
let item = wrap_err!(PrfItem::from_url(&url, None, None, option).await)?;
let mut profiles = profiles_state.0.lock().unwrap();
wrap_err!(profiles.append_item(item))
@@ -55,7 +55,7 @@ pub async fn create_profile(
#[tauri::command]
pub async fn update_profile(
index: String,
with_proxy: bool,
option: Option<PrfOption>,
clash_state: State<'_, ClashState>,
profiles_state: State<'_, ProfilesState>,
) -> Result<(), String> {
@@ -71,7 +71,7 @@ pub async fn update_profile(
item.url.clone().unwrap()
};
let item = wrap_err!(PrfItem::from_url(&url, None, None, with_proxy).await)?;
let item = wrap_err!(PrfItem::from_url(&url, None, None, option).await)?;
let mut profiles = profiles_state.0.lock().unwrap();
wrap_err!(profiles.update_item(index.clone(), item))?;

View File

@@ -31,13 +31,17 @@ pub struct PrfItem {
#[serde(skip_serializing_if = "Option::is_none")]
pub selected: Option<Vec<PrfSelected>>,
/// user info
/// subscription user info
#[serde(skip_serializing_if = "Option::is_none")]
pub extra: Option<PrfExtra>,
/// updated time
pub updated: Option<usize>,
/// some options of the item
#[serde(skip_serializing_if = "Option::is_none")]
pub option: Option<PrfOption>,
/// the file data
#[serde(skip)]
pub file_data: Option<String>,
@@ -57,6 +61,18 @@ pub struct PrfExtra {
pub expire: usize,
}
#[derive(Default, Debug, Clone, Deserialize, Serialize)]
pub struct PrfOption {
/// for `remote` profile's http request
/// see issue #13
#[serde(skip_serializing_if = "Option::is_none")]
pub user_agent: Option<String>,
/// for `remote` profile
#[serde(skip_serializing_if = "Option::is_none")]
pub with_proxy: Option<bool>,
}
impl Default for PrfItem {
fn default() -> Self {
PrfItem {
@@ -69,6 +85,7 @@ impl Default for PrfItem {
selected: None,
extra: None,
updated: None,
option: None,
file_data: None,
}
}
@@ -90,7 +107,7 @@ impl PrfItem {
let url = item.url.as_ref().unwrap().as_str();
let name = item.name;
let desc = item.desc;
PrfItem::from_url(url, name, desc, false).await
PrfItem::from_url(url, name, desc, item.option).await
}
"local" => {
let name = item.name.unwrap_or("Local File".into());
@@ -126,6 +143,7 @@ impl PrfItem {
url: None,
selected: None,
extra: None,
option: None,
updated: Some(help::get_now()),
file_data: Some(tmpl::ITEM_LOCAL.into()),
})
@@ -137,13 +155,25 @@ impl PrfItem {
url: &str,
name: Option<String>,
desc: Option<String>,
with_proxy: bool,
option: Option<PrfOption>,
) -> Result<PrfItem> {
let with_proxy = match option.as_ref() {
Some(opt) => opt.with_proxy.unwrap_or(false),
None => false,
};
let user_agent = match option.as_ref() {
Some(opt) => opt.user_agent.clone(),
None => None,
};
let mut builder = reqwest::ClientBuilder::new();
if !with_proxy {
builder = builder.no_proxy();
}
if let Some(user_agent) = user_agent {
builder = builder.user_agent(user_agent);
}
let resp = builder.build()?.get(url).send().await?;
let header = resp.headers();
@@ -177,6 +207,7 @@ impl PrfItem {
url: Some(url.into()),
selected: None,
extra,
option,
updated: Some(help::get_now()),
file_data: Some(data),
})
@@ -197,6 +228,7 @@ impl PrfItem {
url: None,
selected: None,
extra: None,
option: None,
updated: Some(help::get_now()),
file_data: Some(tmpl::ITEM_MERGE.into()),
})
@@ -217,6 +249,7 @@ impl PrfItem {
url: None,
selected: None,
extra: None,
option: None,
updated: Some(help::get_now()),
file_data: Some(tmpl::ITEM_SCRIPT.into()),
})
@@ -382,6 +415,9 @@ impl Profiles {
patch!(each, item, extra);
patch!(each, item, updated);
// can be removed
each.option = item.option;
self.items = Some(items);
return self.save_file();
}