lib/Search/Elasticsearch/Role/Transport.pm (44 lines of code) (raw):
# Licensed to Elasticsearch B.V under one or more agreements.
# Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
# See the LICENSE file in the project root for more information
package Search::Elasticsearch::Role::Transport;
use Moo::Role;
requires qw(perform_request);
use Try::Tiny;
use Search::Elasticsearch::Util qw(parse_params is_compat);
use namespace::clean;
has 'serializer' => ( is => 'ro', required => 1 );
has 'logger' => ( is => 'ro', required => 1 );
has 'send_get_body_as' => ( is => 'ro', default => 'GET' );
has 'cxn_pool' => ( is => 'ro', required => 1 );
#===================================
sub BUILD {
#===================================
my $self = shift;
my $pool = $self->cxn_pool;
is_compat( 'cxn_pool', $self, $pool );
is_compat( 'cxn', $self, $pool->cxn_factory->cxn_class );
return $self;
}
#===================================
sub tidy_request {
#===================================
my ( $self, $params ) = parse_params(@_);
$params->{method} ||= 'GET';
$params->{path} ||= '/';
$params->{qs} ||= {};
$params->{ignore} ||= [];
my $body = $params->{body};
return $params unless defined $body;
$params->{serialize} ||= 'std';
$params->{data}
= $params->{serialize} eq 'std'
? $self->serializer->encode($body)
: $self->serializer->encode_bulk($body);
if ( $params->{method} eq 'GET' ) {
my $send_as = $self->send_get_body_as;
if ( $send_as eq 'POST' ) {
$params->{method} = 'POST';
}
elsif ( $send_as eq 'source' ) {
$params->{qs}{source} = delete $params->{data};
delete $params->{body};
}
}
$params->{mime_type} ||= $self->serializer->mime_type;
return $params;
}
1;
#ABSTRACT: Transport role providing interface between the client class and the Elasticsearch cluster