Boost.URL

Boost.URL 是一个可移植的 C++ 库,它提供了容器和算法,用于建模 “URL”,更正式的描述使用了 统一资源标识符 (URI) 规范(以下简称 rfc3986)。URL 是一个紧凑的字符序列,用于标识抽象或物理资源。例如,这是一个有效的 URL

https://www.example.com/path/to/file.txt?userid=1001&pages=3&results=full#page1

这个库理解与 URL 相关的语法,并提供验证、解析、检查和修改 URL,以及应用规范化或解析算法的功能。

特性

虽然这个库是通用的,但已经特别注意确保实现和数据表示对需要高效且安全地处理 URL 的网络程序友好,包括输入来自不受信任的源的情况。根据需要,提供了使用错误代码而不是异常的接口,并且大多数算法都具有选择退出动态内存分配的方法。该库的另一个特性是,所有修改都会使 URL 保持有效状态。使用此库的代码易于阅读、灵活且性能良好。

Boost.URL 提供以下特性

  • 仅需 C++11

  • 快速编译,少量模板

  • 严格遵守 rfc3986

  • 维护有效 URL 的容器

  • 无需异常即可工作的解析算法

  • 对 URL 的存储和分配的控制

  • 支持 -fno-exceptions,自动检测

  • 在嵌入式设备上运行良好的特性

目前,该库不处理 国际化资源标识符 (IRI)。它们与 URL 不同,来自 Unicode 字符串而不是低 ASCII 字符串,并由单独的规范涵盖。

要求

该库需要支持至少 C++11 的编译器。

对于标准类型,例如 std::error_codestd::string_view,该库使用它们的 Boost 等效项 boost::system::error_codeboost::core::string_view

Boost.URL 在嵌入式设备上运行良好。它可以以避免所有动态内存分配的方式使用。此外,如果需要,它还提供无需异常即可工作的替代接口。

已测试的编译器

Boost.URL 已经过以下编译器的测试

  • clang: 3.8, 4, 5, 6, 7, 8, 9, 10, 11, 12

  • gcc: 4.8, 4.9, 5, 6, 7, 8, 9, 10, 11

  • msvc: 14.1, 14.2, 14.3

以及这些架构:x86, x64, ARM64, S390x。

我们不测试和支持 gcc 8.0.1。

质量保证

该库的开发基础设施包括以下每次提交的分析

  • 覆盖率报告

  • 在 Drone.io 和 GitHub Actions 上的编译和测试

  • 定期的安全代码审计

命名法

历史上曾使用各种名称来指代不同类型的资源标识符,包括 URI、URL、URN,甚至 IRI。随着时间的推移,在技术文档和非正式著作中讨论时,URI 和 URL 之间的区别已经消失。在本库中,我们使用术语 URL 来指代所有根据 rfc3986 中找到的顶层语法规则有效的字符串。

ABNF

本文档使用 rfc5234 的 增强型巴科斯-诺尔范式 (ABNF) 表示法来指定算法和容器使用的特定语法。虽然完整理解该表示法不是使用该库的必要条件,但它可能有助于理解如何定义 URL 的有效组件。特别是,这对于希望使用库提供的组合器来组合解析算法的用户来说非常重要。

致谢

如果没有 Peter Dimov 在设计建议和一般帮助方面的帮助,这个库就不会有今天的成就。