ADA是用C ++编写的快速且规范的URL解析器。 URL解析器的规范可以从Whatwg网站找到。
ADA库通过规范的全部测试通过了广泛的平台(例如Windows,Linux,MacOS)。它完全支持相关的Unicode技术标准。
URL解析器的常见用途是采用URL字符串并将其归一化。大多数浏览器都采用了Whatwg URL规范。其他工具,例如卷曲和许多标准库,遵循RFC 3986。下表说明了实践的可能差异(主机编码,编码路径):
| 字符串源 | 字符串值 |
|---|---|
| 输入字符串 | https://www.7-eleven.com/home/privacy/montréal |
| ADA的标准化字符串 | https://www.xn--7eleven-506c.com/home/privacy/montr%C3%A9Al |
| 卷发7.87 | (返回原始未改变的原始) |
该项目否则是独立的,并且没有依赖性。最近支持C ++ 20的C ++编译器。我们测试GCC 12或更高的LLVM 12或更高的测试以及Microsoft Visual Studio 2022。
在我们需要在流行网站上验证数千个URL的基准上,我们发现ADA的速度比流行的竞争对手快几倍(System:Apple Macbook 2022,使用LLVM 14)。
ada ▏ 188 ns/URL ███▏
servo url ▏ 664 ns/URL ███████████▎
CURL ▏ 1471 ns/URL █████████████████████████
ADA提高了流行的JavaScript环境Node.js的性能:
由于Node.js 18,因此将新的URL解析器依赖项添加到Node.js -ADA中。当将URL解析到新级别时,此添加使Node.js的性能碰到了。一些结果可能会提高400% 。 (NODE.JS性能2023)
ADA库除了Node.js(例如Redpanda,Kong,Telegram和Cloudflare工人)外,还使用了重要系统。
目前可用于以下系统的二进制软件包:
Linux或MacOS用户如果已安装了C ++编译器,并且标准实用程序( wget )可能会遵循以下说明
将图书馆拉到目录中
wget https://github.com/ada-url/ada/releases/download/v2.6.10/ada.cpp
wget https://github.com/ada-url/ada/releases/download/v2.6.10/ada.h
使用此内容创建一个名为demo.cpp的新文件:
# include " ada.cpp "
# include " ada.h "
# include < iostream >
int main ( int , char *[]) {
auto url = ada::parse ( " https://www.google.com " );
if (!url) {
std::cout << " failure " << std::endl;
return EXIT_FAILURE;
}
url-> set_protocol ( " http " );
std::cout << url-> get_protocol () << std::endl;
std::cout << url-> get_host () << std::endl;
return EXIT_SUCCESS;
}编译
c++ -std=c++20 -o demo demo.cpp
./demo
http:
www.google.com
以下图书馆由ADA团队维护,并在ADA Github组织下可用。
ADA支持两种类型的URL实例, ada::url和ada::url_aggregator 。在任何一种情况下,用法都是相同的:我们有一个解析功能模板ada::parse ,可以返回类型ada::result<ada::url>或类型ada::result<ada::url_aggregator> 。 ada::url_aggregator类较小,并且由预先计算的序列化URL字符串支持。 ada::url类是由多个组件(路径,主机等)的几个单独的字符串制成的。
ada::result<ada::url_aggregator> url = ada::parse<ada::url_aggregator>( " https://www.google.com " );
if (url) { /* URL is valid */ }调用“解析”后,您必须检查结果是否有效,然后在您不确定它是否成功时访问它。以下代码不安全:
ada::result<ada::url_aggregator> url = ada::parse<ada::url_aggregator>( " some bad url " );
url-> get_href ();你应该做...
ada::result<ada::url_aggregator> url = ada::parse<ada::url_aggregator>( " some bad url " );
if (url) {
// next line is now safe:
url-> get_href ();
} else {
// report a parsing failure
}为简单起见,在下面的示例中,我们跳过了支票,因为我们知道解析成功。所有字符串都假定为有效的UTF-8字符串。
ada::result<ada::url_aggregator> url = ada::parse<ada::url_aggregator>( " https://www.google.com " );
url-> set_username ( " username " );
url-> set_password ( " password " );
// ada->get_href() will return "https://username:[email protected]/"ada::result<ada::url_aggregator> url = ada::parse<ada::url_aggregator>( " https://www.google.com " );
url-> set_protocol ( " wss " );
// url->get_protocol() will return "wss:"
// url->get_href() will return "wss://www.google.com/"ada::result<ada::url_aggregator> url = ada::parse<ada::url_aggregator>( " https://www.google.com " );
url-> set_host ( " github.com " );
// url->get_host() will return "github.com"
// you can use `url.set_hostname` depending on your usage.ada::result<ada::url_aggregator> url = ada::parse<ada::url_aggregator>( " https://www.google.com " );
url-> set_port ( " 8080 " );
// url->get_port() will return "8080"ada::result<ada::url_aggregator> url = ada::parse<ada::url_aggregator>( " https://www.google.com " );
url-> set_pathname ( " /my-super-long-path " )
// url->get_pathname() will return "/my-super-long-path"ada::result<ada::url_aggregator> url = ada::parse<ada::url_aggregator>( " https://www.google.com " );
url-> set_search ( " target=self " );
// url->get_search() will return "?target=self"ada::result<ada::url_aggregator> url = ada::parse<ada::url_aggregator>( " https://www.google.com " );
url-> set_hash ( " is-this-the-real-life " );
// url->get_hash() will return "#is-this-the-real-life"有关命令行选项的更多信息,请参阅CLI文档。
ada::url_search_params search_params ( " a=b&c=d&e=f " );
search_params.append( " g=h " );
search_params.get( " g " ); // will return "h"
auto keys = search_params.get_keys();
while (keys.has_next()) {
auto key = keys. next (); // "a", "c", "e", "g"
}有关我们的C接口,请参见文件include/ada_c.h 。我们期望ASCII或UTF-8字符串。
#include "ada_c.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
static void ada_print ( ada_string string ) {
printf ( "%.*sn" , ( int ) string . length , string . data );
}
int main ( int c , char * arg [] ) {
const char * input =
"https://username:[email protected]:8080/"
"pathname?query=true#hash-exists" ;
ada_url url = ada_parse ( input , strlen ( input ));
if (! ada_is_valid ( url )) { puts ( "failure" ); return EXIT_FAILURE ; }
ada_print ( ada_get_href ( url )); // prints https://username:password@host:8080/pathname?query=true#hash-exists
ada_print ( ada_get_protocol ( url )); // prints https:
ada_print ( ada_get_username ( url )); // prints username
ada_set_href ( url , "https://www.yagiz.co" , strlen ( "https://www.yagiz.co" ));
if (! ada_is_valid ( url )) { puts ( "failure" ); return EXIT_FAILURE ; }
ada_set_hash ( url , "new-hash" , strlen ( "new-hash" ));
ada_set_hostname ( url , "new-host" , strlen ( "new-host" ));
ada_set_host ( url , "changed-host:9090" , strlen ( "changed-host:9090" ));
ada_set_pathname ( url , "new-pathname" , strlen ( "new-pathname" ));
ada_set_search ( url , "new-search" , strlen ( "new-search" ));
ada_set_protocol ( url , "wss" , 3 );
ada_print ( ada_get_href ( url )); // will print wss://changed-host:9090/new-pathname?new-search#new-hash
// Manipulating search params
ada_string search = ada_get_search ( url );
ada_url_search_params search_params =
ada_parse_search_params ( search . data , search . length );
ada_search_params_append ( search_params , "a" , 1 , "b" , 1 );
ada_owned_string result = ada_search_params_to_string ( search_params );
ada_set_search ( url , result . data , result . length );
ada_free_owned_string ( result );
ada_free_search_params ( search_params );
ada_free ( url );
return EXIT_SUCCESS ;
}当从C ++链接到ADA库时,请注意ADA需要访问标准的C ++库。例如,您可以与C ++编译器链接。
例如,如果您抓住我们的单头C ++文件( ada.cpp和ada.h )以及C头( ada_c.h ),则通常可以在Linux/MacOS Systems下按照以下方式编译C程序( demo.c ):
c++ -c ada.cpp -std=c++20
cc -c demo.c
c++ demo.o ada.o -o cdemo
./cdemo
有关在系统上安装ADA之后,请参见文件tests/installation/CMakeLists.txt 。
ADA可通过自制。您可以使用brew install ada-url ADA。
ADA使用CMAKE作为构建系统。建议您运行以下命令以在本地构建它。
cmake -B build && cmake --build buildctest --output-on-failure --test-dir build Windows用户需要其他标志来指定构建配置,例如--config Release 。
也可以使用默认的存储库文件和以下命令通过Docker文件来构建该项目。
docker build -t ada-builder . && docker run --rm -it -v ${PWD}:/repo ada-builder
您可以通过键入执行Python 3 Script singleheader/amalgamate.py来将所有源文件合并到两个文件( ada.h和ada.cpp )中。默认情况下,这些文件是在singleheader目录中创建的。
此代码可根据Apache许可证2.0以及MIT许可证提供。
我们的测试包括第三方代码和数据。基准测定代码包括第三方代码:仅出于研究目的而不是图书馆的一部分提供。