line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Elasticsearch::Transport; |
2
|
|
|
|
|
|
|
$Elasticsearch::Transport::VERSION = '1.05'; |
3
|
42
|
|
|
42
|
|
36424
|
use Moo; |
|
42
|
|
|
|
|
126
|
|
|
42
|
|
|
|
|
384
|
|
4
|
|
|
|
|
|
|
|
5
|
42
|
|
|
42
|
|
17030
|
use URI(); |
|
42
|
|
|
|
|
108
|
|
|
42
|
|
|
|
|
1132
|
|
6
|
42
|
|
|
42
|
|
382
|
use Time::HiRes qw(time); |
|
42
|
|
|
|
|
111
|
|
|
42
|
|
|
|
|
494
|
|
7
|
42
|
|
|
42
|
|
9944
|
use Try::Tiny; |
|
42
|
|
|
|
|
294
|
|
|
42
|
|
|
|
|
5664
|
|
8
|
42
|
|
|
42
|
|
286
|
use Elasticsearch::Util qw(upgrade_error); |
|
42
|
|
|
|
|
91
|
|
|
42
|
|
|
|
|
480
|
|
9
|
42
|
|
|
42
|
|
15044
|
use namespace::clean; |
|
42
|
|
|
|
|
96
|
|
|
42
|
|
|
|
|
421
|
|
10
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
with 'Elasticsearch::Role::Is_Sync', 'Elasticsearch::Role::Transport'; |
12
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
#=================================== |
14
|
|
|
|
|
|
|
sub perform_request { |
15
|
|
|
|
|
|
|
#=================================== |
16
|
161
|
|
|
161
|
1
|
13083
|
my $self = shift; |
17
|
161
|
|
|
|
|
728
|
my $params = $self->tidy_request(@_); |
18
|
161
|
|
|
|
|
478
|
my $pool = $self->cxn_pool; |
19
|
161
|
|
|
|
|
413
|
my $logger = $self->logger; |
20
|
|
|
|
|
|
|
|
21
|
161
|
|
|
|
|
219
|
my ( $code, $response, $cxn, $error ); |
22
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
try { |
24
|
161
|
|
|
161
|
|
9313
|
$cxn = $pool->next_cxn; |
25
|
148
|
|
|
|
|
1437
|
my $start = time(); |
26
|
148
|
|
|
|
|
678
|
$logger->trace_request( $cxn, $params ); |
27
|
|
|
|
|
|
|
|
28
|
148
|
|
|
|
|
14686
|
( $code, $response ) = $cxn->perform_request($params); |
29
|
114
|
|
|
|
|
752
|
$pool->request_ok($cxn); |
30
|
114
|
|
|
|
|
990
|
$logger->trace_response( $cxn, $code, $response, time() - $start ); |
31
|
|
|
|
|
|
|
} |
32
|
|
|
|
|
|
|
catch { |
33
|
47
|
|
|
47
|
|
1077
|
$error = upgrade_error( |
34
|
|
|
|
|
|
|
$_, |
35
|
|
|
|
|
|
|
{ request => $params, |
36
|
|
|
|
|
|
|
status_code => $code, |
37
|
|
|
|
|
|
|
body => $response |
38
|
|
|
|
|
|
|
} |
39
|
|
|
|
|
|
|
); |
40
|
161
|
|
|
|
|
1527
|
}; |
41
|
|
|
|
|
|
|
|
42
|
161
|
100
|
|
|
|
14471
|
if ($error) { |
43
|
47
|
100
|
|
|
|
480
|
if ( $pool->request_failed( $cxn, $error ) ) { |
44
|
19
|
|
|
|
|
678
|
$logger->debugf( "[%s] %s", $cxn->stringify, "$error" ); |
45
|
19
|
|
|
|
|
1240
|
$logger->info('Retrying request on a new cxn'); |
46
|
19
|
|
|
|
|
3160
|
return $self->perform_request($params); |
47
|
|
|
|
|
|
|
} |
48
|
|
|
|
|
|
|
|
49
|
28
|
|
|
|
|
198
|
$logger->trace_error( $cxn, $error ); |
50
|
28
|
|
|
|
|
2034
|
delete $error->{vars}{body}; |
51
|
28
|
100
|
|
|
|
120
|
$error->is('NoNodes') |
52
|
|
|
|
|
|
|
? $logger->throw_critical($error) |
53
|
|
|
|
|
|
|
: $logger->throw_error($error); |
54
|
|
|
|
|
|
|
} |
55
|
|
|
|
|
|
|
|
56
|
114
|
|
|
|
|
885
|
return $response; |
57
|
|
|
|
|
|
|
} |
58
|
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
1; |
60
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
#ABSTRACT: Provides interface between the client class and the Elasticsearch cluster |
62
|
|
|
|
|
|
|
|
63
|
|
|
|
|
|
|
__END__ |
64
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
=pod |
66
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
=encoding UTF-8 |
68
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
=head1 NAME |
70
|
|
|
|
|
|
|
|
71
|
|
|
|
|
|
|
Elasticsearch::Transport - Provides interface between the client class and the Elasticsearch cluster |
72
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
=head1 VERSION |
74
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
version 1.05 |
76
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
=head1 DESCRIPTION |
78
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
The Transport class manages the request cycle. It receives parsed requests |
80
|
|
|
|
|
|
|
from the (user-facing) client class, and tries to execute the request on a |
81
|
|
|
|
|
|
|
node in the cluster, retrying a request if necessary. |
82
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
This class does L<Elasticsearch::Role::Transport> and |
84
|
|
|
|
|
|
|
L<Elasticsearch::Role::Is_Sync>. |
85
|
|
|
|
|
|
|
|
86
|
|
|
|
|
|
|
=head1 CONFIGURATION |
87
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
=head2 C<send_get_body_as> |
89
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
$e = Elasticsearch->new( |
91
|
|
|
|
|
|
|
send_get_body_as => 'POST' |
92
|
|
|
|
|
|
|
); |
93
|
|
|
|
|
|
|
|
94
|
|
|
|
|
|
|
Certain endpoints like L<Elasticsearch::Client::Direct/search()> default to |
95
|
|
|
|
|
|
|
using a C<GET> method, even when they include a request body. Some proxy |
96
|
|
|
|
|
|
|
servers do not support C<GET> requests with a body. To work around this, |
97
|
|
|
|
|
|
|
the C<send_get_body_as> parameter accepts the following: |
98
|
|
|
|
|
|
|
|
99
|
|
|
|
|
|
|
=over |
100
|
|
|
|
|
|
|
|
101
|
|
|
|
|
|
|
=item * C<GET> |
102
|
|
|
|
|
|
|
|
103
|
|
|
|
|
|
|
The default. Request bodies are sent as C<GET> requests. |
104
|
|
|
|
|
|
|
|
105
|
|
|
|
|
|
|
=item * C<POST> |
106
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
The method is changed to C<POST> when a body is present. |
108
|
|
|
|
|
|
|
|
109
|
|
|
|
|
|
|
=item * C<source> |
110
|
|
|
|
|
|
|
|
111
|
|
|
|
|
|
|
The body is encoded as JSON and added to the query string as the C<source> |
112
|
|
|
|
|
|
|
parameter. This has the advantage of still being a C<GET> request (for those |
113
|
|
|
|
|
|
|
filtering on request method) but has the disadvantage of being restricted |
114
|
|
|
|
|
|
|
in size. The limit depends on the proxies between the client and |
115
|
|
|
|
|
|
|
Elasticsearch, but usually is around 4kB. |
116
|
|
|
|
|
|
|
|
117
|
|
|
|
|
|
|
=back |
118
|
|
|
|
|
|
|
|
119
|
|
|
|
|
|
|
=head1 METHODS |
120
|
|
|
|
|
|
|
|
121
|
|
|
|
|
|
|
=head2 C<perform_request()> |
122
|
|
|
|
|
|
|
|
123
|
|
|
|
|
|
|
Raw requests can be executed using the transport class as follows: |
124
|
|
|
|
|
|
|
|
125
|
|
|
|
|
|
|
$result = $e->transport->perform_request( |
126
|
|
|
|
|
|
|
method => 'POST', |
127
|
|
|
|
|
|
|
path => '/_search', |
128
|
|
|
|
|
|
|
qs => { from => 0, size => 10 }, |
129
|
|
|
|
|
|
|
body => { |
130
|
|
|
|
|
|
|
query => { |
131
|
|
|
|
|
|
|
match => { |
132
|
|
|
|
|
|
|
title => "Elasticsearch clients" |
133
|
|
|
|
|
|
|
} |
134
|
|
|
|
|
|
|
} |
135
|
|
|
|
|
|
|
} |
136
|
|
|
|
|
|
|
); |
137
|
|
|
|
|
|
|
|
138
|
|
|
|
|
|
|
Other than the C<method>, C<path>, C<qs> and C<body> parameters, which |
139
|
|
|
|
|
|
|
should be self-explanatory, it also accepts: |
140
|
|
|
|
|
|
|
|
141
|
|
|
|
|
|
|
=over |
142
|
|
|
|
|
|
|
|
143
|
|
|
|
|
|
|
=item C<ignore> |
144
|
|
|
|
|
|
|
|
145
|
|
|
|
|
|
|
The HTTP error codes which should be ignored instead of throwing an error, |
146
|
|
|
|
|
|
|
eg C<404 NOT FOUND>: |
147
|
|
|
|
|
|
|
|
148
|
|
|
|
|
|
|
$result = $e->transport->perform_request( |
149
|
|
|
|
|
|
|
method => 'GET', |
150
|
|
|
|
|
|
|
path => '/index/type/id' |
151
|
|
|
|
|
|
|
ignore => [404], |
152
|
|
|
|
|
|
|
); |
153
|
|
|
|
|
|
|
|
154
|
|
|
|
|
|
|
=item C<serialize> |
155
|
|
|
|
|
|
|
|
156
|
|
|
|
|
|
|
Whether the C<body> should be serialized in the standard way (as plain |
157
|
|
|
|
|
|
|
JSON) or using the special I<bulk> format: C<"std"> or C<"bulk">. |
158
|
|
|
|
|
|
|
|
159
|
|
|
|
|
|
|
=back |
160
|
|
|
|
|
|
|
|
161
|
|
|
|
|
|
|
=head1 AUTHOR |
162
|
|
|
|
|
|
|
|
163
|
|
|
|
|
|
|
Clinton Gormley <drtech@cpan.org> |
164
|
|
|
|
|
|
|
|
165
|
|
|
|
|
|
|
=head1 COPYRIGHT AND LICENSE |
166
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
This software is Copyright (c) 2014 by Elasticsearch BV. |
168
|
|
|
|
|
|
|
|
169
|
|
|
|
|
|
|
This is free software, licensed under: |
170
|
|
|
|
|
|
|
|
171
|
|
|
|
|
|
|
The Apache License, Version 2.0, January 2004 |
172
|
|
|
|
|
|
|
|
173
|
|
|
|
|
|
|
=cut |