はじめに
ElixirにてCowboyを直接動かすための記事となります。
前回の記事では、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 |
Header情報からブラウザ情報を取得
今回はブラウザ情報の判定を実施します。
ブラウザ情報自体はUser-Agent
に設定されていますので、User-Agent
を取得してから、どのブラウザであるかを確認していきます。
cowboy 1.0の場合
lib/elixir_cowboy_example.ex
routes = [
{"/", ElixirCowboyExample.Handler, []},
# Add it.
{"/browser", ElixirCowboyExample.BrowserCheckHandler, []},
{"/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/browser_check_handler.ex
defmodule ElixirCowboyExample.BrowserCheckHandler do
def init({:tcp, :http}, req, opts) do
{:ok, req, opts}
end
def handle(req, state) do
# Headerからuser-agentの情報を抜き出す
{user_agent_val, req} = :cowboy_req.header(<<"user-agent">>, req)
headers = [{"content-type", "text/html"}]
# user-agentの情報から、どのブラウザであるかをチェックし
# bodyにHTMLの値を設定する
# 今回はchromeとsafariのみ対応
body = cond do
String.contains?(user_agent_val, "Chrome")
-> "<html><head>Chrome Hello world!</head>"
String.contains?(user_agent_val, "Safari")
-> "<html><head>Safari Hello world!</head>"
true
-> "<html><head>Hello world!</head>"
end
{:ok, resp} = :cowboy_req.reply(200, headers, body, 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.
{"/browser", ElixirCowboyExample.BrowserCheckHandler, []},
{"/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/browser_check_handler.ex
defmodule ElixirCowboyExample.BrowserCheckHandler do
def init(req, opts) do
# Headerからuser-agentの情報を抜き出す
user_agent_val = :cowboy_req.header(<<"user-agent">>, req)
headers = %{"content-type" => "text/html"}
# user-agentの情報から、どのブラウザであるかをチェックし
# bodyにHTMLの値を設定する
# 今回はchromeとsafariのみ対応
body = cond do
String.contains?(user_agent_val, "Chrome")
-> "<html><head>Chrome Hello world!</head>"
String.contains?(user_agent_val, "Safari")
-> "<html><head>Safari Hello world!</head>"
true
-> "<html><head>Hello world!</head>"
end
{:ok, resp} = :cowboy_req.reply(200, headers, body, req)
{:ok, req, opts}
end
end
記載したコードの実行
コードの記述が完了しましたので、それでは実行していきましょう。
いつも通り iex -S mix
にて cowboy を実行していき、http://localhost:4000/browser
にアクセスしてみましょう。
ChromeとSafariで別のHTML内容が出ていることが確認できます。
最後に
今回はHeader情報からブラウザを判定してみました。
判定方法はElixirで書かないといけないので少し考えないといけないかもしれませんね。
それではまた次回