Alien-Build
view release on metacpan or search on metacpan
lib/Alien/Build/Plugin/Fetch/LWP.pm view on Meta::CPAN
package Alien::Build::Plugin::Fetch::LWP;
use strict;
use warnings;
use 5.008004;
use Alien::Build::Plugin;
use Carp ();
# ABSTRACT: Plugin for fetching files using LWP
our $VERSION = '2.84'; # VERSION
has '+url' => '';
has ssl => 0;
sub init
{
my($self, $meta) = @_;
$meta->add_requires('share' => 'LWP::UserAgent' => 0 );
$meta->prop->{start_url} ||= $self->url;
$self->url($meta->prop->{start_url});
$self->url || Carp::croak('url is a required property');
if($self->url =~ /^https:/ || $self->ssl)
{
$meta->add_requires('share' => 'LWP::Protocol::https' => 0 );
}
$meta->register_hook( fetch => sub {
my($build, $url, %options) = @_;
$url ||= $self->url;
my @headers;
if(my $headers = $options{http_headers})
{
if(ref $headers eq 'ARRAY')
{
@headers = @$headers;
}
else
{
$build->log("Fetch for $url with http_headers that is not an array reference");
}
}
my $ua = LWP::UserAgent->new;
$ua->env_proxy;
my $res = $ua->get($url, @headers);
my($protocol) = $url =~ /^([a-z]+):/;
die "error fetching $url: @{[ $res->status_line ]}"
unless $res->is_success;
my($type, $charset) = $res->content_type_charset;
my $base = $res->base;
my $filename = $res->filename;
if($type eq 'text/html')
{
return {
type => 'html',
charset => $charset,
base => "$base",
content => $res->decoded_content || $res->content,
protocol => $protocol,
};
}
elsif($type eq 'text/ftp-dir-listing')
{
return {
type => 'dir_listing',
base => "$base",
content => $res->decoded_content || $res->content,
protocol => $protocol,
};
}
else
{
return {
type => 'file',
filename => $filename || 'downloadedfile',
content => $res->content,
protocol => $protocol,
};
}
});
$self;
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Alien::Build::Plugin::Fetch::LWP - Plugin for fetching files using LWP
=head1 VERSION
version 2.84
=head1 SYNOPSIS
use alienfile;
share {
( run in 0.565 second using v1.01-cache-2.11-cpan-efa8479b9fe )