elasticsearch-transport 7.10.0.pre → 7.11.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/{LICENSE.txt → LICENSE} +0 -0
- data/README.md +13 -7
- data/elasticsearch-transport.gemspec +1 -1
- data/lib/elasticsearch/transport/client.rb +147 -48
- data/lib/elasticsearch/transport/transport/http/faraday.rb +10 -2
- data/lib/elasticsearch/transport/version.rb +1 -1
- data/spec/elasticsearch/transport/client_spec.rb +357 -110
- data/spec/elasticsearch/transport/meta_header_spec.rb +225 -0
- metadata +10 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a61db52575ad4a8669cbef5e60e6f90607f82155206c85e9e473835dfa35e0e5
|
4
|
+
data.tar.gz: e8d2f1899f4ebf17cfafdfee98174f86ba52633f04d8fadd30ec9b4d31457546
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ca54a9d0f096d1f8675ea7ef4d84da517f34ffeea31c9ce72f3c4a9257cfab33d6548582490ff7f87708a0ff3bc25a29c907274870d2ea22df34d7585c6d59e
|
7
|
+
data.tar.gz: 854a17c7995ceede84fa87f73ccb7fafd8d57a8ff400429e8877258bd00e7cadbc69562400af8d682cb195b51599867bfce2fc84db151d3bff45c846844b188b
|
data/Gemfile
CHANGED
@@ -32,7 +32,7 @@ if File.exist? File.expand_path('../../elasticsearch/elasticsearch.gemspec', __F
|
|
32
32
|
gem 'elasticsearch', path: File.expand_path('../../elasticsearch', __FILE__), require: false
|
33
33
|
end
|
34
34
|
|
35
|
-
group :development do
|
35
|
+
group :development, :test do
|
36
36
|
gem 'rspec'
|
37
37
|
if defined?(JRUBY_VERSION)
|
38
38
|
gem 'pry-nav'
|
data/{LICENSE.txt → LICENSE}
RENAMED
File without changes
|
data/README.md
CHANGED
@@ -136,7 +136,7 @@ Please see below for an exception to this when connecting using an Elastic Cloud
|
|
136
136
|
|
137
137
|
If you are using [Elastic Cloud](https://www.elastic.co/cloud), you can provide your cloud id to the client.
|
138
138
|
You must supply your username and password separately, and optionally a port. If no port is supplied,
|
139
|
-
port
|
139
|
+
port 443 will be used.
|
140
140
|
|
141
141
|
Note: Do not enable sniffing when using Elastic Cloud. The nodes are behind a load balancer so
|
142
142
|
Elastic Cloud will take care of everything for you.
|
@@ -187,18 +187,24 @@ Elasticsearch::Client.new(
|
|
187
187
|
|
188
188
|
### Logging
|
189
189
|
|
190
|
-
To log requests and responses to standard output with the default logger (an instance of Ruby's {::Logger} class),
|
191
|
-
set the `log` argument:
|
190
|
+
To log requests and responses to standard output with the default logger (an instance of Ruby's {::Logger} class), set the `log` argument to true:
|
192
191
|
|
193
192
|
```ruby
|
194
|
-
Elasticsearch::Client.new
|
193
|
+
Elasticsearch::Client.new(log: true)
|
194
|
+
```
|
195
|
+
|
196
|
+
You can also use [ecs-logging](https://github.com/elastic/ecs-logging-ruby). `ecs-logging` is a set of libraries that allows you to transform your application logs to structured logs that comply with the [Elastic Common Schema (ECS)](https://www.elastic.co/guide/en/ecs/current/ecs-reference.html):
|
197
|
+
|
198
|
+
```ruby
|
199
|
+
logger = EcsLogging::Logger.new($stdout)
|
200
|
+
Elasticsearch::Client.new(logger: logger)
|
195
201
|
```
|
196
202
|
|
197
203
|
|
198
204
|
To trace requests and responses in the _Curl_ format, set the `trace` argument:
|
199
205
|
|
200
206
|
```ruby
|
201
|
-
Elasticsearch::Client.new
|
207
|
+
Elasticsearch::Client.new(trace: true)
|
202
208
|
```
|
203
209
|
|
204
210
|
You can customize the default logger or tracer:
|
@@ -211,7 +217,7 @@ You can customize the default logger or tracer:
|
|
211
217
|
Or, you can use a custom `::Logger` instance:
|
212
218
|
|
213
219
|
```ruby
|
214
|
-
Elasticsearch::Client.new
|
220
|
+
Elasticsearch::Client.new(logger: Logger.new(STDERR))
|
215
221
|
```
|
216
222
|
|
217
223
|
You can pass the client any conforming logger implementation:
|
@@ -223,7 +229,7 @@ log = Logging.logger['elasticsearch']
|
|
223
229
|
log.add_appenders Logging.appenders.stdout
|
224
230
|
log.level = :info
|
225
231
|
|
226
|
-
client = Elasticsearch::Client.new
|
232
|
+
client = Elasticsearch::Client.new(logger: log)
|
227
233
|
```
|
228
234
|
|
229
235
|
### Custom HTTP Headers
|
@@ -39,7 +39,7 @@ Gem::Specification.new do |s|
|
|
39
39
|
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
40
40
|
s.require_paths = ['lib']
|
41
41
|
|
42
|
-
s.extra_rdoc_files = [ 'README.md', 'LICENSE
|
42
|
+
s.extra_rdoc_files = [ 'README.md', 'LICENSE' ]
|
43
43
|
s.rdoc_options = [ '--charset=UTF-8' ]
|
44
44
|
|
45
45
|
s.required_ruby_version = '>= 2.4'
|
@@ -49,9 +49,15 @@ module Elasticsearch
|
|
49
49
|
DEFAULT_HOST = 'localhost:9200'.freeze
|
50
50
|
|
51
51
|
# The default port to use if connecting using a Cloud ID.
|
52
|
+
# Updated from 9243 to 443 in client version 7.10.1
|
52
53
|
#
|
53
54
|
# @since 7.2.0
|
54
|
-
DEFAULT_CLOUD_PORT =
|
55
|
+
DEFAULT_CLOUD_PORT = 443
|
56
|
+
|
57
|
+
# The default port to use if not otherwise specified.
|
58
|
+
#
|
59
|
+
# @since 7.2.0
|
60
|
+
DEFAULT_PORT = 9200
|
55
61
|
|
56
62
|
# Returns the transport object.
|
57
63
|
#
|
@@ -114,8 +120,11 @@ module Elasticsearch
|
|
114
120
|
#
|
115
121
|
# @option api_key [String, Hash] :api_key Use API Key Authentication, either the base64 encoding of `id` and `api_key`
|
116
122
|
# joined by a colon as a String, or a hash with the `id` and `api_key` values.
|
117
|
-
# @option opaque_id_prefix [String] :opaque_id_prefix set a prefix for X-Opaque-Id when initializing the client.
|
118
|
-
# will be prepended to the id you set before each request
|
123
|
+
# @option opaque_id_prefix [String] :opaque_id_prefix set a prefix for X-Opaque-Id when initializing the client.
|
124
|
+
# This will be prepended to the id you set before each request
|
125
|
+
# if you're using X-Opaque-Id
|
126
|
+
# @option enable_meta_header [Boolean] :enable_meta_header Enable sending the meta data header to Cloud.
|
127
|
+
# (Default: true)
|
119
128
|
#
|
120
129
|
# @yield [faraday] Access and configure the `Faraday::Connection` instance directly with a block
|
121
130
|
#
|
@@ -130,6 +139,7 @@ module Elasticsearch
|
|
130
139
|
@arguments[:randomize_hosts] ||= false
|
131
140
|
@arguments[:transport_options] ||= {}
|
132
141
|
@arguments[:http] ||= {}
|
142
|
+
@arguments[:enable_meta_header] = arguments.fetch(:enable_meta_header) { true }
|
133
143
|
@options[:http] ||= {}
|
134
144
|
|
135
145
|
set_api_key if (@api_key = @arguments[:api_key])
|
@@ -152,15 +162,18 @@ module Elasticsearch
|
|
152
162
|
if @arguments[:transport]
|
153
163
|
@transport = @arguments[:transport]
|
154
164
|
else
|
155
|
-
transport_class
|
156
|
-
if transport_class == Transport::HTTP::Faraday
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
165
|
+
@transport_class = @arguments[:transport_class] || DEFAULT_TRANSPORT_CLASS
|
166
|
+
@transport = if @transport_class == Transport::HTTP::Faraday
|
167
|
+
@arguments[:adapter] ||= __auto_detect_adapter
|
168
|
+
set_meta_header
|
169
|
+
@transport_class.new(hosts: @seeds, options: @arguments) do |faraday|
|
170
|
+
faraday.adapter(@arguments[:adapter])
|
171
|
+
block&.call faraday
|
172
|
+
end
|
173
|
+
else
|
174
|
+
set_meta_header
|
175
|
+
@transport_class.new(hosts: @seeds, options: @arguments)
|
176
|
+
end
|
164
177
|
end
|
165
178
|
end
|
166
179
|
|
@@ -180,27 +193,111 @@ module Elasticsearch
|
|
180
193
|
|
181
194
|
def set_api_key
|
182
195
|
@api_key = __encode(@api_key) if @api_key.is_a? Hash
|
196
|
+
add_header('Authorization' => "ApiKey #{@api_key}")
|
197
|
+
@arguments.delete(:user)
|
198
|
+
@arguments.delete(:password)
|
199
|
+
end
|
200
|
+
|
201
|
+
def add_header(header)
|
183
202
|
headers = @arguments[:transport_options]&.[](:headers) || {}
|
184
|
-
headers.merge!(
|
203
|
+
headers.merge!(header)
|
185
204
|
@arguments[:transport_options].merge!(
|
186
205
|
headers: headers
|
187
206
|
)
|
188
|
-
|
189
|
-
|
207
|
+
end
|
208
|
+
|
209
|
+
def set_meta_header
|
210
|
+
return if @arguments[:enable_meta_header] == false
|
211
|
+
|
212
|
+
service, version = meta_header_service_version
|
213
|
+
|
214
|
+
meta_headers = {
|
215
|
+
service.to_sym => version,
|
216
|
+
rb: RUBY_VERSION,
|
217
|
+
t: Elasticsearch::Transport::VERSION
|
218
|
+
}
|
219
|
+
meta_headers.merge!(meta_header_engine) if meta_header_engine
|
220
|
+
meta_headers.merge!(meta_header_adapter) if meta_header_adapter
|
221
|
+
|
222
|
+
add_header({ 'x-elastic-client-meta' => meta_headers.map { |k, v| "#{k}=#{v}" }.join(',') })
|
223
|
+
end
|
224
|
+
|
225
|
+
def meta_header_service_version
|
226
|
+
if defined?(Elastic::META_HEADER_SERVICE_VERSION)
|
227
|
+
Elastic::META_HEADER_SERVICE_VERSION
|
228
|
+
elsif defined?(Elasticsearch::VERSION)
|
229
|
+
[:es, client_meta_version(Elasticsearch::VERSION)]
|
230
|
+
else
|
231
|
+
[:es, client_meta_version(Elasticsearch::Transport::VERSION)]
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
def client_meta_version(version)
|
236
|
+
regexp = /^([0-9]+\.[0-9]+\.[0-9]+)(\.?[a-z0-9.-]+)?$/
|
237
|
+
match = version.match(regexp)
|
238
|
+
return "#{match[1]}p" if (match[2])
|
239
|
+
|
240
|
+
version
|
241
|
+
end
|
242
|
+
|
243
|
+
def meta_header_engine
|
244
|
+
case RUBY_ENGINE
|
245
|
+
when 'ruby'
|
246
|
+
{}
|
247
|
+
when 'jruby'
|
248
|
+
{ jv: ENV_JAVA['java.version'], jr: JRUBY_VERSION }
|
249
|
+
when 'rbx'
|
250
|
+
{ rbx: RUBY_VERSION }
|
251
|
+
else
|
252
|
+
{ RUBY_ENGINE.to_sym => RUBY_VERSION }
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
def meta_header_adapter
|
257
|
+
if @transport_class == Transport::HTTP::Faraday
|
258
|
+
{fd: Faraday::VERSION}.merge(
|
259
|
+
case @arguments[:adapter]
|
260
|
+
when :patron
|
261
|
+
{pt: Patron::VERSION}
|
262
|
+
when :net_http
|
263
|
+
{nh: defined?(Net::HTTP::VERSION) ? Net::HTTP::VERSION : Net::HTTP::HTTPVersion}
|
264
|
+
when :typhoeus
|
265
|
+
{ty: Typhoeus::VERSION}
|
266
|
+
when :httpclient
|
267
|
+
{hc: HTTPClient::VERSION}
|
268
|
+
when :net_http_persistent
|
269
|
+
{np: Net::HTTP::Persistent::VERSION}
|
270
|
+
else
|
271
|
+
{}
|
272
|
+
end
|
273
|
+
)
|
274
|
+
elsif defined?(Transport::HTTP::Curb) && @transport_class == Transport::HTTP::Curb
|
275
|
+
{cl: Curl::CURB_VERSION}
|
276
|
+
elsif defined?(Transport::HTTP::Manticore) && @transport_class == Transport::HTTP::Manticore
|
277
|
+
{mc: Manticore::VERSION}
|
278
|
+
end
|
190
279
|
end
|
191
280
|
|
192
281
|
def extract_cloud_creds(arguments)
|
193
|
-
return unless arguments[:cloud_id]
|
282
|
+
return unless arguments[:cloud_id] && !arguments[:cloud_id].empty?
|
194
283
|
|
195
284
|
name = arguments[:cloud_id].split(':')[0]
|
196
285
|
cloud_url, elasticsearch_instance = Base64.decode64(arguments[:cloud_id].gsub("#{name}:", '')).split('$')
|
286
|
+
|
287
|
+
if cloud_url.include?(':')
|
288
|
+
url, port = cloud_url.split(':')
|
289
|
+
host = "#{elasticsearch_instance}.#{url}"
|
290
|
+
else
|
291
|
+
host = "#{elasticsearch_instance}.#{cloud_url}"
|
292
|
+
port = arguments[:port] || DEFAULT_CLOUD_PORT
|
293
|
+
end
|
197
294
|
[
|
198
295
|
{
|
199
296
|
scheme: 'https',
|
200
297
|
user: arguments[:user],
|
201
298
|
password: arguments[:password],
|
202
|
-
host:
|
203
|
-
port:
|
299
|
+
host: host,
|
300
|
+
port: port.to_i
|
204
301
|
}
|
205
302
|
]
|
206
303
|
end
|
@@ -235,36 +332,38 @@ module Elasticsearch
|
|
235
332
|
|
236
333
|
def __parse_host(host)
|
237
334
|
host_parts = case host
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
335
|
+
when String
|
336
|
+
if host =~ /^[a-z]+\:\/\//
|
337
|
+
# Construct a new `URI::Generic` directly from the array returned by URI::split.
|
338
|
+
# This avoids `URI::HTTP` and `URI::HTTPS`, which supply default ports.
|
339
|
+
uri = URI::Generic.new(*URI.split(host))
|
340
|
+
default_port = uri.scheme == 'https' ? 443 : DEFAULT_PORT
|
341
|
+
{
|
342
|
+
scheme: uri.scheme,
|
343
|
+
user: uri.user,
|
344
|
+
password: uri.password,
|
345
|
+
host: uri.host,
|
346
|
+
path: uri.path,
|
347
|
+
port: uri.port || default_port
|
348
|
+
}
|
349
|
+
else
|
350
|
+
host, port = host.split(':')
|
351
|
+
{ host: host, port: port }
|
352
|
+
end
|
353
|
+
when URI
|
354
|
+
{
|
355
|
+
scheme: host.scheme,
|
356
|
+
user: host.user,
|
357
|
+
password: host.password,
|
358
|
+
host: host.host,
|
359
|
+
path: host.path,
|
360
|
+
port: host.port
|
361
|
+
}
|
362
|
+
when Hash
|
363
|
+
host
|
364
|
+
else
|
365
|
+
raise ArgumentError, "Please pass host as a String, URI or Hash -- #{host.class} given."
|
366
|
+
end
|
268
367
|
if @api_key
|
269
368
|
# Remove Basic Auth if using API KEY
|
270
369
|
host_parts.delete(:user)
|
@@ -33,9 +33,17 @@ module Elasticsearch
|
|
33
33
|
# @return [Response]
|
34
34
|
# @see Transport::Base#perform_request
|
35
35
|
#
|
36
|
-
def perform_request(method, path, params={}, body=nil, headers=nil, opts={})
|
36
|
+
def perform_request(method, path, params = {}, body = nil, headers = nil, opts = {})
|
37
37
|
super do |connection, url|
|
38
|
-
headers =
|
38
|
+
headers = if connection.connection.headers
|
39
|
+
if !headers.nil?
|
40
|
+
connection.connection.headers.merge(headers)
|
41
|
+
else
|
42
|
+
connection.connection.headers
|
43
|
+
end
|
44
|
+
else
|
45
|
+
headers
|
46
|
+
end
|
39
47
|
|
40
48
|
response = connection.connection.run_request(method.downcase.to_sym,
|
41
49
|
url,
|
@@ -246,7 +246,7 @@ describe Elasticsearch::Transport::Client do
|
|
246
246
|
end
|
247
247
|
|
248
248
|
let(:client) do
|
249
|
-
described_class.new(adapter: :patron)
|
249
|
+
described_class.new(adapter: :patron, enable_meta_header: false)
|
250
250
|
end
|
251
251
|
|
252
252
|
it 'uses Faraday with the adapter' do
|
@@ -260,7 +260,7 @@ describe Elasticsearch::Transport::Client do
|
|
260
260
|
end
|
261
261
|
|
262
262
|
let(:client) do
|
263
|
-
described_class.new(adapter: :typhoeus)
|
263
|
+
described_class.new(adapter: :typhoeus, enable_meta_header: false)
|
264
264
|
end
|
265
265
|
|
266
266
|
it 'uses Faraday with the adapter' do
|
@@ -274,7 +274,7 @@ describe Elasticsearch::Transport::Client do
|
|
274
274
|
end
|
275
275
|
|
276
276
|
let(:client) do
|
277
|
-
described_class.new(
|
277
|
+
described_class.new(adapter: :patron, enable_meta_header: false)
|
278
278
|
end
|
279
279
|
|
280
280
|
it 'uses Faraday with the adapter' do
|
@@ -344,24 +344,19 @@ describe Elasticsearch::Transport::Client do
|
|
344
344
|
expect(hosts[0][:protocol]).to eq('https')
|
345
345
|
expect(hosts[0][:user]).to eq('elastic')
|
346
346
|
expect(hosts[0][:password]).to eq('changeme')
|
347
|
-
expect(hosts[0][:port]).to eq(
|
347
|
+
expect(hosts[0][:port]).to eq(443)
|
348
348
|
end
|
349
349
|
|
350
350
|
it 'creates the correct full url' do
|
351
351
|
expect(
|
352
352
|
client.transport.__full_url(client.transport.hosts[0])
|
353
|
-
).to eq('https://elastic:changeme@abcd.localhost:
|
353
|
+
).to eq('https://elastic:changeme@abcd.localhost:443')
|
354
354
|
end
|
355
355
|
|
356
356
|
context 'when a port is specified' do
|
357
357
|
|
358
358
|
let(:client) do
|
359
|
-
described_class.new(
|
360
|
-
cloud_id: 'name:bG9jYWxob3N0JGFiY2QkZWZnaA==',
|
361
|
-
user: 'elastic',
|
362
|
-
password: 'changeme',
|
363
|
-
port: 9200
|
364
|
-
)
|
359
|
+
described_class.new(cloud_id: 'name:bG9jYWxob3N0JGFiY2QkZWZnaA==', user: 'elastic', password: 'changeme', port: 9250)
|
365
360
|
end
|
366
361
|
|
367
362
|
it 'sets the specified port along with the cloud credentials' do
|
@@ -369,11 +364,11 @@ describe Elasticsearch::Transport::Client do
|
|
369
364
|
expect(hosts[0][:protocol]).to eq('https')
|
370
365
|
expect(hosts[0][:user]).to eq('elastic')
|
371
366
|
expect(hosts[0][:password]).to eq('changeme')
|
372
|
-
expect(hosts[0][:port]).to eq(
|
367
|
+
expect(hosts[0][:port]).to eq(9250)
|
373
368
|
end
|
374
369
|
|
375
370
|
it 'creates the correct full url' do
|
376
|
-
expect(client.transport.__full_url(client.transport.hosts[0])).to eq('https://elastic:changeme@abcd.localhost:
|
371
|
+
expect(client.transport.__full_url(client.transport.hosts[0])).to eq('https://elastic:changeme@abcd.localhost:9250')
|
377
372
|
end
|
378
373
|
end
|
379
374
|
|
@@ -396,13 +391,13 @@ describe Elasticsearch::Transport::Client do
|
|
396
391
|
expect(hosts[0][:protocol]).to eq('https')
|
397
392
|
expect(hosts[0][:user]).to eq('elasticfantastic')
|
398
393
|
expect(hosts[0][:password]).to eq('tobechanged')
|
399
|
-
expect(hosts[0][:port]).to eq(
|
394
|
+
expect(hosts[0][:port]).to eq(443)
|
400
395
|
end
|
401
396
|
|
402
397
|
it 'creates the correct full url' do
|
403
398
|
expect(
|
404
399
|
client.transport.__full_url(client.transport.hosts[0])
|
405
|
-
).to eq('https://elasticfantastic:tobechanged@abcd.localhost:
|
400
|
+
).to eq('https://elasticfantastic:tobechanged@abcd.localhost:443')
|
406
401
|
end
|
407
402
|
end
|
408
403
|
|
@@ -424,125 +419,306 @@ describe Elasticsearch::Transport::Client do
|
|
424
419
|
expect(hosts[0][:protocol]).to eq('https')
|
425
420
|
expect(hosts[0][:user]).to eq('elasticfantastic')
|
426
421
|
expect(hosts[0][:password]).to eq('changeme')
|
427
|
-
expect(hosts[0][:port]).to eq(
|
422
|
+
expect(hosts[0][:port]).to eq(443)
|
428
423
|
end
|
429
424
|
|
430
425
|
it 'creates the correct full url' do
|
431
426
|
expect(
|
432
427
|
client.transport.__full_url(client.transport.hosts[0])
|
433
|
-
).to eq('https://elasticfantastic:changeme@abcd.localhost:
|
428
|
+
).to eq('https://elasticfantastic:changeme@abcd.localhost:443')
|
434
429
|
end
|
435
430
|
end
|
436
|
-
end
|
437
431
|
|
438
|
-
|
432
|
+
context 'when the cloud host provides a port' do
|
433
|
+
let(:client) do
|
434
|
+
described_class.new(
|
435
|
+
cloud_id: 'name:ZWxhc3RpY19zZXJ2ZXI6OTI0MyRlbGFzdGljX2lk',
|
436
|
+
user: 'elastic',
|
437
|
+
password: 'changeme'
|
438
|
+
)
|
439
|
+
end
|
439
440
|
|
440
|
-
|
441
|
+
let(:hosts) do
|
442
|
+
client.transport.hosts
|
443
|
+
end
|
441
444
|
|
442
|
-
|
443
|
-
'
|
445
|
+
it 'creates the correct full url' do
|
446
|
+
expect(hosts[0][:host]).to eq('elastic_id.elastic_server')
|
447
|
+
expect(hosts[0][:protocol]).to eq('https')
|
448
|
+
expect(hosts[0][:user]).to eq('elastic')
|
449
|
+
expect(hosts[0][:password]).to eq('changeme')
|
450
|
+
expect(hosts[0][:port]).to eq(9243)
|
444
451
|
end
|
452
|
+
end
|
445
453
|
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
454
|
+
context 'when the cloud host provides a port and the port is also specified' do
|
455
|
+
let(:client) do
|
456
|
+
described_class.new(
|
457
|
+
cloud_id: 'name:ZWxhc3RpY19zZXJ2ZXI6OTI0MyRlbGFzdGljX2lk',
|
458
|
+
user: 'elastic',
|
459
|
+
password: 'changeme',
|
460
|
+
port: 9200
|
461
|
+
)
|
450
462
|
end
|
451
463
|
|
452
|
-
|
464
|
+
let(:hosts) do
|
465
|
+
client.transport.hosts
|
466
|
+
end
|
453
467
|
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
468
|
+
it 'creates the correct full url' do
|
469
|
+
expect(hosts[0][:host]).to eq('elastic_id.elastic_server')
|
470
|
+
expect(hosts[0][:protocol]).to eq('https')
|
471
|
+
expect(hosts[0][:user]).to eq('elastic')
|
472
|
+
expect(hosts[0][:password]).to eq('changeme')
|
473
|
+
expect(hosts[0][:port]).to eq(9243)
|
474
|
+
end
|
475
|
+
end
|
476
|
+
end
|
460
477
|
|
461
|
-
|
462
|
-
'https://[2090:db8:85a3:9811::1f]:8080'
|
463
|
-
end
|
478
|
+
shared_examples_for 'a client that extracts hosts' do
|
464
479
|
|
465
|
-
|
466
|
-
expect(hosts[0][:host]).to eq('[2090:db8:85a3:9811::1f]')
|
467
|
-
expect(hosts[0][:scheme]).to eq('https')
|
468
|
-
expect(hosts[0][:port]).to be(8080)
|
469
|
-
end
|
480
|
+
context 'when the host is a String' do
|
470
481
|
|
471
|
-
|
472
|
-
expect(client.transport.__full_url(client.transport.hosts[0])).to eq('https://[2090:db8:85a3:9811::1f]:8080')
|
473
|
-
end
|
474
|
-
end
|
482
|
+
context 'when there is a protocol specified' do
|
475
483
|
|
476
|
-
|
484
|
+
context 'when credentials are specified \'http://USERNAME:PASSWORD@myhost:8080\'' do
|
477
485
|
|
478
|
-
|
479
|
-
|
480
|
-
|
486
|
+
let(:host) do
|
487
|
+
'http://USERNAME:PASSWORD@myhost:8080'
|
488
|
+
end
|
481
489
|
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
expect(hosts[0][:port]).to be(8080)
|
487
|
-
end
|
488
|
-
end
|
490
|
+
it 'extracts the credentials' do
|
491
|
+
expect(hosts[0][:user]).to eq('USERNAME')
|
492
|
+
expect(hosts[0][:password]).to eq('PASSWORD')
|
493
|
+
end
|
489
494
|
|
490
|
-
|
495
|
+
it 'extracts the host' do
|
496
|
+
expect(hosts[0][:host]).to eq('myhost')
|
497
|
+
end
|
491
498
|
|
492
|
-
|
493
|
-
|
499
|
+
it 'extracts the port' do
|
500
|
+
expect(hosts[0][:port]).to be(8080)
|
501
|
+
end
|
494
502
|
end
|
495
503
|
|
496
|
-
|
497
|
-
expect(hosts[0][:host]).to eq('myhost')
|
498
|
-
expect(hosts[0][:scheme]).to eq('https')
|
499
|
-
expect(hosts[0][:port]).to be(8080)
|
500
|
-
end
|
501
|
-
end
|
504
|
+
context 'when there is a trailing slash \'http://myhost/\'' do
|
502
505
|
|
503
|
-
|
506
|
+
let(:host) do
|
507
|
+
'http://myhost/'
|
508
|
+
end
|
504
509
|
|
505
|
-
|
506
|
-
|
510
|
+
it 'extracts the host' do
|
511
|
+
expect(hosts[0][:host]).to eq('myhost')
|
512
|
+
expect(hosts[0][:scheme]).to eq('http')
|
513
|
+
expect(hosts[0][:path]).to eq('')
|
514
|
+
end
|
515
|
+
|
516
|
+
it 'extracts the scheme' do
|
517
|
+
expect(hosts[0][:scheme]).to eq('http')
|
518
|
+
end
|
519
|
+
|
520
|
+
it 'extracts the path' do
|
521
|
+
expect(hosts[0][:path]).to eq('')
|
522
|
+
end
|
507
523
|
end
|
508
524
|
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
525
|
+
context 'when there is a trailing slash with a path \'http://myhost/foo/bar/\'' do
|
526
|
+
|
527
|
+
let(:host) do
|
528
|
+
'http://myhost/foo/bar/'
|
529
|
+
end
|
530
|
+
|
531
|
+
it 'extracts the host' do
|
532
|
+
expect(hosts[0][:host]).to eq('myhost')
|
533
|
+
expect(hosts[0][:scheme]).to eq('http')
|
534
|
+
expect(hosts[0][:path]).to eq('/foo/bar')
|
535
|
+
end
|
515
536
|
end
|
516
|
-
end
|
517
537
|
|
518
|
-
|
538
|
+
context 'when the protocol is http' do
|
519
539
|
|
520
|
-
|
521
|
-
|
540
|
+
context 'when there is no port specified \'http://myhost\'' do
|
541
|
+
|
542
|
+
let(:host) do
|
543
|
+
'http://myhost'
|
544
|
+
end
|
545
|
+
|
546
|
+
it 'extracts the host' do
|
547
|
+
expect(hosts[0][:host]).to eq('myhost')
|
548
|
+
end
|
549
|
+
|
550
|
+
it 'extracts the protocol' do
|
551
|
+
expect(hosts[0][:protocol]).to eq('http')
|
552
|
+
end
|
553
|
+
|
554
|
+
it 'defaults to port 9200' do
|
555
|
+
expect(hosts[0][:port]).to be(9200)
|
556
|
+
end
|
557
|
+
end
|
558
|
+
|
559
|
+
context 'when there is a port specified \'http://myhost:7101\'' do
|
560
|
+
|
561
|
+
let(:host) do
|
562
|
+
'http://myhost:7101'
|
563
|
+
end
|
564
|
+
|
565
|
+
it 'extracts the host' do
|
566
|
+
expect(hosts[0][:host]).to eq('myhost')
|
567
|
+
end
|
568
|
+
|
569
|
+
it 'extracts the protocol' do
|
570
|
+
expect(hosts[0][:protocol]).to eq('http')
|
571
|
+
end
|
572
|
+
|
573
|
+
it 'extracts the port' do
|
574
|
+
expect(hosts[0][:port]).to be(7101)
|
575
|
+
end
|
576
|
+
|
577
|
+
context 'when there is a path specified \'http://myhost:7101/api\'' do
|
578
|
+
|
579
|
+
let(:host) do
|
580
|
+
'http://myhost:7101/api'
|
581
|
+
end
|
582
|
+
|
583
|
+
it 'sets the path' do
|
584
|
+
expect(hosts[0][:host]).to eq('myhost')
|
585
|
+
expect(hosts[0][:protocol]).to eq('http')
|
586
|
+
expect(hosts[0][:path]).to eq('/api')
|
587
|
+
expect(hosts[0][:port]).to be(7101)
|
588
|
+
end
|
589
|
+
|
590
|
+
it 'extracts the host' do
|
591
|
+
expect(hosts[0][:host]).to eq('myhost')
|
592
|
+
end
|
593
|
+
|
594
|
+
it 'extracts the protocol' do
|
595
|
+
expect(hosts[0][:protocol]).to eq('http')
|
596
|
+
end
|
597
|
+
|
598
|
+
it 'extracts the port' do
|
599
|
+
expect(hosts[0][:port]).to be(7101)
|
600
|
+
end
|
601
|
+
|
602
|
+
it 'extracts the path' do
|
603
|
+
expect(hosts[0][:path]).to eq('/api')
|
604
|
+
end
|
605
|
+
end
|
606
|
+
end
|
522
607
|
end
|
523
608
|
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
609
|
+
context 'when the protocol is https' do
|
610
|
+
|
611
|
+
context 'when there is no port specified \'https://myhost\'' do
|
612
|
+
|
613
|
+
let(:host) do
|
614
|
+
'https://myhost'
|
615
|
+
end
|
616
|
+
|
617
|
+
it 'extracts the host' do
|
618
|
+
expect(hosts[0][:host]).to eq('myhost')
|
619
|
+
end
|
620
|
+
|
621
|
+
it 'extracts the protocol' do
|
622
|
+
expect(hosts[0][:protocol]).to eq('https')
|
623
|
+
end
|
624
|
+
|
625
|
+
it 'defaults to port 443' do
|
626
|
+
expect(hosts[0][:port]).to be(443)
|
627
|
+
end
|
628
|
+
end
|
629
|
+
|
630
|
+
context 'when there is a port specified \'https://myhost:7101\'' do
|
631
|
+
|
632
|
+
let(:host) do
|
633
|
+
'https://myhost:7101'
|
634
|
+
end
|
635
|
+
|
636
|
+
it 'extracts the host' do
|
637
|
+
expect(hosts[0][:host]).to eq('myhost')
|
638
|
+
end
|
639
|
+
|
640
|
+
it 'extracts the protocol' do
|
641
|
+
expect(hosts[0][:protocol]).to eq('https')
|
642
|
+
end
|
643
|
+
|
644
|
+
it 'extracts the port' do
|
645
|
+
expect(hosts[0][:port]).to be(7101)
|
646
|
+
end
|
647
|
+
|
648
|
+
context 'when there is a path specified \'https://myhost:7101/api\'' do
|
649
|
+
|
650
|
+
let(:host) do
|
651
|
+
'https://myhost:7101/api'
|
652
|
+
end
|
653
|
+
|
654
|
+
it 'extracts the host' do
|
655
|
+
expect(hosts[0][:host]).to eq('myhost')
|
656
|
+
end
|
657
|
+
|
658
|
+
it 'extracts the protocol' do
|
659
|
+
expect(hosts[0][:protocol]).to eq('https')
|
660
|
+
end
|
661
|
+
|
662
|
+
it 'extracts the port' do
|
663
|
+
expect(hosts[0][:port]).to be(7101)
|
664
|
+
end
|
665
|
+
|
666
|
+
it 'extracts the path' do
|
667
|
+
expect(hosts[0][:path]).to eq('/api')
|
668
|
+
end
|
669
|
+
end
|
670
|
+
end
|
671
|
+
|
672
|
+
context 'when IPv6 format is used' do
|
673
|
+
|
674
|
+
around do |example|
|
675
|
+
original_setting = Faraday.ignore_env_proxy
|
676
|
+
Faraday.ignore_env_proxy = true
|
677
|
+
example.run
|
678
|
+
Faraday.ignore_env_proxy = original_setting
|
679
|
+
end
|
680
|
+
|
681
|
+
let(:host) do
|
682
|
+
'https://[2090:db8:85a3:9811::1f]:8080'
|
683
|
+
end
|
684
|
+
|
685
|
+
it 'extracts the host' do
|
686
|
+
expect(hosts[0][:host]).to eq('[2090:db8:85a3:9811::1f]')
|
687
|
+
end
|
688
|
+
|
689
|
+
it 'extracts the protocol' do
|
690
|
+
expect(hosts[0][:protocol]).to eq('https')
|
691
|
+
end
|
692
|
+
|
693
|
+
it 'extracts the port' do
|
694
|
+
expect(hosts[0][:port]).to be(8080)
|
695
|
+
end
|
696
|
+
|
697
|
+
it 'creates the correct full url' do
|
698
|
+
expect(client.transport.__full_url(client.transport.hosts[0])).to eq('https://[2090:db8:85a3:9811::1f]:8080')
|
699
|
+
end
|
700
|
+
end
|
528
701
|
end
|
529
702
|
end
|
530
703
|
|
531
|
-
context 'when
|
704
|
+
context 'when no protocol is specified \'myhost\'' do
|
532
705
|
|
533
706
|
let(:host) do
|
534
|
-
'
|
707
|
+
'myhost'
|
535
708
|
end
|
536
709
|
|
537
|
-
it '
|
710
|
+
it 'defaults to http' do
|
538
711
|
expect(hosts[0][:host]).to eq('myhost')
|
539
|
-
expect(hosts[0][:
|
540
|
-
|
712
|
+
expect(hosts[0][:protocol]).to eq('http')
|
713
|
+
end
|
714
|
+
|
715
|
+
it 'uses port 9200' do
|
716
|
+
expect(hosts[0][:port]).to be(9200)
|
541
717
|
end
|
542
718
|
end
|
543
719
|
end
|
544
720
|
|
545
|
-
context 'when the
|
721
|
+
context 'when the host is a Hash' do
|
546
722
|
|
547
723
|
let(:host) do
|
548
724
|
{ :host => 'myhost', :scheme => 'https' }
|
@@ -550,7 +726,13 @@ describe Elasticsearch::Transport::Client do
|
|
550
726
|
|
551
727
|
it 'extracts the host' do
|
552
728
|
expect(hosts[0][:host]).to eq('myhost')
|
553
|
-
|
729
|
+
end
|
730
|
+
|
731
|
+
it 'extracts the protocol' do
|
732
|
+
expect(hosts[0][:protocol]).to eq('https')
|
733
|
+
end
|
734
|
+
|
735
|
+
it 'extracts the port' do
|
554
736
|
expect(hosts[0][:port]).to be(9200)
|
555
737
|
end
|
556
738
|
|
@@ -609,7 +791,13 @@ describe Elasticsearch::Transport::Client do
|
|
609
791
|
|
610
792
|
it 'extracts the host' do
|
611
793
|
expect(hosts[0][:host]).to eq('myhost')
|
794
|
+
end
|
795
|
+
|
796
|
+
it 'extracts the protocol' do
|
612
797
|
expect(hosts[0][:scheme]).to eq('https')
|
798
|
+
end
|
799
|
+
|
800
|
+
it 'converts the port to an integer' do
|
613
801
|
expect(hosts[0][:port]).to be(443)
|
614
802
|
end
|
615
803
|
end
|
@@ -622,7 +810,13 @@ describe Elasticsearch::Transport::Client do
|
|
622
810
|
|
623
811
|
it 'extracts the host' do
|
624
812
|
expect(hosts[0][:host]).to eq('myhost')
|
813
|
+
end
|
814
|
+
|
815
|
+
it 'extracts the protocol' do
|
625
816
|
expect(hosts[0][:scheme]).to eq('https')
|
817
|
+
end
|
818
|
+
|
819
|
+
it 'extracts port as an integer' do
|
626
820
|
expect(hosts[0][:port]).to be(443)
|
627
821
|
end
|
628
822
|
end
|
@@ -636,7 +830,13 @@ describe Elasticsearch::Transport::Client do
|
|
636
830
|
|
637
831
|
it 'extracts the host' do
|
638
832
|
expect(hosts[0][:host]).to eq('myhost')
|
833
|
+
end
|
834
|
+
|
835
|
+
it 'extracts the protocol' do
|
639
836
|
expect(hosts[0][:scheme]).to eq('https')
|
837
|
+
end
|
838
|
+
|
839
|
+
it 'converts the port to an integer' do
|
640
840
|
expect(hosts[0][:port]).to be(9200)
|
641
841
|
end
|
642
842
|
|
@@ -648,7 +848,13 @@ describe Elasticsearch::Transport::Client do
|
|
648
848
|
|
649
849
|
it 'extracts the host' do
|
650
850
|
expect(hosts[0][:host]).to eq('myhost')
|
851
|
+
end
|
852
|
+
|
853
|
+
it 'extracts the protocol' do
|
651
854
|
expect(hosts[0][:scheme]).to eq('https')
|
855
|
+
end
|
856
|
+
|
857
|
+
it 'converts the port to an integer' do
|
652
858
|
expect(hosts[0][:port]).to be(443)
|
653
859
|
end
|
654
860
|
end
|
@@ -661,7 +867,13 @@ describe Elasticsearch::Transport::Client do
|
|
661
867
|
|
662
868
|
it 'extracts the host' do
|
663
869
|
expect(hosts[0][:host]).to eq('myhost')
|
870
|
+
end
|
871
|
+
|
872
|
+
it 'extracts the protocol' do
|
664
873
|
expect(hosts[0][:scheme]).to eq('https')
|
874
|
+
end
|
875
|
+
|
876
|
+
it 'extracts port as an integer' do
|
665
877
|
expect(hosts[0][:port]).to be(443)
|
666
878
|
end
|
667
879
|
end
|
@@ -677,7 +889,13 @@ describe Elasticsearch::Transport::Client do
|
|
677
889
|
|
678
890
|
it 'extracts the host' do
|
679
891
|
expect(hosts[0][:host]).to eq('myhost')
|
892
|
+
end
|
893
|
+
|
894
|
+
it 'extracts the protocol' do
|
680
895
|
expect(hosts[0][:protocol]).to eq('http')
|
896
|
+
end
|
897
|
+
|
898
|
+
it 'defaults to port 9200' do
|
681
899
|
expect(hosts[0][:port]).to be(9200)
|
682
900
|
end
|
683
901
|
end
|
@@ -690,20 +908,13 @@ describe Elasticsearch::Transport::Client do
|
|
690
908
|
|
691
909
|
it 'extracts the host' do
|
692
910
|
expect(hosts[0][:host]).to eq('myhost')
|
693
|
-
expect(hosts[0][:protocol]).to eq('http')
|
694
|
-
expect(hosts[0][:port]).to be(9200)
|
695
911
|
end
|
696
|
-
end
|
697
912
|
|
698
|
-
|
699
|
-
|
700
|
-
let(:host) do
|
701
|
-
['http://myhost']
|
913
|
+
it 'extracts the protocol' do
|
914
|
+
expect(hosts[0][:scheme]).to eq('http')
|
702
915
|
end
|
703
916
|
|
704
|
-
it '
|
705
|
-
expect(hosts[0][:host]).to eq('myhost')
|
706
|
-
expect(hosts[0][:protocol]).to eq('http')
|
917
|
+
it 'defaults to port 9200' do
|
707
918
|
expect(hosts[0][:port]).to be(9200)
|
708
919
|
end
|
709
920
|
end
|
@@ -728,7 +939,7 @@ describe Elasticsearch::Transport::Client do
|
|
728
939
|
end
|
729
940
|
end
|
730
941
|
|
731
|
-
context 'when there is one host with a
|
942
|
+
context 'when there is one host with a protocol and no port' do
|
732
943
|
|
733
944
|
let(:host) do
|
734
945
|
['https://myhost']
|
@@ -736,12 +947,18 @@ describe Elasticsearch::Transport::Client do
|
|
736
947
|
|
737
948
|
it 'extracts the host' do
|
738
949
|
expect(hosts[0][:host]).to eq('myhost')
|
739
|
-
|
740
|
-
|
950
|
+
end
|
951
|
+
|
952
|
+
it 'extracts the protocol' do
|
953
|
+
expect(hosts[0][:scheme]).to eq('https')
|
954
|
+
end
|
955
|
+
|
956
|
+
it 'defaults to port 443' do
|
957
|
+
expect(hosts[0][:port]).to be(443)
|
741
958
|
end
|
742
959
|
end
|
743
960
|
|
744
|
-
context 'when there is one host with a
|
961
|
+
context 'when there is one host with a protocol, path, and no port' do
|
745
962
|
|
746
963
|
let(:host) do
|
747
964
|
['http://myhost/foo/bar']
|
@@ -749,9 +966,18 @@ describe Elasticsearch::Transport::Client do
|
|
749
966
|
|
750
967
|
it 'extracts the host' do
|
751
968
|
expect(hosts[0][:host]).to eq('myhost')
|
752
|
-
|
969
|
+
end
|
970
|
+
|
971
|
+
it 'extracts the protocol' do
|
972
|
+
expect(hosts[0][:scheme]).to eq('http')
|
973
|
+
end
|
974
|
+
|
975
|
+
it 'defaults to port 9200' do
|
753
976
|
expect(hosts[0][:port]).to be(9200)
|
754
|
-
|
977
|
+
end
|
978
|
+
|
979
|
+
it 'extracts the path' do
|
980
|
+
expect(hosts[0][:path]).to eq('/foo/bar')
|
755
981
|
end
|
756
982
|
end
|
757
983
|
|
@@ -761,7 +987,7 @@ describe Elasticsearch::Transport::Client do
|
|
761
987
|
['host1', 'host2']
|
762
988
|
end
|
763
989
|
|
764
|
-
it 'extracts the
|
990
|
+
it 'extracts the hosts' do
|
765
991
|
expect(hosts[0][:host]).to eq('host1')
|
766
992
|
expect(hosts[0][:protocol]).to eq('http')
|
767
993
|
expect(hosts[0][:port]).to be(9200)
|
@@ -777,7 +1003,7 @@ describe Elasticsearch::Transport::Client do
|
|
777
1003
|
['host1:1000', 'host2:2000']
|
778
1004
|
end
|
779
1005
|
|
780
|
-
it 'extracts the
|
1006
|
+
it 'extracts the hosts' do
|
781
1007
|
expect(hosts[0][:host]).to eq('host1')
|
782
1008
|
expect(hosts[0][:protocol]).to eq('http')
|
783
1009
|
expect(hosts[0][:port]).to be(1000)
|
@@ -1197,7 +1423,7 @@ describe Elasticsearch::Transport::Client do
|
|
1197
1423
|
allow(client).to receive(:perform_request) { OpenStruct.new(body: '') }
|
1198
1424
|
expect { client.search(opaque_id: 'opaque_id') }.not_to raise_error
|
1199
1425
|
expect(client).to have_received(:perform_request)
|
1200
|
-
|
1426
|
+
.with('GET', '_search', { opaque_id: 'opaque_id' }, nil, {})
|
1201
1427
|
end
|
1202
1428
|
end
|
1203
1429
|
end
|
@@ -1236,7 +1462,28 @@ describe Elasticsearch::Transport::Client do
|
|
1236
1462
|
allow(client).to receive(:perform_request) { OpenStruct.new(body: '') }
|
1237
1463
|
expect { client.search(headers: headers) }.not_to raise_error
|
1238
1464
|
expect(client).to have_received(:perform_request)
|
1239
|
-
|
1465
|
+
.with('GET', '_search', {}, nil, headers)
|
1466
|
+
end
|
1467
|
+
end
|
1468
|
+
|
1469
|
+
context 'when a header is set on an endpoint request and on initialization' do
|
1470
|
+
let!(:client) do
|
1471
|
+
described_class.new(
|
1472
|
+
host: hosts,
|
1473
|
+
transport_options: { headers: instance_headers }
|
1474
|
+
)
|
1475
|
+
end
|
1476
|
+
let(:instance_headers) { { set_in_instantiation: 'header value' } }
|
1477
|
+
let(:param_headers) {{'user-agent' => 'My Ruby Tests', 'set-on-method-call' => 'header value'}}
|
1478
|
+
|
1479
|
+
it 'performs the request with the header' do
|
1480
|
+
expected_headers = client.transport.connections.connections.first.connection.headers.merge(param_headers)
|
1481
|
+
|
1482
|
+
expect_any_instance_of(Faraday::Connection)
|
1483
|
+
.to receive(:run_request)
|
1484
|
+
.with(:get, "http://#{hosts[0]}/_search", nil, expected_headers) { OpenStruct.new(body: '')}
|
1485
|
+
|
1486
|
+
client.search(headers: param_headers)
|
1240
1487
|
end
|
1241
1488
|
end
|
1242
1489
|
end
|
@@ -1458,7 +1705,7 @@ describe Elasticsearch::Transport::Client do
|
|
1458
1705
|
context 'when using the HTTPClient adapter' do
|
1459
1706
|
|
1460
1707
|
let(:client) do
|
1461
|
-
described_class.new(hosts: ELASTICSEARCH_HOSTS, compression: true, adapter: :httpclient)
|
1708
|
+
described_class.new(hosts: ELASTICSEARCH_HOSTS, compression: true, adapter: :httpclient, enable_meta_header: false)
|
1462
1709
|
end
|
1463
1710
|
|
1464
1711
|
it 'compresses the request and decompresses the response' do
|