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許可證提供。
我們的測試包括第三方代碼和數據。基準測定代碼包括第三方代碼:僅出於研究目的而不是圖書館的一部分提供。