From 76b489c2e80d2f51a9c9b551e1310ac8fa26e1e7 Mon Sep 17 00:00:00 2001 From: Jake Fullerton Date: Mon, 29 Jan 2024 15:31:11 -0800 Subject: [PATCH 01/12] add endpoint query param --- rs/src/management/http_client.rs | 5 +++++ rs/src/management/tunnel_request_options.rs | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/rs/src/management/http_client.rs b/rs/src/management/http_client.rs index 216432b3..942150c7 100644 --- a/rs/src/management/http_client.rs +++ b/rs/src/management/http_client.rs @@ -187,6 +187,7 @@ impl TunnelManagementClient { ENDPOINTS_API_SUB_PATH, endpoint.base.id )), ); + options.connection_mode = endpoint.base.connection_mode; let mut request = self.make_tunnel_request(Method::PUT, url, options).await?; json_body(&mut request, endpoint); self.execute_json("update_tunnel_relay_endpoints", request) @@ -651,6 +652,10 @@ fn add_query(url: &mut Url, tunnel_opts: &TunnelRequestOptions, api_version: &st url.query_pairs_mut().append_pair("allLabels", "true"); } } + if tunnel_opts.connection_mode.is_empty() { + url.query_pairs_mut() + .append_pair("connectionMode", &tunnel_opts.connection_mode); + } url.query_pairs_mut() .append_pair("api-version", api_version); if tunnel_opts.limit > 0 { diff --git a/rs/src/management/tunnel_request_options.rs b/rs/src/management/tunnel_request_options.rs index dfc346f0..3d5d3079 100644 --- a/rs/src/management/tunnel_request_options.rs +++ b/rs/src/management/tunnel_request_options.rs @@ -1,5 +1,7 @@ use reqwest::header::{HeaderName, HeaderValue}; +use crate::contracts::TunnelConnectionMode; + use super::Authorization; #[derive(Default, Clone)] @@ -50,6 +52,9 @@ pub struct TunnelRequestOptions { /// Limits the number of tunnels returned when searching or listing tunnels. pub limit: u32, + + /// Gets or sets the connection mode of the endpoint. + pub connection_mode: TunnelConnectionMode, } pub const NO_REQUEST_OPTIONS: &TunnelRequestOptions = &TunnelRequestOptions { From dc72adce3973202707ff1ba1e5bc1b4e6191d9c5 Mon Sep 17 00:00:00 2001 From: Jake Fullerton Date: Mon, 29 Jan 2024 15:35:06 -0800 Subject: [PATCH 02/12] Revert "add endpoint query param" This reverts commit 76b489c2e80d2f51a9c9b551e1310ac8fa26e1e7. --- rs/src/management/http_client.rs | 5 ----- rs/src/management/tunnel_request_options.rs | 5 ----- 2 files changed, 10 deletions(-) diff --git a/rs/src/management/http_client.rs b/rs/src/management/http_client.rs index 942150c7..216432b3 100644 --- a/rs/src/management/http_client.rs +++ b/rs/src/management/http_client.rs @@ -187,7 +187,6 @@ impl TunnelManagementClient { ENDPOINTS_API_SUB_PATH, endpoint.base.id )), ); - options.connection_mode = endpoint.base.connection_mode; let mut request = self.make_tunnel_request(Method::PUT, url, options).await?; json_body(&mut request, endpoint); self.execute_json("update_tunnel_relay_endpoints", request) @@ -652,10 +651,6 @@ fn add_query(url: &mut Url, tunnel_opts: &TunnelRequestOptions, api_version: &st url.query_pairs_mut().append_pair("allLabels", "true"); } } - if tunnel_opts.connection_mode.is_empty() { - url.query_pairs_mut() - .append_pair("connectionMode", &tunnel_opts.connection_mode); - } url.query_pairs_mut() .append_pair("api-version", api_version); if tunnel_opts.limit > 0 { diff --git a/rs/src/management/tunnel_request_options.rs b/rs/src/management/tunnel_request_options.rs index 3d5d3079..dfc346f0 100644 --- a/rs/src/management/tunnel_request_options.rs +++ b/rs/src/management/tunnel_request_options.rs @@ -1,7 +1,5 @@ use reqwest::header::{HeaderName, HeaderValue}; -use crate::contracts::TunnelConnectionMode; - use super::Authorization; #[derive(Default, Clone)] @@ -52,9 +50,6 @@ pub struct TunnelRequestOptions { /// Limits the number of tunnels returned when searching or listing tunnels. pub limit: u32, - - /// Gets or sets the connection mode of the endpoint. - pub connection_mode: TunnelConnectionMode, } pub const NO_REQUEST_OPTIONS: &TunnelRequestOptions = &TunnelRequestOptions { From c07e53165ffd5633c51876430c380bc207ba9589 Mon Sep 17 00:00:00 2001 From: Jake Fullerton Date: Mon, 29 Jan 2024 15:36:26 -0800 Subject: [PATCH 03/12] use tostring --- rs/src/management/http_client.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/rs/src/management/http_client.rs b/rs/src/management/http_client.rs index 216432b3..033b2a1d 100644 --- a/rs/src/management/http_client.rs +++ b/rs/src/management/http_client.rs @@ -187,6 +187,7 @@ impl TunnelManagementClient { ENDPOINTS_API_SUB_PATH, endpoint.base.id )), ); + url.query_pairs_mut().append_pair("connectionMode", &endpoint.base.connection_mode.to_string()); let mut request = self.make_tunnel_request(Method::PUT, url, options).await?; json_body(&mut request, endpoint); self.execute_json("update_tunnel_relay_endpoints", request) From 76d1ffa73fca440091ff6aa9847ef8b91373e5b5 Mon Sep 17 00:00:00 2001 From: Jake Fullerton Date: Mon, 29 Jan 2024 15:38:05 -0800 Subject: [PATCH 04/12] update types --- rs/src/management/http_client.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rs/src/management/http_client.rs b/rs/src/management/http_client.rs index 033b2a1d..fc79d149 100644 --- a/rs/src/management/http_client.rs +++ b/rs/src/management/http_client.rs @@ -180,7 +180,7 @@ impl TunnelManagementClient { endpoint: &TunnelRelayTunnelEndpoint, options: &TunnelRequestOptions, ) -> HttpResult { - let url = self.build_tunnel_uri( + let mut url = self.build_tunnel_uri( locator, Some(&format!( "{}/{}", From d37deb6346ce9c97765b3c58e8aeeeff3ac03f56 Mon Sep 17 00:00:00 2001 From: Jake Fullerton Date: Mon, 29 Jan 2024 15:52:28 -0800 Subject: [PATCH 05/12] fix delete --- rs/src/connections/relay_tunnel_host.rs | 4 ++-- rs/src/management/http_client.rs | 13 +++++-------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/rs/src/connections/relay_tunnel_host.rs b/rs/src/connections/relay_tunnel_host.rs index 9c573251..326e1afa 100644 --- a/rs/src/connections/relay_tunnel_host.rs +++ b/rs/src/connections/relay_tunnel_host.rs @@ -239,7 +239,7 @@ impl RelayTunnelHost { self.mgmt .delete_tunnel_endpoints( &self.locator, - &self.host_id.to_string(), + Some(format!("{}-{}", &self.host_id.to_string(), "relay")), None, NO_REQUEST_OPTIONS, ) @@ -390,7 +390,7 @@ impl RelayTunnelHost { &self.locator, &TunnelRelayTunnelEndpoint { base: TunnelEndpoint { - id: Some(uuid::Uuid::new_v4().to_string()), + id: format!("{}-{}",self.host_id.to_string(), relay), connection_mode: TunnelConnectionMode::TunnelRelay, host_id: self.host_id.to_string(), host_public_keys: vec![], diff --git a/rs/src/management/http_client.rs b/rs/src/management/http_client.rs index fc79d149..c611ad2d 100644 --- a/rs/src/management/http_client.rs +++ b/rs/src/management/http_client.rs @@ -164,10 +164,11 @@ impl TunnelManagementClient { let url = self.build_tunnel_uri( locator, Some(&format!( - "{}/{}/{}", - ENDPOINTS_API_SUB_PATH, endpoint.host_id, endpoint.connection_mode + "{}/{}", + ENDPOINTS_API_SUB_PATH, endpoint.base.id )), ); + url.query_pairs_mut().append_pair("connectionMode", &endpoint.base.connection_mode.to_string()); let mut request = self.make_tunnel_request(Method::PUT, url, options).await?; json_body(&mut request, endpoint); self.execute_json("update_tunnel_endpoints", request).await @@ -198,15 +199,11 @@ impl TunnelManagementClient { pub async fn delete_tunnel_endpoints( &self, locator: &TunnelLocator, - host_id: &str, + id: &str, connection_mode: Option, options: &TunnelRequestOptions, ) -> HttpResult { - let path = if let Some(cm) = connection_mode { - format!("{}/{}/{}", ENDPOINTS_API_SUB_PATH, host_id, cm) - } else { - format!("{}/{}", ENDPOINTS_API_SUB_PATH, host_id) - }; + let path = format!("{}/{}", ENDPOINTS_API_SUB_PATH, id); let url = self.build_tunnel_uri(locator, Some(&path)); let request = self From 9f6044bb9bcdcf57f7b838aba9a3128118ba1003 Mon Sep 17 00:00:00 2001 From: Jake Fullerton Date: Mon, 29 Jan 2024 15:55:18 -0800 Subject: [PATCH 06/12] fix build --- rs/src/connections/relay_tunnel_host.rs | 1 - rs/src/management/http_client.rs | 5 ++--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/rs/src/connections/relay_tunnel_host.rs b/rs/src/connections/relay_tunnel_host.rs index 326e1afa..15689bad 100644 --- a/rs/src/connections/relay_tunnel_host.rs +++ b/rs/src/connections/relay_tunnel_host.rs @@ -240,7 +240,6 @@ impl RelayTunnelHost { .delete_tunnel_endpoints( &self.locator, Some(format!("{}-{}", &self.host_id.to_string(), "relay")), - None, NO_REQUEST_OPTIONS, ) .await diff --git a/rs/src/management/http_client.rs b/rs/src/management/http_client.rs index c611ad2d..6c9897ee 100644 --- a/rs/src/management/http_client.rs +++ b/rs/src/management/http_client.rs @@ -165,10 +165,10 @@ impl TunnelManagementClient { locator, Some(&format!( "{}/{}", - ENDPOINTS_API_SUB_PATH, endpoint.base.id + ENDPOINTS_API_SUB_PATH, endpoint.id )), ); - url.query_pairs_mut().append_pair("connectionMode", &endpoint.base.connection_mode.to_string()); + url.query_pairs_mut().append_pair("connectionMode", &endpoint.connection_mode.to_string()); let mut request = self.make_tunnel_request(Method::PUT, url, options).await?; json_body(&mut request, endpoint); self.execute_json("update_tunnel_endpoints", request).await @@ -200,7 +200,6 @@ impl TunnelManagementClient { &self, locator: &TunnelLocator, id: &str, - connection_mode: Option, options: &TunnelRequestOptions, ) -> HttpResult { let path = format!("{}/{}", ENDPOINTS_API_SUB_PATH, id); From 12f2e7e3cb1255416bab7ab403ae37b0de68563a Mon Sep 17 00:00:00 2001 From: Jake Fullerton Date: Mon, 29 Jan 2024 15:56:30 -0800 Subject: [PATCH 07/12] update port request --- rs/src/management/http_client.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rs/src/management/http_client.rs b/rs/src/management/http_client.rs index 6c9897ee..b985f086 100644 --- a/rs/src/management/http_client.rs +++ b/rs/src/management/http_client.rs @@ -247,7 +247,10 @@ impl TunnelManagementClient { port: &TunnelPort, options: &TunnelRequestOptions, ) -> HttpResult { - let url = self.build_tunnel_uri(locator, Some(PORTS_API_SUB_PATH)); + let url = self.build_tunnel_uri( + locator, + Some(&format!("{}/{}", PORTS_API_SUB_PATH, port_number)), + ); let mut request = self.make_tunnel_request(Method::PUT, url, options).await?; json_body(&mut request, port); self.execute_json("create_tunnel_port", request).await From ad87ed7622c46a11006b87339e06dc45c71e8cfb Mon Sep 17 00:00:00 2001 From: Jake Fullerton Date: Mon, 29 Jan 2024 15:56:50 -0800 Subject: [PATCH 08/12] fix syntax --- rs/src/management/http_client.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rs/src/management/http_client.rs b/rs/src/management/http_client.rs index b985f086..3aeb39fe 100644 --- a/rs/src/management/http_client.rs +++ b/rs/src/management/http_client.rs @@ -249,7 +249,7 @@ impl TunnelManagementClient { ) -> HttpResult { let url = self.build_tunnel_uri( locator, - Some(&format!("{}/{}", PORTS_API_SUB_PATH, port_number)), + Some(&format!("{}/{}", PORTS_API_SUB_PATH, port.port_number)), ); let mut request = self.make_tunnel_request(Method::PUT, url, options).await?; json_body(&mut request, port); From 8c8e483b96683b672a71567914566da59ba303eb Mon Sep 17 00:00:00 2001 From: Jake Fullerton Date: Mon, 29 Jan 2024 15:58:27 -0800 Subject: [PATCH 09/12] fix build again --- rs/src/management/http_client.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rs/src/management/http_client.rs b/rs/src/management/http_client.rs index 3aeb39fe..c2ef0461 100644 --- a/rs/src/management/http_client.rs +++ b/rs/src/management/http_client.rs @@ -14,7 +14,7 @@ use url::Url; use rand::Rng; use crate::contracts::{ - env_production, NamedRateStatus, Tunnel, TunnelConnectionMode, TunnelEndpoint, + env_production, NamedRateStatus, Tunnel, TunnelEndpoint, TunnelListByRegionResponse, TunnelPort, TunnelPortListResponse, TunnelRelayTunnelEndpoint, TunnelServiceProperties, }; @@ -161,7 +161,7 @@ impl TunnelManagementClient { endpoint: &TunnelEndpoint, options: &TunnelRequestOptions, ) -> HttpResult { - let url = self.build_tunnel_uri( + let mut url = self.build_tunnel_uri( locator, Some(&format!( "{}/{}", From 884c6e28a5ad9345649a038dd4c14eb16f4a52be Mon Sep 17 00:00:00 2001 From: Jake Fullerton Date: Mon, 29 Jan 2024 16:18:46 -0800 Subject: [PATCH 10/12] fix build --- rs/src/connections/relay_tunnel_host.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rs/src/connections/relay_tunnel_host.rs b/rs/src/connections/relay_tunnel_host.rs index 15689bad..10025a52 100644 --- a/rs/src/connections/relay_tunnel_host.rs +++ b/rs/src/connections/relay_tunnel_host.rs @@ -239,7 +239,7 @@ impl RelayTunnelHost { self.mgmt .delete_tunnel_endpoints( &self.locator, - Some(format!("{}-{}", &self.host_id.to_string(), "relay")), + Some(format!("{}-relay", &self.host_id.to_string())), NO_REQUEST_OPTIONS, ) .await @@ -389,7 +389,7 @@ impl RelayTunnelHost { &self.locator, &TunnelRelayTunnelEndpoint { base: TunnelEndpoint { - id: format!("{}-{}",self.host_id.to_string(), relay), + id: format!("{}-relay",self.host_id.to_string()), connection_mode: TunnelConnectionMode::TunnelRelay, host_id: self.host_id.to_string(), host_public_keys: vec![], From 3be5c7172b7a8db9f556445343638dec8fb24c44 Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Mon, 29 Jan 2024 16:23:57 -0800 Subject: [PATCH 11/12] compilation error, build connections in ci --- .github/workflows/rust.yml | 6 +++--- rs/src/connections/relay_tunnel_host.rs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index b598ec76..671db906 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -17,7 +17,7 @@ jobs: steps: - uses: actions/checkout@v3 - name: Build - run: cargo build --verbose --manifest-path=rs/Cargo.toml + run: cargo build --features connections --verbose --manifest-path=rs/Cargo.toml - name: Run tests - run: cargo test --verbose --manifest-path=rs/Cargo.toml - + run: cargo test --features connections --verbose --manifest-path=rs/Cargo.toml + diff --git a/rs/src/connections/relay_tunnel_host.rs b/rs/src/connections/relay_tunnel_host.rs index 10025a52..251881a9 100644 --- a/rs/src/connections/relay_tunnel_host.rs +++ b/rs/src/connections/relay_tunnel_host.rs @@ -239,7 +239,7 @@ impl RelayTunnelHost { self.mgmt .delete_tunnel_endpoints( &self.locator, - Some(format!("{}-relay", &self.host_id.to_string())), + &format!("{}-relay", &self.host_id.to_string()), NO_REQUEST_OPTIONS, ) .await From a064151288dde428f67fcc4e12766b226315ff1a Mon Sep 17 00:00:00 2001 From: Connor Peet Date: Mon, 29 Jan 2024 16:26:55 -0800 Subject: [PATCH 12/12] run clippy and cargo fmt --- rs/src/connections/relay_tunnel_host.rs | 4 ++-- rs/src/connections/ws.rs | 3 +-- rs/src/contracts/tunnel.rs | 2 +- .../contracts/tunnel_access_control_entry.rs | 2 +- rs/src/contracts/tunnel_constraints.rs | 2 +- rs/src/contracts/tunnel_port.rs | 2 +- rs/src/management/http_client.rs | 21 +++++++------------ 7 files changed, 15 insertions(+), 21 deletions(-) diff --git a/rs/src/connections/relay_tunnel_host.rs b/rs/src/connections/relay_tunnel_host.rs index 251881a9..e52e27fe 100644 --- a/rs/src/connections/relay_tunnel_host.rs +++ b/rs/src/connections/relay_tunnel_host.rs @@ -325,7 +325,7 @@ impl RelayTunnelHost { connection_timeout: None, auth_rejection_time: std::time::Duration::from_secs(5), keys: vec![keypair], - window_size: 1024 * 1024 * 1, + window_size: 1024 * 1024, preferred: russh::Preferred::COMPRESSED, limits: russh::Limits { rekey_read_limit: usize::MAX, @@ -389,7 +389,7 @@ impl RelayTunnelHost { &self.locator, &TunnelRelayTunnelEndpoint { base: TunnelEndpoint { - id: format!("{}-relay",self.host_id.to_string()), + id: format!("{}-relay", self.host_id), connection_mode: TunnelConnectionMode::TunnelRelay, host_id: self.host_id.to_string(), host_public_keys: vec![], diff --git a/rs/src/connections/ws.rs b/rs/src/connections/ws.rs index 380969b3..12460197 100644 --- a/rs/src/connections/ws.rs +++ b/rs/src/connections/ws.rs @@ -368,8 +368,7 @@ mod test { } }); - let mut output = Vec::new(); - output.resize(input_len, 0); + let mut output = vec![0; input_len]; read.read_exact(&mut output) .await .expect("expected to read"); diff --git a/rs/src/contracts/tunnel.rs b/rs/src/contracts/tunnel.rs index 16a78133..3e71632f 100644 --- a/rs/src/contracts/tunnel.rs +++ b/rs/src/contracts/tunnel.rs @@ -2,12 +2,12 @@ // Licensed under the MIT license. // Generated from ../../../cs/src/Contracts/Tunnel.cs -use chrono::{DateTime, Utc}; use crate::contracts::TunnelAccessControl; use crate::contracts::TunnelEndpoint; use crate::contracts::TunnelOptions; use crate::contracts::TunnelPort; use crate::contracts::TunnelStatus; +use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; diff --git a/rs/src/contracts/tunnel_access_control_entry.rs b/rs/src/contracts/tunnel_access_control_entry.rs index b36863a9..fa7f985a 100644 --- a/rs/src/contracts/tunnel_access_control_entry.rs +++ b/rs/src/contracts/tunnel_access_control_entry.rs @@ -2,8 +2,8 @@ // Licensed under the MIT license. // Generated from ../../../cs/src/Contracts/TunnelAccessControlEntry.cs -use chrono::{DateTime, Utc}; use crate::contracts::TunnelAccessControlEntryType; +use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; // Data contract for an access control entry on a `Tunnel` or `TunnelPort`. diff --git a/rs/src/contracts/tunnel_constraints.rs b/rs/src/contracts/tunnel_constraints.rs index fd4eb0e5..142bc27f 100644 --- a/rs/src/contracts/tunnel_constraints.rs +++ b/rs/src/contracts/tunnel_constraints.rs @@ -110,7 +110,7 @@ pub const TUNNEL_ALIAS_PATTERN: &str = r#"[0123456789bcdfghjklmnpqrstvwxz]{3,60} pub const TUNNEL_NAME_PATTERN: &str = r#"([a-z0-9][a-z0-9-]{1,58}[a-z0-9])|(^$)"#; // Regular expression that can match or validate tunnel or port labels. -pub const LABEL_PATTERN: &str = r#"[\w-=]{1,50}"#; +pub const LABEL_PATTERN: &str = r"[\w-=]{1,50}"; // Regular expression that can match or validate tunnel domains. // diff --git a/rs/src/contracts/tunnel_port.rs b/rs/src/contracts/tunnel_port.rs index 1fd3e41a..89611508 100644 --- a/rs/src/contracts/tunnel_port.rs +++ b/rs/src/contracts/tunnel_port.rs @@ -43,7 +43,7 @@ pub struct TunnelPort { // A client that connects to a tunnel (by ID or name) without specifying a port number // will connect to the default port for the tunnel, if a default is configured. Or if // the tunnel has only one port then the single port is the implicit default. - // + // // Selection of a default port for a connection also depends on matching the // connection to the port `TunnelPort.Protocol`, so it is possible to configure // separate defaults for distinct protocols like `TunnelProtocol.Http` and diff --git a/rs/src/management/http_client.rs b/rs/src/management/http_client.rs index c2ef0461..0ad685c9 100644 --- a/rs/src/management/http_client.rs +++ b/rs/src/management/http_client.rs @@ -14,9 +14,8 @@ use url::Url; use rand::Rng; use crate::contracts::{ - env_production, NamedRateStatus, Tunnel, TunnelEndpoint, - TunnelListByRegionResponse, TunnelPort, TunnelPortListResponse, TunnelRelayTunnelEndpoint, - TunnelServiceProperties, + env_production, NamedRateStatus, Tunnel, TunnelEndpoint, TunnelListByRegionResponse, + TunnelPort, TunnelPortListResponse, TunnelRelayTunnelEndpoint, TunnelServiceProperties, }; use super::{ @@ -163,12 +162,10 @@ impl TunnelManagementClient { ) -> HttpResult { let mut url = self.build_tunnel_uri( locator, - Some(&format!( - "{}/{}", - ENDPOINTS_API_SUB_PATH, endpoint.id - )), + Some(&format!("{}/{}", ENDPOINTS_API_SUB_PATH, endpoint.id)), ); - url.query_pairs_mut().append_pair("connectionMode", &endpoint.connection_mode.to_string()); + url.query_pairs_mut() + .append_pair("connectionMode", &endpoint.connection_mode.to_string()); let mut request = self.make_tunnel_request(Method::PUT, url, options).await?; json_body(&mut request, endpoint); self.execute_json("update_tunnel_endpoints", request).await @@ -183,12 +180,10 @@ impl TunnelManagementClient { ) -> HttpResult { let mut url = self.build_tunnel_uri( locator, - Some(&format!( - "{}/{}", - ENDPOINTS_API_SUB_PATH, endpoint.base.id - )), + Some(&format!("{}/{}", ENDPOINTS_API_SUB_PATH, endpoint.base.id)), ); - url.query_pairs_mut().append_pair("connectionMode", &endpoint.base.connection_mode.to_string()); + url.query_pairs_mut() + .append_pair("connectionMode", &endpoint.base.connection_mode.to_string()); let mut request = self.make_tunnel_request(Method::PUT, url, options).await?; json_body(&mut request, endpoint); self.execute_json("update_tunnel_relay_endpoints", request)