ADA ist ein schneller und spezifischer URL-Parser, der in C ++ geschrieben wurde. Die Spezifikation für URL -Parser finden Sie auf der WhatWG -Website.
Die ADA -Bibliothek besteht aus der Spezifikation über eine Vielzahl von Plattformen (z. B. Windows, Linux, MacOS). Es unterstützt den entsprechenden technischen Standard von Unicode vollständig.
Eine häufige Verwendung eines URL -Parsers besteht darin, eine URL -Zeichenfolge zu nehmen und sie zu normalisieren. Die Whatwg URL -Spezifikation wurde von den meisten Browsern übernommen. Andere Tools wie Curl und viele Standardbibliotheken folgen dem RFC 3986. Die folgende Tabelle zeigt mögliche Unterschiede in der Praxis (Codierung des Hosts, Codierung des Pfades):
| Saitenquelle | Stringwert |
|---|---|
| Eingabezeichenfolge | https://www.7-leven.com/home/privacy/montréal |
| Adas normalisierte Zeichenfolge | https://www.xn--7eleven-506c.com/home/privacy/montr%C3%A9Al |
| Curl 7.87 | (Gibt das Original unverändert zurück) |
Das Projekt ist ansonsten in sich geschlossen und hat keine Abhängigkeit. Ein aktueller C ++ - Compiler, der C ++ 20 unterstützt. Wir testen GCC 12 oder Better, LLVM 12 oder Better und Microsoft Visual Studio 2022.
Auf einem Benchmark, in dem wir Tausende URLs auf beliebten Websites validieren und normalisieren müssen, stellen wir fest, dass ADA mehrmals schneller sein kann als beliebte Konkurrenten (System: Apple MacBook 2022 mit LLVM 14).
ada ▏ 188 ns/URL ███▏
servo url ▏ 664 ns/URL ███████████▎
CURL ▏ 1471 ns/URL █████████████████████████
ADA hat die Leistung des beliebten JavaScript -Umgebungsknotens verbessert.js:
Seit Node.js 18 wurde Node.js - ADA eine neue URL -Parser -Abhängigkeit hinzugefügt. Diese Ergänzung hat die Leistung von Node.js bei der Parsen von URLs auf ein neues Niveau gestoßen. Einige Ergebnisse könnten eine Verbesserung von 400% erreichen. (Status von Node.js Leistung 2023)
Die ADA -Bibliothek wird von wichtigen Systemen neben Node.js wie Redpanda, Kong, Telegramm und Cloudflare -Mitarbeitern verwendet.
Binärpakete für folgende Systeme sind derzeit verfügbar:
Linux- oder MacOS -Benutzer befolgen möglicherweise die folgenden Anweisungen, wenn sie über einen aktuellen C ++ - Compiler installiert sind und ein Standard -Dienstprogramm (WGET) ( wget ) installiert sind.
Ziehen Sie die Bibliothek in einem Verzeichnis
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
Erstellen Sie mit diesem Inhalt eine neue Datei namens 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;
}Kompilieren
c++ -std=c++20 -o demo demo.cpp
./demo
http:
www.google.com
Die folgenden Bibliotheken werden vom ADA -Team gepflegt und unter ADA Github Organization erhältlich.
ADA unterstützt zwei Arten von URL -Instanzen, ada::url und ada::url_aggregator . Die Verwendung ist in beiden Fällen gleich: Wir haben eine Parsing -Funktionsvorlage ada::parse , die entweder ein Ergebnis vom Typ ada::result<ada::url> oder vom Typ ada::result<ada::url_aggregator> Abhängig von Ihren Anforderungen zurückgeben kann. Die ada::url_aggregator -Klasse ist kleiner und wird durch eine vorberechtigte serialisierte URL -Zeichenfolge gesichert. Die ada::url -Klasse besteht aus mehreren getrennten Zeichenfolgen für die verschiedenen Komponenten (Pfad, Host usw.).
ada::result<ada::url_aggregator> url = ada::parse<ada::url_aggregator>( " https://www.google.com " );
if (url) { /* URL is valid */ }Nach dem Aufrufen von "Parse" müssen Sie überprüfen, ob das Ergebnis gültig ist, bevor Sie darauf zugreifen, wenn Sie nicht sicher sind, ob es erfolgreich ist. Der folgende Code ist unsicher:
ada::result<ada::url_aggregator> url = ada::parse<ada::url_aggregator>( " some bad url " );
url-> get_href ();Du solltest tun ...
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
}Der Einfachheit halber überspringen wir in den folgenden Beispielen den Scheck, weil wir wissen, dass das Parsen erfolgreich ist. Es wird angenommen, dass alle Zeichenfolgen gültige UTF-8-Saiten sind.
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"Weitere Informationen zu Befehlszeilenoptionen finden Sie in der CLI-Dokumentation.
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"
} Siehe die Datei include/ada_c.h für unsere C -Schnittstelle. Wir erwarten ASCII- oder UTF-8-Saiten.
#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 ;
}Bei der Verknüpfung mit der ADA -Bibliothek von C ++ kümmern Sie sich darum, dass ADA Zugriff auf die Standard -C ++ -Bibliothek benötigt. ZB, Sie können sich mit dem C ++ - Compiler verbinden.
ZB, wenn Sie sich unsere Einzelhaupt-C ++--Dateien ( ada.cpp und ada.h ) sowie den C-Header ( ada_c.h ) greifen, können Sie häufig ein C-Programm ( demo.c ) wie folgt unter Linux/MacOS-Systemen kompilieren:
c++ -c ada.cpp -std=c++20
cc -c demo.c
c++ demo.o ada.o -o cdemo
./cdemo
In den tests/installation/CMakeLists.txt finden Sie ein Beispiel dafür, wie Sie ADA aus Ihrem eigenen CMake -Projekt verwenden können, nachdem Sie ADA auf Ihrem System installiert haben.
ADA ist über Homebrew erhältlich. Sie können ADA mit brew install ada-url installieren.
ADA verwendet CMake als Build -System. Es wird empfohlen, die folgenden Befehle auszuführen, um sie lokal zu erstellen.
cmake -B build && cmake --build buildctest --output-on-failure --test-dir build Windows -Benutzer benötigen zusätzliche Flags, um die Build -Konfiguration, z. B. --config Release anzugeben.
Das Projekt kann auch über Docker mit der Standard -Docker -Datei des Repositorys mit folgenden Befehlen erstellt werden.
docker build -t ada-builder . && docker run --rm -it -v ${PWD}:/repo ada-builder
Sie können alle Quelldateien in nur zwei Dateien ( ada.h und ada.cpp ) zusammenfassen, indem Sie die Ausführung des Python 3 -Skripts singleheader/amalgamate.py eingeben. Standardmäßig werden die Dateien im singleheader -Verzeichnis erstellt.
Dieser Code wird unter der Apache -Lizenz 2.0 sowie der MIT -Lizenz verfügbar gemacht.
Unsere Tests enthalten Code und Daten von Drittanbietern. Der Benchmarking-Code enthält Code von Drittanbietern: Er wird nur für Forschungszwecke bereitgestellt und nicht zu einem Teil der Bibliothek.