naia_socket_shared/
url_parse.rs

1use std::net::SocketAddr;
2
3use url::Url;
4
5pub fn parse_server_url(server_url_str: &str) -> Url {
6    let url = Url::parse(server_url_str).expect("server_url_str is not a valid URL!");
7    if let Some(path_segments) = url.path_segments() {
8        let path_segment_count = path_segments.count();
9        if path_segment_count > 1 {
10            log::error!("server_url_str must not include a path");
11            panic!("");
12        }
13    }
14    if url.query().is_some() {
15        log::error!("server_url_str must not include a query string");
16        panic!("");
17    }
18    if url.fragment().is_some() {
19        log::error!("server_url_str must not include a fragment");
20        panic!("");
21    }
22
23    url
24}
25
26cfg_if! {
27    if #[cfg(not(target_arch = "wasm32"))]
28    {
29        pub fn url_to_socket_addr(url: &Url) -> SocketAddr {
30            const SOCKET_PARSE_FAIL_STR: &str = "could not get SocketAddr from input URL";
31
32            match url.socket_addrs(|| match url.scheme() {
33                "http" => Some(80),
34                "https" => Some(443),
35                _ => None,
36            }) {
37                Ok(addr_list) => {
38                    if addr_list.is_empty() {
39                        log::error!("{}", SOCKET_PARSE_FAIL_STR);
40                        panic!("");
41                    }
42
43                    return *addr_list.first().expect(SOCKET_PARSE_FAIL_STR);
44                }
45                Err(err) => {
46                    log::error!("URL -> SocketAddr parse fails with: {:?}", err);
47                    panic!("");
48                }
49            }
50        }
51    } else {
52        pub fn url_to_socket_addr(_url: &Url) -> SocketAddr {
53            panic!("should not need this method for Wasm apps");
54        }
55    }
56}