O ADA é um analisador de URL rápido e compatível com especificações escrito em C ++. A especificação para o analisador de URL pode ser encontrada no site Whatwg.
A Biblioteca ADA passa por toda a gama de testes a partir da especificação, em uma ampla gama de plataformas (por exemplo, Windows, Linux, MacOS). Ele suporta totalmente o padrão técnico Unicode relevante.
Um uso comum de um analisador de URL é pegar uma corda de URL e normalizá -la. A especificação Whatwg URL foi adotada pela maioria dos navegadores. Outras ferramentas, como o CURL e muitas bibliotecas padrão, seguem o RFC 3986. A tabela a seguir ilustra possíveis diferenças na prática (codificação do host, codificação do caminho):
| fonte de string | valor da string |
|---|---|
| string de entrada | https://www.7-eleven.com/home/privacy/montréal |
| A corda normalizada de Ada | https://www.xn--7eleven-506c.com/home/privacy/montr%C3%A9al |
| Curl 7.87 | (Retorna o original inalterado) |
O projeto é independente e não tem dependência. Um compilador C ++ recente que suporta C ++ 20. Testamos o GCC 12 ou melhor, LLVM 12 ou melhor e o Microsoft Visual Studio 2022.
Em uma referência em que precisamos validar e normalizar milhares de URLs encontrados em sites populares, descobrimos que a ADA pode ser várias vezes mais rápida que os concorrentes populares (System: Apple MacBook 2022 com LLVM 14).
ada ▏ 188 ns/URL ███▏
servo url ▏ 664 ns/URL ███████████▎
CURL ▏ 1471 ns/URL █████████████████████████
ADA melhorou o desempenho do popular JavaScript Environment Node.js:
Desde o Node.js 18, uma nova dependência de analisador de URL foi adicionada ao Node.js - ADA. Essa adição aumentou o desempenho do Node.js ao analisar URLs para um novo nível. Alguns resultados podem atingir uma melhoria de 400% . (Estado do Node.js Performance 2023)
A biblioteca da ADA é usada por sistemas importantes, além de node.js como trabalhadores de Redpanda, Kong, Telegram e Cloudflare.
Pacotes binários para os seguintes sistemas estão disponíveis no momento:
Os usuários do Linux ou MacOS podem seguir as seguintes instruções se tiverem um compilador C ++ recente instalado e um utilitário padrão ( wget )
Puxe a biblioteca em um diretório
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
Crie um novo arquivo chamado demo.cpp com este conteúdo:
# 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;
}Compilar
c++ -std=c++20 -o demo demo.cpp
./demo
http:
www.google.com
As bibliotecas a seguir são mantidas pela equipe da ADA e estão disponíveis na Organização Ada Github.
ADA suporta dois tipos de instâncias de URL, ada::url e ada::url_aggregator . O uso é o mesmo em ambos os casos: temos um modelo de função de análise ada::parse que pode retornar um resultado do tipo ada::result<ada::url> ou do tipo ada::result<ada::url_aggregator> Dependendo de suas necessidades. A classe ada::url_aggregator é menor e é apoiada por uma sequência de URL serializada pré -computada. A classe ada::url é feita de várias cordas separadas para os vários componentes (caminho, hospedeiro e assim por diante).
ada::result<ada::url_aggregator> url = ada::parse<ada::url_aggregator>( " https://www.google.com " );
if (url) { /* URL is valid */ }Depois de ligar para 'análise', você deve verificar se o resultado é válido antes de acessá -lo quando não tiver certeza de que ele terá sucesso. O código a seguir é inseguro:
ada::result<ada::url_aggregator> url = ada::parse<ada::url_aggregator>( " some bad url " );
url-> get_href ();Você deveria fazer ...
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
}Por simplicidade, nos exemplos abaixo, ignoramos o cheque porque sabemos que a análise é bem -sucedida. Presume-se que todas as seqüências de strings sejam strings UTF-8 válidas.
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"Para obter mais informações sobre as opções de linha de comando, consulte a documentação da 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"
} Consulte o arquivo include/ada_c.h para nossa interface C. Esperamos cordas ASCII ou 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 ;
}Ao vincular a biblioteca ADA da C ++, lembre -se de que a ADA requer acesso à biblioteca C ++ padrão. Por exemplo, você pode se vincular ao compilador C ++.
Por exemplo, se você pegar nossos arquivos C ++ de cabeçalho único ( ada.cpp e ada.h ), bem como o cabeçalho C ( ada_c.h ), muitas vezes você pode compilar um programa C ( demo.c ), como segue nos sistemas Linux/MacOS:
c++ -c ada.cpp -std=c++20
cc -c demo.c
c++ demo.o ada.o -o cdemo
./cdemo
Consulte os tests/installation/CMakeLists.txt para um exemplo de como você pode usar o ADA do seu próprio projeto CMake, depois de instalar a ADA no seu sistema.
ADA está disponível no Homebrew. Você pode instalar a ADA usando brew install ada-url .
A ADA usa o CMake como um sistema de construção. É recomendável que você execute os seguintes comandos para construí -los localmente.
cmake -B build && cmake --build buildctest --output-on-failure --test-dir build Os usuários do Windows precisam de sinalizadores adicionais para especificar a configuração de compilação, por exemplo --config Release .
O projeto também pode ser construído via Docker usando o arquivo de repositório padrão do Docker com os seguintes comandos.
docker build -t ada-builder . && docker run --rm -it -v ${PWD}:/repo ada-builder
Você pode criar todos os arquivos de origem em apenas dois arquivos ( ada.h e ada.cpp ) digitando executando o script python 3 singleheader/amalgamate.py . Por padrão, os arquivos são criados no diretório singleheader .
Este código é disponibilizado sob a licença Apache 2.0, bem como a licença do MIT.
Nossos testes incluem código e dados de terceiros. O código de benchmarking inclui código de terceiros: é fornecido apenas para fins de pesquisa e não parte da biblioteca.