diff --git a/Cargo.lock b/Cargo.lock index 0c4e1da9..f46a26e0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3315,6 +3315,7 @@ dependencies = [ "rocksdb", "rustls-native-certs", "serde", + "serde_json", "serde_json5", "shadowsocks", "smoltcp", diff --git a/crates/shadowsocks-service/Cargo.toml b/crates/shadowsocks-service/Cargo.toml index 655cca6d..3a5193d0 100644 --- a/crates/shadowsocks-service/Cargo.toml +++ b/crates/shadowsocks-service/Cargo.toml @@ -196,6 +196,7 @@ smoltcp = { version = "0.12", optional = true, default-features = false, feature serde = { version = "1.0", features = ["derive"] } serde_json5 = "0.2" +serde_json = "1.0" bson = { version = "3.0.0", features = ["serde"], optional = true } shadowsocks = { version = "1.23.2", path = "../shadowsocks", default-features = false } diff --git a/crates/shadowsocks-service/src/config.rs b/crates/shadowsocks-service/src/config.rs index 05eb21b8..74ad2b82 100644 --- a/crates/shadowsocks-service/src/config.rs +++ b/crates/shadowsocks-service/src/config.rs @@ -1458,6 +1458,7 @@ macro_rules! impl_from { impl_from!(::std::io::Error, ErrorKind::IoError, "error while reading file"); impl_from!(serde_json5::Error, ErrorKind::JsonParsingError, "json parse error"); +impl_from!(serde_json::Error, ErrorKind::JsonParsingError, "json parse error"); impl Debug for Error { fn fmt(&self, f: &mut Formatter) -> fmt::Result { @@ -2568,6 +2569,12 @@ impl Config { Self::load_from_ssconfig(c, config_type) } + /// Load Config from a JSON `str` + pub fn load_from_json_str(s: &str, config_type: ConfigType) -> Result { + let c = serde_json::from_str::(s)?; + Self::load_from_ssconfig(c, config_type) + } + /// Load Config from a File pub fn load_from_file>(filename: P, config_type: ConfigType) -> Result { let filename = filename.as_ref(); diff --git a/crates/shadowsocks-service/src/local/online_config/mod.rs b/crates/shadowsocks-service/src/local/online_config/mod.rs index 9ef741aa..94300be9 100644 --- a/crates/shadowsocks-service/src/local/online_config/mod.rs +++ b/crates/shadowsocks-service/src/local/online_config/mod.rs @@ -190,7 +190,7 @@ impl OnlineConfigService { Err(..) => return Err(io::Error::other("body contains non-utf8 bytes")), }; - let online_config = match Config::load_from_str(&parsed_body, ConfigType::OnlineConfig) { + let online_config = match Config::load_from_json_str(&parsed_body, ConfigType::OnlineConfig) { Ok(c) => c, Err(err) => { error!(