ADAは、C ++で記述された高速で仕様に準拠したURLパーサーです。 URLパーサーの仕様は、WhatWG Webサイトから見つけることができます。
ADAライブラリは、幅広いプラットフォーム(Windows、Linux、MacOなど)にわたって、仕様からの全範囲のテストを渡します。関連する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 |
| カール7.87 | (オリジナルを変更せずに返します) |
それ以外の場合は、このプロジェクトは自己完結型であり、依存関係はありません。 C ++ 20をサポートする最近のC ++コンパイラ。 GCC 12以上、LLVM 12以上、Microsoft Visual Studio 2022をテストします。
人気のあるWebサイトで見つかった数千のURLを検証および正規化する必要があるベンチマークでは、ADAは人気のある競合他社よりも数倍高速になる可能性があることがわかります(LLVM 14を含むApple MacBook 2022)。
ada ▏ 188 ns/URL ███▏
servo url ▏ 664 ns/URL ███████████▎
CURL ▏ 1471 ns/URL █████████████████████████
ADAは、人気のJavaScript Environment Node.jsのパフォーマンスを改善しました。
Node.js 18以降、Node.js - Adaに新しいURLパーサー依存関係が追加されました。この追加は、URLを新しいレベルに解析するときにnode.jsパフォーマンスを拡大しました。いくつかの結果は、 400%の改善に達する可能性があります。 (node.jsパフォーマンス2023の状態)
ADAライブラリは、Redpanda、Kong、Telegram、CloudFlareワーカーなどの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は、 ada::urlとada::url_aggregatorの2種類のURLインスタンスをサポートしています。使用法はどちらの場合でも同じです。PARSINGFUNCTIONテンプレート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をインストールした後、ファイルtests/installation/CMakeLists.txtを参照してください。
ADAはHomeBrewから入手できます。 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を介して構築することもできます。
docker build -t ada-builder . && docker run --rm -it -v ${PWD}:/repo ada-builder
すべてのソースファイルを、Python 3スクリプトsingleheader/amalgamate.pyを実行するとタイプすることにより、2つのファイル( ada.hとada.cpp )のみにアマルガメートできます。デフォルトでは、ファイルはsingleheaderディレクトリに作成されます。
このコードは、Apacheライセンス2.0およびMITライセンスの下で利用可能になります。
私たちのテストには、サードパーティのコードとデータが含まれます。ベンチマークコードには、サードパーティのコードが含まれています。これは、研究目的のみで提供され、ライブラリの一部ではありません。