diff --git a/crates/meilisearch/src/routes/network.rs b/crates/meilisearch/src/routes/network.rs index 458ae8cbf..7e58df113 100644 --- a/crates/meilisearch/src/routes/network.rs +++ b/crates/meilisearch/src/routes/network.rs @@ -119,10 +119,22 @@ pub struct Network { impl Remote { pub fn try_into_db_node(self, name: &str) -> Result { Ok(DbRemote { - url: self.url.set().ok_or(ResponseError::from_msg( - format!("Missing field `.remotes.{name}.url`"), - meilisearch_types::error::Code::MissingNetworkUrl, - ))?, + url: self + .url + .set() + .ok_or(ResponseError::from_msg( + format!("Missing field `.remotes.{name}.url`"), + meilisearch_types::error::Code::MissingNetworkUrl, + )) + .and_then(|url| { + if let Err(error) = url::Url::parse(&url) { + return Err(ResponseError::from_msg( + format!("Invalid `.remotes.{name}.url` (`{url}`): {error}"), + meilisearch_types::error::Code::InvalidNetworkUrl, + )); + } + Ok(url) + })?, search_api_key: self.search_api_key.set(), }) } @@ -211,7 +223,15 @@ async fn patch_network( let merged = DbRemote { url: match new_url { - Setting::Set(new_url) => new_url, + Setting::Set(new_url) => { + if let Err(error) = url::Url::parse(&new_url) { + return Err(ResponseError::from_msg( + format!("Invalid `.remotes.{key}.url` (`{new_url}`): {error}"), + meilisearch_types::error::Code::InvalidNetworkUrl, + )); + } + new_url + } Setting::Reset => { return Err(ResponseError::from_msg( format!( diff --git a/crates/meilisearch/tests/network/mod.rs b/crates/meilisearch/tests/network/mod.rs index 1c3661a06..60f73ed40 100644 --- a/crates/meilisearch/tests/network/mod.rs +++ b/crates/meilisearch/tests/network/mod.rs @@ -117,6 +117,25 @@ async fn errors_on_param() { } "###); + // remote with url not valid + let (response, code) = server + .set_network(json!({"remotes": { + "new": { + "url": "no-http-scheme" + } + }})) + .await; + + meili_snap::snapshot!(code, @"400 Bad Request"); + meili_snap::snapshot!(meili_snap::json_string!(response), @r###" + { + "message": "Invalid `.remotes.new.url` (`no-http-scheme`): relative URL without a base", + "code": "invalid_network_url", + "type": "invalid_request", + "link": "https://docs.meilisearch.com/errors#invalid_network_url" + } + "###); + // remote with non-existing param let (response, code) = server .set_network(json!({"remotes": {