diff --git a/.minitestfailures b/.minitestfailures new file mode 100644 index 00000000..0637a088 --- /dev/null +++ b/.minitestfailures @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ea6b8e7..99d988ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Unreleased + +- Reuse the detected browser for bot detection instead of parsing the user agent + twice. Custom bot matchers now receive that browser instead of a + `Browser::Unknown` built from the downcased user agent. + ## 6.2.0 - Add `Browser::Base#epiphany?`. diff --git a/lib/browser/base.rb b/lib/browser/base.rb index b6c551df..17847748 100644 --- a/lib/browser/base.rb +++ b/lib/browser/base.rb @@ -7,7 +7,7 @@ class Base attr_reader :ua def initialize(ua, accept_language: nil) - validate_size(:user_agent, ua.to_s) + validate_size(:user_agent, ua.to_s, Browser.user_agent_size_limit) @ua = ua @accept_language_raw = accept_language.to_s @@ -21,7 +21,11 @@ def meta # Return an array with all preferred languages that this browser accepts. def accept_language @accept_language ||= begin - validate_size(:accept_language, @accept_language_raw) + validate_size( + :accept_language, + @accept_language_raw, + Browser.accept_language_size_limit + ) AcceptLanguage.parse(@accept_language_raw) end end @@ -44,7 +48,7 @@ def platform # Return the bot info. def bot - @bot ||= Bot.new(ua) + @bot ||= Bot.new(ua, browser: self) end # Detect if current user agent is from a bot. @@ -273,9 +277,8 @@ def epiphany?(expected_version = nil) instance_of?(Epiphany) && detect_version?(full_version, expected_version) end - private def validate_size(subject, input) + private def validate_size(subject, input, size_limit) actual_bytesize = input.bytesize - size_limit = Browser.public_send(:"#{subject}_size_limit") return if actual_bytesize < size_limit diff --git a/lib/browser/bot.rb b/lib/browser/bot.rb index cd0051fc..bcb6ef4a 100644 --- a/lib/browser/bot.rb +++ b/lib/browser/bot.rb @@ -40,9 +40,9 @@ def self.why?(ua) attr_reader :ua, :browser - def initialize(ua) + def initialize(ua, browser: nil) @ua = ua.downcase.strip - @browser = Browser.new(@ua) + @browser = browser || Browser.new(@ua) end def bot? diff --git a/test/unit/bots_test.rb b/test/unit/bots_test.rb index 53919806..e7f8f390 100644 --- a/test/unit/bots_test.rb +++ b/test/unit/bots_test.rb @@ -93,6 +93,20 @@ class BotsTest < Minitest::Test assert_equal "Generic Bot", browser.bot.name end + test "passes the detected browser to custom bot matchers" do + matched_browsers = [] + Browser::Bot.matchers << lambda {|_ua, browser| + matched_browsers << browser + false + } + browser = Browser.new(Browser["CHROME"]) + + refute browser.bot? + assert_same browser, matched_browsers.last + ensure + Browser::Bot.matchers.pop + end + %w[ content-fetcher content-crawler