FusionInventory-Agent
view release on metacpan or search on metacpan
lib/FusionInventory/Agent/HTTP/Client.pm view on Meta::CPAN
package FusionInventory::Agent::HTTP::Client;
use strict;
use warnings;
use English qw(-no_match_vars);
use URI;
use HTTP::Status;
use LWP::UserAgent;
use UNIVERSAL::require;
use FusionInventory::Agent;
use FusionInventory::Agent::Logger;
my $log_prefix = "[http client] ";
sub new {
my ($class, %params) = @_;
die "non-existing certificate file $params{ca_cert_file}"
if $params{ca_cert_file} && ! -f $params{ca_cert_file};
die "non-existing certificate directory $params{ca_cert_dir}"
if $params{ca_cert_dir} && ! -d $params{ca_cert_dir};
my $self = {
logger => $params{logger} ||
FusionInventory::Agent::Logger->new(),
user => $params{user},
password => $params{password},
ssl_set => 0,
no_ssl_check => $params{no_ssl_check},
no_compress => $params{no_compress},
ca_cert_dir => $params{ca_cert_dir},
ca_cert_file => $params{ca_cert_file}
};
bless $self, $class;
# create user agent
$self->{ua} = LWP::UserAgent->new(
requests_redirectable => ['POST', 'GET', 'HEAD'],
agent => $FusionInventory::Agent::AGENT_STRING,
timeout => $params{timeout} || 180,
parse_head => 0, # No need to parse HTML
keep_alive => 1,
);
if ($params{proxy}) {
$self->{ua}->proxy(['http', 'https'], $params{proxy});
} else {
$self->{ua}->env_proxy();
}
return $self;
}
sub request {
my ($self, $request, $file, $no_proxy_host, $timeout) = @_;
my $logger = $self->{logger};
# Save current timeout to restore it before leaving
my $current_timeout = $self->{ua}->timeout();
$self->{ua}->timeout($timeout)
if defined($timeout);
my $url = $request->uri();
my $scheme = $url->scheme();
$self->_setSSLOptions() if $scheme eq 'https' && !$self->{ssl_set};
# Avoid to use proxy if requested
if ($no_proxy_host) {
$self->{ua}->no_proxy($no_proxy_host);
} elsif ($self->{ua}->proxy($scheme)) {
# keep proxy trace if one may be used
my $proxy_uri = URI->new($self->{ua}->proxy($scheme));
if ($proxy_uri->userinfo) {
# Obfuscate proxy password if present
my ($proxy_user, $proxy_pass) = split(':', $proxy_uri->userinfo);
$proxy_uri->userinfo( $proxy_user.":".('X' x length($proxy_pass)) )
if ($proxy_pass);
}
$logger->debug(
$log_prefix .
"Using '".$proxy_uri->as_string()."' as proxy for $scheme protocol"
);
}
my $result = HTTP::Response->new( 500 );
eval {
if ($OSNAME eq 'MSWin32' && $scheme eq 'https') {
alarm $self->{ua}->timeout();
}
$result = $self->{ua}->request($request, $file);
alarm 0;
};
# check result first
if (!$result->is_success()) {
# authentication required
if ($result->code() == 401) {
if ($self->{user} && $self->{password}) {
$logger->debug(
$log_prefix .
"authentication required, submitting credentials"
( run in 2.480 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )