Kubernetes-REST
view release on metacpan or search on metacpan
lib/Kubernetes/REST/LWPIO.pm view on Meta::CPAN
package Kubernetes::REST::LWPIO;
our $VERSION = '1.107';
# ABSTRACT: HTTP client using LWP::UserAgent
use Moo;
use LWP::UserAgent;
use Kubernetes::REST::HTTPResponse;
use Types::Standard qw/Bool/;
with 'Kubernetes::REST::Role::IO';
has ssl_verify_server => (is => 'ro', isa => Bool, default => 1);
has ssl_cert_file => (is => 'ro');
has ssl_cert_pem => (is => 'ro');
has ssl_key_file => (is => 'ro');
has ssl_key_pem => (is => 'ro');
has ssl_ca_file => (is => 'ro');
has ssl_ca_pem => (is => 'ro');
has timeout => (is => 'ro', default => sub { 310 });
has ua => (is => 'ro', lazy => 1, default => sub {
my $self = shift;
require IO::Socket::SSL::Utils;
my %ssl_opts;
$ssl_opts{ verify_hostname } = $self->ssl_verify_server;
$ssl_opts{ SSL_verify_mode } = $self->ssl_verify_server ? 1 : 0;
# PEM data: convert to X509/EVP_PKEY objects via SSL_cert/SSL_key
# PEM file paths: use SSL_cert_file/SSL_key_file as normal
if (defined $self->ssl_cert_pem) {
$ssl_opts{ SSL_cert } = [ IO::Socket::SSL::Utils::PEM_string2cert($self->ssl_cert_pem) ];
} elsif (defined $self->ssl_cert_file) {
$ssl_opts{ SSL_cert_file } = $self->ssl_cert_file;
}
if (defined $self->ssl_key_pem) {
$ssl_opts{ SSL_key } = IO::Socket::SSL::Utils::PEM_string2key($self->ssl_key_pem);
} elsif (defined $self->ssl_key_file) {
$ssl_opts{ SSL_key_file } = $self->ssl_key_file;
}
if (defined $self->ssl_ca_pem) {
$ssl_opts{ SSL_ca } = [ IO::Socket::SSL::Utils::PEM_string2cert($self->ssl_ca_pem) ];
} elsif (defined $self->ssl_ca_file) {
$ssl_opts{ SSL_ca_file } = $self->ssl_ca_file;
}
return LWP::UserAgent->new(
agent => 'Kubernetes::REST Perl Client ' . ($Kubernetes::REST::VERSION // 'dev'),
timeout => $self->timeout,
ssl_opts => \%ssl_opts,
);
});
sub call {
my ($self, $req) = @_;
my $http_req = HTTP::Request->new(
$req->method,
$req->url,
[ %{$req->headers} ],
$req->content,
);
my $res = $self->ua->request($http_req);
return $self->_response($res);
}
sub call_streaming {
my ($self, $req, $data_callback) = @_;
my $http_req = HTTP::Request->new(
$req->method,
$req->url,
[ %{$req->headers} ],
);
my $res = $self->ua->request($http_req, sub {
my ($chunk) = @_;
$data_callback->($chunk);
});
return $self->_response($res);
}
# charset => 'none' undoes Content-Encoding (gzip et al) but leaves the charset
# alone, so the body stays bytes - which is what Kubernetes::REST and IO::K8s
# expect, and what HTTPTinyIO hands back. Plain decoded_content() would decode
# UTF-8 here and IO::K8s would then decode the characters a second time.
sub _response {
my ($self, $res) = @_;
my $content = $res->decoded_content(charset => 'none');
return Kubernetes::REST::HTTPResponse->new(
status => $res->code,
(defined $content && length $content) ? ( content => $content ) : (),
);
}
( run in 2.026 seconds using v1.01-cache-2.11-cpan-6736b670a1e )