ADA adalah parser URL yang cepat dan sesuai dengan spesifikasi yang ditulis dalam C ++. Spesifikasi untuk Parser URL dapat ditemukan dari situs web WhatwG.
Perpustakaan ADA melewati berbagai tes dari spesifikasi, di berbagai platform (misalnya, Windows, Linux, MacOS). Ini sepenuhnya mendukung standar teknis Unicode yang relevan.
Penggunaan umum parser URL adalah untuk mengambil string URL dan menormalkannya. Spesifikasi URL WhatWG telah diadopsi oleh sebagian besar browser. Alat lain, seperti Curl dan banyak perpustakaan standar, ikuti RFC 3986. Tabel berikut menggambarkan kemungkinan perbedaan dalam praktik (pengkodean host, pengkodean jalur):
| sumber string | nilai string |
|---|---|
| string input | https://www.7-eleven.com/home/privacy/mantréal |
| string dinormalisasi Ada | https://www.xn--7eleven-506c.com/home/privacy/mantr%C3%A9al |
| Curl 7.87 | (mengembalikan aslinya yang tidak berubah) |
Proyek ini mandiri dan tidak memiliki ketergantungan. Kompiler C ++ baru -baru ini mendukung C ++ 20. Kami menguji GCC 12 atau lebih baik, LLVM 12 atau lebih baik dan Microsoft Visual Studio 2022.
Pada tolok ukur di mana kami perlu memvalidasi dan menormalkan ribuan URL yang ditemukan di situs web populer, kami menemukan bahwa ADA dapat beberapa kali lebih cepat daripada pesaing populer (System: Apple MacBook 2022 dengan LLVM 14).
ada ▏ 188 ns/URL ███▏
servo url ▏ 664 ns/URL ███████████▎
CURL ▏ 1471 ns/URL █████████████████████████
ADA telah meningkatkan kinerja JavaScript Environment Node.js:
Sejak Node.js 18, ketergantungan parser URL baru ditambahkan ke Node.js - Ada. Penambahan ini menabrak kinerja Node.js saat parsing URL ke tingkat baru. Beberapa hasil dapat mencapai peningkatan 400% . (State of Node.js Performance 2023)
Perpustakaan ADA digunakan oleh sistem penting selain Node.js seperti Redpanda, Kong, Telegram dan Cloudflare pekerja.
Paket biner untuk sistem berikut saat ini tersedia:
Pengguna Linux atau MacOS dapat mengikuti instruksi berikut jika mereka memiliki kompiler C ++ terbaru yang diinstal dan utilitas standar ( wget )
Tarik perpustakaan di direktori
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
Buat file baru bernama demo.cpp dengan konten ini:
# 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;
}Menyusun
c++ -std=c++20 -o demo demo.cpp
./demo
http:
www.google.com
Perpustakaan berikut dikelola oleh tim ADA dan tersedia di bawah organisasi ADA GitHub.
ADA mendukung dua jenis instance URL, ada::url dan ada::url_aggregator . Penggunaannya sama dalam kedua kasus: kami memiliki template fungsi parsing ada::parse yang dapat mengembalikan hasil dari tipe ada::result<ada::url> atau tipe ada::result<ada::url_aggregator> tergantung pada kebutuhan Anda. Kelas ada::url_aggregator lebih kecil dan didukung oleh string URL serial yang telah dikomputasi. Kelas ada::url terbuat dari beberapa string terpisah untuk berbagai komponen (jalur, host, dan sebagainya).
ada::result<ada::url_aggregator> url = ada::parse<ada::url_aggregator>( " https://www.google.com " );
if (url) { /* URL is valid */ }Setelah menelepon 'Parse', Anda harus memeriksa bahwa hasilnya valid sebelum mengaksesnya ketika Anda tidak yakin itu akan berhasil. Kode berikut tidak aman:
ada::result<ada::url_aggregator> url = ada::parse<ada::url_aggregator>( " some bad url " );
url-> get_href ();Anda harus melakukan ...
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
}Untuk kesederhanaan, dalam contoh di bawah ini, kami melewatkan cek karena kami tahu bahwa penguraian berhasil. Semua string diasumsikan valid string 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"Untuk informasi lebih lanjut tentang opsi baris perintah, silakan merujuk ke dokumentasi 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"
} Lihat file include/ada_c.h untuk antarmuka C kami. Kami mengharapkan string ASCII atau 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 ;
}Saat menghubungkan dengan perpustakaan ADA dari C ++, ingatlah bahwa ADA memerlukan akses ke perpustakaan C ++ standar. Misalnya, Anda dapat menautkan dengan kompiler C ++.
Misalnya, jika Anda mengambil file c ++ header tunggal kami ( ada.cpp dan ada.h ), serta header C ( ada_c.h ), Anda sering dapat mengkompilasi program C ( demo.c ) sebagai berikut di bawah sistem Linux/MacOS:
c++ -c ada.cpp -std=c++20
cc -c demo.c
c++ demo.o ada.o -o cdemo
./cdemo
Lihat file tests/installation/CMakeLists.txt untuk contoh bagaimana Anda dapat menggunakan ADA dari proyek cmake Anda sendiri, setelah menginstal ADA di sistem Anda.
ADA tersedia melalui homebrew. Anda dapat menginstal ADA menggunakan brew install ada-url .
ADA menggunakan cmake sebagai sistem build. Direkomendasikan Anda untuk menjalankan perintah berikut untuk membangunnya secara lokal.
cmake -B build && cmake --build buildctest --output-on-failure --test-dir build Pengguna Windows memerlukan bendera tambahan untuk menentukan konfigurasi build, misalnya --config Release .
Proyek ini juga dapat dibangun melalui Docker menggunakan file Docker Default Repositori dengan perintah berikut.
docker build -t ada-builder . && docker run --rm -it -v ${PWD}:/repo ada-builder
Anda dapat menggabungkan semua file sumber menjadi hanya dua file ( ada.h dan ada.cpp ) dengan mengetik mengeksekusi script python 3 script singleheader/amalgamate.py . Secara default, file dibuat di direktori singleheader .
Kode ini tersedia di bawah Lisensi Apache 2.0 serta lisensi MIT.
Tes kami termasuk kode dan data pihak ketiga. Kode pembandingan mencakup kode pihak ketiga: Ini disediakan untuk tujuan penelitian saja dan bukan bagian dari perpustakaan.