LoginSignup
0
0

More than 5 years have passed since last update.

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

Posted at

はじめに

ElixirにてCowboyを直接動かすための記事となります。
前回の記事では、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

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内容が出ていることが確認できます。

Chromeの場合
スクリーンショット 2017-01-18 14.39.16.png

Safariの場合
スクリーンショット 2017-01-18 14.39.45.png

最後に

今回はHeader情報からブラウザを判定してみました。
判定方法はElixirで書かないといけないので少し考えないといけないかもしれませんね。
それではまた次回

参考サイト

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