ADA는 C ++로 작성된 빠르고 스펙 준수 URL 파서입니다. URL 파서의 사양은 Whatwg 웹 사이트에서 찾을 수 있습니다.
ADA 라이브러리는 광범위한 플랫폼 (예 : Windows, Linux, MacOS)에서 사양에서 전체 범위의 테스트를 전달합니다. 관련 유니 코드 기술 표준을 완전히 지원합니다.
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 |
| 컬 7.87 | (원래 변경되지 않은 원래 반환) |
이 프로젝트는 그렇지 않으면 독립적이며 의존성이 없습니다. C ++ 20을지지하는 최근의 C ++ 컴파일러. GCC 12 이상, LLVM 12 이상 및 Microsoft Visual Studio 2022를 테스트합니다.
인기있는 웹 사이트에서 발견 된 수천 개의 URL을 검증하고 정상화 해야하는 벤치 마크에서 ADA는 인기있는 경쟁 업체보다 몇 배 더 빠를 수 있음을 발견했습니다 (System : Apple MacBook 2022 with LLVM 14).
ada ▏ 188 ns/URL ███▏
servo url ▏ 664 ns/URL ███████████▎
CURL ▏ 1471 ns/URL █████████████████████████
ADA는 인기있는 JavaScript 환경 Node.js의 성능을 향상 시켰습니다.
Node.js 18 이후 새 URL 파서 종속성이 node.js - ada에 추가되었습니다. 이 추가로 URL을 새 레벨로 구문 분석 할 때 Node.js 성능이 충돌했습니다. 일부 결과는 400% 의 개선에 도달 할 수 있습니다. (node.js 성능 2023)
ADA 라이브러리는 Redpanda, Kong, Telegram 및 Cloudflare Workers와 같은 Node.js 외에 중요한 시스템에서 사용됩니다.
다음 시스템의 이진 패키지는 현재 사용할 수 있습니다.
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 */ }'Parse'를 호출 한 후에는 성공할 수 있는지 확실하지 않은 경우 결과가 액세스하기 전에 유효한지 확인 해야합니다 . 다음 코드는 안전하지 않습니다.
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"
} C 인터페이스는 include/ada_c.h 파일을 참조하십시오. 우리는 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 ;
}C ++에서 ADA 라이브러리와 연결할 때 ADA는 표준 C ++ 라이브러리에 액세스해야한다는 점을 염두에 두십시오. 예를 들어 C ++ 컴파일러와 연결할 수 있습니다.
예를 들어, 단일 헤더 C ++ 파일 ( ada.cpp 및 ada.h )과 C 헤더 ( ada_c.h )를 잡으면 Linux/MacOS 시스템에서 다음과 같이 C 프로그램 ( demo.c )을 컴파일 할 수 있습니다.
c++ -c ada.cpp -std=c++20
cc -c demo.c
c++ demo.o ada.o -o cdemo
./cdemo
시스템에 ADA를 설치 한 후 자신의 CMAKE 프로젝트에서 ADA를 어떻게 사용할 수 있는지에 대한 예는 파일 tests/installation/CMakeLists.txt 참조하십시오.
Ada는 홈브류를 통해 구입할 수 있습니다. brew install ada-url 사용하여 ADA를 설치할 수 있습니다.
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
Python 3 Script singleheader/amalgamate.py 실행하여 모든 소스 파일을 두 개의 파일 ( ada.h 및 ada.cpp )으로 합병 할 수 있습니다. 기본적으로 파일은 singleheader 디렉토리에 생성됩니다.
이 코드는 Apache License 2.0 및 MIT 라이센스에 따라 제공됩니다.
우리의 테스트에는 타사 코드 및 데이터가 포함됩니다. 벤치마킹 코드에는 타사 코드가 포함되어 있습니다. 라이브러리의 일부가 아닌 연구 목적으로 만 제공됩니다.