如何从URL匹配IP主机?

如何从URL匹配IP主机?,url,rust,Url,Rust,我正在尝试从以下URL获取IPv4: use url::{Url, Host}; use std::net::{SocketAddr, IpAddr}; fn main () { let url = Url::parse("rtsp://admin:12345@192.168.1.178:10554/tcp/av0_0").unwrap(); let port = url.port().unwrap_or(554); let ip_address =

我正在尝试从以下URL获取IPv4:

use url::{Url, Host};
use std::net::{SocketAddr, IpAddr};

fn main () {
    let url = Url::parse("rtsp://admin:12345@192.168.1.178:10554/tcp/av0_0").unwrap();
    let port = url.port().unwrap_or(554);
    let ip_address = match url.host() {
        Some(Host::Ipv4(ipv4)) => SocketAddr::new(IpAddr::V4(ipv4), port),
        Some(Host::Ipv6(ipv6)) =>  SocketAddr::new(IpAddr::V6(ipv6), port),
        None => panic!("missing host"),
        _ => panic!(format!("only IP hosts are accepted. Your host: {:?}", url.host()))
    };
    println!("{}", ip_address);
}

但它感到恐慌:

thread 'main' panicked at 'only IP hosts are accepted. Your host: Some(Domain("192.168.1.178"))', src/main.rs:11:14

怎么了?主机显然是一个ip地址。

我在bug追踪器中找到了一个

答案显然是
url
遵循/实施了url标准(这是在伺服环境中开发的,很有意义),而url标准只需要对选定数量的方案进行IPv4地址识别,因为这些方案(显然)专门处理IPv4地址:

具体来说:是ftp、http、https、ws、wss(也有
文件
,但它是自己的类别),它们之间的区别在于:

  • 特殊方案的主机可以是ipv4、ipv6或域
  • 非特殊方案的主机可以是ipv6、不透明、空或空
url
实际上将解析非特殊方案的ipv6,尽管它只是将其他所有内容转储到
一些(域(…)
(或

无论如何,这意味着如果您得到一个
结果,您可能想尝试将其解析为IP


顺便说一下,您不必
格式化要格式化您的紧急消息,
紧急
将在内部执行此操作。

查看bug追踪器,我发现

答案显然是
url
遵循/实施了url标准(这是在伺服环境中开发的,很有意义),而url标准只需要对选定数量的方案进行IPv4地址识别,因为这些方案(显然)专门处理IPv4地址:

具体来说:是ftp、http、https、ws、wss(也有
文件
,但它是自己的类别),它们之间的区别在于:

  • 特殊方案的主机可以是ipv4、ipv6或域
  • 非特殊方案的主机可以是ipv6、不透明、空或空
url
实际上将解析非特殊方案的ipv6,尽管它只是将其他所有内容转储到
一些(域(…)
(或

无论如何,这意味着如果您得到一个
结果,您可能想尝试将其解析为IP


顺便说一下,您不必
格式化要格式化您的紧急消息,
紧急
将在内部执行此操作。

从文档中看,他们两人似乎都有一个数字列表
Ipv4Addr::new(127,0,0,1)
@Dominic我不明白。我正在解析一个字符串,它与
rtsp
方案有关。如果您将其更改为
http
,它会工作。深入分析解析代码,http、https、ws、wss和ftp方案被解析为“特殊”,而rtsp则不会。不知道为什么会有你所观察到的效果@Schwern是因为,URL标准具有并区分了基于以下内容的主机语义:。而
url
显然将
用于不透明主机。在测试之后,我可以确认ipv6地址实际上已经被rtsp识别了。从文档中可以看出,这两个地址都有一个数字列表
Ipv4Addr::new(127,0,0,1)
@Dominic我不明白。我正在解析一个字符串,它与
rtsp
方案有关。如果您将其更改为
http
,它会工作。深入分析解析代码,http、https、ws、wss和ftp方案被解析为“特殊”,而rtsp则不会。不知道为什么会有你所观察到的效果@Schwern是因为,URL标准具有并区分了基于以下内容的主机语义:。而
url
显然将
用于不透明主机。在测试之后,我可以确认ipv6地址实际上已被rtsp识别。