LoginSignup
0
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-01-13

はじめに

ElixirにてCowboyを直接動かすための記事となります。
前回の記事では、ファイルをアップロードするための機能を実装しました。。
今回の記事では、cookieの操作をおこなう方法を記載していきます。

Cowboy1.0のサンプルコードはこちらになります

Cowboy2.0のサンプルコードはこちらになります

バージョン

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

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

スクリーンショット 2017-01-13 11.43.35.png

最後に

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

参考サイト

Cowboy User Guide
Cowboy User Guide

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0