burak / CPAN-Parse-HTTP-UserAgent
Parser for the User Agent string
Clone this repository (size: 159.9 KB): HTTPS / SSH
$ hg clone http://bitbucket.org/burak/cpan-parse-http-useragent/
| commit 94: | c87669421f04 |
| parent 93: | f6bdf7d0bb6b |
| branch: | default |
use meaningful constants
- View burak's profile
-
burak's public repos »
- CPAN-Padre-Plugin-HG
- CPAN-Net-Bitbucket
- CPAN-GD-SecurityImage
- CPAN-Lingua-TR-Numbers
- CPAN-Sys-Info-Driver-Windows
- CPAN-Task-Lingua-Any-Numbers
- CPAN-Time-Elapsed
- CPAN-Win32-ASP-CGI
- CPAN-Scalar-Util-Reftype
- CPAN-Parse-HTTP-UserAgent
- CPAN-Acme-CPANAuthors-Turkish
- CPAN-tools
- CPAN-Device-CableModem-Motorola-SB4200
- CPAN-Text-Template-Simple
- CPAN-CGI-Auth-Basic
- CPAN-GD-Thumbnail
- CPAN-Lingua-Any-Numbers
- CPAN-MP3-M3U-Parser
- CPAN-PHP-Session-DBI
- CPAN-Sys-Info
- CPAN-Sys-Info-Base
- CPAN-Sys-Info-Driver-BSD
- CPAN-Sys-Info-Driver-Linux
- CPAN-Sys-Info-Driver-Unknown
- CPAN-Test-Sys-Info
- Send message
6 months ago
Changed (Δ178 bytes):
raw changeset »
lib/Parse/HTTP/UserAgent.pm (3 lines added, 3 lines removed)
lib/Parse/HTTP/UserAgent/Base/IS.pm (17 lines added, 17 lines removed)
lib/Parse/HTTP/UserAgent/Base/Parsers.pm (18 lines added, 15 lines removed)
lib/Parse/HTTP/UserAgent/Constants.pm (8 lines added, 2 lines removed)
Up to file-list lib/Parse/HTTP/UserAgent.pm:
| … | … | @@ -81,7 +81,7 @@ sub _parse { |
81 |
81 |
|
82 |
82 |
sub _pre_parse { |
83 |
83 |
my $self = shift; |
84 |
$self->[IS_MAXTHON] = index(uc $self->[UA_STRING], 'MAXTHON') != |
|
84 |
$self->[IS_MAXTHON] = index(uc $self->[UA_STRING], 'MAXTHON') != NO_IMATCH; |
|
85 |
85 |
my $ua = $self->[UA_STRING]; |
86 |
86 |
my($moz, $thing, $extra, @others) = split RE_SPLIT_PARSE, $ua; |
87 |
87 |
$thing = $thing ? [ split RE_SC_WS, $thing ] : []; |
| … | … | @@ -96,7 +96,7 @@ sub _do_parse { |
96 |
96 |
|
97 |
97 |
if ( $c && shift @{$t} && ! $e && ! $self->[IS_MAXTHON] ) { |
98 |
98 |
my($n, $v) = split RE_WHITESPACE, $t->[0]; |
99 |
if ( $n eq 'MSIE' && index($m, q{ }) == |
|
99 |
if ( $n eq 'MSIE' && index($m, q{ }) == NO_IMATCH ) { |
|
100 |
100 |
return $self->_parse_msie($m, $t, $e, $n, $v); |
101 |
101 |
} |
102 |
102 |
} |
| … | … | @@ -200,7 +200,7 @@ sub _numify { |
200 |
200 |
}; |
201 |
201 |
# if version::vpp is used it'll identify 420 as a v-string |
202 |
202 |
# add a floating point to fool it |
203 |
$v .= q{.0} if index($v, q{.}) == |
|
203 |
$v .= q{.0} if index($v, q{.}) == NO_IMATCH; |
|
204 |
204 |
my $rv = version->new("$v")->numify; |
205 |
205 |
return $rv; |
206 |
206 |
} |
Up to file-list lib/Parse/HTTP/UserAgent/Base/IS.pm:
| … | … | @@ -9,7 +9,7 @@ use constant OPERA_FAKER_EXTRA_SIZE => 4 |
9 |
9 |
|
10 |
10 |
sub _is_opera_pre { |
11 |
11 |
my($self, $moz) = @_; |
12 |
return index( $moz, 'Opera') != |
|
12 |
return index( $moz, 'Opera') != NO_IMATCH; |
|
13 |
13 |
} |
14 |
14 |
|
15 |
15 |
sub _is_opera_post { |
| … | … | @@ -26,9 +26,9 @@ sub _is_safari { |
26 |
26 |
my($self, $extra, $others) = @_; |
27 |
27 |
my $str = $self->[UA_STRING]; |
28 |
28 |
# epiphany? |
29 |
return index( $str , 'Chrome' ) != MINUS_ONE ? 0 # faker |
|
30 |
: $extra && index( $extra->[0] , 'AppleWebKit' ) != MINUS_ONE ? 1 |
|
31 |
|
|
29 |
return index( $str , 'Chrome' ) != NO_IMATCH ? 0 # faker |
|
30 |
: $extra && index( $extra->[0] , 'AppleWebKit' ) != NO_IMATCH ? 1 |
|
31 |
: @{$others} && index( $others->[LAST_ELEMENT], 'Safari' ) != NO_IMATCH ? 1 |
|
32 |
32 |
: 0 |
33 |
33 |
; |
34 |
34 |
} |
| … | … | @@ -39,9 +39,9 @@ sub _is_chrome { |
39 |
39 |
my($chrome, $safari) = split RE_WHITESPACE, $chx; |
40 |
40 |
return if ! ( $chrome && $safari); |
41 |
41 |
|
42 |
return index( $chrome , 'Chrome' ) != MINUS_ONE && |
|
43 |
index( $safari , 'Safari' ) != MINUS_ONE && |
|
44 |
|
|
42 |
return index( $chrome , 'Chrome' ) != NO_IMATCH && |
|
43 |
index( $safari , 'Safari' ) != NO_IMATCH && |
|
44 |
( $extra && index( $extra->[0], 'AppleWebKit') != NO_IMATCH); |
|
45 |
45 |
} |
46 |
46 |
|
47 |
47 |
sub _is_ff { |
| … | … | @@ -55,7 +55,7 @@ sub _is_ff { |
55 |
55 |
} |
56 |
56 |
|
57 |
57 |
sub _is_gecko { |
58 |
return index(shift->[UA_STRING], 'Gecko/') != |
|
58 |
return index(shift->[UA_STRING], 'Gecko/') != NO_IMATCH; |
|
59 |
59 |
} |
60 |
60 |
|
61 |
61 |
sub _is_generic { #TODO: this is actually a parser |
| … | … | @@ -69,20 +69,20 @@ sub _is_generic { #TODO: this is actuall |
69 |
69 |
sub _is_netscape { |
70 |
70 |
my($self, $moz, $thing, $extra, $compatible, @others) = @_; |
71 |
71 |
|
72 |
my $rv = index($moz, 'Mozilla/') != MINUS_ONE && |
|
73 |
$moz ne 'Mozilla/4.0' && |
|
74 |
! $compatible && |
|
75 |
! $extra && |
|
76 |
! @others && |
|
77 |
$thing->[MINUS_ONE] ne 'Sun' && # hotjava |
|
78 |
|
|
72 |
my $rv = index($moz, 'Mozilla/') != NO_IMATCH && |
|
73 |
$moz ne 'Mozilla/4.0' && |
|
74 |
! $compatible && |
|
75 |
! $extra && |
|
76 |
! @others && |
|
77 |
$thing->[LAST_ELEMENT] ne 'Sun' && # hotjava |
|
78 |
index($thing->[0], 'http://') == NO_IMATCH # robot |
|
79 |
79 |
; |
80 |
80 |
return $rv; |
81 |
81 |
} |
82 |
82 |
|
83 |
83 |
sub _is_docomo { |
84 |
84 |
my($self, $moz) = @_; |
85 |
return index(lc $moz, 'docomo') != |
|
85 |
return index(lc $moz, 'docomo') != NO_IMATCH; |
|
86 |
86 |
} |
87 |
87 |
|
88 |
88 |
sub _is_strength { |
| … | … | @@ -97,7 +97,7 @@ sub _is_generic_bogus_ie { |
97 |
97 |
my($self, $extra) = @_; |
98 |
98 |
return $extra |
99 |
99 |
&& $extra->[0] |
100 |
&& index( $extra->[0], 'compatible' ) != |
|
100 |
&& index( $extra->[0], 'compatible' ) != NO_IMATCH |
|
101 |
101 |
&& $extra->[1] |
102 |
102 |
&& $extra->[1] eq 'MSIE'; |
103 |
103 |
} |
Up to file-list lib/Parse/HTTP/UserAgent/Base/Parsers.pm:
| … | … | @@ -69,8 +69,8 @@ sub _parse_maxthon { |
69 |
69 |
my @omap = grep { $_ } map { split RE_SC_WS_MULTI, $_ } @others; |
70 |
70 |
my($maxthon, $msie, @buf); |
71 |
71 |
foreach my $e ( @omap, @{$thing} ) { # $extra -> junk |
72 |
if ( index(uc $e, 'MAXTHON') != MINUS_ONE ) { $maxthon = $e; next; } |
|
73 |
if ( index(uc $e, 'MSIE' ) != MINUS_ONE ) { $msie = $e; next; } |
|
72 |
if ( index(uc $e, 'MAXTHON') != NO_IMATCH ) { $maxthon = $e; next; } |
|
73 |
if ( index(uc $e, 'MSIE' ) != NO_IMATCH ) { $msie = $e; next; } |
|
74 |
74 |
push @buf, $e; |
75 |
75 |
} |
76 |
76 |
|
| … | … | @@ -104,7 +104,7 @@ sub _parse_msie { |
104 |
104 |
my $junk = shift @{ $thing }; # already used |
105 |
105 |
my($extras,$dotnet) = $self->_extract_dotnet( $thing, $extra ); |
106 |
106 |
|
107 |
if ( @{$extras} == 2 && index( $extras->[1], 'Lunascape' ) != |
|
107 |
if ( @{$extras} == 2 && index( $extras->[1], 'Lunascape' ) != NO_IMATCH ) { |
|
108 |
108 |
($name, $version) = split RE_CHAR_SLASH_WS, pop @{ $extras }; |
109 |
109 |
} |
110 |
110 |
|
| … | … | @@ -139,14 +139,15 @@ sub _parse_firefox { |
139 |
139 |
sub _parse_safari { |
140 |
140 |
my($self, $moz, $thing, $extra, @others) = @_; |
141 |
141 |
my($version, @junk) = split RE_WHITESPACE, pop @others; |
142 |
my $ep = $version && index( lc($version), 'epiphany' ) != |
|
142 |
my $ep = $version && index( lc($version), 'epiphany' ) != NO_IMATCH; |
|
143 |
143 |
(undef, $version) = split RE_SLASH, $version; |
144 |
144 |
$self->[UA_NAME] = $ep ? 'Epiphany' : 'Safari'; |
145 |
145 |
$self->[UA_VERSION_RAW] = $version; |
146 |
146 |
$self->[UA_TOOLKIT] = [ split RE_SLASH, $extra->[0] ]; |
147 |
147 |
$self->[UA_LANG] = pop @{ $thing }; |
148 |
$self->[UA_OS] = length $thing->[MINUS_ONE] > 1 ? pop @{ $thing } |
|
149 |
: shift @{ $thing } |
|
148 |
$self->[UA_OS] = length $thing->[LAST_ELEMENT] > 1 |
|
149 |
? pop @{ $thing } |
|
150 |
: shift @{ $thing } |
|
150 |
151 |
; |
151 |
152 |
$self->[UA_DEVICE] = shift @{$thing} if $thing->[0] eq 'iPhone'; |
152 |
153 |
$self->[UA_EXTRAS] = [ @{$thing}, @others ]; |
| … | … | @@ -177,7 +178,7 @@ sub _parse_opera_pre { |
177 |
178 |
# opera 5,9 |
178 |
179 |
my($self, $moz, $thing, $extra) = @_; |
179 |
180 |
my($name, $version) = split RE_SLASH, $moz; |
180 |
my $faking_ff = index($thing->[ |
|
181 |
my $faking_ff = index($thing->[LAST_ELEMENT], 'rv:') != NO_IMATCH ? pop @{$thing} : 0; |
|
181 |
182 |
$self->[UA_NAME] = $name; |
182 |
183 |
$self->[UA_VERSION_RAW] = $version; |
183 |
184 |
my $ver = $self->_numify( $version ); |
| … | … | @@ -185,7 +186,7 @@ sub _parse_opera_pre { |
185 |
186 |
|
186 |
187 |
if ( $extra ) { |
187 |
188 |
# http://dev.opera.com/articles/view/opera-ua-string-changes/ |
188 |
my $swap = index($extra->[ |
|
189 |
my $swap = index($extra->[LAST_ELEMENT], 'Version/') != NO_IMATCH; # damned 10.0 beta |
|
189 |
190 |
($lang = $swap ? shift @{$extra} : pop @{$extra}) =~ tr/[]//d; |
190 |
191 |
if ( $swap ) { |
191 |
192 |
my $vjunk = pop @{$extra}; |
| … | … | @@ -201,8 +202,9 @@ sub _parse_opera_pre { |
201 |
202 |
} |
202 |
203 |
|
203 |
204 |
$self->[UA_LANG] = $lang; |
204 |
$self->[UA_OS] = $self->_is_strength($thing->[MINUS_ONE]) ? shift @{$thing} |
|
205 |
: pop @{$thing} |
|
205 |
$self->[UA_OS] = $self->_is_strength( $thing->[LAST_ELEMENT] ) |
|
206 |
? shift @{$thing} |
|
207 |
: pop @{$thing} |
|
206 |
208 |
; |
207 |
209 |
|
208 |
210 |
$self->[UA_EXTRAS] = [ @{ $thing }, ( $extra ? @{$extra} : () ) ]; |
| … | … | @@ -216,8 +218,9 @@ sub _parse_opera_post { |
216 |
218 |
$self->[UA_NAME] = shift @{$extra}; |
217 |
219 |
$self->[UA_VERSION_RAW] = shift @{$extra}; |
218 |
220 |
($self->[UA_LANG] = shift @{$extra} || q{}) =~ tr/[]//d; |
219 |
$self->[UA_OS] = $self->_is_strength($thing->[MINUS_ONE]) ? shift @{$thing} |
|
220 |
: pop @{$thing} |
|
221 |
$self->[UA_OS] = $self->_is_strength($thing->[LAST_ELEMENT]) |
|
222 |
? shift @{$thing} |
|
223 |
: pop @{$thing} |
|
221 |
224 |
; |
222 |
225 |
$self->[UA_EXTRAS] = [ @{ $thing }, ( $extra ? @{$extra} : () ) ]; |
223 |
226 |
return $self->_fix_opera; |
| … | … | @@ -233,7 +236,7 @@ sub _parse_mozilla_family { |
233 |
236 |
$self->[UA_TOOLKIT] = [ split RE_SLASH, $extra->[0] ]; |
234 |
237 |
$self->[UA_VERSION_RAW] = $version; |
235 |
238 |
|
236 |
if ( index($thing->[ |
|
239 |
if ( index($thing->[LAST_ELEMENT], 'rv:') != NO_IMATCH ) { |
|
237 |
240 |
$self->[UA_MOZILLA] = pop @{ $thing }; |
238 |
241 |
$self->[UA_LANG] = pop @{ $thing }; |
239 |
242 |
$self->[UA_OS] = pop @{ $thing }; |
| … | … | @@ -424,7 +427,7 @@ sub _generic_compatible { |
424 |
427 |
@extras = (@{ $extras }, @others); |
425 |
428 |
} |
426 |
429 |
else { |
427 |
return if index($moz, q{ }) != |
|
430 |
return if index($moz, q{ }) != NO_IMATCH; # WebTV |
|
428 |
431 |
} |
429 |
432 |
} |
430 |
433 |
|
| … | … | @@ -445,7 +448,7 @@ sub _generic_compatible { |
445 |
448 |
|
446 |
449 |
sub _parse_docomo { |
447 |
450 |
my($self, $moz, $thing, $extra, $compatible, @others) = @_; |
448 |
if ( $thing->[0] && index(lc $thing->[0], 'googlebot-mobile') != |
|
451 |
if ( $thing->[0] && index(lc $thing->[0], 'googlebot-mobile') != NO_IMATCH ) { |
|
449 |
452 |
my($name, $version) = split RE_SLASH, shift @{ $thing }; |
450 |
453 |
$self->[UA_NAME] = $name; |
451 |
454 |
$self->[UA_VERSION_RAW] = $version; |
Up to file-list lib/Parse/HTTP/UserAgent/Constants.pm:
| … | … | @@ -2,10 +2,15 @@ package Parse::HTTP::UserAgent::Constant |
2 |
2 |
use strict; |
3 |
3 |
use warnings; |
4 |
4 |
use vars qw( $VERSION $OID @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS ); |
5 |
use constant MINUS_ONE => -1; |
|
5 |
||
6 |
6 |
$VERSION = '0.10'; |
7 |
7 |
|
8 |
use constant MINUS_ONE => -1; |
|
9 |
use constant NO_IMATCH => -1; # for index() |
|
10 |
use constant LAST_ELEMENT => -1; |
|
11 |
||
8 |
12 |
BEGIN { $OID = MINUS_ONE } |
13 |
||
9 |
14 |
use constant UA_STRING => ++$OID; # just for information |
10 |
15 |
use constant UA_UNKNOWN => ++$OID; # failed to detect? |
11 |
16 |
use constant UA_GENERIC => ++$OID; # parsed with a generic parser. |
| … | … | @@ -130,7 +135,8 @@ BEGIN { |
130 |
135 |
TK_VERSION |
131 |
136 |
)], |
132 |
137 |
etc => [qw( |
133 |
|
|
138 |
NO_IMATCH |
|
139 |
LAST_ELEMENT |
|
134 |
140 |
)], |
135 |
141 |
); |
136 |
142 |
