url - 如何从 Rust URL 匹配 IP 主机?
问题描述
我正在尝试从以下 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地址。
解决方案
查看错误跟踪器,我发现IP 在 RTSP url 中无法识别。
答案显然是url
遵循/实现了 URL 标准(这很有意义,因为它是在 Servo 的上下文中开发的),并且 URL 标准只需要对选定数量的方案进行 IPv4 地址识别,因为这些方案(显然)处理IPv4特别地址:https ://github.com/servo/rust-url/issues/577
具体来说:特殊方案是ftp、http、https、ws、wss(也有,file
但它是自己的类别),主机表示的差异是:
- 特殊方案的主机可以是 ipv4、ipv6 或域
- 非特殊方案的主机可以是 ipv6、不透明、空或 null
url
实际上会为非特殊方案解析 ipv6,尽管它只是转储到Some(Domain(...))
(或None
)中的所有其他内容。
无论如何,这意味着如果您得到Domain
结果,您可能想尝试将其解析为 IP。
顺便说一句,您不必format!
格式化您的恐慌消息,panic!
将在内部进行。
推荐阅读
- python - Plotly:将等高线图更改为 3-d 曲面
- c# - 我怎么做DoSomething???方法一种通用方法?
- asp.net-core-webapi - .net core webapi启动时如何预加载数据?
- postgresql - 什么是带括号的别名(类似于“FROM ... a(m)”)?
- javascript - 我如何重用反应组件但颜色不同?
- java - 使用 OneToMany 标签时.. EntityManager 没有持久性提供程序 - Hibernate JPA
- reactjs - FileReader - 存储更新后如何更新本地状态?
- javascript - Puppeteer.js:获取带有给定文本的链接的 href 属性
- javascript - 如何在 React 中访问其他组件的数据
- excel - 在 Excel VBA 中使用变量设置范围