はじめに
ElixirにてCowboyを直接動かすための記事となります。
前回の記事では、ファイルをアップロードするための機能を実装しました。。
今回の記事では、cookieの操作をおこなう方法を記載していきます。
バージョン
使用した言語やライブラリのバージョンは下記となります。
cowboy 1.0のバージョン
Version | |
---|---|
Elixir | 1.3.2 |
Erlang | 19.2 |
Cowboy | 1.0.4 |
cowboy 2.0のバージョン
Version | |
---|---|
Elixir | 1.3.2 |
Erlang | 19.2 |
Cowboy | 2.0.0-pre4 |
Cookieの情報を作成しブラウザに戻す
今回はCookie情報をブラウザに返す方法を作成していきます。
Cookie情報をサーバ側で作ってブラウザに返すことなど少ないとは思いますが見ていただければ幸いです。
cowboy 1.0の場合
lib/elixir_cowboy_example.ex
routes = [
{"/", ElixirCowboyExample.Handler, []},
{"/cookie", ElixirCowboyExample.CookieHandler, []},
{"/upload", ElixirCowboyExample.UploadHandler, []},
{"/dynamic", ElixirCowboyExample.DynamicPageHandler, []},
{"/json", ElixirCowboyExample.JsonHandler, []},
{"/:html", ElixirCowboyExample.Handler, []},
{"/priv/static/js/:javascript", ElixirCowboyExample.JavascriptHandler, []},
{"/priv/static/css/:css", ElixirCowboyExample.CssHandler, []},
{"/priv/static/image/[...]", :cowboy_static, {:priv_dir, :elixir_cowboy_example, "static/image"}}
]
lib/elixir_cowboy_example/cookie_handler.ex
defmodule ElixirCowboyExample.CookieHandler do
def init({:tcp, :http}, req, opts) do
{:ok, req, opts}
end
def handle(req, state) do
# Cookie情報が含まれたリクエストの作成
cookie_req = :cowboy_req.set_resp_cookie("server", "add_cookie", [
# cookieの保存期間を設定
{:max_age, 3600},
# cookieを参照できるドメインとpathを設定
{:domain, "localhost"},
{:path, "/"}
], req)
# cookie情報が含まれたレスポンスを返す
headers = [ {"content-type", "text/html"} ]
body = "push cookie"
{ :ok, reply } = :cowboy_req.reply(200, headers, body, cookie_req)
{:ok, cookie_req, state}
end
def terminate(_reason, _req, _state) do
:ok
end
end
cowboy 2.0の場合
lib/elixir_cowboy_example.ex
routes = [
{"/", ElixirCowboyExample.Handler, []},
{"/cookie", ElixirCowboyExample.CookieHandler, []},
{"/upload", ElixirCowboyExample.UploadHandler, []},
{"/dynamic", ElixirCowboyExample.DynamicPageHandler, []},
{"/json", ElixirCowboyExample.JsonHandler, []},
{"/:html", ElixirCowboyExample.Handler, []},
{"/priv/static/js/:javascript", ElixirCowboyExample.JavascriptHandler, []},
{"/priv/static/css/:css", ElixirCowboyExample.CssHandler, []},
{"/priv/static/image/[...]", :cowboy_static, {:priv_dir, :elixir_cowboy_example, "static/image"}}
]
lib/elixir_cowboy_example/cookie_handler.ex
defmodule ElixirCowboyExample.CookieHandler do
def init(req, opts) do
# cookie情報が含まれたリクエストを作成
cookie_req = :cowboy_req.set_resp_cookie("server", "add_cookie",
# Cowboy2.0からはMapで引き渡すように変更された
%{max_age: 3600, domain: "localhost", path: "/"},
req)
# Cookie情報が含まれたレスポンスを返す
header = %{"content-type" => "text/html"}
body = "push cookie"
{ :ok, reply } = :cowboy_req.reply(200, header, body, cookie_req)
{:ok, cookie_req, opts}
end
end
記載したコードの実行
コードの記述が完了しましたので、それでは実行していきましょう。
いつも通り iex -S mix
にて cowboy を実行していき、http://localhost:4000/cookie
にアクセスしてみましょう。
下記の画像のようにアクセスすると push cookieと画面に表示され、開発ツールよりdocument.cookie
を叩いてみるとcookieが追加されたことが確認できます。
最後に
今回はcookie情報をレスポンスとして返す実装を行いました。
上でも記載しましたがサーバよりcookieを作成して返すことはそうそうないかもしれまんが何かの参考にはなったのではないでしょうか。
それではまた次回