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 解析器实现
238,079 每月下载量
用于 1,155 个crate (58 直接)
370KB
5.5K SLoC
uriparse-rs
RFC3986的实现,包括URI和URI引用。
目标
此crate的目标是提供用于高效创建、修改和解析URI、相对引用和URI引用的类型。
以下将描述这三种类型。
什么是 URI
?
URI代表统一资源标识符,用于标识某些资源。好吧,这或许没有解释太多,让我们看看一些例子
- https://www.google.com/
- ftps://example.com/help?q=example
- urn:resource
- http://mywebsite:8080#tag
如你所见,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