ADA est un analyseur d'URL rapide et conforme aux spécifications écrits en C ++. Les spécifications de l'analyseur URL peuvent être trouvées sur le site Web de Whatwg.
La bibliothèque ADA passe la gamme complète de tests à partir des spécifications, sur une large gamme de plates-formes (par exemple, Windows, Linux, macOS). Il soutient pleinement la norme technique UNICODE pertinente.
Une utilisation courante d'un analyseur d'URL consiste à prendre une chaîne d'URL et à la normaliser. La spécification URL de Whatwg a été adoptée par la plupart des navigateurs. D'autres outils, tels que Curl et de nombreuses bibliothèques standard, suivent le RFC 3986. Le tableau suivant illustre les différences possibles dans la pratique (codage de l'hôte, codage du chemin):
| Source de chaîne | Valeur de chaîne |
|---|---|
| chaîne d'entrée | https://www.7-eleven.com/home/privacy/montréal |
| La chaîne normalisée d'Ada | https://www.xn--7eleven-506c..com/home/privacy/montr%C3%A9al |
| Curl 7.87 | (Renvoie l'original inchangé) |
Le projet est autrement autonome et n'a aucune dépendance. Un compilateur C ++ récent prenant en charge C ++ 20. Nous testons GCC 12 ou mieux, LLVM 12 ou mieux et Microsoft Visual Studio 2022.
Sur une référence où nous devons valider et normaliser les milliers d'URL trouvées sur les sites Web populaires, nous constatons que l'ADA peut être plusieurs fois plus rapide que les concurrents populaires (système: Apple MacBook 2022 avec LLVM 14).
ada ▏ 188 ns/URL ███▏
servo url ▏ 664 ns/URL ███████████▎
CURL ▏ 1471 ns/URL █████████████████████████
ADA a amélioré les performances du populaire environnement JavaScript Node.js:
Depuis Node.js 18, une nouvelle dépendance de l'analyseur URL a été ajoutée à Node.js - Ada. Cet ajout a heurté les performances Node.js lors de l'analyse des URL à un nouveau niveau. Certains résultats pourraient atteindre une amélioration de 400% . (État de Node.js Performance 2023)
La bibliothèque ADA est utilisée par des systèmes importants en plus de Node.js tels que Redpanda, Kong, Telegram et CloudFlare.
Des forfaits binaires pour les systèmes suivants sont actuellement disponibles:
Les utilisateurs de Linux ou MacOS peuvent suivre les instructions suivantes s'ils ont un compilateur C ++ récent installé et un utilitaire standard ( wget )
Tirez la bibliothèque dans un répertoire
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
Créez un nouveau fichier nommé demo.cpp avec ce contenu:
# 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;
}Compiler
c++ -std=c++20 -o demo demo.cpp
./demo
http:
www.google.com
Les bibliothèques suivantes sont maintenues par l'équipe ADA et disponibles dans le cadre de l'organisation ADA GitHub.
ADA prend en charge deux types d'instances d'URL, ada::url et ada::url_aggregator . L'utilisation est la même dans les deux cas: nous avons un modèle de fonction d'analyse ada::parse qui peut renvoyer soit le résultat de type ada::result<ada::url> ou de type ada::result<ada::url_aggregator> en fonction de vos besoins. La classe ada::url_aggregator est plus petite et elle est soutenue par une chaîne d'URL sérialisée précomptée. La classe ada::url est faite de plusieurs chaînes distinctes pour les différents composants (chemin, hôte, etc.).
ada::result<ada::url_aggregator> url = ada::parse<ada::url_aggregator>( " https://www.google.com " );
if (url) { /* URL is valid */ }Après avoir appelé «analyse», vous devez vérifier que le résultat est valide avant d'y accéder lorsque vous n'êtes pas sûr qu'il réussira. Le code suivant n'est pas sûr:
ada::result<ada::url_aggregator> url = ada::parse<ada::url_aggregator>( " some bad url " );
url-> get_href ();Tu devrais faire ...
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
}Pour plus de simplicité, dans les exemples ci-dessous, nous ignorons le chèque parce que nous savons que l'analyse réussit. Toutes les chaînes sont supposées être des cordes UTF-8 valides.
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"Pour plus d'informations sur les options de ligne de commande, veuillez vous référer à la documentation 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"
} Voir le fichier include/ada_c.h pour notre interface C. Nous attendons des cordes 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 ;
}Lorsque vous vous liez à la bibliothèque ADA à partir de C ++, soyez à l'esprit que l'ADA nécessite l'accès à la bibliothèque C ++ standard. Par exemple, vous pouvez créer un lien avec le compilateur C ++.
Par exemple, si vous prenez nos fichiers C ++ à tête ( ada.cpp et ada.h ), ainsi que l'en-tête C ( ada_c.h ), vous pouvez souvent compiler un programme C ( demo.c ) comme suit sous les systèmes Linux / MacOS:
c++ -c ada.cpp -std=c++20
cc -c demo.c
c++ demo.o ada.o -o cdemo
./cdemo
Consultez les tests/installation/CMakeLists.txt pour un exemple de la façon dont vous pourriez utiliser ADA à partir de votre propre projet CMake, après avoir installé ADA sur votre système.
Ada est disponible via Homebrew. Vous pouvez installer ADA à l'aide brew install ada-url .
ADA utilise CMake comme système de construction. Il vous a recommandé d'exécuter les commandes suivantes pour la construire localement.
cmake -B build && cmake --build buildctest --output-on-failure --test-dir build Les utilisateurs de Windows ont besoin de drapeaux supplémentaires pour spécifier la configuration de construction, par exemple, --config Release .
Le projet peut également être construit via Docker à l'aide du fichier Docker par défaut du référentiel avec les commandes suivantes.
docker build -t ada-builder . && docker run --rm -it -v ${PWD}:/repo ada-builder
Vous pouvez assumer tous les fichiers source en seulement deux fichiers ( ada.h et ada.cpp ) en tapant l'exécution du script Python 3 Script singleheader/amalgamate.py . Par défaut, les fichiers sont créés dans le répertoire singleheader .
Ce code est mis à disposition sous la licence Apache 2.0 ainsi que la licence MIT.
Nos tests incluent le code et les données tiers. Le code d'analyse comparative comprend le code tiers: il est fourni à des fins de recherche uniquement et ne faisait pas partie de la bibliothèque.