From 81c930193b69d2c0f1fbf2375610476ff654e1e3 Mon Sep 17 00:00:00 2001 From: Keivan-sf Date: Sat, 26 Jul 2025 19:25:55 +0330 Subject: [PATCH] Support http inbound resolves #2 --- src/config_models/mod.rs | 2 +- src/main.rs | 4 ++- src/parser/mod.rs | 11 +++++-- src/utils/inbound_generator.rs | 57 ++++++++++++++++++---------------- 4 files changed, 42 insertions(+), 32 deletions(-) diff --git a/src/config_models/mod.rs b/src/config_models/mod.rs index b78454a..c4d6d28 100644 --- a/src/config_models/mod.rs +++ b/src/config_models/mod.rs @@ -165,7 +165,7 @@ pub struct Inbound { pub listen: String, pub port: u16, pub protocol: String, - pub settings: InboundSettings, + pub settings: Option, pub sniffing: Option, pub tag: String, } diff --git a/src/main.rs b/src/main.rs index ef374ad..601f9b9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,10 +9,12 @@ struct Cli { uri: String, #[arg(short, long, value_name = "socksport")] socksport: Option, + #[arg(long, value_name = "httpport")] + httpport: Option, } fn main() { let cli = Cli::parse(); - let json_config = parser::create_json_config(&cli.uri, cli.socksport); + let json_config = parser::create_json_config(&cli.uri, cli.socksport, cli.httpport); println!("{}", json_config); } diff --git a/src/parser/mod.rs b/src/parser/mod.rs index d4fb81d..ad0ff87 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -5,17 +5,22 @@ use std::process::exit; mod uri_identifier; mod vless; -pub fn create_json_config(uri: &str, socks_port: Option) -> String { - let config = create_config(uri, socks_port); +pub fn create_json_config(uri: &str, socks_port: Option, http_port: Option) -> String { + let config = create_config(uri, socks_port, http_port); let serialized = serde_json::to_string(&config).unwrap(); return serialized; } -pub fn create_config(uri: &str, socks_port: Option) -> config_models::Config { +pub fn create_config( + uri: &str, + socks_port: Option, + http_port: Option, +) -> config_models::Config { let outbound_object = create_outbound_object(uri); let inbound_config = inbound_generator::generate_inbound_config(inbound_generator::InboundGenerationOptions { socks_port, + http_port, }); let config = config_models::Config { outbounds: vec![outbound_object], diff --git a/src/utils/inbound_generator.rs b/src/utils/inbound_generator.rs index ec7bde2..3808dfb 100644 --- a/src/utils/inbound_generator.rs +++ b/src/utils/inbound_generator.rs @@ -2,6 +2,7 @@ use crate::config_models; pub struct InboundGenerationOptions { pub socks_port: Option, + pub http_port: Option, } pub fn generate_inbound_config(options: InboundGenerationOptions) -> Vec { @@ -12,16 +13,24 @@ pub fn generate_inbound_config(options: InboundGenerationOptions) -> Vec {} } + + match options.http_port { + Some(port) => { + inbounds.push(generate_http_inbound(port)); + } + None => {} + } + return inbounds; } -pub fn generate_socks_inbound(socks_port: u16) -> config_models::Inbound { +pub fn generate_http_inbound(http_port: u16) -> config_models::Inbound { return config_models::Inbound { - protocol: String::from("socks"), - port: socks_port, - tag: String::from("socks-in"), + protocol: String::from("http"), + port: http_port, + tag: String::from("http-in"), + settings: None, listen: String::from("127.0.0.1"), - settings: config_models::InboundSettings { udp: true }, sniffing: Some(config_models::SniffingSettings { enabled: Some(true), routeOnly: Some(true), @@ -36,29 +45,23 @@ pub fn generate_socks_inbound(socks_port: u16) -> config_models::Inbound { }; } -#[cfg(test)] -mod test { - use super::*; - #[test] - fn test_generate_socks_inboud() { - let socks_inbound = generate_socks_inbound(2080); - assert_eq!(socks_inbound.protocol, String::from("socks")); - assert_eq!(socks_inbound.listen, String::from("127.0.0.1")); - assert_eq!(socks_inbound.tag, String::from("socks-in")); - assert_eq!(socks_inbound.port, 2080); - assert_eq!(socks_inbound.settings.udp, true); - - let sniffing_obj = socks_inbound.sniffing.unwrap(); - assert_eq!(sniffing_obj.enabled, Some(true)); - assert_eq!(sniffing_obj.routeOnly, Some(true)); - assert_eq!(sniffing_obj.domainsExcluded, None); - assert_eq!( - sniffing_obj.destOverride, - Some(vec![ +pub fn generate_socks_inbound(socks_port: u16) -> config_models::Inbound { + return config_models::Inbound { + protocol: String::from("socks"), + port: socks_port, + tag: String::from("socks-in"), + listen: String::from("127.0.0.1"), + settings: Some(config_models::InboundSettings { udp: true }), + sniffing: Some(config_models::SniffingSettings { + enabled: Some(true), + routeOnly: Some(true), + metadataOnly: Some(false), + domainsExcluded: None, + destOverride: Some(vec![ String::from("http"), String::from("tls"), String::from("quic"), - ]) - ); - } + ]), + }), + }; }