diff --git a/Cargo.lock b/Cargo.lock index c3fede4..d708597 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -805,6 +805,7 @@ dependencies = [ "tonic", "tonic-build", "tower 0.5.1", + "url-builder", "uuid", "vmm", ] @@ -3566,6 +3567,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "url-builder" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c560d19163937c53680c515b82a9311c5a796691c67890b8ad579423123e194" + [[package]] name = "utf16_iter" version = "1.0.5" diff --git a/Cargo.toml b/Cargo.toml index f9229ff..9dff270 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -55,6 +55,7 @@ libc = "0.2" pelite = "0.10" regex = "1.10" structopt = "0.3.26" +url-builder = "0.1.1" [build-dependencies] tonic-build = "0.12.3" diff --git a/src/bin/feos_cli/client.rs b/src/bin/feos_cli/client.rs index cec4031..bc542ce 100644 --- a/src/bin/feos_cli/client.rs +++ b/src/bin/feos_cli/client.rs @@ -19,7 +19,7 @@ pub mod feos_grpc { #[structopt(name = "feos-cli")] pub struct Opt { #[structopt(short, long, default_value = "::1")] - pub server_ip: String, + pub server: String, #[structopt(short, long, default_value = "1337")] pub port: u16, #[structopt(subcommand)] @@ -67,18 +67,12 @@ pub enum Command { IsolatedContainer(IsolatedContainerCommand), } -fn format_address(ip: &str, port: u16) -> String { - if ip.contains(':') { - // IPv6 address - format!("http://[{}]:{}", ip, port) - } else { - // IPv4 address - format!("http://{}:{}", ip, port) - } -} - pub async fn run_client(opt: Opt) -> Result<(), Box> { - let address = format_address(&opt.server_ip, opt.port); + let mut ub = URLBuilder::new(); + ub.set_protocol("http") + .set_host(server.as_str()) + .set_port(port); + let address = ub.build(); let endpoint = Endpoint::from_shared(address)? .keep_alive_while_idle(true) .keep_alive_timeout(Duration::from_secs(20)); @@ -88,12 +82,12 @@ pub async fn run_client(opt: Opt) -> Result<(), Box> { match opt.cmd { Command::Container(container_cmd) => { - crate::client_container::run_container_client(opt.server_ip, opt.port, container_cmd) + crate::client_container::run_container_client(opt.server, opt.port, container_cmd) .await?; } Command::IsolatedContainer(container_cmd) => { crate::client_isolated_container::run_isolated_container_client( - opt.server_ip, + opt.server, opt.port, container_cmd, ) diff --git a/src/bin/feos_cli/client_container.rs b/src/bin/feos_cli/client_container.rs index 970667f..49f21ae 100644 --- a/src/bin/feos_cli/client_container.rs +++ b/src/bin/feos_cli/client_container.rs @@ -6,6 +6,7 @@ use tonic::Request; use container_grpc::container_service_client::ContainerServiceClient; use container_grpc::*; +use url_builder::URLBuilder; pub mod container_grpc { tonic::include_proto!("container"); @@ -33,11 +34,15 @@ pub enum ContainerCommand { } pub async fn run_container_client( - server_ip: String, + server: String, port: u16, cmd: ContainerCommand, ) -> Result<(), Box> { - let address = format!("http://{}:{}", server_ip, port); + let mut ub = URLBuilder::new(); + ub.set_protocol("http") + .set_host(server.as_str()) + .set_port(port); + let address = ub.build(); let channel = Endpoint::from_shared(address)?.connect().await?; let mut client = ContainerServiceClient::new(channel); diff --git a/src/bin/feos_cli/client_isolated_container.rs b/src/bin/feos_cli/client_isolated_container.rs index 5801b98..42ce5a2 100644 --- a/src/bin/feos_cli/client_isolated_container.rs +++ b/src/bin/feos_cli/client_isolated_container.rs @@ -6,6 +6,7 @@ use tonic::Request; use isolated_container_grpc::isolated_container_service_client::IsolatedContainerServiceClient; use isolated_container_grpc::*; +use url_builder::URLBuilder; pub mod isolated_container_grpc { tonic::include_proto!("isolated_container"); @@ -30,11 +31,15 @@ pub enum IsolatedContainerCommand { } pub async fn run_isolated_container_client( - server_ip: String, + server: String, port: u16, cmd: IsolatedContainerCommand, ) -> Result<(), Box> { - let address = format!("http://{}:{}", server_ip, port); + let mut ub = URLBuilder::new(); + ub.set_protocol("http") + .set_host(server.as_str()) + .set_port(port); + let address = ub.build(); let channel = Endpoint::from_shared(address)?.connect().await?; let mut client = IsolatedContainerServiceClient::new(channel);