diff --git a/Cargo.lock b/Cargo.lock index 7787248..1ffd999 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1271,6 +1271,7 @@ dependencies = [ "serde_derive", "serde_json", "tracing", + "url", ] [[package]] diff --git a/enostr/Cargo.toml b/enostr/Cargo.toml index 4b74228..2af528a 100644 --- a/enostr/Cargo.toml +++ b/enostr/Cargo.toml @@ -15,3 +15,4 @@ nostrdb = { git = "https://github.com/damus-io/nostrdb-rs", rev = "9bbafd8a2e904 hex = "0.4.3" tracing = "0.1.40" env_logger = "0.11.1" +url = "2.5.2" diff --git a/enostr/src/relay/pool.rs b/enostr/src/relay/pool.rs index 30963c9..de4e1ef 100644 --- a/enostr/src/relay/pool.rs +++ b/enostr/src/relay/pool.rs @@ -4,6 +4,8 @@ use nostrdb::Filter; use std::time::{Duration, Instant}; +use url::Url; + #[cfg(not(target_arch = "wasm32"))] use ewebsock::{WsEvent, WsMessage}; @@ -152,6 +154,7 @@ impl RelayPool { url: String, wakeup: impl Fn() + Send + Sync + Clone + 'static, ) -> Result<()> { + let url = Self::canonicalize_url(url); // Check if the URL already exists in the pool. if self.has(&url) { return Ok(()); @@ -164,6 +167,14 @@ impl RelayPool { Ok(()) } + // standardize the format (ie, trailing slashes) + fn canonicalize_url(url: String) -> String { + match Url::parse(&url) { + Ok(parsed_url) => parsed_url.to_string(), + Err(_) => url, // If parsing fails, return the original URL. + } + } + /// Attempts to receive a pool event from a list of relays. The /// function searches each relay in the list in order, attempting to /// receive a message from each. If a message is received, return it.