14个版本

0.6.4 2022年3月18日
0.6.3 2020年9月11日
0.6.1 2019年5月9日
0.6.0 2019年3月8日
0.1.0 2018年7月14日

#50 in 解析器实现

Download history 54793/week @ 2024-04-21 48742/week @ 2024-04-28 50533/week @ 2024-05-05 54284/week @ 2024-05-12 46409/week @ 2024-05-19 48886/week @ 2024-05-26 51703/week @ 2024-06-02 53633/week @ 2024-06-09 51750/week @ 2024-06-16 53761/week @ 2024-06-23 48982/week @ 2024-06-30 52421/week @ 2024-07-07 49148/week @ 2024-07-14 55115/week @ 2024-07-21 55671/week @ 2024-07-28 75480/week @ 2024-08-04

238,079 每月下载量
用于 1,155 个crate (58 直接)

MIT 许可证

370KB
5.5K SLoC

uriparse-rs

LICENSE Build Status Crates.io Version

RFC3986的实现,包括URI和URI引用。

文档

目标

此crate的目标是提供用于高效创建、修改和解析URI、相对引用和URI引用的类型。

以下将描述这三种类型。

什么是 URI

URI代表统一资源标识符,用于标识某些资源。好吧,这或许没有解释太多,让我们看看一些例子

如你所见,URI由各个部分组成,具体来说:方案、授权、路径、查询和片段。

方案

方案是第一个冒号前的部分,例如 "https""urn",它决定了URI其余部分所使用的规范。每种方案可能对URI的形式有各种限制。

例如,URN(统一资源名称)方案完全不使用 '/',而HTTP显然是。此crate支持最通用的语法,即,一个如 "urn:/test/" 的URI可能是有效的URI,但它不是一个有效的URN URI。

此处可以看到许多已注册的方案,这个库通过Scheme类型(例如 Scheme::HTTPS)提供了一种轻松访问它们的方法。您还可以使用未注册的方案。

权限

权限总是由"//" precedes,并且是直到'/''?''#'或URI的末尾的所有内容。它由三个部分组成:用户信息、主机和端口。

用户信息允许提供资源用户名和密码(例如"http://username:[email protected]/")。然而,根据规范,使用密码已被弃用,因此您应尽量避免使用,因为许多服务器都会记录URI。

主机提供托管资源的主机名称。它可以是IPv4地址、IPv6地址或注册名称(例如域名)。

最后是连接到机器的端口号,假设使用TCP或UDP。通常不需要指定,许多方案指定默认端口号(例如,HTTP默认使用端口80)。

路径

路径是URI的主要部分,即使在它看起来不存在的情况下也是如此。例如,URI "http://example.com" 的路径是 "/",而URI "urn:" 的路径是 ""。在权限之后,路径始终以'/'开头。

查看URI时,路径从权限(如果有,否则是方案)开始,一直持续到'?''#'或URI的末尾。查询内容的含义高度依赖于所使用的方案。

路径可以有很多不同的分类,我建议阅读规范中的相应部分以获取更多信息。

查询

查询是从第一个'?'开始到第一个'#'或URI的末尾的所有内容。与路径一样,查询内容的含义高度依赖于所使用的方案。

片段

片段是第一个'#'之后的所有内容。它用于标识次要资源,并依赖于所描述的主要资源的媒体类型。因此,它的描述通常与方案的规范正交。

什么是RelativeReference

相对引用与URI非常相似,唯一的不同之处在于它没有方案。然而,其他一切都是相同的。相对引用通常用于资源的基本URI隐式定义的地方。

什么是 URIReference

URI引用简单地是所有有效URI和相对引用的并集。它可以表示可能或可能未指定方案的引用。

性能

正如目标部分所述,这个crate的目标是能够高效地解析URI。这主要意味着最小化分配。目前,唯一进行的分配是在将路径解析到Vec<Segment<'segment>>时,尽管这些片段本身仍然是原始源引用。

规范化

默认情况下,这个crate不执行任何规范化。但是,用户可以使用提供的normalize函数在解析后对相应组件进行单独或全部规范化。提供的规范化包括大小写规范化、百分编码规范化和路径片段规范化。

然而,在比较组件时,会考虑百分编码规范化。例如,如果您要比较两个路径 /my/path/my/p%61th,它们会被这个crate视为相等。在散列方面也是如此。

查询字符串

这个crate不执行查询字符串解析,它只会确保它是一个有效的查询字符串,如[RFC3986, Section 3.4]定义的那样。如果您需要解析它,您需要使用另一个crate(例如queryst)。

依赖关系

~200KB