ElixirからCowboy 1.0と2.0を使ってみる Part 8

# はじめに
ElixirにてCowboyを直接動かすための記事となります。
[前回](http://qiita.com/hayabusa333/items/cb165667fc222cf70087)の記事では、ファイルをアップロードするための機能を実装しました。。
今回の記事では、cookieの操作をおこなう方法を記載していきます。

[Cowboy1.0のサンプルコードはこちらになります](https://github.com/hayabusa333/elixir_cowboy_example/tree/cookie_cowboy)

[Cowboy2.0のサンプルコードはこちらになります](https://github.com/hayabusa333/elixir_cowboy_example/tree/cookie_cowboy_two_pre4)

# バージョン
使用した言語やライブラリのバージョンは下記となります。

## 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の場合

``` elixir: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"}}
    ]
```

``` elixir: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の場合

``` elixir: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"}}
    ]
```

``` elixir: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が追加されたことが確認できます。

<img width="1176" alt="スクリーンショット 2017-01-13 11.43.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/3014/85772387-cd59-9b16-2e7c-4edf0ab2d379.png">


# 最後に
今回はcookie情報をレスポンスとして返す実装を行いました。
上でも記載しましたがサーバよりcookieを作成して返すことはそうそうないかもしれまんが何かの参考にはなったのではないでしょうか。
それではまた次回

# 参考サイト
[Cowboy User Guide](https://ninenines.eu/docs/en/cowboy/1.0/guide/)
[Cowboy User Guide](https://ninenines.eu/docs/en/cowboy/2.0/guide/)