Consul
view release on metacpan or search on metacpan
lib/Consul.pm view on Meta::CPAN
package Consul;
$Consul::VERSION = '0.027';
# ABSTRACT: Client library for consul
use namespace::autoclean;
use HTTP::Tiny 0.014;
use URI::Escape qw(uri_escape);
use JSON::MaybeXS qw(JSON);
use Hash::MultiValue;
use Try::Tiny;
use Carp qw(croak);
use Moo;
use Type::Utils qw(class_type);
use Types::Standard qw(Str Int Bool HashRef CodeRef);
has host => ( is => 'ro', isa => Str, default => sub { '127.0.0.1' } );
has port => ( is => 'ro', isa => Int, default => sub { 8500 } );
has ssl => ( is => 'ro', isa => Bool, default => sub { 0 } );
has timeout => ( is => 'ro', isa => Int, default => sub { 15 } );
has token => ( is => 'ro', isa => Str, predicate => '_has_token' );
has _http => ( is => 'lazy', isa => class_type('HTTP::Tiny') );
sub _build__http { HTTP::Tiny->new(timeout => shift->timeout) };
has _version_prefix => ( is => 'ro', isa => Str, default => sub { '/v1' } );
has _url_base => ( is => 'lazy' );
sub _build__url_base {
my ($self) = @_;
($self->ssl ? 'https' : 'http') .'://'.$self->host.':'.$self->port;
}
sub _prep_url {
my ($self, $path, %args) = @_;
my $trailing = $path =~ m{/$};
my $url = $self->_url_base.join('/', map { uri_escape($_) } split('/', $path));
$url .= '/' if $trailing;
$url .= '?'.$self->_http->www_form_urlencode(\%args) if %args;
$url;
}
my $json = JSON->new->utf8->allow_nonref;
sub _prep_request {
my $callback = pop @_;
my ($self, $path, $method, %args) = @_;
my %uargs = map { m/^_/ ? () : ($_ => $args{$_}) } keys %args;
my $headers = Hash::MultiValue->new;
if ($self->_has_token()) {
$headers->set( 'X-Consul-Token', $self->token() );
}
return Consul::Request->new(
method => $method,
url => $self->_prep_url($path, %uargs),
headers => $headers,
content => defined( $args{_content} ) ? $args{_content} : "",
callback => $callback,
args => \%uargs,
);
}
sub _prep_response {
( run in 0.788 second using v1.01-cache-2.11-cpan-39bf76dae61 )