HTTP-UserAgentString-Parser
view release on metacpan or search on metacpan
lib/HTTP/UserAgentString/Parser.pm view on Meta::CPAN
}
sub _writeCacheFile($$$) {
my ($self, $filename, $content) = @_;
if (open(my $fh, ">", $filename)) {
if (print $fh $content) {
if (close($fh)) {
return 1;
} else {
Carp::carp("Can't close $filename: $!\n");
return 0;
}
} else {
Carp::carp("Can't write to $filename: $!\n");
return 0;
}
} else {
Carp::carp("Can't open $filename for writing: $!\n");
return 0;
}
}
sub _updateCache($$$) {
my ($self, $inidata, $version) = @_;
return ($self->_writeCacheFile($self->cache_file, $inidata) and $self->_writeCacheFile($self->version_file, $version));
}
sub _downloadDB($$) {
my ($self, $current_version) = @_;
my $lwp = LWP::UserAgent->new();
$lwp->env_proxy();
my $res_ini = $lwp->get($INI_URL);
if ($res_ini->is_success) {
my $inidata = $res_ini->content;
my $res_md5 = $lwp->get($MD5_URL);
if ($res_md5->is_success) {
my $expected_hash = $res_md5->content;
my $ctx = Digest::MD5->new();
$ctx->add($inidata);
my $hash = $ctx->hexdigest();
if ($hash eq $expected_hash) {
# Write files to disk
return $self->_updateCache($inidata, $current_version);
} else {
Carp::carp("MD5 digest does not match - expected=$expected_hash; calculate=$hash\n");
return 0;
}
} else {
Carp::carp("Can't get MD5 from $MD5_URL: " . $res_md5->status_line . "\n");
return 0;
}
} else {
Carp::carp("Can't get .ini from $INI_URL: " . $res_ini->status_line . "\n");
return 0;
}
}
sub updateDB($;$) {
my ($self, $force) = @_;
# Check if cache file needs to be updated according to max_age
my $cache_file = $self->cache_file;
my $do_check;
if (! -f $cache_file) {
$do_check = 1;
} else {
my @stat = stat($cache_file);
if (@stat) {
my $mtime = $stat[9];
my $limit = time() - $self->cache_max_age;
$do_check = ($mtime < $limit);
} else {
Carp::carp("Can't stat() $cache_file: $!\n");
return undef();
}
}
if ($do_check or $force) {
my $current_version = $self->getCurrentVersion();
my $cache_version = $self->getCachedVersion();
if (defined($current_version) and ((! defined($cache_version)) or ($current_version gt $cache_version))) {
return $self->_downloadDB($current_version);
} else {
return -1;
}
} else {
return -1;
}
}
sub _compileRegexes($$) {
my ($self, $regexes) = @_;
foreach my $ir (@$regexes) {
my $r = $ir->[0];
my $regex = eval "qr" . $r;
if (defined($regex)) {
$ir->[2] = $r;
$ir->[0] = $regex;
} else {
Carp::carp("Invalid regex: " . $ir->[0] . "($@)\n");
return 0;
}
}
return 1;
}
sub _loadDB($) {
my $self = shift;
my $file = $self->cache_file;
if (open(my $fh, "<", $file)) {
my $cursec;
my $nline = 1;
my $lastvalues;
( run in 2.283 seconds using v1.01-cache-2.11-cpan-d8267643d1d )