From fc6208f9a610ad56e23bd1d136e7797fc66916cc Mon Sep 17 00:00:00 2001 From: Marc Neudert Date: Mon, 22 May 2017 20:46:16 +0200 Subject: [PATCH] [refs #7] short-circuits lookups of empty user agents --- CHANGELOG.md | 7 +++++++ lib/ua_inspector/pool.ex | 11 +++++++++++ test/ua_inspector/parser_test.exs | 17 +++++++++++++---- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a3ac7f9c..4afcf225 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,9 +3,16 @@ ## v0.14.0-dev - Enhancements + - Empty user agents (`""` or `nil`) now return a result without performing + an actual lookup. By definition an empty user agent is never detected + as a bot - System environment configuration can set an optional default value to be used if the environment variable is unset +- Bug fixes + - Properly handles `nil` values passed to the lookup functions + ([#7](https://github.com/elixytics/ua_inspector/issues/7)) + ## v0.13.0 (2016-09-08) - Enhancements diff --git a/lib/ua_inspector/pool.ex b/lib/ua_inspector/pool.ex index 777d3117..92d59d1b 100644 --- a/lib/ua_inspector/pool.ex +++ b/lib/ua_inspector/pool.ex @@ -3,6 +3,9 @@ defmodule UAInspector.Pool do Connects the plain UAInspector interface with the underlying pool. """ + alias UAInspector.Result + + @pool_name :ua_inspector_pool @pool_options [ name: { :local, @pool_name }, @@ -28,6 +31,8 @@ defmodule UAInspector.Pool do Sends a bot check request to a pool worker. """ @spec bot?(String.t) :: boolean + def bot?(nil), do: false + def bot?(""), do: false def bot?(ua) do :poolboy.transaction( @pool_name, @@ -39,6 +44,8 @@ defmodule UAInspector.Pool do Sends a HbbTV check request to a pool worker.. """ @spec hbbtv?(String.t) :: false | String.t + def hbbtv?(nil), do: false + def hbbtv?(""), do: false def hbbtv?(ua) do :poolboy.transaction( @pool_name, @@ -50,6 +57,8 @@ defmodule UAInspector.Pool do Sends a parse request to a pool worker. """ @spec parse(String.t) :: map + def parse(nil), do: %Result{ user_agent: nil } + def parse(""), do: %Result{ user_agent: "" } def parse(ua) do :poolboy.transaction( @pool_name, @@ -61,6 +70,8 @@ defmodule UAInspector.Pool do Sends a client parse request to a pool worker. """ @spec parse_client(String.t) :: map + def parse_client(nil), do: %Result{ user_agent: nil } + def parse_client(""), do: %Result{ user_agent: "" } def parse_client(ua) do :poolboy.transaction( @pool_name, diff --git a/test/ua_inspector/parser_test.exs b/test/ua_inspector/parser_test.exs index 725bafd7..dd9604c1 100644 --- a/test/ua_inspector/parser_test.exs +++ b/test/ua_inspector/parser_test.exs @@ -14,10 +14,8 @@ defmodule UAInspector.ParserTest do end test "parse empty" do - agent = "" - parsed = %Result{ user_agent: agent } - - assert parsed == UAInspector.parse(agent) + assert UAInspector.parse(nil) == %Result{ user_agent: nil } + assert UAInspector.parse("") == %Result{ user_agent: "" } end test "parse unknown" do @@ -29,11 +27,17 @@ defmodule UAInspector.ParserTest do test "bot?" do + refute UAInspector.bot?(nil) + refute UAInspector.bot?("") + assert UAInspector.bot?("generic crawler agent") refute UAInspector.bot?("regular user agent") end test "hbbtv?" do + refute UAInspector.hbbtv?(nil) + refute UAInspector.hbbtv?(nil) + assert "1.1.1" == UAInspector.hbbtv?("agent containing HbbTV/1.1.1 (; ;) information") refute UAInspector.hbbtv?("generic user agent") end @@ -56,4 +60,9 @@ defmodule UAInspector.ParserTest do assert parsed == UAInspector.parse_client(agent) end + + test "parse_client empty" do + assert UAInspector.parse_client(nil) == %Result{ user_agent: nil } + assert UAInspector.parse_client("") == %Result{ user_agent: "" } + end end