File Coverage

blib/lib/Duadua/Parser.pm
Criterion Covered Total %
statement 47 47 100.0
branch 22 24 91.6
condition 11 12 91.6
subroutine 6 6 100.0
pod 1 1 100.0
total 87 90 96.6


line stmt bran cond sub pod time code
1             package Duadua::Parser;
2 11     11   1146 use strict;
  11         20  
  11         400  
3 11     11   60 use warnings;
  11         21  
  11         564  
4 11     11   4306 use Duadua::Util;
  11         36  
  11         11590  
5              
6             my $BLANK_UA = {
7             name => 'UNKNOWN',
8             };
9              
10             sub parse {
11 444     444 1 1093 my ($class, $d) = @_;
12              
13 444         1157 my $index_mozilla = index($d->ua, 'Mozilla/');
14 444 100       1651 if ($index_mozilla == 0) {
    100          
15 253         620 $d->{_contain_mozilla_top} = 1;
16 253         537 $d->{_contain_mozilla} = 1;
17             } elsif ($index_mozilla > 0) {
18 4         14 $d->{_contain_mozilla} = 1;
19             }
20              
21 444         731 for my $m (@{$d->parsers}) {
  444         1219  
22 13115 100       57034 if ( my $res = $m->try($d) ) {
23 410         1883 return $res;
24             }
25             }
26              
27             # Blank or '-'
28 34 100 100     94 if ($d->ua eq '' || $d->ua eq '-') {
29 3         15 return $BLANK_UA;
30             }
31              
32 31 100       199 if ( my $browser = $class->_detect_general_browser($d) ) {
33 2         9 return $browser;
34             }
35              
36 29 100       92 if ( my $bot = $class->_detect_general_bot($d) ) {
37 24         159 return $bot;
38             }
39              
40 5         58 return $BLANK_UA;
41             }
42              
43             sub _detect_general_browser {
44 31     31   84 my ($class, $d) = @_;
45              
46 31 100 66     92 if ( index($d->ua, 'rowser') > 0 && $d->_prefix('Mozilla/') ) {
47 2 50       7 if ( $d->ua =~ m![^a-zA-Z]([a-zA-Z]+[bB]rowser)/([\d.]+)! ) {
48 2         5 my %h = %{$BLANK_UA};
  2         11  
49 2         14 ($h{name}, $h{version}) = ($1, $2);
50 2         15 return Duadua::Util->set_os($d, \%h);
51             }
52             }
53             }
54              
55             sub _detect_general_bot {
56 29     29   70 my ($class, $d) = @_;
57              
58 29         60 my %h = %{$BLANK_UA};
  29         148  
59              
60 29 100 100     101 if ( $d->_contain('https://') || $d->_contain('http://') ) {
61 24         71 $h{is_bot} = 1;
62 24 100 100     63 if ( !$d->_contain('Mozilla/') && $d->ua =~ m!^([^/;]+)/(v?[\d.]+)! ) {
    100          
    50          
63 9         43 my ($name, $version) = ($1, $2);
64 9         26 $h{name} = $name;
65 9         32 $h{version} = $version;
66             }
67             elsif ( $d->ua =~ m![\s\(]([^(/\s:;]+(?:bot|crawl|crawler|spider|fetcher))/(v?[\d.]+)!i ) {
68 14         69 my ($name, $version) = ($1, $2);
69 14         42 $h{name} = $1;
70 14         49 $h{version} = $version;
71             }
72             elsif ( $d->ua =~ m!([a-zA-Z0-9\-\_\.\!]+(?:bot|crawler|spider))!i ) {
73 1         5 $h{name} = $1;
74             }
75              
76 24         112 return \%h;
77             }
78             }
79              
80             1;
81              
82             __END__