豫言 / 豫言操作系统网址定位 @ 0.2.0

按 URL 标准解析绝对网址及相对网址,返回完整部件。

源码浏览已生成;不能解析的文件以纯文本展示,不表示通过类型检查。

规范.汉语.md

# 网址定位接口规范 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 保留,不再被悄悄丢弃而使无效网址变成有效。

规范.文言.md

# 网址定位之约 0.2.0

`解析绝对网址部件` 受绝对 `http:` 或 `https:` 址;`根据根址解析网址部件` 受待析文与绝对 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` 同名之性逐字相同。

坏址、非 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」,宿主交换缓冲溢出之错不复穿出。
- 文授宿主 TextDecoder 用 `ignoreBOM: true`:文首之 U+FEFF 存之,不复暗弃而使无效之址变有效。