Parse alpn

This commit is contained in:
Keivan-sf
2025-07-26 11:58:01 +03:30
parent 9b73b4c6ed
commit cd0b282c6e
3 changed files with 15 additions and 2 deletions

View File

@@ -85,6 +85,7 @@ pub struct WsSettings {
#[allow(non_snake_case)] #[allow(non_snake_case)]
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
pub struct TlsSettings { pub struct TlsSettings {
pub alpn: Option<Vec<String>>,
pub allowInsecure: Option<bool>, pub allowInsecure: Option<bool>,
pub serverName: Option<String>, pub serverName: Option<String>,
pub enableSessionResumption: Option<bool>, pub enableSessionResumption: Option<bool>,

View File

@@ -13,6 +13,11 @@ pub fn create_outbound_object(data: models::VlessData) -> Outbound {
security: data.query.security.clone(), security: data.query.security.clone(),
tlsSettings: if data.query.security == String::from("tls") { tlsSettings: if data.query.security == String::from("tls") {
Some(TlsSettings { Some(TlsSettings {
alpn: if data.query.alpn.len() > 1 {
Some(vec![data.query.alpn])
} else {
None
},
rejectUnknownSni: None, rejectUnknownSni: None,
enableSessionResumption: None, enableSessionResumption: None,
minVersion: None, minVersion: None,
@@ -140,7 +145,12 @@ fn parse_vless_query(raw_query: &str) -> models::VlessQuery {
let query: Vec<(&str, &str)> = querystring::querify(raw_query); let query: Vec<(&str, &str)> = querystring::querify(raw_query);
let a = models::VlessQuery { let a = models::VlessQuery {
path: get_parameter_value(&query, "path"), alpn: urlencoding::decode(get_parameter_value(&query, "alpn").as_str())
.unwrap()
.into_owned(),
path: urlencoding::decode(get_parameter_value(&query, "path").as_str())
.unwrap()
.into_owned(),
pbk: get_parameter_value(&query, "pbk"), pbk: get_parameter_value(&query, "pbk"),
security: get_parameter_value(&query, "security"), security: get_parameter_value(&query, "security"),
sid: get_parameter_value(&query, "sid"), sid: get_parameter_value(&query, "sid"),
@@ -218,7 +228,7 @@ mod tests {
#[test] #[test]
fn parse_vless_query_data() { fn parse_vless_query_data() {
let query = "security=reality&sni=bench.sh&fp=chrome&pbk=7xhH4b_VkliBxGulljcyPOH-bYUA2dl-XAdZAsfhk04&sid=6ba85179e30d4fc2&type=tcp&flow=xtls-rprx-vision&path=/"; let query = "security=reality&sni=bench.sh&fp=chrome&pbk=7xhH4b_VkliBxGulljcyPOH-bYUA2dl-XAdZAsfhk04&sid=6ba85179e30d4fc2&type=tcp&flow=xtls-rprx-vision&alpn=http%2F1.1&path=/";
let parsed_query = parse_vless_query(query); let parsed_query = parse_vless_query(query);
assert_eq!(parsed_query.sni, "bench.sh"); assert_eq!(parsed_query.sni, "bench.sh");
assert_eq!(parsed_query.security, "reality"); assert_eq!(parsed_query.security, "reality");
@@ -230,6 +240,7 @@ mod tests {
assert_eq!(parsed_query.sid, "6ba85179e30d4fc2"); assert_eq!(parsed_query.sid, "6ba85179e30d4fc2");
assert_eq!(parsed_query.r#type, "tcp"); assert_eq!(parsed_query.r#type, "tcp");
assert_eq!(parsed_query.flow, "xtls-rprx-vision"); assert_eq!(parsed_query.flow, "xtls-rprx-vision");
assert_eq!(parsed_query.alpn, "http/1.1");
assert_eq!(parsed_query.path, "/"); assert_eq!(parsed_query.path, "/");
assert_eq!(parsed_query.encryption, ""); assert_eq!(parsed_query.encryption, "");
assert_eq!(parsed_query.header_type, ""); assert_eq!(parsed_query.header_type, "");

View File

@@ -17,6 +17,7 @@ pub struct VlessQuery {
pub service_name: String, pub service_name: String,
pub slpn: String, pub slpn: String,
pub spx: String, pub spx: String,
pub alpn: String,
} }
pub struct VlessAddress { pub struct VlessAddress {