elasticsearch-transport 7.15.0 → 7.16.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/elasticsearch-transport.gemspec +4 -4
- data/lib/elasticsearch/transport/client.rb +31 -0
- data/lib/elasticsearch/transport/transport/base.rb +30 -9
- data/lib/elasticsearch/transport/transport/connections/connection.rb +2 -1
- data/lib/elasticsearch/transport/transport/http/curb.rb +6 -4
- data/lib/elasticsearch/transport/transport/http/faraday.rb +8 -7
- data/lib/elasticsearch/transport/transport/http/manticore.rb +4 -1
- data/lib/elasticsearch/transport/version.rb +1 -1
- data/lib/elasticsearch/transport.rb +1 -0
- data/spec/elasticsearch/transport/client_spec.rb +107 -24
- data/spec/elasticsearch/transport/http/curb_spec.rb +126 -0
- data/spec/elasticsearch/transport/http/faraday_spec.rb +141 -0
- data/spec/elasticsearch/transport/http/manticore_spec.rb +143 -0
- metadata +12 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 86cb8f5de5ca5fc4270376d791ea8bd03252e5bbed8494d232da2eea8512434a
|
4
|
+
data.tar.gz: 27a6b7bfeea33bfa6e56ddd4a01109a1864a48685b54558707fe9af15ae73948
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d2c129c4eeeb76a83d3fea12764ec135ad768920cd20c7c447a768708ab324db32482bdf616197e0674fe72a62ec74422b35774117a2d22cd0de8cc1520df20d
|
7
|
+
data.tar.gz: 586f14ab09c77a7a257667131d692dfd056e06ea66ccd3f53194985113043dec32e0fab5cf7fb3ed3d1a84036df02127df051c589ca137c6412ea8456a238a68
|
@@ -26,12 +26,12 @@ Gem::Specification.new do |s|
|
|
26
26
|
s.authors = ['Karel Minarik']
|
27
27
|
s.email = ['karel.minarik@elasticsearch.org']
|
28
28
|
s.summary = 'Ruby client for Elasticsearch.'
|
29
|
-
s.homepage = 'https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/7.
|
29
|
+
s.homepage = 'https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/7.16/index.html'
|
30
30
|
s.license = 'Apache-2.0'
|
31
31
|
s.metadata = {
|
32
|
-
'homepage_uri' => 'https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/7.
|
33
|
-
'changelog_uri' => 'https://github.com/elastic/elasticsearch-ruby/blob/7.
|
34
|
-
'source_code_uri' => 'https://github.com/elastic/elasticsearch-ruby/tree/7.
|
32
|
+
'homepage_uri' => 'https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/7.16/index.html',
|
33
|
+
'changelog_uri' => 'https://github.com/elastic/elasticsearch-ruby/blob/7.16/CHANGELOG.md',
|
34
|
+
'source_code_uri' => 'https://github.com/elastic/elasticsearch-ruby/tree/7.16/elasticsearch-transport',
|
35
35
|
'bug_tracker_uri' => 'https://github.com/elastic/elasticsearch-ruby/issues'
|
36
36
|
}
|
37
37
|
s.files = `git ls-files`.split($/)
|
@@ -92,6 +92,8 @@ module Elasticsearch
|
|
92
92
|
#
|
93
93
|
# @option arguments [Boolean,Number] :retry_on_failure Retry X times when request fails before raising and
|
94
94
|
# exception (false by default)
|
95
|
+
# @option arguments [Number] :delay_on_retry Delay in milliseconds between each retry (0 by default)
|
96
|
+
#
|
95
97
|
# @option arguments Array<Number> :retry_on_status Retry when specific status codes are returned
|
96
98
|
#
|
97
99
|
# @option arguments [Boolean] :reload_on_failure Reload connections after failure (false by default)
|
@@ -126,6 +128,7 @@ module Elasticsearch
|
|
126
128
|
# if you're using X-Opaque-Id
|
127
129
|
# @option enable_meta_header [Boolean] :enable_meta_header Enable sending the meta data header to Cloud.
|
128
130
|
# (Default: true)
|
131
|
+
# @option ca_fingerprint [String] :ca_fingerprint provide this value to only trust certificates that are signed by a specific CA certificate
|
129
132
|
#
|
130
133
|
# @yield [faraday] Access and configure the `Faraday::Connection` instance directly with a block
|
131
134
|
#
|
@@ -136,6 +139,7 @@ module Elasticsearch
|
|
136
139
|
@arguments[:tracer] ||= @arguments[:trace] ? DEFAULT_TRACER.call() : nil
|
137
140
|
@arguments[:reload_connections] ||= false
|
138
141
|
@arguments[:retry_on_failure] ||= false
|
142
|
+
@arguments[:delay_on_retry] ||= 0
|
139
143
|
@arguments[:reload_on_failure] ||= false
|
140
144
|
@arguments[:randomize_hosts] ||= false
|
141
145
|
@arguments[:transport_options] ||= {}
|
@@ -156,6 +160,7 @@ module Elasticsearch
|
|
156
160
|
|
157
161
|
@send_get_body_as = @arguments[:send_get_body_as] || 'GET'
|
158
162
|
@opaque_id_prefix = @arguments[:opaque_id_prefix] || nil
|
163
|
+
@ca_fingerprint = @arguments.delete(:ca_fingerprint)
|
159
164
|
|
160
165
|
if @arguments[:request_timeout]
|
161
166
|
@arguments[:transport_options][:request] = { timeout: @arguments[:request_timeout] }
|
@@ -188,6 +193,7 @@ module Elasticsearch
|
|
188
193
|
opaque_id = @opaque_id_prefix ? "#{@opaque_id_prefix}#{opaque_id}" : opaque_id
|
189
194
|
headers.merge!('X-Opaque-Id' => opaque_id)
|
190
195
|
end
|
196
|
+
validate_ca_fingerprints if @ca_fingerprint
|
191
197
|
transport.perform_request(method, path, params, body, headers)
|
192
198
|
end
|
193
199
|
|
@@ -211,6 +217,31 @@ module Elasticsearch
|
|
211
217
|
)
|
212
218
|
end
|
213
219
|
|
220
|
+
def validate_ca_fingerprints
|
221
|
+
transport.connections.connections.each do |connection|
|
222
|
+
unless connection.host[:scheme] == 'https'
|
223
|
+
raise Elasticsearch::Transport::Transport::Error, 'CA fingerprinting can\'t be configured over http'
|
224
|
+
end
|
225
|
+
|
226
|
+
next if connection.verified
|
227
|
+
|
228
|
+
ctx = OpenSSL::SSL::SSLContext.new
|
229
|
+
socket = TCPSocket.new(connection.host[:host], connection.host[:port])
|
230
|
+
ssl = OpenSSL::SSL::SSLSocket.new(socket, ctx)
|
231
|
+
ssl.connect
|
232
|
+
cert_store = ssl.peer_cert_chain
|
233
|
+
matching_certs = cert_store.select do |cert|
|
234
|
+
OpenSSL::Digest::SHA256.hexdigest(cert.to_der).upcase == @ca_fingerprint.upcase.gsub(':', '')
|
235
|
+
end
|
236
|
+
if matching_certs.empty?
|
237
|
+
raise Elasticsearch::Transport::Transport::Error,
|
238
|
+
'Server certificate CA fingerprint does not match the value configured in ca_fingerprint'
|
239
|
+
end
|
240
|
+
|
241
|
+
connection.verified = true
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
214
245
|
def add_header(header)
|
215
246
|
headers = @arguments[:transport_options]&.[](:headers) || {}
|
216
247
|
headers.merge!(header)
|
@@ -54,6 +54,7 @@ module Elasticsearch
|
|
54
54
|
@options = arguments[:options] || {}
|
55
55
|
@options[:http] ||= {}
|
56
56
|
@options[:retry_on_status] ||= []
|
57
|
+
@options[:delay_on_retry] ||= 0
|
57
58
|
|
58
59
|
@block = block
|
59
60
|
@compression = !!@options[:compression]
|
@@ -223,7 +224,7 @@ module Elasticsearch
|
|
223
224
|
# @api private
|
224
225
|
#
|
225
226
|
def __convert_to_json(o=nil, options={})
|
226
|
-
o
|
227
|
+
o.is_a?(String) ? o : serializer.dump(o, options)
|
227
228
|
end
|
228
229
|
|
229
230
|
# Returns a full URL based on information from host
|
@@ -264,6 +265,7 @@ module Elasticsearch
|
|
264
265
|
start = Time.now
|
265
266
|
tries = 0
|
266
267
|
reload_on_failure = opts.fetch(:reload_on_failure, @options[:reload_on_failure])
|
268
|
+
delay_on_retry = opts.fetch(:delay_on_retry, @options[:delay_on_retry])
|
267
269
|
|
268
270
|
max_retries = if opts.key?(:retry_on_failure)
|
269
271
|
opts[:retry_on_failure] === true ? DEFAULT_MAX_RETRIES : opts[:retry_on_failure]
|
@@ -275,6 +277,7 @@ module Elasticsearch
|
|
275
277
|
ignore = Array(params.delete(:ignore)).compact.map { |s| s.to_i }
|
276
278
|
|
277
279
|
begin
|
280
|
+
sleep(delay_on_retry / 1000.0) if tries > 0
|
278
281
|
tries += 1
|
279
282
|
connection = get_connection or raise Error.new('Cannot get new connection from pool.')
|
280
283
|
|
@@ -306,7 +309,6 @@ module Elasticsearch
|
|
306
309
|
log_error "[#{e.class}] #{e.message} #{connection.host.inspect}"
|
307
310
|
|
308
311
|
connection.dead!
|
309
|
-
|
310
312
|
if reload_on_failure and tries < connections.all.size
|
311
313
|
log_warn "[#{e.class}] Reloading connections (attempt #{tries} of #{connections.all.size})"
|
312
314
|
reload_connections! and retry
|
@@ -348,7 +350,7 @@ module Elasticsearch
|
|
348
350
|
end
|
349
351
|
|
350
352
|
__trace(method, path, params, connection_headers(connection), body, url, response, nil, 'N/A', duration) if tracer
|
351
|
-
|
353
|
+
log_warn(response.headers['warning']) if response.headers&.[]('warning')
|
352
354
|
Response.new response.status, json || response.body, response.headers
|
353
355
|
ensure
|
354
356
|
@last_request_at = Time.now
|
@@ -367,17 +369,38 @@ module Elasticsearch
|
|
367
369
|
|
368
370
|
USER_AGENT_STR = 'User-Agent'.freeze
|
369
371
|
USER_AGENT_REGEX = /user\-?\_?agent/
|
372
|
+
ACCEPT_ENCODING = 'Accept-Encoding'.freeze
|
373
|
+
CONTENT_ENCODING = 'Content-Encoding'.freeze
|
370
374
|
CONTENT_TYPE_STR = 'Content-Type'.freeze
|
371
375
|
CONTENT_TYPE_REGEX = /content\-?\_?type/
|
372
376
|
DEFAULT_CONTENT_TYPE = 'application/json'.freeze
|
373
377
|
GZIP = 'gzip'.freeze
|
374
|
-
ACCEPT_ENCODING = 'Accept-Encoding'.freeze
|
375
378
|
GZIP_FIRST_TWO_BYTES = '1f8b'.freeze
|
376
379
|
HEX_STRING_DIRECTIVE = 'H*'.freeze
|
377
380
|
RUBY_ENCODING = '1.9'.respond_to?(:force_encoding)
|
378
381
|
|
382
|
+
def compress_request(body, headers)
|
383
|
+
if body
|
384
|
+
headers ||= {}
|
385
|
+
|
386
|
+
if gzipped?(body)
|
387
|
+
headers[CONTENT_ENCODING] = GZIP
|
388
|
+
elsif use_compression?
|
389
|
+
headers[CONTENT_ENCODING] = GZIP
|
390
|
+
gzip = Zlib::GzipWriter.new(StringIO.new)
|
391
|
+
gzip << body
|
392
|
+
body = gzip.close.string
|
393
|
+
else
|
394
|
+
headers.delete(CONTENT_ENCODING)
|
395
|
+
end
|
396
|
+
elsif headers
|
397
|
+
headers.delete(CONTENT_ENCODING)
|
398
|
+
end
|
399
|
+
|
400
|
+
[body, headers]
|
401
|
+
end
|
402
|
+
|
379
403
|
def decompress_response(body)
|
380
|
-
return body unless use_compression?
|
381
404
|
return body unless gzipped?(body)
|
382
405
|
|
383
406
|
io = StringIO.new(body)
|
@@ -390,6 +413,8 @@ module Elasticsearch
|
|
390
413
|
end
|
391
414
|
|
392
415
|
def gzipped?(body)
|
416
|
+
return unless body && !body.empty?
|
417
|
+
|
393
418
|
body[0..1].unpack(HEX_STRING_DIRECTIVE)[0] == GZIP_FIRST_TWO_BYTES
|
394
419
|
end
|
395
420
|
|
@@ -423,10 +448,6 @@ module Elasticsearch
|
|
423
448
|
end
|
424
449
|
end
|
425
450
|
|
426
|
-
def warnings(warning)
|
427
|
-
warn("warning: #{warning}")
|
428
|
-
end
|
429
|
-
|
430
451
|
def connection_headers(connection)
|
431
452
|
if defined?(Elasticsearch::Transport::Transport::HTTP::Manticore) && self.class == Elasticsearch::Transport::Transport::HTTP::Manticore
|
432
453
|
@request_options[:headers]
|
@@ -33,6 +33,7 @@ module Elasticsearch
|
|
33
33
|
DEFAULT_RESURRECT_TIMEOUT = 60
|
34
34
|
|
35
35
|
attr_reader :host, :connection, :options, :failures, :dead_since
|
36
|
+
attr_accessor :verified
|
36
37
|
|
37
38
|
# @option arguments [Hash] :host Host information (example: `{host: 'localhost', port: 9200}`)
|
38
39
|
# @option arguments [Object] :connection The transport-specific physical connection or "session"
|
@@ -42,6 +43,7 @@ module Elasticsearch
|
|
42
43
|
@host = arguments[:host].is_a?(Hash) ? Redacted.new(arguments[:host]) : arguments[:host]
|
43
44
|
@connection = arguments[:connection]
|
44
45
|
@options = arguments[:options] || {}
|
46
|
+
@verified = false
|
45
47
|
@state_mutex = Mutex.new
|
46
48
|
|
47
49
|
@options[:resurrect_timeout] ||= DEFAULT_RESURRECT_TIMEOUT
|
@@ -153,7 +155,6 @@ module Elasticsearch
|
|
153
155
|
"<#{self.class.name} host: #{host} (#{dead? ? 'dead since ' + dead_since.to_s : 'alive'})>"
|
154
156
|
end
|
155
157
|
end
|
156
|
-
|
157
158
|
end
|
158
159
|
end
|
159
160
|
end
|
@@ -19,29 +19,31 @@ module Elasticsearch
|
|
19
19
|
module Transport
|
20
20
|
module Transport
|
21
21
|
module HTTP
|
22
|
-
|
23
22
|
# Alternative HTTP transport implementation, using the [_Curb_](https://rubygems.org/gems/curb) client.
|
24
23
|
#
|
25
24
|
# @see Transport::Base
|
26
25
|
#
|
27
26
|
class Curb
|
28
27
|
include Base
|
29
|
-
|
30
28
|
# Performs the request by invoking {Transport::Base#perform_request} with a block.
|
31
29
|
#
|
32
30
|
# @return [Response]
|
33
31
|
# @see Transport::Base#perform_request
|
34
32
|
#
|
35
33
|
def perform_request(method, path, params={}, body=nil, headers=nil, opts={})
|
36
|
-
super do |connection,
|
34
|
+
super do |connection, _url|
|
37
35
|
connection.connection.url = connection.full_url(path, params)
|
36
|
+
body = body ? __convert_to_json(body) : nil
|
37
|
+
body, headers = compress_request(body, headers)
|
38
38
|
|
39
39
|
case method
|
40
40
|
when 'HEAD'
|
41
41
|
connection.connection.set :nobody, true
|
42
42
|
when 'GET', 'POST', 'PUT', 'DELETE'
|
43
43
|
connection.connection.set :nobody, false
|
44
|
-
|
44
|
+
|
45
|
+
connection.connection.put_data = body if body
|
46
|
+
|
45
47
|
if headers
|
46
48
|
if connection.connection.headers
|
47
49
|
connection.connection.headers.merge!(headers)
|
@@ -44,12 +44,13 @@ module Elasticsearch
|
|
44
44
|
headers
|
45
45
|
end
|
46
46
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
47
|
+
body = body ? __convert_to_json(body) : nil
|
48
|
+
body, headers = compress_request(body, headers)
|
49
|
+
|
50
|
+
response = connection.connection.run_request(method.downcase.to_sym,
|
51
|
+
url,
|
52
|
+
body,
|
53
|
+
headers)
|
53
54
|
|
54
55
|
Response.new response.status, decompress_response(response.body), response.headers
|
55
56
|
end
|
@@ -62,7 +63,7 @@ module Elasticsearch
|
|
62
63
|
def __build_connection(host, options={}, block=nil)
|
63
64
|
client = ::Faraday.new(__full_url(host), options, &block)
|
64
65
|
apply_headers(client, options)
|
65
|
-
Connections::Connection.new
|
66
|
+
Connections::Connection.new(host: host, connection: client)
|
66
67
|
end
|
67
68
|
|
68
69
|
# Returns an array of implementation specific connection errors.
|
@@ -83,7 +83,10 @@ module Elasticsearch
|
|
83
83
|
#
|
84
84
|
def perform_request(method, path, params={}, body=nil, headers=nil, opts={})
|
85
85
|
super do |connection, url|
|
86
|
-
|
86
|
+
body = body ? __convert_to_json(body) : nil
|
87
|
+
body, headers = compress_request(body, @request_options[:headers])
|
88
|
+
|
89
|
+
params[:body] = body if body
|
87
90
|
params[:headers] = headers if headers
|
88
91
|
params = params.merge @request_options
|
89
92
|
case method
|
@@ -1466,28 +1466,19 @@ describe Elasticsearch::Transport::Client do
|
|
1466
1466
|
end
|
1467
1467
|
|
1468
1468
|
context 'when Elasticsearch response includes a warning header' do
|
1469
|
+
let(:logger) { double('logger', warn: '', warn?: '', info?: '', info: '', debug?: '', debug: '') }
|
1469
1470
|
let(:client) do
|
1470
|
-
Elasticsearch::Transport::Client.new(hosts: hosts)
|
1471
|
+
Elasticsearch::Transport::Client.new(hosts: hosts, logger: logger)
|
1471
1472
|
end
|
1472
1473
|
|
1473
1474
|
let(:warning) { 'Elasticsearch warning: "deprecation warning"' }
|
1474
1475
|
|
1475
1476
|
it 'prints a warning' do
|
1476
|
-
|
1477
|
-
{ 'warning' => warning }
|
1478
|
-
end
|
1479
|
-
|
1480
|
-
begin
|
1481
|
-
stderr = $stderr
|
1482
|
-
fake_stderr = StringIO.new
|
1483
|
-
$stderr = fake_stderr
|
1484
|
-
|
1485
|
-
client.perform_request('GET', '/')
|
1486
|
-
fake_stderr.rewind
|
1487
|
-
expect(fake_stderr.string).to eq("warning: #{warning}\n")
|
1488
|
-
ensure
|
1489
|
-
$stderr = stderr
|
1477
|
+
expect_any_instance_of(Faraday::Connection).to receive(:run_request) do
|
1478
|
+
Elasticsearch::Transport::Transport::Response.new(200, {}, { 'warning' => warning })
|
1490
1479
|
end
|
1480
|
+
client.perform_request('GET', '/')
|
1481
|
+
expect(logger).to have_received(:warn).with(warning)
|
1491
1482
|
end
|
1492
1483
|
end
|
1493
1484
|
|
@@ -1668,6 +1659,29 @@ describe Elasticsearch::Transport::Client do
|
|
1668
1659
|
end
|
1669
1660
|
end
|
1670
1661
|
|
1662
|
+
context 'when retry_on_failure is true and delay_on_retry is specified' do
|
1663
|
+
context 'when a node is unreachable' do
|
1664
|
+
let(:hosts) do
|
1665
|
+
[ELASTICSEARCH_HOSTS.first, "foobar1", "foobar2"]
|
1666
|
+
end
|
1667
|
+
|
1668
|
+
let(:options) do
|
1669
|
+
{ retry_on_failure: true, delay_on_retry: 3000 }
|
1670
|
+
end
|
1671
|
+
|
1672
|
+
let(:responses) do
|
1673
|
+
5.times.collect do
|
1674
|
+
client.perform_request('GET', '_nodes/_local')
|
1675
|
+
end
|
1676
|
+
end
|
1677
|
+
|
1678
|
+
it 'retries on failure' do
|
1679
|
+
allow_any_instance_of(Object).to receive(:sleep).with(3000 / 1000)
|
1680
|
+
expect(responses.all? { true }).to be(true)
|
1681
|
+
end
|
1682
|
+
end
|
1683
|
+
end
|
1684
|
+
|
1671
1685
|
context 'when reload_on_failure is true' do
|
1672
1686
|
|
1673
1687
|
let(:hosts) do
|
@@ -1727,7 +1741,7 @@ describe Elasticsearch::Transport::Client do
|
|
1727
1741
|
end
|
1728
1742
|
|
1729
1743
|
it 'sets the Accept-Encoding header' do
|
1730
|
-
expect(client.transport.connections[0].connection.headers['Accept-Encoding'])
|
1744
|
+
expect(client.transport.connections[0].connection.headers['Accept-Encoding']).to eq 'gzip'
|
1731
1745
|
end
|
1732
1746
|
|
1733
1747
|
it 'preserves the other headers' do
|
@@ -1746,7 +1760,7 @@ describe Elasticsearch::Transport::Client do
|
|
1746
1760
|
end
|
1747
1761
|
|
1748
1762
|
it 'sets the Accept-Encoding header' do
|
1749
|
-
expect(client.transport.connections[0].connection.headers['Accept-Encoding'])
|
1763
|
+
expect(client.transport.connections[0].connection.headers['Accept-Encoding']).to eq 'gzip'
|
1750
1764
|
end
|
1751
1765
|
|
1752
1766
|
it 'preserves the other headers' do
|
@@ -1765,7 +1779,7 @@ describe Elasticsearch::Transport::Client do
|
|
1765
1779
|
end
|
1766
1780
|
|
1767
1781
|
it 'sets the Accept-Encoding header' do
|
1768
|
-
expect(client.transport.connections[0].connection.headers['Accept-Encoding'])
|
1782
|
+
expect(client.transport.connections[0].connection.headers['Accept-Encoding']).to eq 'gzip'
|
1769
1783
|
end
|
1770
1784
|
|
1771
1785
|
it 'preserves the other headers' do
|
@@ -1784,7 +1798,7 @@ describe Elasticsearch::Transport::Client do
|
|
1784
1798
|
end
|
1785
1799
|
|
1786
1800
|
it 'sets the Accept-Encoding header' do
|
1787
|
-
expect(client.transport.connections[0].connection.headers['Accept-Encoding'])
|
1801
|
+
expect(client.transport.connections[0].connection.headers['Accept-Encoding']).to eq 'gzip'
|
1788
1802
|
end
|
1789
1803
|
|
1790
1804
|
it 'preserves the other headers' do
|
@@ -1803,7 +1817,7 @@ describe Elasticsearch::Transport::Client do
|
|
1803
1817
|
end
|
1804
1818
|
|
1805
1819
|
it 'sets the Accept-Encoding header' do
|
1806
|
-
expect(client.transport.connections[0].connection.headers['Accept-Encoding'])
|
1820
|
+
expect(client.transport.connections[0].connection.headers['Accept-Encoding']).to eq 'gzip'
|
1807
1821
|
end
|
1808
1822
|
|
1809
1823
|
it 'preserves the other headers' do
|
@@ -1827,7 +1841,7 @@ describe Elasticsearch::Transport::Client do
|
|
1827
1841
|
end
|
1828
1842
|
|
1829
1843
|
it 'sets the Accept-Encoding header' do
|
1830
|
-
expect(client.transport.connections[0].connection.headers['Accept-Encoding'])
|
1844
|
+
expect(client.transport.connections[0].connection.headers['Accept-Encoding']).to eq 'gzip'
|
1831
1845
|
end
|
1832
1846
|
|
1833
1847
|
it 'preserves the other headers' do
|
@@ -1895,7 +1909,6 @@ describe Elasticsearch::Transport::Client do
|
|
1895
1909
|
end
|
1896
1910
|
|
1897
1911
|
context 'when request headers are specified' do
|
1898
|
-
|
1899
1912
|
let(:response) do
|
1900
1913
|
client.perform_request('GET', '/', {}, nil, { 'Content-Type' => 'application/yaml' })
|
1901
1914
|
end
|
@@ -1906,9 +1919,7 @@ describe Elasticsearch::Transport::Client do
|
|
1906
1919
|
end
|
1907
1920
|
|
1908
1921
|
describe 'selector' do
|
1909
|
-
|
1910
1922
|
context 'when the round-robin selector is used' do
|
1911
|
-
|
1912
1923
|
let(:nodes) do
|
1913
1924
|
3.times.collect do
|
1914
1925
|
client.perform_request('GET', '_nodes/_local').body['nodes'].to_a[0][1]['name']
|
@@ -1989,4 +2000,76 @@ describe Elasticsearch::Transport::Client do
|
|
1989
2000
|
end
|
1990
2001
|
end
|
1991
2002
|
end
|
2003
|
+
|
2004
|
+
context 'CA Fingerprinting' do
|
2005
|
+
context 'when setting a ca_fingerprint' do
|
2006
|
+
after do
|
2007
|
+
File.delete('./certificate.crt')
|
2008
|
+
File.delete('./certificate.key')
|
2009
|
+
end
|
2010
|
+
|
2011
|
+
let(:certificate) do
|
2012
|
+
system(
|
2013
|
+
'openssl req -new -newkey rsa:4096 -days 3650 -nodes -x509 -subj "/C=BE/O=Test/CN=Test"' \
|
2014
|
+
' -keyout certificate.key -out certificate.crt',
|
2015
|
+
err: File::NULL
|
2016
|
+
)
|
2017
|
+
OpenSSL::X509::Certificate.new File.read('./certificate.crt')
|
2018
|
+
end
|
2019
|
+
|
2020
|
+
let(:client) do
|
2021
|
+
Elasticsearch::Transport::Client.new(
|
2022
|
+
host: 'https://elastic:changeme@localhost:9200',
|
2023
|
+
ca_fingerprint: OpenSSL::Digest::SHA256.hexdigest(certificate.to_der)
|
2024
|
+
)
|
2025
|
+
end
|
2026
|
+
|
2027
|
+
it 'validates CA fingerprints on perform request' do
|
2028
|
+
expect(client.transport.connections.connections.map(&:verified).uniq).to eq [false]
|
2029
|
+
allow(client.transport).to receive(:perform_request) { 'Hello' }
|
2030
|
+
|
2031
|
+
server = double('server').as_null_object
|
2032
|
+
allow(TCPSocket).to receive(:new) { server }
|
2033
|
+
socket = double('socket')
|
2034
|
+
allow(OpenSSL::SSL::SSLSocket).to receive(:new) { socket }
|
2035
|
+
allow(socket).to receive(:connect) { nil }
|
2036
|
+
allow(socket).to receive(:peer_cert_chain) { [certificate] }
|
2037
|
+
|
2038
|
+
response = client.perform_request('GET', '/')
|
2039
|
+
expect(client.transport.connections.connections.map(&:verified).uniq).to eq [true]
|
2040
|
+
expect(response).to eq 'Hello'
|
2041
|
+
end
|
2042
|
+
end
|
2043
|
+
|
2044
|
+
context 'when using an http host' do
|
2045
|
+
let(:client) do
|
2046
|
+
Elasticsearch::Transport::Client.new(
|
2047
|
+
host: 'http://elastic:changeme@localhost:9200',
|
2048
|
+
ca_fingerprint: 'test'
|
2049
|
+
)
|
2050
|
+
end
|
2051
|
+
|
2052
|
+
it 'raises an error' do
|
2053
|
+
expect do
|
2054
|
+
client.perform_request('GET', '/')
|
2055
|
+
end.to raise_exception(Elasticsearch::Transport::Transport::Error)
|
2056
|
+
end
|
2057
|
+
end
|
2058
|
+
|
2059
|
+
context 'when not setting a ca_fingerprint' do
|
2060
|
+
let(:client) do
|
2061
|
+
Elasticsearch::Transport::Client.new(
|
2062
|
+
host: 'http://elastic:changeme@localhost:9200'
|
2063
|
+
)
|
2064
|
+
end
|
2065
|
+
|
2066
|
+
it 'has unvalidated connections' do
|
2067
|
+
allow(client).to receive(:validate_ca_fingerprints) { nil }
|
2068
|
+
allow(client.transport).to receive(:perform_request) { nil }
|
2069
|
+
|
2070
|
+
client.perform_request('GET', '/')
|
2071
|
+
expect(client).to_not have_received(:validate_ca_fingerprints)
|
2072
|
+
end
|
2073
|
+
end
|
2074
|
+
end
|
1992
2075
|
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
# Licensed to Elasticsearch B.V. under one or more contributor
|
2
|
+
# license agreements. See the NOTICE file distributed with
|
3
|
+
# this work for additional information regarding copyright
|
4
|
+
# ownership. Elasticsearch B.V. licenses this file to you under
|
5
|
+
# the Apache License, Version 2.0 (the "License"); you may
|
6
|
+
# not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing,
|
12
|
+
# software distributed under the License is distributed on an
|
13
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
14
|
+
# KIND, either express or implied. See the License for the
|
15
|
+
# specific language governing permissions and limitations
|
16
|
+
# under the License.
|
17
|
+
|
18
|
+
unless defined?(JRUBY_VERSION)
|
19
|
+
require_relative '../../../spec_helper'
|
20
|
+
|
21
|
+
describe Elasticsearch::Transport::Transport::HTTP::Curb do
|
22
|
+
let(:client) do
|
23
|
+
Elasticsearch::Transport::Client.new(transport_class: described_class)
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '#perform_request' do
|
27
|
+
subject(:perform_request) { client.perform_request(*args) }
|
28
|
+
let(:args) do
|
29
|
+
['POST', '/', {}, body, headers]
|
30
|
+
end
|
31
|
+
let(:body) { '{"foo":"bar"}' }
|
32
|
+
let(:headers) { { 'Content-Type' => 'application/x-ndjson' } }
|
33
|
+
|
34
|
+
before do
|
35
|
+
allow_any_instance_of(Curl::Easy).to receive(:http).and_return(true)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'convert body to json' do
|
39
|
+
expect(client.transport).to receive(:__convert_to_json).with(body)
|
40
|
+
perform_request
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'call compress_request' do
|
44
|
+
expect(client.transport).to receive(:compress_request).with(body, headers)
|
45
|
+
perform_request
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'return response' do
|
49
|
+
expect(perform_request).to be_kind_of(Elasticsearch::Transport::Transport::Response)
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'put body' do
|
53
|
+
expect(client.transport.connections.first.connection).to receive('put_data=').with(body)
|
54
|
+
perform_request
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'when body nil' do
|
58
|
+
let(:body) { nil }
|
59
|
+
|
60
|
+
it 'convert body to json' do
|
61
|
+
expect(client.transport).not_to receive(:__convert_to_json)
|
62
|
+
perform_request
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'call compress_request' do
|
66
|
+
expect(client.transport).to receive(:compress_request).with(body, headers)
|
67
|
+
perform_request
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'put body' do
|
71
|
+
expect(client.transport.connections.first.connection).not_to receive('put_data=')
|
72
|
+
perform_request
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context 'when body is hash' do
|
77
|
+
let(:body) { { foo: 'bar' } }
|
78
|
+
let(:body_string) { '{"foo":"bar"}' }
|
79
|
+
|
80
|
+
it 'convert body to json' do
|
81
|
+
expect(client.transport).to receive(:__convert_to_json).with(body)
|
82
|
+
perform_request
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'call compress_request' do
|
86
|
+
expect(client.transport).to receive(:compress_request).with(body_string, headers)
|
87
|
+
perform_request
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'put body' do
|
91
|
+
expect(client.transport.connections.first.connection).to receive('put_data=').with(body_string)
|
92
|
+
perform_request
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context 'when compression enabled' do
|
97
|
+
let(:client) do
|
98
|
+
Elasticsearch::Transport::Client.new(transport_class: described_class, compression: true)
|
99
|
+
end
|
100
|
+
let(:body_string) { '{"foo":"bar"}' }
|
101
|
+
let(:compressed_body) do
|
102
|
+
gzip = Zlib::GzipWriter.new(StringIO.new)
|
103
|
+
gzip << body_string
|
104
|
+
gzip.close.string
|
105
|
+
end
|
106
|
+
|
107
|
+
before { allow(client.transport).to receive(:decompress_response).and_return('') }
|
108
|
+
|
109
|
+
it 'put compressed body' do
|
110
|
+
expect(client.transport.connections.first.connection).to receive('put_data=').with(compressed_body)
|
111
|
+
perform_request
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'set Content-Encoding header' do
|
115
|
+
perform_request
|
116
|
+
expect(client.transport.connections.first.connection.headers).to include('Content-Encoding')
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'set Content-Encoding to gzip' do
|
120
|
+
perform_request
|
121
|
+
expect(client.transport.connections.first.connection.headers['Content-Encoding']).to eql('gzip')
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
# Licensed to Elasticsearch B.V. under one or more contributor
|
2
|
+
# license agreements. See the NOTICE file distributed with
|
3
|
+
# this work for additional information regarding copyright
|
4
|
+
# ownership. Elasticsearch B.V. licenses this file to you under
|
5
|
+
# the Apache License, Version 2.0 (the "License"); you may
|
6
|
+
# not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing,
|
12
|
+
# software distributed under the License is distributed on an
|
13
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
14
|
+
# KIND, either express or implied. See the License for the
|
15
|
+
# specific language governing permissions and limitations
|
16
|
+
# under the License.
|
17
|
+
|
18
|
+
require_relative '../../../spec_helper'
|
19
|
+
|
20
|
+
describe Elasticsearch::Transport::Transport::HTTP::Faraday do
|
21
|
+
let(:client) do
|
22
|
+
Elasticsearch::Transport::Client.new(transport_class: described_class)
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#perform_request' do
|
26
|
+
subject(:perform_request) { client.perform_request(*args) }
|
27
|
+
let(:args) do
|
28
|
+
['POST', '/', {}, body, headers]
|
29
|
+
end
|
30
|
+
let(:body) { '{"foo":"bar"}' }
|
31
|
+
let(:headers) { { 'Content-Type' => 'application/x-ndjson' } }
|
32
|
+
let(:response) { instance_double('Faraday::Response', status: 200, body: '', headers: headers) }
|
33
|
+
let(:expected_headers) do
|
34
|
+
client.transport.connections.first.connection.headers.merge(headers)
|
35
|
+
end
|
36
|
+
|
37
|
+
before do
|
38
|
+
allow_any_instance_of(Faraday::Connection).to receive(:run_request).and_return(response)
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'convert body to json' do
|
42
|
+
expect(client.transport).to receive(:__convert_to_json).with(body)
|
43
|
+
perform_request
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'call compress_request' do
|
47
|
+
expect(client.transport).to receive(:compress_request).with(body, expected_headers)
|
48
|
+
perform_request
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'return response' do
|
52
|
+
expect(perform_request).to be_kind_of(Elasticsearch::Transport::Transport::Response)
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'run body with preper params' do
|
56
|
+
expect(
|
57
|
+
client.transport.connections.first.connection
|
58
|
+
).to receive(:run_request).with(:post, 'http://localhost:9200/', body, expected_headers).and_return(response)
|
59
|
+
perform_request
|
60
|
+
end
|
61
|
+
|
62
|
+
context 'when body nil' do
|
63
|
+
let(:body) { nil }
|
64
|
+
let(:request_params) { [:post, 'http://localhost:9200/', body, expected_headers] }
|
65
|
+
|
66
|
+
it 'convert body to json' do
|
67
|
+
expect(client.transport).not_to receive(:__convert_to_json)
|
68
|
+
perform_request
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'call compress_request' do
|
72
|
+
expect(client.transport).to receive(:compress_request).with(body, expected_headers)
|
73
|
+
perform_request
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'run body with preper params' do
|
77
|
+
expect(
|
78
|
+
client.transport.connections.first.connection
|
79
|
+
).to receive(:run_request).with(*request_params).and_return(response)
|
80
|
+
perform_request
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context 'when body is hash' do
|
85
|
+
let(:body) { { foo: 'bar' } }
|
86
|
+
let(:body_string) { '{"foo":"bar"}' }
|
87
|
+
let(:request_params) { [:post, 'http://localhost:9200/', body_string, expected_headers] }
|
88
|
+
|
89
|
+
it 'convert body to json' do
|
90
|
+
expect(client.transport).to receive(:__convert_to_json).with(body)
|
91
|
+
perform_request
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'call compress_request' do
|
95
|
+
expect(client.transport).to receive(:compress_request).with(body_string, expected_headers)
|
96
|
+
perform_request
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'run body with preper params' do
|
100
|
+
expect(
|
101
|
+
client.transport.connections.first.connection
|
102
|
+
).to receive(:run_request).with(*request_params).and_return(response)
|
103
|
+
perform_request
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
context 'when compression enabled' do
|
108
|
+
let(:client) do
|
109
|
+
Elasticsearch::Transport::Client.new(transport_class: described_class, compression: true)
|
110
|
+
end
|
111
|
+
let(:body_string) { '{"foo":"bar"}' }
|
112
|
+
let(:expected_headers) { super().merge({ "Content-Encoding" => "gzip", "Accept-Encoding" => "gzip"}) }
|
113
|
+
let(:request_params) { [:post, 'http://localhost:9200/', compressed_body, expected_headers] }
|
114
|
+
let(:compressed_body) do
|
115
|
+
gzip = Zlib::GzipWriter.new(StringIO.new)
|
116
|
+
gzip << body_string
|
117
|
+
gzip.close.string
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'run body with preper params' do
|
121
|
+
expect(
|
122
|
+
client.transport.connections.first.connection
|
123
|
+
).to receive(:run_request).with(*request_params).and_return(response)
|
124
|
+
perform_request
|
125
|
+
end
|
126
|
+
|
127
|
+
context 'when client makes second request with nil boby' do
|
128
|
+
before { perform_request }
|
129
|
+
|
130
|
+
it 'remove Content-Encoding header' do
|
131
|
+
expected_headers.delete("Content-Encoding")
|
132
|
+
expect(
|
133
|
+
client.transport.connections.first.connection
|
134
|
+
).to receive(:run_request).with(:post, 'http://localhost:9200/', nil, expected_headers)
|
135
|
+
.and_return(response)
|
136
|
+
client.perform_request('POST', '/', {}, nil, headers)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
# Licensed to Elasticsearch B.V. under one or more contributor
|
2
|
+
# license agreements. See the NOTICE file distributed with
|
3
|
+
# this work for additional information regarding copyright
|
4
|
+
# ownership. Elasticsearch B.V. licenses this file to you under
|
5
|
+
# the Apache License, Version 2.0 (the "License"); you may
|
6
|
+
# not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing,
|
12
|
+
# software distributed under the License is distributed on an
|
13
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
14
|
+
# KIND, either express or implied. See the License for the
|
15
|
+
# specific language governing permissions and limitations
|
16
|
+
# under the License.
|
17
|
+
|
18
|
+
if defined?(JRUBY_VERSION)
|
19
|
+
require_relative '../../../spec_helper'
|
20
|
+
|
21
|
+
describe Elasticsearch::Transport::Transport::HTTP::Manticore do
|
22
|
+
let(:client) do
|
23
|
+
Elasticsearch::Transport::Client.new(transport_class: described_class)
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '#perform_request' do
|
27
|
+
subject(:perform_request) { client.perform_request(*args) }
|
28
|
+
let(:args) do
|
29
|
+
['POST', '/', {}, body, headers]
|
30
|
+
end
|
31
|
+
let(:body) { '{"foo":"bar"}' }
|
32
|
+
let(:headers) { { 'Content-Type' => 'application/json' } }
|
33
|
+
let(:response) { instance_double('Manticore::Response', code: 200, read_body: '', headers: headers) }
|
34
|
+
let(:expected_headers) do
|
35
|
+
client.transport.instance_variable_get('@request_options')[:headers].merge(headers)
|
36
|
+
end
|
37
|
+
|
38
|
+
before do
|
39
|
+
allow_any_instance_of(Manticore::Client).to receive(:post).and_return(response)
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'convert body to json' do
|
43
|
+
expect(client.transport).to receive(:__convert_to_json).with(body)
|
44
|
+
perform_request
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'call compress_request' do
|
48
|
+
expect(client.transport).to receive(:compress_request).with(body, expected_headers)
|
49
|
+
perform_request
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'return response' do
|
53
|
+
expect(perform_request).to be_kind_of(Elasticsearch::Transport::Transport::Response)
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'run body with preper params' do
|
57
|
+
expect(
|
58
|
+
client.transport.connections.first.connection
|
59
|
+
).to receive(:post).with('http://localhost:9200/', { body: body, headers: expected_headers }).and_return(response)
|
60
|
+
perform_request
|
61
|
+
end
|
62
|
+
|
63
|
+
context 'when body nil' do
|
64
|
+
let(:body) { nil }
|
65
|
+
let(:request_params) { ['http://localhost:9200/', { body: body, headers: expected_headers }] }
|
66
|
+
|
67
|
+
it 'convert body to json' do
|
68
|
+
expect(client.transport).not_to receive(:__convert_to_json)
|
69
|
+
perform_request
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'call compress_request' do
|
73
|
+
expect(client.transport).to receive(:compress_request).with(body, expected_headers)
|
74
|
+
perform_request
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'run body with preper params' do
|
78
|
+
expect(
|
79
|
+
client.transport.connections.first.connection
|
80
|
+
).to receive(:post).with('http://localhost:9200/', { headers: expected_headers }).and_return(response)
|
81
|
+
perform_request
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
context 'when body is hash' do
|
86
|
+
let(:body) { { foo: 'bar' } }
|
87
|
+
let(:body_string) { '{"foo":"bar"}' }
|
88
|
+
let(:request_params) { ['http://localhost:9200/', { body: body_string, headers: expected_headers }] }
|
89
|
+
|
90
|
+
it 'convert body to json' do
|
91
|
+
expect(client.transport).to receive(:__convert_to_json).with(body)
|
92
|
+
perform_request
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'call compress_request' do
|
96
|
+
expect(client.transport).to receive(:compress_request).with(body_string, expected_headers)
|
97
|
+
perform_request
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'run body with preper params' do
|
101
|
+
expect(
|
102
|
+
client.transport.connections.first.connection
|
103
|
+
).to receive(:post).with(*request_params).and_return(response)
|
104
|
+
perform_request
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
context 'when compression enabled' do
|
109
|
+
let(:client) do
|
110
|
+
Elasticsearch::Transport::Client.new(transport_class: described_class, compression: true)
|
111
|
+
end
|
112
|
+
let(:body_string) { '{"foo":"bar"}' }
|
113
|
+
let(:expected_headers) { super().merge({ "Content-Encoding" => "gzip", "Accept-Encoding" => "gzip"}) }
|
114
|
+
let(:request_params) { ['http://localhost:9200/', { body: compressed_body, headers: expected_headers }] }
|
115
|
+
let(:compressed_body) do
|
116
|
+
gzip = Zlib::GzipWriter.new(StringIO.new)
|
117
|
+
gzip << body_string
|
118
|
+
gzip.close.string
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'run body with preper params' do
|
122
|
+
expect(
|
123
|
+
client.transport.connections.first.connection
|
124
|
+
).to receive(:post).with(*request_params).and_return(response)
|
125
|
+
perform_request
|
126
|
+
end
|
127
|
+
|
128
|
+
context 'when client makes second request with nil boby' do
|
129
|
+
before { perform_request }
|
130
|
+
|
131
|
+
it 'remove Content-Encoding header' do
|
132
|
+
expected_headers.delete("Content-Encoding")
|
133
|
+
expect(
|
134
|
+
client.transport.connections.first.connection
|
135
|
+
).to receive(:post).with('http://localhost:9200/', { headers: expected_headers })
|
136
|
+
.and_return(response)
|
137
|
+
client.perform_request('POST', '/', {}, nil, headers)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elasticsearch-transport
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 7.
|
4
|
+
version: 7.16.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Karel Minarik
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-12-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: multi_json
|
@@ -392,6 +392,9 @@ files:
|
|
392
392
|
- spec/elasticsearch/connections/selector_spec.rb
|
393
393
|
- spec/elasticsearch/transport/base_spec.rb
|
394
394
|
- spec/elasticsearch/transport/client_spec.rb
|
395
|
+
- spec/elasticsearch/transport/http/curb_spec.rb
|
396
|
+
- spec/elasticsearch/transport/http/faraday_spec.rb
|
397
|
+
- spec/elasticsearch/transport/http/manticore_spec.rb
|
395
398
|
- spec/elasticsearch/transport/meta_header_spec.rb
|
396
399
|
- spec/elasticsearch/transport/sniffer_spec.rb
|
397
400
|
- spec/spec_helper.rb
|
@@ -406,13 +409,13 @@ files:
|
|
406
409
|
- test/unit/transport_curb_test.rb
|
407
410
|
- test/unit/transport_faraday_test.rb
|
408
411
|
- test/unit/transport_manticore_test.rb
|
409
|
-
homepage: https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/7.
|
412
|
+
homepage: https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/7.16/index.html
|
410
413
|
licenses:
|
411
414
|
- Apache-2.0
|
412
415
|
metadata:
|
413
|
-
homepage_uri: https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/7.
|
414
|
-
changelog_uri: https://github.com/elastic/elasticsearch-ruby/blob/7.
|
415
|
-
source_code_uri: https://github.com/elastic/elasticsearch-ruby/tree/7.
|
416
|
+
homepage_uri: https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/7.16/index.html
|
417
|
+
changelog_uri: https://github.com/elastic/elasticsearch-ruby/blob/7.16/CHANGELOG.md
|
418
|
+
source_code_uri: https://github.com/elastic/elasticsearch-ruby/tree/7.16/elasticsearch-transport
|
416
419
|
bug_tracker_uri: https://github.com/elastic/elasticsearch-ruby/issues
|
417
420
|
post_install_message:
|
418
421
|
rdoc_options:
|
@@ -439,6 +442,9 @@ test_files:
|
|
439
442
|
- spec/elasticsearch/connections/selector_spec.rb
|
440
443
|
- spec/elasticsearch/transport/base_spec.rb
|
441
444
|
- spec/elasticsearch/transport/client_spec.rb
|
445
|
+
- spec/elasticsearch/transport/http/curb_spec.rb
|
446
|
+
- spec/elasticsearch/transport/http/faraday_spec.rb
|
447
|
+
- spec/elasticsearch/transport/http/manticore_spec.rb
|
442
448
|
- spec/elasticsearch/transport/meta_header_spec.rb
|
443
449
|
- spec/elasticsearch/transport/sniffer_spec.rb
|
444
450
|
- spec/spec_helper.rb
|