1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
use std::collections::HashMap; use http::uri::Authority; use hyper::Uri; pub const DEFAULT_PORTAL_URL: &str = "https://siasky.net"; pub const URI_SKYNET_PREFIX: &str = "sia://"; pub fn make_uri( portal_url: &str, path: String, api_key: Option<String>, extra_path: Option<String>, query: HashMap<String, String>, ) -> Uri { let parts: Vec<&str> = portal_url.split("://").collect(); let scheme = parts[0]; let host = parts[1]; let authority: Authority = if let Some(api_key) = api_key { format!("{}@{}", api_key, host).parse().unwrap() } else { host.parse().unwrap() }; let extra_path = if let Some(extra_path) = extra_path { format!("/{}", extra_path) } else { "".to_string() }; let query = if query.is_empty() { "".to_string() } else { let query = query .iter() .map(|(k, v)| format!("{}={}", k, v)) .collect::<Vec<String>>() .join("&"); format!("?{}", query) }; let path_and_query = format!("{}{}{}", path, extra_path, query); Uri::builder() .scheme(scheme) .authority(authority) .path_and_query(path_and_query) .build() .unwrap() }