|
@@ -1,6 +1,7 @@
|
|
|
use crate::config::Config;
|
|
|
use anyhow::{bail, Result};
|
|
|
use reqwest::header::HeaderMap;
|
|
|
+use serde::{Deserialize, Serialize};
|
|
|
use serde_yaml::Mapping;
|
|
|
use std::collections::HashMap;
|
|
|
|
|
@@ -36,6 +37,28 @@ pub async fn patch_configs(config: &Mapping) -> Result<()> {
|
|
|
Ok(())
|
|
|
}
|
|
|
|
|
|
+#[derive(Default, Debug, Clone, Deserialize, Serialize)]
|
|
|
+pub struct DelayRes {
|
|
|
+ delay: u64,
|
|
|
+}
|
|
|
+
|
|
|
+/// GET /proxies/{name}/delay
|
|
|
+/// 获取代理延迟
|
|
|
+pub async fn get_proxy_delay(name: String, test_url: Option<String>) -> Result<DelayRes> {
|
|
|
+ let (url, headers) = clash_client_info()?;
|
|
|
+ let url = format!("{url}/proxies/{name}/delay");
|
|
|
+ let test_url = test_url.unwrap_or("http://www.gstatic.com/generate_204".into());
|
|
|
+
|
|
|
+ let client = reqwest::ClientBuilder::new().no_proxy().build()?;
|
|
|
+ let builder = client
|
|
|
+ .get(&url)
|
|
|
+ .headers(headers)
|
|
|
+ .query(&[("timeout", "10000"), ("url", &test_url)]);
|
|
|
+ let response = builder.send().await?;
|
|
|
+
|
|
|
+ Ok(response.json::<DelayRes>().await?)
|
|
|
+}
|
|
|
+
|
|
|
/// 根据clash info获取clash服务地址和请求头
|
|
|
fn clash_client_info() -> Result<(String, HeaderMap)> {
|
|
|
let client = { Config::clash().data().get_client_info() };
|