diff options
author | aviac <aviac@mailbox.org> | 2024-05-11 13:00:17 +0200 |
---|---|---|
committer | aviac <aviac@mailbox.org> | 2024-05-11 13:00:17 +0200 |
commit | a786cd85add0acb89c1f4b843f0af6b3f7ebc65a (patch) | |
tree | 3efff05e9ba3d3832884efe6d97d8f6a9749b4e9 /src | |
parent | test: add a small 🤏 cute 🥺 test to prove it works (diff) | |
download | forgejo-api-a786cd85add0acb89c1f4b843f0af6b3f7ebc65a.tar.xz forgejo-api-a786cd85add0acb89c1f4b843f0af6b3f7ebc65a.zip |
fix: implement review comment regarding non standard ssh port scenario
Diffstat (limited to 'src')
-rw-r--r-- | src/lib.rs | 21 |
1 files changed, 15 insertions, 6 deletions
@@ -262,8 +262,7 @@ where DE: serde::de::Error, { let raw_url: String = String::deserialize(deserializer).map_err(DE::custom)?; - let url = format!("ssh://{url}", url = raw_url.replace(":", "/")); - Url::parse(url.as_str()).map_err(DE::custom) + parse_ssh_url(&raw_url).map_err(DE::custom) } fn deserialize_optional_ssh_url<'de, D, DE>(deserializer: D) -> Result<Option<Url>, DE> @@ -273,13 +272,23 @@ where { let raw_url: Option<String> = Option::deserialize(deserializer).map_err(DE::custom)?; raw_url - .map(|raw_url| { - let url = format!("ssh://{url}", url = raw_url.replace(":", "/")); - Url::parse(url.as_str()).map_err(DE::custom).map(Some) - }) + .as_ref() + .map(parse_ssh_url) + .map(|res| res.map_err(DE::custom).map(Some)) .unwrap_or(Ok(None)) } +fn parse_ssh_url(raw_url: &String) -> Result<Url, url::ParseError> { + // in case of a non-standard ssh-port (not 22), the ssh url coming from the forgejo API + // is actually parseable by the url crate, so try to do that first + Url::parse(raw_url).or_else(|_| { + // otherwise the ssh url is not parseable by the url crate and we try again after some + // pre-processing + let url = format!("ssh://{url}", url = raw_url.replace(":", "/")); + Url::parse(url.as_str()) + }) +} + impl From<structs::DefaultMergeStyle> for structs::MergePullRequestOptionDo { fn from(value: structs::DefaultMergeStyle) -> Self { match value { |