browser 2.5.2 → 5.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.github/ISSUE_TEMPLATE.md +1 -1
- data/.github/workflows/tests.yml +57 -0
- data/.gitignore +1 -0
- data/.prettierignore +1 -0
- data/.rubocop.yml +22 -107
- data/CHANGELOG.md +192 -11
- data/FUNDING.yml +3 -0
- data/Gemfile +2 -0
- data/README.md +139 -89
- data/Rakefile +11 -3
- data/bot_exceptions.yml +2 -0
- data/bots.yml +302 -247
- data/browser.gemspec +12 -7
- data/gemfiles/rails6_0.gemfile +6 -0
- data/gemfiles/rails6_1.gemfile +6 -0
- data/lib/browser/accept_language.rb +12 -9
- data/lib/browser/action_controller.rb +1 -3
- data/lib/browser/aliases.rb +5 -5
- data/lib/browser/alipay.rb +2 -2
- data/lib/browser/base.rb +101 -19
- data/lib/browser/blackberry.rb +3 -3
- data/lib/browser/bot/empty_user_agent_matcher.rb +11 -0
- data/lib/browser/bot/keyword_matcher.rb +11 -0
- data/lib/browser/bot/known_bots_matcher.rb +11 -0
- data/lib/browser/bot.rb +39 -27
- data/lib/browser/browser.rb +65 -54
- data/lib/browser/chrome.rb +18 -5
- data/lib/browser/detect_version.rb +5 -5
- data/lib/browser/device/android.rb +20 -0
- data/lib/browser/device/blackberry_playbook.rb +1 -1
- data/lib/browser/device/ipad.rb +1 -1
- data/lib/browser/device/iphone.rb +1 -1
- data/lib/browser/device/ipod_touch.rb +1 -1
- data/lib/browser/device/kindle.rb +1 -1
- data/lib/browser/device/kindle_fire.rb +1 -1
- data/lib/browser/device/playstation3.rb +1 -1
- data/lib/browser/device/playstation4.rb +1 -1
- data/lib/browser/device/psp.rb +1 -1
- data/lib/browser/device/psvita.rb +1 -1
- data/lib/browser/device/samsung.rb +33 -0
- data/lib/browser/device/surface.rb +2 -4
- data/lib/browser/device/switch.rb +19 -0
- data/lib/browser/device/tv.rb +1 -1
- data/lib/browser/device/unknown.rb +1 -1
- data/lib/browser/device/wii.rb +1 -1
- data/lib/browser/device/wiiu.rb +1 -1
- data/lib/browser/device/xbox_360.rb +1 -1
- data/lib/browser/device/xbox_one.rb +1 -1
- data/lib/browser/device.rb +47 -30
- data/lib/browser/duck_duck_go.rb +22 -0
- data/lib/browser/edge.rb +6 -2
- data/lib/browser/electron.rb +2 -2
- data/lib/browser/facebook.rb +4 -2
- data/lib/browser/firefox.rb +2 -2
- data/lib/browser/google_search_app.rb +21 -0
- data/lib/browser/huawei_browser.rb +21 -0
- data/lib/browser/instagram.rb +21 -0
- data/lib/browser/internet_explorer.rb +9 -10
- data/lib/browser/maxthon.rb +21 -0
- data/lib/browser/meta/base.rb +0 -1
- data/lib/browser/meta/generic_browser.rb +1 -3
- data/lib/browser/meta.rb +12 -13
- data/lib/browser/micro_messenger.rb +2 -2
- data/lib/browser/middleware/context/additions.rb +1 -1
- data/lib/browser/middleware.rb +4 -3
- data/lib/browser/miui_browser.rb +21 -0
- data/lib/browser/nokia.rb +2 -2
- data/lib/browser/opera.rb +2 -2
- data/lib/browser/otter.rb +2 -2
- data/lib/browser/phantom_js.rb +2 -2
- data/lib/browser/platform/adobe_air.rb +2 -2
- data/lib/browser/platform/android.rb +1 -1
- data/lib/browser/platform/base.rb +3 -2
- data/lib/browser/platform/blackberry.rb +2 -2
- data/lib/browser/platform/chrome_os.rb +1 -1
- data/lib/browser/platform/firefox_os.rb +1 -1
- data/lib/browser/platform/ios.rb +17 -4
- data/lib/browser/platform/kai_os.rb +23 -0
- data/lib/browser/platform/linux.rb +1 -1
- data/lib/browser/platform/mac.rb +5 -3
- data/lib/browser/platform/{other.rb → unknown.rb} +3 -3
- data/lib/browser/platform/windows.rb +2 -2
- data/lib/browser/platform/windows_mobile.rb +1 -1
- data/lib/browser/platform/windows_phone.rb +1 -1
- data/lib/browser/platform.rb +37 -28
- data/lib/browser/qq.rb +5 -5
- data/lib/browser/rails.rb +11 -5
- data/lib/browser/safari.rb +19 -4
- data/lib/browser/samsung_browser.rb +21 -0
- data/lib/browser/snapchat.rb +21 -0
- data/lib/browser/sougou_browser.rb +24 -0
- data/lib/browser/sputnik.rb +21 -0
- data/lib/browser/uc_browser.rb +2 -2
- data/lib/browser/{generic.rb → unknown.rb} +6 -8
- data/lib/browser/version.rb +1 -1
- data/lib/browser/weibo.rb +2 -2
- data/lib/browser/yandex.rb +21 -0
- data/lib/browser.rb +2 -2
- data/samsung.yml +138 -0
- data/search_engines.yml +2 -2
- data/test/browser_test.rb +42 -10
- data/test/rails_test.rb +10 -0
- data/test/sample_app.rb +14 -0
- data/test/test_helper.rb +9 -1
- data/test/ua.yml +147 -109
- data/test/ua_bots.yml +98 -45
- data/test/ua_search_engines.yml +7 -6
- data/test/unit/accept_language_test.rb +24 -0
- data/test/unit/adobe_air_test.rb +1 -1
- data/test/unit/alipay_test.rb +6 -0
- data/test/unit/blackberry_test.rb +0 -6
- data/test/unit/bots_test.rb +37 -27
- data/test/unit/chrome_test.rb +8 -19
- data/test/unit/console_test.rb +2 -2
- data/test/unit/device_test.rb +60 -3
- data/test/unit/duck_duck_go_test.rb +37 -0
- data/test/unit/edge_test.rb +49 -5
- data/test/unit/facebook_test.rb +20 -0
- data/test/unit/firefox_test.rb +0 -3
- data/test/unit/google_search_app_test.rb +54 -0
- data/test/unit/huawei_browser_test.rb +25 -0
- data/test/unit/instagram_test.rb +30 -0
- data/test/unit/internet_explorer_test.rb +0 -12
- data/test/unit/ios_test.rb +7 -5
- data/test/unit/kai_os_test.rb +31 -0
- data/test/unit/kindle_test.rb +0 -2
- data/test/unit/maxthon_test.rb +25 -0
- data/test/unit/meta_test.rb +10 -2
- data/test/unit/micro_messenger_test.rb +21 -6
- data/test/unit/miui_browser_test.rb +25 -0
- data/test/unit/opera_test.rb +1 -2
- data/test/unit/platform_test.rb +34 -8
- data/test/unit/qq_test.rb +12 -0
- data/test/unit/safari_test.rb +12 -7
- data/test/unit/samsung_browser_test.rb +23 -0
- data/test/unit/snapchat_test.rb +40 -0
- data/test/unit/sougou_browser_test.rb +41 -0
- data/test/unit/sputnik_test.rb +22 -0
- data/test/unit/yandex_test.rb +37 -0
- metadata +83 -26
- data/.bundle/config +0 -2
- data/.travis.yml +0 -16
- data/bin/rake +0 -17
- data/gemfiles/rails4.gemfile +0 -4
- data/lib/browser/meta/modern.rb +0 -11
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Browser
|
|
4
|
+
class SougouBrowser < Base
|
|
5
|
+
def id
|
|
6
|
+
:sougou_browser
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def name
|
|
10
|
+
"Sougou Browser"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# We can't get the real version on desktop device from the ua string
|
|
14
|
+
def full_version
|
|
15
|
+
ua[%r{(?:SogouMobileBrowser)/([\d.]+)}, 1] || "0.0"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# SogouMobileBrowser for mobile device
|
|
19
|
+
# SE for desktop device
|
|
20
|
+
def match?
|
|
21
|
+
ua.match?(/SogouMobileBrowser/i) || ua.match?(/\bSE\b/)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Browser
|
|
4
|
+
class Sputnik < Base
|
|
5
|
+
def id
|
|
6
|
+
:sputnik
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def name
|
|
10
|
+
"Sputnik"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def full_version
|
|
14
|
+
ua[%r{SputnikBrowser/([\d.]+)}, 1] || "0.0"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def match?
|
|
18
|
+
ua.include?("SputnikBrowser")
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
data/lib/browser/uc_browser.rb
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
module Browser
|
|
4
|
-
class
|
|
4
|
+
class Unknown < Base
|
|
5
5
|
NAMES = {
|
|
6
6
|
"QuickTime" => "QuickTime",
|
|
7
7
|
"CoreMedia" => "Apple CoreMedia"
|
|
8
8
|
}.freeze
|
|
9
9
|
|
|
10
10
|
def id
|
|
11
|
-
:
|
|
11
|
+
:unknown_browser
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
def name
|
|
15
|
-
infer_name || "
|
|
15
|
+
infer_name || "Unknown Browser"
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
def full_version
|
|
19
|
-
ua[%r
|
|
20
|
-
ua[
|
|
19
|
+
ua[%r{(?:QuickTime)/([\d.]+)}, 1] ||
|
|
20
|
+
ua[/CoreMedia v([\d.]+)/, 1] ||
|
|
21
21
|
"0.0"
|
|
22
22
|
end
|
|
23
23
|
|
|
@@ -25,9 +25,7 @@ module Browser
|
|
|
25
25
|
true
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
private
|
|
29
|
-
|
|
30
|
-
def infer_name
|
|
28
|
+
private def infer_name
|
|
31
29
|
(NAMES.find {|key, _| ua.include?(key) } || []).last
|
|
32
30
|
end
|
|
33
31
|
end
|
data/lib/browser/version.rb
CHANGED
data/lib/browser/weibo.rb
CHANGED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Browser
|
|
4
|
+
class Yandex < Base
|
|
5
|
+
def id
|
|
6
|
+
:yandex
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def name
|
|
10
|
+
"Yandex"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def full_version
|
|
14
|
+
ua[%r{YaBrowser/([\d.]+)}, 1] || "0.0"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def match?
|
|
18
|
+
ua.include?("YaBrowser")
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
data/lib/browser.rb
CHANGED
data/samsung.yml
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# Source: https://en.wikipedia.org/wiki/Samsung_Galaxy
|
|
2
|
+
SM-G900H: Galaxy S5 Exynos
|
|
3
|
+
SM-A320FL: Galaxy A3
|
|
4
|
+
SM-G780F: Galaxy S20 Fan Edition
|
|
5
|
+
SM-G781B: Galaxy S20 Fan Edition
|
|
6
|
+
SM-F196B: Galaxy Z Fold2 5G
|
|
7
|
+
SM-G928A: Galaxy S6 Edge+
|
|
8
|
+
SM-G928AZ: Galaxy S6 Edge+
|
|
9
|
+
SM-G928D: Galaxy S6 Edge+
|
|
10
|
+
SM-G928F: Galaxy S6 Edge+
|
|
11
|
+
SM-G928FD: Galaxy S6 Edge+
|
|
12
|
+
SM-G928I: Galaxy S6 Edge+
|
|
13
|
+
SM-G928K: Galaxy S6 Edge+
|
|
14
|
+
SM-G928L: Galaxy S6 Edge+
|
|
15
|
+
SM-G928P: Galaxy S6 Edge+
|
|
16
|
+
SM-G928PZ: Galaxy S6 Edge+
|
|
17
|
+
SM-G928R4: Galaxy S6 Edge+
|
|
18
|
+
SM-G928R7: Galaxy S6 Edge+
|
|
19
|
+
SM-G928S: Galaxy S6 Edge+
|
|
20
|
+
SM-G928T: Galaxy S6 Edge+
|
|
21
|
+
SM-G928T1: Galaxy S6 Edge+
|
|
22
|
+
SM-G928TR: Galaxy S6 Edge+
|
|
23
|
+
SM-G928V: Galaxy S6 Edge+
|
|
24
|
+
SM-G9280: Galaxy S6 Edge+
|
|
25
|
+
SM-G9288: Galaxy S6 Edge+
|
|
26
|
+
SM-G9289: Galaxy S6 Edge+
|
|
27
|
+
SM-A8000: Galaxy A8
|
|
28
|
+
SM-A800F: Galaxy A8
|
|
29
|
+
SM-A800I: Galaxy A8
|
|
30
|
+
SM-A800S: Galaxy A8
|
|
31
|
+
SM-A800Y: Galaxy A8
|
|
32
|
+
SM-N9200: Galaxy Note 5
|
|
33
|
+
SM-N920C: Galaxy Note 5
|
|
34
|
+
SM-N920T: Galaxy Note 5
|
|
35
|
+
SM-N920A: Galaxy Note 5
|
|
36
|
+
SM-N920I: Galaxy Note 5
|
|
37
|
+
SM-N9208: Galaxy Note 5
|
|
38
|
+
SM-G903FP: Galaxy S5 Neo
|
|
39
|
+
SM-G903WP: Galaxy S5 Neo
|
|
40
|
+
SM-G925A: Galaxy S6 Edge
|
|
41
|
+
SM-G925AZ: Galaxy S6 Edge
|
|
42
|
+
SM-G925F: Galaxy S6 Edge
|
|
43
|
+
SM-G925I: Galaxy S6 Edge
|
|
44
|
+
SM-G925K: Galaxy S6 Edge
|
|
45
|
+
SM-G925L: Galaxy S6 Edge
|
|
46
|
+
SM-G925P: Galaxy S6 Edge
|
|
47
|
+
SM-G925PZ: Galaxy S6 Edge
|
|
48
|
+
SM-G925R4: Galaxy S6 Edge
|
|
49
|
+
SM-G925R7: Galaxy S6 Edge
|
|
50
|
+
SM-G925S: Galaxy S6 Edge
|
|
51
|
+
SM-G925T: Galaxy S6 Edge
|
|
52
|
+
SM-G925T1: Galaxy S6 Edge
|
|
53
|
+
SM-G925TR: Galaxy S6 Edge
|
|
54
|
+
SM-G925V: Galaxy S6 Edge
|
|
55
|
+
SM-G9250: Galaxy S6 Edge
|
|
56
|
+
SM-G9258: Galaxy S6 Edge
|
|
57
|
+
SM-G9259: Galaxy S6 Edge
|
|
58
|
+
SM-G920A: Galaxy S6
|
|
59
|
+
SM-G920AZ: Galaxy S6
|
|
60
|
+
SM-G920D: Galaxy S6
|
|
61
|
+
SM-G920F: Galaxy S6
|
|
62
|
+
SM-G920FD: Galaxy S6
|
|
63
|
+
SM-G920I: Galaxy S6
|
|
64
|
+
SM-G920K: Galaxy S6
|
|
65
|
+
SM-G920L: Galaxy S6
|
|
66
|
+
SM-G920P: Galaxy S6
|
|
67
|
+
SM-G920PZ: Galaxy S6
|
|
68
|
+
SM-G920R4: Galaxy S6
|
|
69
|
+
SM-G920R7: Galaxy S6
|
|
70
|
+
SM-G920S: Galaxy S6
|
|
71
|
+
SM-G920T: Galaxy S6
|
|
72
|
+
SM-G920T1: Galaxy S6
|
|
73
|
+
SM-G920TR: Galaxy S6
|
|
74
|
+
SM-G920V: Galaxy S6
|
|
75
|
+
SM-G9200: Galaxy S6
|
|
76
|
+
SM-G9208: Galaxy S6
|
|
77
|
+
SM-G9209: Galaxy S6
|
|
78
|
+
SM-A700F: Galaxy A7
|
|
79
|
+
SM-A700FD: Galaxy A7
|
|
80
|
+
SM-A700FQ: Galaxy A7
|
|
81
|
+
SM-A700H: Galaxy A7
|
|
82
|
+
SM-A700K: Galaxy A7
|
|
83
|
+
SM-A700L: Galaxy A7
|
|
84
|
+
SM-A700M: Galaxy A7
|
|
85
|
+
SM-A700S: Galaxy A7
|
|
86
|
+
SM-A700X: Galaxy A7
|
|
87
|
+
SM-A700YD: Galaxy A7
|
|
88
|
+
SM-A700YZ: Galaxy A7
|
|
89
|
+
SM-A7000: Galaxy A7
|
|
90
|
+
SM-A7009: Galaxy A7
|
|
91
|
+
SM-A7009W: Galaxy A7
|
|
92
|
+
SM-G530BT: Galaxy Grand Prime
|
|
93
|
+
SM-G530F: Galaxy Grand Prime
|
|
94
|
+
SM-G530FQ: Galaxy Grand Prime
|
|
95
|
+
SM-G530FZ: Galaxy Grand Prime
|
|
96
|
+
SM-G530H: Galaxy Grand Prime
|
|
97
|
+
SM-G530M: Galaxy Grand Prime
|
|
98
|
+
SM-G530MU: Galaxy Grand Prime
|
|
99
|
+
SM-G530P: Galaxy Grand Prime
|
|
100
|
+
SM-G530R4: Galaxy Grand Prime
|
|
101
|
+
SM-G530R7: Galaxy Grand Prime
|
|
102
|
+
SM-G530T: Galaxy Grand Prime
|
|
103
|
+
SM-G530W: Galaxy Grand Prime
|
|
104
|
+
SM-G530Y: Galaxy Grand Prime
|
|
105
|
+
SM-G5306W: Galaxy Grand Prime
|
|
106
|
+
SM-G5308W: Galaxy Grand Prime
|
|
107
|
+
SM-G5309W: Galaxy Grand Prime
|
|
108
|
+
SM-J7109: Galaxy J7
|
|
109
|
+
SM-J710F: Galaxy J7
|
|
110
|
+
SM-J710FN: Galaxy J7
|
|
111
|
+
SM-J710H: Galaxy J7
|
|
112
|
+
SM-J710MN: Galaxy J7
|
|
113
|
+
SM-J710FQ: Galaxy J7
|
|
114
|
+
SM-J710K: Galaxy J7
|
|
115
|
+
SM-J710K: Galaxy J7
|
|
116
|
+
SM-J710GN: Galaxy J7
|
|
117
|
+
SM-J5109: Galaxy J5
|
|
118
|
+
SM-J510F: Galaxy J5
|
|
119
|
+
SM-J510FN: Galaxy J5
|
|
120
|
+
SM-J510H: Galaxy J5
|
|
121
|
+
SM-J510G: Galaxy J5
|
|
122
|
+
SM-J510MN: Galaxy J5
|
|
123
|
+
SM-J510Y: Galaxy J5
|
|
124
|
+
SM-J5108: Galaxy J5
|
|
125
|
+
SM-J510K: Galaxy J5
|
|
126
|
+
SM-J510L: Galaxy J5
|
|
127
|
+
SM-J510S: Galaxy J5
|
|
128
|
+
SM-J510UN: Galaxy J5
|
|
129
|
+
SM-G570F: Galaxy J2 Prime
|
|
130
|
+
SM-G570M: Galaxy J2 Prime
|
|
131
|
+
SM-G532F: Galaxy J2 Prime
|
|
132
|
+
SM-G532M: Galaxy J2 Prime
|
|
133
|
+
SM-G532G: Galaxy J2 Prime
|
|
134
|
+
SM-G610F: Galaxy J7 Prime
|
|
135
|
+
SM-G610M: Galaxy J7 Prime
|
|
136
|
+
SM-G975F: Galaxy S10+
|
|
137
|
+
SM-G960F: Galaxy S9
|
|
138
|
+
SM-F700F: Galaxy Z Flip
|
data/search_engines.yml
CHANGED
data/test/browser_test.rb
CHANGED
|
@@ -39,7 +39,6 @@ class BrowserTest < Minitest::Test
|
|
|
39
39
|
assert browser.platform.android?
|
|
40
40
|
assert browser.safari?
|
|
41
41
|
assert browser.webkit?
|
|
42
|
-
assert browser.modern?
|
|
43
42
|
assert_equal "3.1.2", browser.full_version
|
|
44
43
|
assert_equal "3", browser.version
|
|
45
44
|
end
|
|
@@ -51,7 +50,6 @@ class BrowserTest < Minitest::Test
|
|
|
51
50
|
assert browser.platform.android?
|
|
52
51
|
assert browser.safari?
|
|
53
52
|
assert browser.webkit?
|
|
54
|
-
assert browser.modern?
|
|
55
53
|
assert_equal "4.0", browser.full_version
|
|
56
54
|
assert_equal "4", browser.version
|
|
57
55
|
end
|
|
@@ -62,7 +60,6 @@ class BrowserTest < Minitest::Test
|
|
|
62
60
|
assert_equal "Internet Explorer", browser.name
|
|
63
61
|
assert browser.device.surface?
|
|
64
62
|
assert browser.ie?
|
|
65
|
-
assert browser.modern?
|
|
66
63
|
assert_equal "10.0", browser.full_version
|
|
67
64
|
assert_equal "10", browser.version
|
|
68
65
|
end
|
|
@@ -93,7 +90,6 @@ class BrowserTest < Minitest::Test
|
|
|
93
90
|
assert_equal "PhantomJS", browser.name
|
|
94
91
|
assert_equal :phantom_js, browser.id
|
|
95
92
|
assert browser.phantom_js?
|
|
96
|
-
assert browser.modern?
|
|
97
93
|
assert_equal "1.9.0", browser.full_version
|
|
98
94
|
assert_equal "1", browser.version
|
|
99
95
|
assert browser.phantom_js?(%w[>=1 <2])
|
|
@@ -105,14 +101,18 @@ class BrowserTest < Minitest::Test
|
|
|
105
101
|
assert_equal "0", browser.version
|
|
106
102
|
end
|
|
107
103
|
|
|
108
|
-
test "
|
|
109
|
-
browser = Browser.new("
|
|
110
|
-
|
|
104
|
+
test "ignores malformed strings when comparing versions" do
|
|
105
|
+
browser = Browser.new("Chrome/65.0.3325.99.FreeBrowser.3.0.5")
|
|
106
|
+
refute browser.chrome?(">=65")
|
|
111
107
|
end
|
|
112
108
|
|
|
113
|
-
test "detects unknown
|
|
109
|
+
test "detects unknown browser" do
|
|
114
110
|
browser = Browser.new("Unknown")
|
|
115
|
-
|
|
111
|
+
|
|
112
|
+
assert browser.unknown?
|
|
113
|
+
refute browser.known?
|
|
114
|
+
assert_equal :unknown_browser, browser.id
|
|
115
|
+
assert_equal "Unknown Browser", browser.name
|
|
116
116
|
end
|
|
117
117
|
|
|
118
118
|
test "returns empty language set for missing accept language" do
|
|
@@ -132,7 +132,7 @@ class BrowserTest < Minitest::Test
|
|
|
132
132
|
browser = Browser.new("", accept_language: accept_language)
|
|
133
133
|
languages = browser.accept_language.map(&:full)
|
|
134
134
|
|
|
135
|
-
assert_equal [
|
|
135
|
+
assert_equal %w[en-US en pt-BR pt], languages
|
|
136
136
|
end
|
|
137
137
|
|
|
138
138
|
test "removes duplicate items" do
|
|
@@ -154,4 +154,36 @@ class BrowserTest < Minitest::Test
|
|
|
154
154
|
browser = Browser.new("Fancy new browser")
|
|
155
155
|
refute browser.known?
|
|
156
156
|
end
|
|
157
|
+
|
|
158
|
+
test "rejects user agent larger than 2048 bytes" do
|
|
159
|
+
message = "user_agent cannot be larger than 2048 bytes; actual size is " \
|
|
160
|
+
"2049 bytes"
|
|
161
|
+
|
|
162
|
+
error =
|
|
163
|
+
begin
|
|
164
|
+
Browser.new("a" * 2049)
|
|
165
|
+
nil
|
|
166
|
+
rescue Browser::Error => error
|
|
167
|
+
error
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
refute_nil error
|
|
171
|
+
assert_equal message, error.message
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
test "rejects accept language larger than 2048 bytes" do
|
|
175
|
+
message = "accept_language cannot be larger than 2048 bytes; actual size " \
|
|
176
|
+
"is 2049 bytes"
|
|
177
|
+
|
|
178
|
+
error =
|
|
179
|
+
begin
|
|
180
|
+
Browser.new("Chrome", accept_language: "a" * 2049).accept_language
|
|
181
|
+
nil
|
|
182
|
+
rescue Browser::Error => error
|
|
183
|
+
error
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
refute_nil error
|
|
187
|
+
assert_equal message, error.message
|
|
188
|
+
end
|
|
157
189
|
end
|
data/test/rails_test.rb
CHANGED
|
@@ -19,4 +19,14 @@ class RailsTest < Minitest::Test
|
|
|
19
19
|
assert_equal 200, last_response.status
|
|
20
20
|
assert_equal "Chrome:en-US", last_response.body
|
|
21
21
|
end
|
|
22
|
+
|
|
23
|
+
test "renders json" do
|
|
24
|
+
get "/api/pages", {}, "HTTP_USER_AGENT" => Browser["COMMONCRAWL"],
|
|
25
|
+
"HTTP_ACCEPT" => "application/json",
|
|
26
|
+
"HTTP_ACCEPT_LANGUAGE" => "en-US;q=0.8"
|
|
27
|
+
|
|
28
|
+
assert_equal 200, last_response.status
|
|
29
|
+
assert_equal true, JSON.parse(last_response.body)["isBot"]
|
|
30
|
+
assert_equal "en-US", JSON.parse(last_response.body)["acceptLanguages"][0]
|
|
31
|
+
end
|
|
22
32
|
end
|
data/test/sample_app.rb
CHANGED
|
@@ -9,12 +9,24 @@ class PagesController < ActionController::Base
|
|
|
9
9
|
end
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
+
class PotsController < ActionController::API
|
|
13
|
+
def index
|
|
14
|
+
render json: {
|
|
15
|
+
isBot: browser.bot?,
|
|
16
|
+
acceptLanguages: browser.accept_language.map(&:full)
|
|
17
|
+
}
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
12
21
|
class SampleApp < Rails::Application
|
|
13
22
|
config.secret_token = "99f19f08db7a37bdcb9d6701f54dca"
|
|
14
23
|
config.secret_key_base = "99f19f08db7a37bdcb9d6701f54dca"
|
|
15
24
|
config.eager_load = true
|
|
16
25
|
config.active_support.deprecation = :log
|
|
17
26
|
|
|
27
|
+
# Introduced by Rails 6.
|
|
28
|
+
config.hosts << "example.org" if config.respond_to?(:hosts)
|
|
29
|
+
|
|
18
30
|
routes.append do
|
|
19
31
|
default_headers = {"Content-Type" => "text/html"}
|
|
20
32
|
|
|
@@ -29,6 +41,8 @@ class SampleApp < Rails::Application
|
|
|
29
41
|
}
|
|
30
42
|
|
|
31
43
|
get "/home", to: "pages#home"
|
|
44
|
+
|
|
45
|
+
get "/api/pages", to: "pots#index"
|
|
32
46
|
end
|
|
33
47
|
|
|
34
48
|
config.middleware.use Browser::Middleware do
|
data/test/test_helper.rb
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
require "simplecov"
|
|
4
4
|
SimpleCov.start
|
|
5
5
|
|
|
6
|
-
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("
|
|
6
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
|
|
7
7
|
require "bundler/setup"
|
|
8
8
|
require "minitest/autorun"
|
|
9
9
|
require "minitest/utils"
|
|
@@ -24,3 +24,11 @@ module Minitest
|
|
|
24
24
|
end
|
|
25
25
|
end
|
|
26
26
|
end
|
|
27
|
+
|
|
28
|
+
# Override Browser::Base#warn, so we don't output deprecation messages.
|
|
29
|
+
module Browser
|
|
30
|
+
class Base
|
|
31
|
+
def warn(*)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|