ADA เป็นตัวแยกวิเคราะห์ URL ที่รวดเร็วและเป็นไปตามข้อกำหนดที่เขียนใน C ++ ข้อมูลจำเพาะสำหรับตัวแยกวิเคราะห์ URL สามารถพบได้จากเว็บไซต์ whatwg
ไลบรารี ADA ผ่านการทดสอบอย่างเต็มรูปแบบจากข้อกำหนดผ่านแพลตฟอร์มที่หลากหลาย (เช่น Windows, Linux, MacOS) รองรับมาตรฐานทางเทคนิค Unicode ที่เกี่ยวข้องอย่างเต็มที่
การใช้ตัวแยกวิเคราะห์ URL ทั่วไปคือการใช้สตริง URL และทำให้เป็นมาตรฐาน เบราว์เซอร์ส่วนใหญ่ของ WHATWG URL ได้รับการรับรองจากเบราว์เซอร์ เครื่องมืออื่น ๆ เช่น Curl และห้องสมุดมาตรฐานจำนวนมากติดตาม RFC 3986 ตารางต่อไปนี้แสดงความแตกต่างที่เป็นไปได้ในทางปฏิบัติ (การเข้ารหัสของโฮสต์การเข้ารหัสเส้นทาง):
| แหล่งกำเนิด | ค่าสตริง |
|---|---|
| สตริงอินพุต | https://www.7‑eleven.com/home/privacy/montréal |
| สตริงปกติของ ADA | 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 Environment Node.js:
ตั้งแต่ node.js 18 การพึ่งพาตัวแยกวิเคราะห์ URL ใหม่ถูกเพิ่มลงใน node.js - ada นอกจากนี้การเพิ่มประสิทธิภาพของ Node.js เมื่อแยกวิเคราะห์ URL เป็นระดับใหม่ ผลลัพธ์บางอย่างอาจสูงถึงการปรับปรุง 400% (สถานะของ Node.js ประสิทธิภาพ 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 */ }หลังจากโทร 'แยกวิเคราะห์' คุณ ต้อง ตรวจสอบว่าผลลัพธ์นั้นถูกต้องก่อนที่จะเข้าถึงเมื่อคุณไม่แน่ใจว่ามันจะสำเร็จ รหัสต่อไปนี้ไม่ปลอดภัย:
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 strings
#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 ) ดังต่อไปนี้ภายใต้ระบบ 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 build -t ada-builder . && docker run --rm -it -v ${PWD}:/repo ada-builder
คุณสามารถรวมไฟล์ต้นฉบับทั้งหมดเป็นสองไฟล์เท่านั้น ( ada.h และ ada.cpp ) โดยการพิมพ์การเรียกใช้งาน Python 3 singleheader/amalgamate.py โดยค่าเริ่มต้นไฟล์จะถูกสร้างขึ้นในไดเรกทอรี singleheader
รหัสนี้มีให้ภายใต้ Apache License 2.0 รวมถึงใบอนุญาต MIT
การทดสอบของเรารวมถึงรหัสบุคคลที่สามและข้อมูล รหัสการเปรียบเทียบรวมถึงรหัสบุคคลที่สาม: มีให้เพื่อวัตถุประสงค์ในการวิจัยเท่านั้นและไม่ใช่ส่วนหนึ่งของห้องสมุด