File Coverage

blib/lib/WWW/Google/PageRank.pm
Criterion Covered Total %
statement 78 99 78.7
branch 20 38 52.6
condition 0 10 0.0
subroutine 10 12 83.3
pod 2 2 100.0
total 110 161 68.3


line stmt bran cond sub pod time code
1             package WWW::Google::PageRank;
2              
3             # -*- perl -*-
4              
5 3     3   44876 use strict;
  3         7  
  3         99  
6 3     3   15 use warnings;
  3         4  
  3         98  
7              
8 3     3   14 use vars qw($VERSION);
  3         9  
  3         149  
9              
10 3     3   3078 use LWP::UserAgent;
  3         244188  
  3         116  
11 3     3   35 use URI::Escape;
  3         7  
  3         5080  
12              
13             $VERSION = '0.17';
14              
15             sub new {
16 0     0 1 0 my $class = shift;
17 0         0 my %par = @_;
18 0         0 my $self;
19 0 0 0     0 $self->{ua} = LWP::UserAgent->new(agent => $par{agent} ||
20             'Mozilla/4.0 (compatible; GoogleToolbar 2.0.111-big; Windows XP 5.1)')
21             or return;
22 0 0       0 $self->{ua}->env_proxy if $par{env_proxy};
23 0 0       0 $self->{ua}->proxy('http', $par{proxy}) if $par{proxy};
24 0 0       0 $self->{ua}->timeout($par{timeout}) if $par{timeout};
25 0   0     0 $self->{host} = $par{host} || 'toolbarqueries.google.com';
26 0         0 bless($self, $class);
27             }
28              
29             sub get {
30 0     0 1 0 my ($self, $url) = @_;
31 0 0 0     0 return unless defined $url and $url =~ m[^https?://]i;
32              
33 0         0 my $ch = '6' . _compute_ch_new('info:' . $url);
34 0         0 my $query = 'http://' . $self->{host} . '/tbr?client=navclient-auto&ch=' . $ch .
35             '&ie=UTF-8&oe=UTF-8&features=Rank&q=info:' . uri_escape($url);
36              
37 0         0 my $resp = $self->{ua}->get($query);
38 0 0 0     0 if ($resp->is_success && $resp->content =~ /Rank_\d+:\d+:(\d+)/) {
39 0 0       0 if (wantarray) {
40 0         0 return ($1, $resp);
41             } else {
42 0         0 return $1;
43             }
44             } else {
45 0 0       0 if (wantarray) {
46 0         0 return (undef, $resp);
47             } else {
48 0         0 return;
49             }
50             }
51             }
52              
53             sub _compute_ch_new {
54 16     16   308 my $url = shift;
55              
56 16         31 my $ch = _compute_ch($url);
57 16         39 $ch = (($ch % 0x0d) & 7) | (($ch / 7) << 2);
58              
59 16         30 return _compute_ch(pack("V20", map {my $t = $ch; _wsub($t, $_*9); $t} 0..19));
  320         289  
  320         455  
  320         486  
60             }
61              
62             sub _compute_ch {
63 32     32   38 my $url = shift;
64              
65 32         262 my @url = unpack("C*", $url);
66 32         89 my ($a, $b, $c, $k) = (0x9e3779b9, 0x9e3779b9, 0xe6359a60, 0);
67 32         40 my $len = scalar @url;
68              
69 32         74 while ($len >= 12) {
70 144         464 _wadd($a, $url[$k+0] | ($url[$k+1] << 8) | ($url[$k+2] << 16) | ($url[$k+3] << 24));
71 144         346 _wadd($b, $url[$k+4] | ($url[$k+5] << 8) | ($url[$k+6] << 16) | ($url[$k+7] << 24));
72 144         329 _wadd($c, $url[$k+8] | ($url[$k+9] << 8) | ($url[$k+10] << 16) | ($url[$k+11] << 24));
73              
74 144         220 _mix($a, $b, $c);
75              
76 144         211 $k += 12;
77 144         299 $len -= 12;
78             }
79              
80 32         51 _wadd($c, scalar @url);
81              
82 32 50       62 _wadd($c, $url[$k+10] << 24) if $len > 10;
83 32 100       57 _wadd($c, $url[$k+9] << 16) if $len > 9;
84 32 100       67 _wadd($c, $url[$k+8] << 8) if $len > 8;
85 32 100       81 _wadd($b, $url[$k+7] << 24) if $len > 7;
86 32 100       77 _wadd($b, $url[$k+6] << 16) if $len > 6;
87 32 100       82 _wadd($b, $url[$k+5] << 8) if $len > 5;
88 32 100       69 _wadd($b, $url[$k+4]) if $len > 4;
89 32 100       79 _wadd($a, $url[$k+3] << 24) if $len > 3;
90 32 100       80 _wadd($a, $url[$k+2] << 16) if $len > 2;
91 32 100       84 _wadd($a, $url[$k+1] << 8) if $len > 1;
92 32 50       80 _wadd($a, $url[$k]) if $len > 0;
93              
94 32         50 _mix($a, $b, $c);
95              
96 32         115 return $c; # integer is positive always
97             }
98              
99             sub _mix {
100 176     176   218 my ($a, $b, $c) = @_;
101              
102 176         255 _wsub($a, $b); _wsub($a, $c); $a ^= $c >> 13;
  176         245  
  176         180  
103 176         227 _wsub($b, $c); _wsub($b, $a); $b ^= ($a << 8) % 4294967296;
  176         228  
  176         202  
104 176         235 _wsub($c, $a); _wsub($c, $b); $c ^= $b >>13;
  176         227  
  176         174  
105 176         219 _wsub($a, $b); _wsub($a, $c); $a ^= $c >> 12;
  176         218  
  176         165  
106 176         238 _wsub($b, $c); _wsub($b, $a); $b ^= ($a << 16) % 4294967296;
  176         229  
  176         230  
107 176         237 _wsub($c, $a); _wsub($c, $b); $c ^= $b >> 5;
  176         230  
  176         181  
108 176         243 _wsub($a, $b); _wsub($a, $c); $a ^= $c >> 3;
  176         249  
  176         186  
109 176         240 _wsub($b, $c); _wsub($b, $a); $b ^= ($a << 10) % 4294967296;
  176         227  
  176         180  
110 176         233 _wsub($c, $a); _wsub($c, $b); $c ^= $b >> 15;
  176         217  
  176         170  
111              
112 176         441 @_[0 .. $#_] = ($a, $b, $c);
113             }
114              
115 686     686   1017 sub _wadd { $_[0] = int(($_[0] + $_[1]) % 4294967296);}
116 3488     3488   4219 sub _wsub { $_[0] = int(($_[0] - $_[1]) % 4294967296);}
117              
118             1;
119              
120              
121             __END__