网址定位接口规范 0.2.0
解析绝对网址部件 接受绝对 http: 或 https: URL;根据根址解析网址部件 接受待解析文字和绝对 HTTP(S) 根网址。两者按 WHATWG URL 规则解析、规范化路径和来源,返回 JSON 对象文字,字段按下列顺序固定,均为字符串:href、origin、pathname、search(0.1.0 已有),以及 0.2.0 新增的 protocol(含结尾冒号,如 https:)、hostname(不含端口,小写,国际化域名为 punycode)、host(含非默认端口)、port(默认端口或无端口时为空字符串)、username、password(均为百分号编码后的文字,无则空)、hash(含开头 #,无则空)。search 不含片段,有查询时含开头 ?,无查询时为空。这些字段都取自解析后的 URL 对象,因此与浏览器 URL 的同名属性逐字相同。
无效 URL、非 HTTP(S) 方案或非绝对根网址调用失败;0.2.0 起这些失败都是可捕获的豫言异常,不再让宿主异常越过 Wasm 边界。消息为:“网址不是有效的绝对网址”“网址不是 HTTP(S)”“根网址不是有效的绝对网址”“根网址不是 HTTP(S)”“网址无法按根网址解析”(结果方案不是 HTTP(S) 时为“网址不是 HTTP(S)”)。输入可以含控制字符与任意 UTF-8,宿主按 URL 标准去除制表与换行、对其余字符百分号编码。
此包只做解析,不授予访问所得网址的网络权;调用方在使用解析结果前仍须核对来源、路径根和业务标识。username 与 password 会暴露网址里的凭据,应用不应把它们写进日志。当前 _start 边界用 JSON 文字传递部件;后续可用豫言记录类型替换,不改变 URL 语义。
一致性样例
| 输入 | 必须观察到 |
| --- | --- |
| https://user:pw@Example.COM:8443/a/../b%20c?x=1#f | hostname 为 example.com,host 为 example.com:8443,port 为 8443,username 为 user,password 为 pw,pathname 为 /b%20c,hash 为 #f |
| http://a.example:80/x | port 为空字符串,host 为 a.example |
| 根 http://h.example:8080/a/b/c,输入 ../x?y=1#z | href 为 http://h.example:8080/a/x?y=1#z |
| ftp://a.example/、/rel、http:// | 失败,可捕获 |
不做什么
不发起网络请求,不解析非 HTTP(S) 方案,不决定哪些来源或路径可以访问。
补充:长度上限与首 BOM(独立审查后修订)
- 解析类函数的入参超过 64 KiB 时返回(阴,空),其余函数抛可捕获的「网址文字超过 64 KiB」,不再让宿主交换缓冲区溢出的错误穿出。
- 文字交宿主 TextDecoder 时使用
ignoreBOM: true:文首的 U+FEFF 保留,不再被悄悄丢弃而使无效网址变成有效。