ADA هو محلل URL سريع ومتوافق مع المواصفات مكتوبة في C ++. يمكن العثور على مواصفات محلل URL من موقع Whatwg.
تمر مكتبة ADA النطاق الكامل من الاختبارات من المواصفات ، عبر مجموعة واسعة من المنصات (على سبيل المثال ، Windows ، Linux ، MacOS). يدعم تمامًا المعيار الفني Unicode ذي الصلة.
الاستخدام الشائع لمحلل URL هو أخذ سلسلة عناوين URL وتطبيعها. تم اعتماد مواصفات URL WhatWG من قبل معظم المتصفحات. أدوات أخرى ، مثل Curl والعديد من المكتبات القياسية ، تتبع RFC 3986. يوضح الجدول التالي الاختلافات المحتملة في الممارسة (ترميز المضيف ، وترميز المسار):
| مصدر السلسلة | قيمة السلسلة |
|---|---|
| سلسلة الإدخال | https://www.7 - Eleven.com/home/privacy/montréal |
| سلسلة ADA الطبيعية | https://www.xn--7eleven-506.com/home/privacy/montr٪C3٪A9al |
| حليقة 7.87 | (يعيد الأصلي دون تغيير) |
المشروع بخلاف ذلك بخلاف ذلك وليس له أي تبعية. برنامج التحويل البرمجي C ++ حديث يدعم C ++ 20. نقوم باختبار GCC 12 أو Better ، 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.
#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 ++ واحدة من Header ( 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 users need additional flags to specify the build configuration, eg --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 2.0 بالإضافة إلى ترخيص MIT.
تشمل اختباراتنا رمز وبيانات الطرف الثالث. يتضمن رمز القياس رمز الطرف الثالث: يتم توفيره لأغراض البحث فقط وليس جزءًا من المكتبة.