URL関連の処理を集めたユーティリティモジュール.
Copyright (c) 2013-2014 DWANGO Co., Ltd. All Rights Reserved.
build_qs/1 | 連想リストからHTTPのクエリ文字列を生成する. |
parse_query/1 | URLのクエリストリング部をパースして、対応する連想リストを取得する. |
parse_scheme/1 | URLのschemeを取得する. |
parse_url/1 | URLをparseし、URLの要素をmapで返す. |
urldecode_base64/1 | base64url形式でエンコードされたバイナリをデコードする. |
urldecode_rfc3986/1 | RFC3986形式でエンコードされているバイナリをデコードする. |
urlencode_base64/1 | Equivalent to urlencode_base64(PlainText, []). |
urlencode_base64/2 | バイナリをbase64url形式にエンコードする. |
urlencode_rfc3986/1 | テキストを RFC3986 にもとづいてエンコードする. |
build_qs(AssocList::moyo_assoc:assoc_list()) -> binary()
連想リストからHTTPのクエリ文字列を生成する.
URLエンコード処理にはurlencode_rfc3986/1
が使用される.
連想リストの要素のキーおよび値が文字列ではない場合はmoyo_string:to_string/1
を使って文字列に変換される.
parse_query(QueryString::binary()) -> [{Key::binary(), Value::binary()}]
URLのクエリストリング部をパースして、対応する連想リストを取得する
基本的には、標準のhttpd:parse_query/1
と同じ動作を取るが、
戻り値の連想リストのキー及び値の型が文字列からバイナリに変わっている。
また、標準の関数は入力サイズが大きくなると極端に処理速度が遅くなるために、標準関数の使用は推奨されない。
クエリストリング内の各パラメータのキーおよび値に含まれる'+'は半角スペースに展開され、 '%xx'は対応するコードの文字に展開される。
また、キーに対応する値が存在しない場合は、空文字(バイナリ)が値として使用される。
> parse_query(<<"a&b=10">>).
[{<<"a">>, <<"">>}, {<<"b">>, <<"10">>}]
なお、入力として"%a=b"のように不正なパーセントエンコーディング文字が渡された場合の挙動は未定義。<br />
(何らかの解釈でデコードされた結果が返るかもしれないし、エラーとなるかもしれない)
parse_scheme(URL::binary()) -> {ok, {Scheme::binary(), Rest::binary()}} | error
URLのschemeを取得する
parse_url(URL::binary()) -> {ok, ParsedURL} | {error, Reason::term()}
ParsedURL = #{scheme => binary(), userinfo => binary(), host => binary(), port => pos_integer(), path => binary(), query => binary(), fragment => binary()}
URLをparseし、URLの要素をmapで返す
URLに必須なschemeとhostが入力に含まれない場合、もしくはperseに失敗した場合errorとなる http_uri:parseとの違い
- 入出力の文字列をバイナリ型で取り扱う string()で取り扱わない
- schemeをバイナリで返す http_uri版はschemeをatomで返すため、ユーザ入力を受け付ける場合、無限にatomが生成される恐れがあったが、 この関数はバイナリで返すためleakの心配がない
- デフォルトのport指定を持たない http_uri版は"http://foo/"の様なhttp+port指定なし入力の場合、戻り値のportに80自動指定するが、 この関数ではしない。parserとしての機能としては大きすぎ、parseしたいだけなのにschemeとportの組を設定する必要がある等邪魔になることがあったので外した
urldecode_base64(EncodedText) -> PlainText
EncodedText = binary()
PlainText = binary()
base64url形式でエンコードされたバイナリをデコードする.
base64url形式については urlencode_base64/2
のドキュメントを参照のこと。
EncodedText
の末尾にパディング文字("=")が不足している場合は、デコード時に自動で補われる。
urldecode_rfc3986(EncodedText::binary()) -> PlainText::binary()
RFC3986形式でエンコードされているバイナリをデコードする.
なお、RFC3986に正式に準拠していないバイナリが渡された場合でも、デコードに支障がないようであれば、特にエラーとはならない.
(ex. "|"のように本来パーセントエスケープされるべき文字が生のまま含まれていても、エラーとはならない)
RFC3986に関してはurlencode_rfc3986
を参照のこと.
urlencode_base64(PlainText) -> any()
Equivalent to urlencode_base64(PlainText, [])
.
urlencode_base64(PlainText, Options) -> EncodedText
PlainText = binary()
EncodedText = binary()
Options = [Option]
Option = no_padding
バイナリをbase64url形式にエンコードする.
base64url形式とは、通常のbase64エンコードの結果文字列の"+"および"/"を、それぞれ"-"および"_"に置き換えたもの。
(この処理によって、base64エンコード結果をURL内に安全に含めることができるようになる)
base64urlの詳細は http://tools.ietf.org/html/rfc4648#section-5
を参照のこと.
オプションでno_padding
が指定された場合は、base64エンコード結果の文字列から末尾のパディング文字("=")が除外される.
> urlencode_base64(<<"this is a pen">>, []).
<<"dGhpcyBpcyBhIHBlbg==">>
> urlencode_base64(<<"this is a pen">>, [no_padding]).
<<"dGhpcyBpcyBhIHBlbg">>
urlencode_rfc3986(PlainText::binary()) -> EncodedText::binary()
テキストを RFC3986 にもとづいてエンコードする.
[a-zA-Z0-9_.~-]を除く全ての文字は%XX
形式の文字列で置換される.
RFC3986: http://www.faqs.org/rfcs/rfc3986.html