はじめに
ElixirにてCowboyを直接動かすための記事となります。
前回の記事では、Stream通信にて少しずつHTMLを送信していく方法を実装しました。
今回の記事ではPresetにて少しずつResponseを作成する方法に関して実装していきます。
バージョン
使用した言語やライブラリのバージョンは下記となります。
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つずつ設定していきました。
メソッド分けなどをしていないので今までと何が違うのかっというのもありますが、いかがだったでしょうか?
それではまた次回