LoginSignup
0
0

More than 5 years have passed since last update.

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

Posted at

はじめに

ElixirにてCowboyを直接動かすための記事となります。
前回の記事では、Stream通信にて少しずつHTMLを送信していく方法を実装しました。
今回の記事ではPresetにて少しずつResponseを作成する方法に関して実装していきます。

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

Preset による responseの設定

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

cowboy 1.0の場合

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"}}
    ]
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の場合

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"}}
    ]
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の場合

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

#受信時の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
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