CowboyでCookieの使い方を学んだので備忘録的に残しておきます。
はじめに
ErlangやCowboyの環境構築や設定は以下の記事にまとめてるので気になる人はやってみてください。
CowboyでHello Worldのサンプルを動かしてみる
ハンドラーの準備
まずはCowboyで呼び出すハンドラーの準備をします。パスに応じてハンドラーを呼び分けたりしますが今回は全てのリクエストは一つのハンドラーが受けるようにします。
start(_StartType, _StartArgs) ->
Dispatch = cowboy_router:compile([
{'_', [
{'_', toppage_handler, []}
]}
]),
{ok, _} = cowboy:start_clear(http, [{port, 8010}], #{
env => #{dispatch => Dispatch}
}),
sandbox_sup:start_link().
toppage_handler
ハンドラーが全てのリクエストを受け止めてくれます。なのでリクエストのたびにこのハンドラーが呼ばれます。
今回はテンプレートエンジンにErlyDTLを使いました。
そしてCowboyを8010ポートで待ち受けるように設定します。
Cookieを扱う
Cookieをセットする
では実際にCookieを扱ってみます。Cowboyのサンプルでもありましたが、Cookieに値のセットと値の取得を繰り返すサンプルになります。ではさらっと全体像を。
init(Req0, Opts) ->
NewValue = integer_to_list(rand:uniform(10000)),
Req1 = cowboy_req:set_resp_cookie(<<"server">>, NewValue,
Req0, #{path => <<"/">>}),
NewValue = integer_to_list(rand:uniform(10000)),
ではランダムな値を取得します。Cookieの値が入れ替わるのを確認するためランダムな値を取っています。
Req1 = cowboy_req:set_resp_cookie(<<"server">>, NewValue, Req0, #{path => <<"/">>}),
でCookieに値をセットしています。第一引数の<<server>>
はCookieの値、第二引数にCookieの値を入れています。第三引数にReq objectをセットし、第四引数にCookieのオプションを渡します。今回のオプションではCookieのパスを設定しています。
返り値として新しいRep objectを返します。
Cookieの値を取り出す
次は、Cookieの値をハンドラー内で取り出す処理です。
#{client := ClientCookie, server := ServerCookie}
= cowboy_req:match_cookies([{client, [], <<>>}, {server, [], <<>>}], Req1),
#{client := ClientCookie, server := ServerCookie} = cowboy_req:match_cookies([{client, [], <<>>}, {server, [], <<>>}], Req1)
で値を取り出します。
返り値にCookieのclientとserverをマップとして返します。第一引数ではどの値を取り出すかを決めます。第一引数は{Cookieのキー名, 制約, デフォルト値}
でのタプルのリストを渡しています。
これでCookieの値の取得を行うことができました。
Cookieのオプションたち
最後に、set_resp_cookie
のオプションとして設定できるものを記載していきます。
- max_arg => 失効するまでの時間
- domain => 有効なドメイン
- path => Cookieを設定するパス
- secure => HTTPSのみ有効
- http_only => HTTPのみ有効
まとめ
簡単ではありましたが、CowboyのCookieの扱い方でした。
もっといろいろしようかと思いましたが、これ以上することがないので(悲しい、、、)。
別の記事でCookieを使っていろいろするのを書こうと思います。