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

# はじめに
ElixirにてCowboyを直接動かすための記事となります。
[前回](http://qiita.com/hayabusa333/items/97ebfad8a38d132266ba)の記事では、Stream通信にて少しずつHTMLを送信していく方法を実装しました。
今回の記事ではPresetにて少しずつResponseを作成する方法に関して実装していきます。

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

[Cowboy2.0のサンプルコードはこちらになります](https://github.com/hayabusa333/elixir_cowboy_example/tree/preset_response_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 |

# Preset による responseの設定

今回はPreset、つまりHeaderやBodyなどの情報を1つずつ設定していき、最終的にreplayにて送信する方法を見ていきます。

## cowboy 1.0の場合

``` elixir:lib/elixir_cowboy_example.ex
    routes = [
      {"/", ElixirCowboyExample.Handler, []},
      # Add it.
      {"/preset", ElixirCowboyExample.PresetResponseHandler, []},
      {"/stream", ElixirCowboyExample.StreamHandler, []},
      {"/sendfile", ElixirCowboyExample.SendFileHandler, []},
      {"/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/preset_response_handler.ex
defmodule ElixirCowboyExample.PresetResponseHandler do
  def init({:tcp, :http}, req, opts) do
    {:ok, req, opts}
  end

  def handle(req, state) do

    IO.inspect req

    # Header情報の設定を実施する
    req = :cowboy_req.set_resp_header("allow", "GET", req)
    IO.puts "----------------"
    IO.inspect req

    # bodyの情報を設定する
    req = :cowboy_req.set_resp_body("Hello world!", req)

    # 上とは違い、FunctionにてBodyの情報を設定するには下記から
#    body_fun = fn(socket, transport) ->
#      transport.send(socket, "Hello world!")
#    end
#    req = :cowboy_req.set_resp_body_fun(12, body_fun, req)

    IO.puts "----------------"
    IO.inspect req

    # 設定された情報を一括送信
    :cowboy_req.reply(200, req)

    {:ok, req, state}
  end

  def terminate(_reason, _req, _state) do
    :ok
  end
end
```

## cowboy 2.0の場合

``` elixir:lib/elixir_cowboy_example.ex
    routes = [
      {"/", ElixirCowboyExample.Handler, []},
      # Add it.
      {"/preset", ElixirCowboyExample.PresetResponseHandler, []},
      {"/stream", ElixirCowboyExample.StreamHandler, []},
      {"/sendfile", ElixirCowboyExample.SendFileHandler, []},
      {"/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/preset_response_handler.ex
defmodule ElixirCowboyExample.PresetResponseHandler do
  def init(req, opts) do

    IO.inspect req

    # Header情報の設定を実施する
    req = :cowboy_req.set_resp_header("allow", "GET", req)
    IO.puts "----------------"
    IO.inspect req

    # Body情報の設定を実施する
    # Cowboy2.0では :cowboy_req.set_resp_body_fun ではできない模様
    req = :cowboy_req.set_resp_body("Hello world!", req)
    IO.puts "----------------"
    IO.inspect req

    :cowboy_req.reply(200, req)

    {:ok, req, opts}
  end

end
```

# 記載したコードの実行
コードの記述が完了しましたので、それでは実行していきましょう。
いつも通り `iex -S mix` にて cowboy を実行していき、`http://localhost:4000/preset`にアクセスしてみましょう。
今回は、ブラウザの画面からではわかりにくいので、`IO.inspect`にて表示された内容からみていきます。

# Cowboy 1.0の場合

```cmd
#受信時のreq情報
 [{"connection", ["keep-alive"]}], :undefined, [], :waiting, "", :undefined,
 false, :waiting, [], "", :undefined}

#Header情報を設定した際のreq情報、[{"allow", "PUT"}]が設定されたことがわかる
----------------
 [{"connection", ["keep-alive"]}], :undefined, [], :waiting, "", :undefined,
 false, :waiting, [{"allow", "PUT"}], "", :undefined}

# 最終的に送信される req情報、"Hello world!"が設定されたことがわかる
----------------
 [{"connection", ["keep-alive"]}], :undefined, [], :waiting, "", :undefined,
 false, :waiting, [{"allow", "GET"}], "Hello world!", :undefined}
```

# Cowboy 2.0の場合

```cmd
#受信時のreq情報
  path_info: :undefined, peer: {{127, 0, 0, 1}, 61335}, pid: #PID<0.254.0>,
  port: 4000, qs: "", ref: :http, scheme: "http", streamid: 1,
  version: :"HTTP/1.1"}

#Header情報を設定した際のreq情報、resp_headers: %{"allow" => "GET"}が設定されたことがわかる
----------------
  path_info: :undefined, peer: {{127, 0, 0, 1}, 61335}, pid: #PID<0.254.0>,
  port: 4000, qs: "", ref: :http, resp_headers: %{"allow" => "GET"},
  scheme: "http", streamid: 1, version: :"HTTP/1.1"}

# 最終的に送信される req情報、resp_body: "Hello world!"が設定されたことがわかる
----------------
  path_info: :undefined, peer: {{127, 0, 0, 1}, 61335}, pid: #PID<0.254.0>,
  port: 4000, qs: "", ref: :http, resp_body: "Hello world!",
  resp_headers: %{"allow" => "GET"}, scheme: "http", streamid: 1,
  version: :"HTTP/1.1"}
```

# 最後に

今回はHeader情報やBody情報を1つずつ設定していきました。
メソッド分けなどをしていないので今までと何が違うのかっというのもありますが、いかがだったでしょうか？
それではまた次回

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