ADA-это быстрый и специфический анализатор URL, написанный в C ++. Спецификацию для анализатора URL можно найти с веб -сайта WhatWG.
Библиотека ADA проходит полный диапазон тестов из спецификации на широком диапазоне платформ (например, Windows, Linux, MacOS). Он полностью поддерживает соответствующий технический стандарт Unicode.
Распространенное использование анализатора URL - это взять строку URL и нормализовать ее. Спецификация URL WhatWG была принята большинством браузеров. Другие инструменты, такие как Curl и многие стандартные библиотеки, следуют RFC 3986. Следующая таблица иллюстрирует возможные различия на практике (кодирование хоста, кодирование пути):
| Строка источник | строковое значение |
|---|---|
| Входная строка | https://www.7-eleven.com/home/privacy/montréal |
| Нормализованная строка Ады | https://www.xn--7eleven-506c.com/home/privacy/montr%c3%a9al |
| Curl 7.87 | (возвращает оригинал без изменений) |
Проект в остальном автономен и не имеет зависимости. Недавний компилятор C ++, поддерживающий C ++ 20. Мы тестируем GCC 12 или лучше, LLVM 12 или лучше и Microsoft Visual Studio 2022.
На эталоне, где нам нужно проверить и нормализовать тысячи URL -адресов, найденные на популярных веб -сайтах, мы обнаруживаем, что ADA может быть в несколько раз быстрее, чем популярные конкуренты (система: Apple MacBook 2022 с LLVM 14).
ada ▏ 188 ns/URL ███▏
servo url ▏ 664 ns/URL ███████████▎
CURL ▏ 1471 ns/URL █████████████████████████
ADA улучшила производительность популярного узла среды JavaScript.
Со времен Node.js 18 была добавлена новая зависимость анализатора URL -анализатора в Node.js - ADA. Это дополнение увеличило производительность node.js при анализе URL -адресов на новый уровень. Некоторые результаты могут достичь улучшения на 400% . (State of Node.js Performance 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 */ }После вызова «parse» вы должны проверить, что результат действителен, прежде чем получить к нему доступ, когда вы не уверены, что он будет успешным. Следующий код небезопасен:
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"
} См. Файл include/ada_c.h для нашего интерфейса C. Мы ожидаем строк 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 ;
}При связи против библиотеки ADA из C ++, помните, что ADA требует доступа к стандартной библиотеке C ++. Например, вы можете связаться с компилятором C ++.
Например, если вы захватите наши однополосные файлы C ++ ( ada.cpp и ada.h ), а также заголовок C ( ada_c.h ), вы часто можете скомпилировать программу C ( demo.c ) следующим образом в Systems Linux/MacOS:
c++ -c ada.cpp -std=c++20
cc -c demo.c
c++ demo.o ada.o -o cdemo
./cdemo
См. Файл tests/installation/CMakeLists.txt для примера того, как вы можете использовать ADA из своего собственного проекта Cmake после установки ADA в вашу систему.
ADA доступна через Homebrew. Вы можете установить ADA с помощью brew install ada-url .
ADA использует Cmake в качестве системы сборки. Рекомендуется запустить следующие команды, чтобы построить его локально.
cmake -B build && cmake --build buildctest --output-on-failure --test-dir build Пользователям Windows нужны дополнительные флаги, чтобы указать конфигурацию сборки, например --config Release .
Проект также может быть построен через Docker, используя файл Docker Docker по умолчанию с следующими командами.
docker build -t ada-builder . && docker run --rm -it -v ${PWD}:/repo ada-builder
Вы можете объединить все исходные файлы только в два файла ( ada.h и ada.cpp ), набрав выполнение сценария Python 3 singleheader/amalgamate.py . По умолчанию файлы создаются в каталоге singleheader .
Этот код доступен в соответствии с лицензией Apache 2.0, а также с лицензией MIT.
Наши тесты включают сторонний код и данные. Код для сравнительного анализа включает в себя код стороннего состояния: он предоставляется только для исследовательских целей, а не часть библиотеки.