t/60_Cxn/30_http.t (195 lines of code) (raw):
# Licensed to Elasticsearch B.V. under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Elasticsearch B.V. licenses this file to you under
# the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
use Test::More;
use Test::Exception;
use Test::Deep;
use Search::Elasticsearch;
use Search::Elasticsearch::Role::Cxn;
use MIME::Base64;
sub is_cxn(@);
my $username = 'ThisIsAVeryLongUsernameAndThatIsOKYouSee';
my $password = 'CorrectHorseBatteryStapleCorrectHorseBatteryStaple';
my $userinfo = "$username:$password";
my $userinfo_b64 = MIME::Base64::encode_base64( $userinfo, "" );
my $useragent = Search::Elasticsearch::Role::Cxn::get_user_agent();
my $metaheader = Search::Elasticsearch::Role::Cxn::get_meta_header();
### Scalar nodes ###
is_cxn "Default", new_cxn(), {};
is_cxn "Host",
new_cxn( nodes => 'foo' ),
{ host => 'foo', port => '80', uri => 'http://foo:80' };
is_cxn "Host:Port",
new_cxn( nodes => 'foo:1000' ),
{ host => 'foo', port => '1000', uri => 'http://foo:1000' };
is_cxn "HTTPS", new_cxn( nodes => 'https://foo' ),
{
scheme => 'https',
host => 'foo',
port => '443',
uri => 'https://foo:443'
};
is_cxn "Path",
new_cxn( nodes => 'foo/bar' ),
{ host => 'foo', port => '80', uri => 'http://foo:80/bar' };
is_cxn "Userinfo", new_cxn( nodes => "http://$userinfo\@localhost/" ),
{
port => '80',
uri => 'http://localhost:80',
default_headers => {
'Authorization' => "Basic $userinfo_b64",
'User-Agent' => $useragent,
'x-elastic-client-meta' => $metaheader
},
userinfo => $userinfo
};
is_cxn "IPv4",
new_cxn( nodes => '127.0.0.1' ),
{ host => '127.0.0.1', port => '80', uri => 'http://127.0.0.1:80' };
is_cxn "Scheme:IPv4", new_cxn( nodes => 'https://127.0.0.1' ),
{
host => '127.0.0.1',
port => '443',
uri => 'https://127.0.0.1:443',
scheme => 'https'
};
is_cxn "IPv4:Port",
new_cxn( nodes => '127.0.0.1:1000' ),
{ host => '127.0.0.1', port => '1000', uri => 'http://127.0.0.1:1000' };
is_cxn "Scheme:IPv4:Port", new_cxn( nodes => 'https://127.0.0.1:1000' ),
{
host => '127.0.0.1',
port => '1000',
uri => 'https://127.0.0.1:1000',
scheme => 'https'
};
is_cxn "IPv6",
new_cxn( nodes => '::1' ),
{ host => '::1', port => '80', uri => 'http://[::1]:80' };
is_cxn "Scheme:IPv6", new_cxn( nodes => 'https://[::1]' ),
{
host => '::1',
port => '443',
uri => 'https://[::1]:443',
scheme => 'https'
};
is_cxn "IPv6:Port",
new_cxn( nodes => '[::1]:1000' ),
{ host => '::1', port => '1000', uri => 'http://[::1]:1000' };
is_cxn "Scheme:IPv6:Port", new_cxn( nodes => 'https://[::1]:1000' ),
{
host => '::1',
port => '1000',
uri => 'https://[::1]:1000',
scheme => 'https'
};
### Options with scalar ###
is_cxn "HTTPS option", new_cxn( nodes => 'foo', use_https => 1 ),
{
scheme => 'https',
host => 'foo',
port => '443',
uri => 'https://foo:443'
};
is_cxn "HTTPS option with settings",
new_cxn( nodes => 'http://foo', use_https => 1 ),
{ scheme => 'http', host => 'foo', port => '80', uri => 'http://foo:80' };
is_cxn "Port option",
new_cxn( nodes => 'foo', port => 456 ),
{ host => 'foo', port => '456', uri => 'http://foo:456' };
is_cxn "Port option with settings",
new_cxn( nodes => 'foo:123', port => 456 ),
{ host => 'foo', port => '123', uri => 'http://foo:123' };
is_cxn "Path option",
new_cxn( nodes => 'foo', path_prefix => '/bar/' ),
{ host => 'foo', port => 80, uri => 'http://foo:80/bar' };
is_cxn "Path option with settings",
new_cxn( nodes => 'foo/baz/', path_prefix => '/bar/' ),
{ host => 'foo', port => 80, uri => 'http://foo:80/baz' };
is_cxn "Userinfo option", new_cxn( nodes => 'foo', userinfo => $userinfo ),
{
host => 'foo',
port => 80,
uri => 'http://foo:80',
default_headers => {
'Authorization' => "Basic $userinfo_b64",
'User-Agent' => $useragent,
'x-elastic-client-meta' => $metaheader
},
userinfo => $userinfo
};
is_cxn "Userinfo option with settings",
# Note that userinfo as specified is explicitly different to that
# provided in the nodes string
new_cxn( nodes => "$userinfo\@foo", userinfo => 'foo:baz' ),
{
host => 'foo',
port => 80,
uri => 'http://foo:80',
default_headers => {
'Authorization' => "Basic $userinfo_b64",
'User-Agent' => $useragent,
'x-elastic-client-meta' => $metaheader
},
userinfo => $userinfo
};
is_cxn "Deflate option",
new_cxn( deflate => 1 ),
{ default_headers => { 'Accept-Encoding' => 'deflate', 'User-Agent' => $useragent, 'x-elastic-client-meta' => $metaheader } };
is_cxn "IPv4 with Port",
new_cxn( nodes => '127.0.0.1', port => 456 ),
{ host => '127.0.0.1', port => '456', uri => 'http://127.0.0.1:456' };
is_cxn "IPv6 with Port",
new_cxn( nodes => '::1', port => 456 ),
{ host => '::1', port => '456', uri => 'http://[::1]:456' };
### Hash ###
is_cxn "Hash host",
new_cxn( nodes => { host => 'foo' } ),
{ host => 'foo', port => 80, uri => 'http://foo:80' };
is_cxn "Hash port",
new_cxn( nodes => { port => '123' } ),
{ port => 123, uri => 'http://localhost:123' };
is_cxn "Hash path",
new_cxn( nodes => { path => 'baz' } ),
{ port => 80, uri => 'http://localhost:80/baz' };
is_cxn "Hash IPv4 host",
new_cxn( nodes => { host => '127.0.0.1' } ),
{ host => '127.0.0.1', port => 80, uri => 'http://127.0.0.1:80' };
is_cxn "Hash IPv6 host",
new_cxn( nodes => { host => '::1' } ),
{ host => '::1', port => 80, uri => 'http://[::1]:80' };
# Build URI
is new_cxn()->build_uri( { path => '/' } ), 'http://localhost:9200/',
"Default URI";
is new_cxn( { nodes => 'http://localhost:9200/foo' } )
->build_uri( { path => '/_search' } ),
'http://localhost:9200/foo/_search',
"URI with path";
is new_cxn( { default_qs_params => { session => 'key' } } )
->build_uri( { path => '/_search' } ),
'http://localhost:9200/_search?session=key',
"default_qs_params";
my $uri = new_cxn( { default_qs_params => { session => 'key' } } )
->build_uri( { path => '/_search', qs => { foo => 'bar' } } );
like $uri, qr{^http://localhost:9200/_search?}, "default_qs_params and qs - 1";
like $uri, qr{session=key}, "default_qs_params and qs - 2";
like $uri, qr{foo=bar}, "default_qs_params and qs - 3";
is new_cxn( { default_qs_params => { session => 'key' } } )
->build_uri( { path => '/_search', qs => { session => 'bar' } } ),
'http://localhost:9200/_search?session=bar',
"default_qs_params overwritten";
done_testing;
#===================================
sub is_cxn (@) {
#===================================
my ( $title, $cxn, $params ) = @_;
my %params = (
host => 'localhost',
port => '9200',
scheme => 'http',
uri => 'http://localhost:9200',
default_headers => {
'User-Agent' => $useragent,
'x-elastic-client-meta' => $metaheader
},
userinfo => '',
%$params
);
for my $key ( sort keys %params ) {
my $val = $cxn->$key;
$val = "$val" unless ref $val eq 'HASH';
cmp_deeply $val, $params{$key}, "$title - $key";
}
}
#===================================
sub new_cxn {
#===================================
return Search::Elasticsearch->new(@_)->transport->cxn_pool->cxns->[0];
}