user_agent_sanitizer 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +11 -1
- data/Rakefile +0 -3
- data/lib/user_agent_sanitizer.rb +107 -45
- data/spec/user_agent_sanitizer_spec.rb +53 -40
- data/user_agent_sanitizer.gemspec +1 -1
- metadata +1 -1
data/README.md
CHANGED
@@ -8,10 +8,20 @@ Example:
|
|
8
8
|
require 'user_agent_sanitizer'
|
9
9
|
|
10
10
|
UserAgentSanitizer.sanitize_user_agent('Mozilla/5.0 (iPhone; CPU iPhone OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A405 Safari/7534.48.3')
|
11
|
-
# => 'iPhone'
|
11
|
+
# => 'Apple iPhone'
|
12
12
|
|
13
13
|
UserAgentSanitizer.sanitize_user_agent('Mozilla/5.0 (Linux; U; Android 2.3.3; nl-nl; SAMSUNG GT-I9100/I9100BUKE5 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1')
|
14
14
|
# => 'Samsung GT-I9100'
|
15
|
+
|
16
|
+
Since version 1.1.0, UserAgentSanitizer.user_agent is available:
|
17
|
+
|
18
|
+
ua = UserAgentSanitizer.user_agent('Mozilla/5.0 (iPhone; CPU iPhone OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A405 Safari/7534.48.3')
|
19
|
+
ua.brand
|
20
|
+
# => "Apple"
|
21
|
+
ua.model
|
22
|
+
# => "iPhone"
|
23
|
+
ua.to_s
|
24
|
+
# => "Apple iPhone"
|
15
25
|
|
16
26
|
Installation
|
17
27
|
------------
|
data/Rakefile
CHANGED
data/lib/user_agent_sanitizer.rb
CHANGED
@@ -1,62 +1,124 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
1
2
|
module UserAgentSanitizer
|
2
3
|
extend self
|
3
4
|
|
4
5
|
BRANDS=["nokia", "samsung", "SonyEricsson", "BlackBerry", "htc", "sec", 'gt', 'iphone']
|
5
6
|
|
7
|
+
# Return a human-readable string representation of the user agent
|
6
8
|
def sanitize_user_agent(string)
|
9
|
+
user_agent = user_agent(string)
|
10
|
+
return nil unless user_agent
|
11
|
+
user_agent.to_s
|
12
|
+
end
|
13
|
+
|
14
|
+
# Return the UserAgent wrapper for the user agent string
|
15
|
+
def user_agent(string)
|
7
16
|
string = string.to_s
|
8
17
|
return nil if string.empty?
|
9
|
-
|
10
|
-
result.gsub!(/^SAMSUNG/i, 'Samsung')
|
11
|
-
result.gsub!(/^GT/i, 'Samsung GT')
|
12
|
-
result.gsub!(/^Samsung GT\s+/i, 'Samsung GT-')
|
13
|
-
result.gsub!(/^Desire(_\w+)/i, 'HTC Desire')
|
14
|
-
result = "SonyEricsson #{$1}" if result =~ /^SonyEricsson(\w+)/i
|
15
|
-
result.strip!
|
16
|
-
result.squeeze!(" ")
|
17
|
-
result
|
18
|
+
UserAgent.new(string)
|
18
19
|
end
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
21
|
+
class UserAgent
|
22
|
+
attr_accessor :brand, :model, :user_agent
|
23
|
+
|
24
|
+
def initialize(user_agent)
|
25
|
+
@user_agent = user_agent.dup
|
26
|
+
end
|
27
|
+
|
28
|
+
def brand
|
29
|
+
parse! unless parsed?
|
30
|
+
@brand
|
31
|
+
end
|
32
|
+
|
33
|
+
def model
|
34
|
+
parse! unless parsed?
|
35
|
+
@model
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_s
|
39
|
+
"#{brand} #{model}".strip
|
40
|
+
end
|
41
|
+
|
42
|
+
protected
|
43
|
+
|
44
|
+
def parse!
|
45
|
+
return if @parsing
|
46
|
+
begin
|
47
|
+
@parsing = true
|
48
|
+
parse
|
49
|
+
ensure
|
50
|
+
@parsing = false
|
49
51
|
end
|
52
|
+
end
|
50
53
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
54
|
+
def parsed?
|
55
|
+
@parsed
|
56
|
+
end
|
57
|
+
|
58
|
+
def parse
|
59
|
+
result = self.basic_user_agent_recognizer
|
60
|
+
if result
|
61
|
+
result.gsub!(/^SAMSUNG/i, 'Samsung')
|
62
|
+
result.gsub!(/^GT/i, 'Samsung GT')
|
63
|
+
result.gsub!(/^Samsung GT\s+/i, 'Samsung GT-')
|
64
|
+
result.gsub!(/^Desire(_\w+)/i, 'HTC Desire')
|
65
|
+
result.gsub!(/^iPhone/i, 'Apple iPhone')
|
66
|
+
result = "SonyEricsson #{$1}" if result =~ /^SonyEricsson(\w+)/i
|
67
|
+
result.strip!
|
68
|
+
result.squeeze!(" ")
|
69
|
+
brand, *model_ary = *result.split(" ")
|
70
|
+
@brand ||= brand
|
71
|
+
@model ||= model_ary.join(" ")
|
55
72
|
end
|
73
|
+
self
|
74
|
+
end
|
56
75
|
|
57
|
-
|
58
|
-
|
59
|
-
|
76
|
+
def basic_user_agent_recognizer
|
77
|
+
string = @user_agent.dup
|
78
|
+
case string
|
79
|
+
when /(Mac OS X) (\d+_\d+_\d+)/
|
80
|
+
@brand = 'Apple'
|
81
|
+
@model = "#{$1} #{$2.gsub("_", ".")}"
|
82
|
+
return nil
|
83
|
+
when /(LG|sagem)[\-\/](\w+)/i
|
84
|
+
return "#{$1} #{$2}"
|
85
|
+
when /(MSIE) (\d+(\.\d+)*)/
|
86
|
+
@brand = 'Microsoft'
|
87
|
+
@model = "Internet Explorer #{$2}"
|
88
|
+
return nil
|
89
|
+
when /(Blackberry) ?(\d+)/i
|
90
|
+
return "#{$1} #{$2}"
|
91
|
+
when /(HTC)[_\/]([a-z0-9]+)?/i
|
92
|
+
return [$1, $2].compact.join(" ")
|
93
|
+
when /(Samsung)[\/\-]([a-z0-9]+)([\/\-]([a-z0-9]+))?/i
|
94
|
+
return ['Samsung', $2, $4].compact.join(" ")
|
95
|
+
when /\((Linux; U; Android.*)\)/
|
96
|
+
return $1.split(";").last.split("/").first.gsub(/build/i, "").strip
|
97
|
+
when /(iPod)/
|
98
|
+
@brand = 'Apple'
|
99
|
+
@model = 'iPod'
|
100
|
+
return nil
|
101
|
+
when /((#{BRANDS.join("|")}).*?)\//i
|
102
|
+
result=$1
|
103
|
+
|
104
|
+
result.gsub!(/build/i, "")
|
105
|
+
result.gsub!(/-1/, "")
|
106
|
+
result.gsub!(/-/, " ")
|
107
|
+
|
108
|
+
if result=~/(.+?);/
|
109
|
+
result = $1
|
110
|
+
end
|
111
|
+
|
112
|
+
if result=~/(\D+)([A-Z]+\d+)/
|
113
|
+
result="#{$1} #{$2}"
|
114
|
+
elsif result=~/(\D+)(\d+)/
|
115
|
+
result="#{$1} #{$2}"
|
116
|
+
end
|
117
|
+
|
118
|
+
return result
|
119
|
+
else
|
120
|
+
return string
|
121
|
+
end
|
60
122
|
end
|
61
123
|
end
|
62
124
|
end
|
@@ -3,50 +3,63 @@ require 'spec_helper'
|
|
3
3
|
require 'user_agent_sanitizer'
|
4
4
|
|
5
5
|
describe UserAgentSanitizer do
|
6
|
+
DEVICES = {
|
7
|
+
'BlackBerry8520/4.6.1.296 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/150' => ['BlackBerry', '8520'],
|
8
|
+
'BlackBerry8900/4.6.1.199 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/302' => ['BlackBerry', '8900'],
|
9
|
+
'LG-GD510/V100 Teleca/WAP2.0 Profile/MIDP-2.1 Configuration/CLDC-1.1' => ['LG', 'GD510'],
|
10
|
+
'LG/KU990/v10a Browser/Obigo-Q05A/3.6 MMS/LG-MMS-V1.0/1.2 Java/ASVM/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1' => ['LG','KU990'],
|
11
|
+
'Mozilla/5.0 (Linux; U; Android 2.1-update1; nl-nl; Desire_A8181 Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => ['HTC','Desire'],
|
12
|
+
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; GTB0.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30618)' => ['Microsoft','Internet Explorer 7.0'],
|
13
|
+
'Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; nl) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.246 Mobile Safari/534.1+' => ['BlackBerry','9800'],
|
14
|
+
'Mozilla/5.0 (iPhone; CPU iPhone OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A405 Safari/7534.48.3' => ['Apple','iPhone'],
|
15
|
+
'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_5 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8L1 Safari/6533.18.5' => ['Apple','iPhone'],
|
16
|
+
'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; nl-nl) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A102 Safari/419.3' => ['Apple','iPhone'],
|
17
|
+
'Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8F190 Safari/6533.18.5' => ['Apple','iPod'],
|
18
|
+
'Mozilla/5.0 (SAMSUNG; SAMSUNG-GT-S8500/S8500XXJEC; U; Bada/1.0; nl-nl) AppleWebKit/533.1 (KHTML, like Gecko) Dolfin/2.0 Mobile WVGA SMM-MMS/1.2.0 OPN-B' => ['Samsung','GT-S8500'],
|
19
|
+
'HTC_Touch2_T3333 Opera/9.50 (Windows NT 5.1; U; nl)' => ['HTC','Touch2'],
|
20
|
+
'Mozilla/5.0 (Linux; U; Android 1.5; en-gb; HTC Magic Build/CRB17) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1' => ['HTC','Magic'],
|
21
|
+
'Mozilla/5.0 (Linux; U; Android 1.5; nl-nl; GT-I5700 Build/CUPCAKE) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1' => ['Samsung','GT-I5700'],
|
22
|
+
'Mozilla/5.0 (Linux; U; Android 2.1; nl-nl; HTC Legend Build/ERD79) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => ['HTC','Legend'],
|
23
|
+
'Mozilla/5.0 (Linux; U; Android 2.2.1; es-es; Vodafone 858 Build/Vodafone858C02B617) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => ['Vodafone','858'],
|
24
|
+
'Mozilla/5.0 (Linux; U; Android 2.2; es-es; Light Pro Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => ['Light','Pro'],
|
25
|
+
'Mozilla/5.0 (Linux; U; Android 2.2; nl-nl; HTC_DesireZ_A7272 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => ['HTC','DesireZ'],
|
26
|
+
'Mozilla/5.0 (Linux; U; Android 2.3.3; nl-nl; GT-I9100 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => ['Samsung','GT-I9100'],
|
27
|
+
'Mozilla/5.0 (Linux; U; Android 2.3.3; nl-nl; HTC/DesireS/1.32.161.2 Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => ['HTC','DesireS'],
|
28
|
+
'Mozilla/5.0 (Linux; U; Android 2.3.3; nl-nl; SAMSUNG GT-I9100/I9100BUKE5 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => ['Samsung','GT-I9100'],
|
29
|
+
'Mozilla/5.0 (Linux; U; Android 2.3.5; es-es; ZTE Skate Build/V1.0.0B03) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => ['ZTE','Skate'],
|
30
|
+
'Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; Nexus One Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => ['Nexus','One'],
|
31
|
+
'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; nl-nl) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1' => ['Apple','Mac OS X 10.5.5'],
|
32
|
+
'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-us) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10' => ['Apple','Mac OS X 10.6.2'],
|
33
|
+
'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaE90-1/07.24.0.3; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => ['Nokia','E90'],
|
34
|
+
'Mozilla/5.0 (SymbianOS/9.3; U; Series60/3.2 NokiaE75-1/110.48.125 Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => ['Nokia','E75'],
|
35
|
+
'Mozilla/5.0 (SymbianOS/9.4; U; Series60/5.0 Samsung/I8910; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 Safari/525' => ['Samsung','I8910'],
|
36
|
+
'Opera/9.80 (BlackBerry; Opera Mini/5.1.22303/24.871; U; pt) Presto/2.5.25 Version/10.54' => ['BlackBerry', ''],
|
37
|
+
'SAGEM-my411C/1.0/ MIDP-2.0 Configuration/CLDC-1.1 Browser/UP.Browser/7.2.6.c.1.386 (GUI)' => ['SAGEM','my411C'],
|
38
|
+
'SAMSUNG-GT-C3510/C3510XXIL4 NetFront/3.5 Profile/MIDP-2.0 Configuration/CLDC-1.1' => ['Samsung','GT-C3510'],
|
39
|
+
'SAMSUNG-SGH-L600/L600ASGI3 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Browser/6.2.3.3.c.1.101 (GUI) MMP/2.0' => ['Samsung','SGH L600'],
|
40
|
+
'SEC-SGHM620/1.0 Openwave/6.2.3 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Browser/6.2.3.3.c.1.101 (GUI) MMP/2.0' => ['SEC','SGH M620'],
|
41
|
+
'SonyEricssonW995/R1FA Browser/NetFront/3.4 Profile/MIDP-2.1 Configuration/CLDC-1.1 JavaPlatform/JP-8.4.3' => ['SonyEricsson','W995'],
|
42
|
+
'Mozilla/5.0 (Linux; U; Android 1.6; nl-nl; SonyEricssonX10i Build/R1FA016) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1' => ['SonyEricsson','X10i'],
|
43
|
+
}
|
6
44
|
describe "sanitize_user_agent" do
|
7
|
-
|
8
|
-
|
9
|
-
'BlackBerry8900/4.6.1.199 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/302' => 'BlackBerry 8900',
|
10
|
-
'LG-GD510/V100 Teleca/WAP2.0 Profile/MIDP-2.1 Configuration/CLDC-1.1' => 'LG GD510',
|
11
|
-
'LG/KU990/v10a Browser/Obigo-Q05A/3.6 MMS/LG-MMS-V1.0/1.2 Java/ASVM/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1' => 'LG KU990',
|
12
|
-
'Mozilla/5.0 (Linux; U; Android 2.1-update1; nl-nl; Desire_A8181 Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => 'HTC Desire',
|
13
|
-
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; GTB0.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30618)' => 'MSIE 7.0',
|
14
|
-
'Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; nl) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.246 Mobile Safari/534.1+' => 'BlackBerry 9800',
|
15
|
-
'Mozilla/5.0 (iPhone; CPU iPhone OS 5_0_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A405 Safari/7534.48.3' => 'iPhone',
|
16
|
-
'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_5 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8L1 Safari/6533.18.5' => 'iPhone',
|
17
|
-
'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; nl-nl) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A102 Safari/419.3' => 'iPhone',
|
18
|
-
'Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8F190 Safari/6533.18.5' => 'iPod',
|
19
|
-
'Mozilla/5.0 (SAMSUNG; SAMSUNG-GT-S8500/S8500XXJEC; U; Bada/1.0; nl-nl) AppleWebKit/533.1 (KHTML, like Gecko) Dolfin/2.0 Mobile WVGA SMM-MMS/1.2.0 OPN-B' => 'Samsung GT-S8500',
|
20
|
-
'HTC_Touch2_T3333 Opera/9.50 (Windows NT 5.1; U; nl)' => 'HTC Touch2',
|
21
|
-
'Mozilla/5.0 (Linux; U; Android 1.5; en-gb; HTC Magic Build/CRB17) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1' => 'HTC Magic',
|
22
|
-
'Mozilla/5.0 (Linux; U; Android 1.5; nl-nl; GT-I5700 Build/CUPCAKE) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1' => 'Samsung GT-I5700',
|
23
|
-
'Mozilla/5.0 (Linux; U; Android 2.1; nl-nl; HTC Legend Build/ERD79) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' => 'HTC Legend',
|
24
|
-
'Mozilla/5.0 (Linux; U; Android 2.2.1; es-es; Vodafone 858 Build/Vodafone858C02B617) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => 'Vodafone 858',
|
25
|
-
'Mozilla/5.0 (Linux; U; Android 2.2; es-es; Light Pro Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => 'Light Pro',
|
26
|
-
'Mozilla/5.0 (Linux; U; Android 2.2; nl-nl; HTC_DesireZ_A7272 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => 'HTC DesireZ',
|
27
|
-
'Mozilla/5.0 (Linux; U; Android 2.3.3; nl-nl; GT-I9100 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => 'Samsung GT-I9100',
|
28
|
-
'Mozilla/5.0 (Linux; U; Android 2.3.3; nl-nl; HTC/DesireS/1.32.161.2 Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => 'HTC DesireS',
|
29
|
-
'Mozilla/5.0 (Linux; U; Android 2.3.3; nl-nl; SAMSUNG GT-I9100/I9100BUKE5 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => 'Samsung GT-I9100',
|
30
|
-
'Mozilla/5.0 (Linux; U; Android 2.3.5; es-es; ZTE Skate Build/V1.0.0B03) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => 'ZTE Skate',
|
31
|
-
'Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; Nexus One Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' => 'Nexus One',
|
32
|
-
'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; nl-nl) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1' => 'Mac OS X 10.5.5',
|
33
|
-
'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-us) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10' => 'Mac OS X 10.6.2',
|
34
|
-
'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaE90-1/07.24.0.3; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => 'Nokia E90',
|
35
|
-
'Mozilla/5.0 (SymbianOS/9.3; U; Series60/3.2 NokiaE75-1/110.48.125 Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413' => 'Nokia E75',
|
36
|
-
'Mozilla/5.0 (SymbianOS/9.4; U; Series60/5.0 Samsung/I8910; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 Safari/525' => 'Samsung I8910',
|
37
|
-
'Opera/9.80 (BlackBerry; Opera Mini/5.1.22303/24.871; U; pt) Presto/2.5.25 Version/10.54' => 'BlackBerry',
|
38
|
-
'SAGEM-my411C/1.0/ MIDP-2.0 Configuration/CLDC-1.1 Browser/UP.Browser/7.2.6.c.1.386 (GUI)' => 'SAGEM my411C',
|
39
|
-
'SAMSUNG-GT-C3510/C3510XXIL4 NetFront/3.5 Profile/MIDP-2.0 Configuration/CLDC-1.1' => 'Samsung GT-C3510',
|
40
|
-
'SAMSUNG-SGH-L600/L600ASGI3 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Browser/6.2.3.3.c.1.101 (GUI) MMP/2.0' => 'Samsung SGH L600',
|
41
|
-
'SEC-SGHM620/1.0 Openwave/6.2.3 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Browser/6.2.3.3.c.1.101 (GUI) MMP/2.0' => 'SEC SGH M620',
|
42
|
-
'SonyEricssonW995/R1FA Browser/NetFront/3.4 Profile/MIDP-2.1 Configuration/CLDC-1.1 JavaPlatform/JP-8.4.3' => 'SonyEricsson W995',
|
43
|
-
'Mozilla/5.0 (Linux; U; Android 1.6; nl-nl; SonyEricssonX10i Build/R1FA016) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1' => 'SonyEricsson X10i',
|
44
|
-
'' => nil,
|
45
|
-
nil => nil,
|
46
|
-
}.each do |user_agent, device_name|
|
45
|
+
DEVICES.each do |user_agent, brand_model|
|
46
|
+
device_name = brand_model.join(" ").strip
|
47
47
|
it "should return #{device_name.inspect} for #{user_agent.inspect}" do
|
48
48
|
UserAgentSanitizer.sanitize_user_agent(user_agent).should == device_name
|
49
49
|
end
|
50
50
|
end
|
51
51
|
end
|
52
|
+
|
53
|
+
describe "user_agent" do
|
54
|
+
DEVICES.each do |user_agent, brand_model|
|
55
|
+
brand, model = *brand_model
|
56
|
+
it "should return brand #{brand.inspect} and model #{model.inspect} for #{user_agent.inspect}" do
|
57
|
+
ua=UserAgentSanitizer.user_agent(user_agent)
|
58
|
+
ua.to_s.should == brand_model.join(" ").strip
|
59
|
+
ua.brand.should == brand
|
60
|
+
ua.model.should == model
|
61
|
+
ua.user_agent.should == user_agent
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
52
65
|
end
|
@@ -3,7 +3,7 @@ Gem::Specification.new do |s|
|
|
3
3
|
s.name = 'user_agent_sanitizer'
|
4
4
|
s.summary = "Browser user agent sanitizer"
|
5
5
|
s.description = "Browser user agent sanitizer, with a focus on sanitizing mobile phone user agents to brand + model number"
|
6
|
-
s.version = '1.
|
6
|
+
s.version = '1.1.0'
|
7
7
|
s.date = '2002-06-15'
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
9
|
s.authors = ["Wes Oldenbeuving"]
|