burak / CPAN-Parse-HTTP-UserAgent

Parser for the User Agent string

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') != MINUS_ONE;
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{ }) == MINUS_ONE ) {
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{.}) == MINUS_ONE;
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') != MINUS_ONE;
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
          : @{$others} && index( $others->[MINUS_ONE], 'Safari') != MINUS_ONE ? 1
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
           ( $extra  && index( $extra->[0], 'AppleWebKit') != MINUS_ONE);
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/') != MINUS_ONE;
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
             index($thing->[0], 'http://') == MINUS_ONE # robot
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') != MINUS_ONE;
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' ) != MINUS_ONE
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' ) != MINUS_ONE ) {
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' ) != MINUS_ONE;
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->[MINUS_ONE], 'rv:') != MINUS_ONE ? pop @{$thing} : 0;
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->[MINUS_ONE], 'Version/') != MINUS_ONE; # damned 10.0 beta
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->[MINUS_ONE], 'rv:') != MINUS_ONE ) {
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{ }) != MINUS_ONE; # WebTV
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') != MINUS_ONE ) {
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
            MINUS_ONE
138
            NO_IMATCH
139
            LAST_ELEMENT
134
140
        )],
135
141
    );
136
142