elastomer-client 3.1.2 → 3.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/elastomer/client.rb +13 -1
- data/lib/elastomer/middleware/compress.rb +45 -0
- data/lib/elastomer/version.rb +1 -1
- data/lib/elastomer/version_support.rb +5 -0
- data/test/client_test.rb +9 -0
- data/test/test_helper.rb +11 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ee5ef212d2d3fefeef8794a4b25901237a989ded
|
4
|
+
data.tar.gz: 3434bb50acbebd5cf4a8d98a2bff8e2fe8863dd8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 92a3b002a675a1937360c01670df306e91af406b7bed2402f08094bf4e077d81cee56f961287ea38b702c5f0f0d994d77a4a55efe34261d47e9b5bf62d4e49f7
|
7
|
+
data.tar.gz: '02297cdcb7c4305b2d9e5e20edb7ac9247ba4f0daae03feec88c09621257d57adc5b482e9ea405cc01f7a515486898eb21f97dcb747d853fb2700ab585f93e94'
|
data/lib/elastomer/client.rb
CHANGED
@@ -33,11 +33,14 @@ module Elastomer
|
|
33
33
|
# :max_retries - the maximum number of request retires (defaults to 0)
|
34
34
|
# :retry_delay - delay in seconds between retries (defaults to 0.075)
|
35
35
|
# :strict_params - set to `true` to raise exceptions when invalid request params are used
|
36
|
+
# :es_version - set to the Elasticsearch version (example: "5.6.6") to avoid an HTTP request to get the version.
|
37
|
+
# :compress_body - set to true to enable request body compression (default: false)
|
38
|
+
# :compression - The compression level (0-9) when request body compression is enabled (default: Zlib::DEFAULT_COMPRESSION)
|
36
39
|
#
|
37
40
|
def initialize(host: "localhost", port: 9200, url: nil,
|
38
41
|
read_timeout: 5, open_timeout: 2, max_retries: 0, retry_delay: 0.075,
|
39
42
|
opaque_id: false, adapter: Faraday.default_adapter, max_request_size: MAX_REQUEST_SIZE,
|
40
|
-
strict_params: false)
|
43
|
+
strict_params: false, es_version: nil, compress_body: false, compression: Zlib::DEFAULT_COMPRESSION)
|
41
44
|
|
42
45
|
@url = url || "http://#{host}:#{port}"
|
43
46
|
|
@@ -53,12 +56,18 @@ module Elastomer
|
|
53
56
|
@opaque_id = opaque_id
|
54
57
|
@max_request_size = max_request_size
|
55
58
|
@strict_params = strict_params
|
59
|
+
@es_version = es_version
|
60
|
+
@compress_body = compress_body
|
61
|
+
@compression = compression
|
56
62
|
end
|
57
63
|
|
58
64
|
attr_reader :host, :port, :url
|
59
65
|
attr_reader :read_timeout, :open_timeout
|
60
66
|
attr_reader :max_retries, :retry_delay, :max_request_size
|
61
67
|
attr_reader :strict_params
|
68
|
+
attr_reader :es_version
|
69
|
+
attr_reader :compress_body
|
70
|
+
attr_reader :compression
|
62
71
|
alias :strict_params? :strict_params
|
63
72
|
|
64
73
|
# Returns a duplicate of this Client connection configured in the exact same
|
@@ -84,6 +93,8 @@ module Elastomer
|
|
84
93
|
|
85
94
|
# Returns the version String of the attached Elasticsearch instance.
|
86
95
|
def version
|
96
|
+
return es_version unless es_version.nil?
|
97
|
+
|
87
98
|
@version ||= begin
|
88
99
|
response = get "/"
|
89
100
|
response.body.dig("version", "number")
|
@@ -120,6 +131,7 @@ module Elastomer
|
|
120
131
|
conn.request(:encode_json)
|
121
132
|
conn.request(:opaque_id) if @opaque_id
|
122
133
|
conn.request(:limit_size, max_request_size: max_request_size) if max_request_size
|
134
|
+
conn.request(:elastomer_compress, compression: compression) if compress_body
|
123
135
|
|
124
136
|
if @adapter.is_a?(Array)
|
125
137
|
conn.adapter(*@adapter)
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "stringio"
|
3
|
+
|
4
|
+
module Elastomer
|
5
|
+
module Middleware
|
6
|
+
# Request middleware that compresses request bodies with GZip for supported
|
7
|
+
# versions of Elasticsearch.
|
8
|
+
#
|
9
|
+
# It will only compress when there is a request body that is a String. This
|
10
|
+
# middleware should be inserted after JSON serialization.
|
11
|
+
class Compress < Faraday::Middleware
|
12
|
+
CONTENT_ENCODING = "Content-Encoding"
|
13
|
+
GZIP = "gzip"
|
14
|
+
# An Ethernet packet can hold 1500 bytes. No point in compressing anything smaller than that (plus some wiggle room).
|
15
|
+
MIN_BYTES_FOR_COMPRESSION = 1400
|
16
|
+
|
17
|
+
attr_reader :compression
|
18
|
+
|
19
|
+
# options - The Hash of "keyword" arguments.
|
20
|
+
# :compression - the compression level (0-9, default Zlib::DEFAULT_COMPRESSION)
|
21
|
+
def initialize(app, options = {})
|
22
|
+
super(app)
|
23
|
+
@compression = options[:compression] || Zlib::DEFAULT_COMPRESSION
|
24
|
+
end
|
25
|
+
|
26
|
+
def call(env)
|
27
|
+
if body = env[:body]
|
28
|
+
if body.is_a?(String) && body.bytesize > MIN_BYTES_FOR_COMPRESSION
|
29
|
+
output = StringIO.new
|
30
|
+
output.set_encoding("BINARY")
|
31
|
+
gz = Zlib::GzipWriter.new(output, compression, Zlib::DEFAULT_STRATEGY)
|
32
|
+
gz.write(env[:body])
|
33
|
+
gz.close
|
34
|
+
env[:body] = output.string
|
35
|
+
env[:request_headers][CONTENT_ENCODING] = GZIP
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
@app.call(env)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
Faraday::Request.register_middleware(elastomer_compress: ::Elastomer::Middleware::Compress)
|
data/lib/elastomer/version.rb
CHANGED
@@ -161,6 +161,11 @@ module Elastomer
|
|
161
161
|
end
|
162
162
|
end
|
163
163
|
|
164
|
+
# ES 5.X supports GZip-compressed request bodies, but ES 2.4 doesn't?
|
165
|
+
def supports_gzip?
|
166
|
+
es_version_5_x?
|
167
|
+
end
|
168
|
+
|
164
169
|
private
|
165
170
|
|
166
171
|
# Internal: Helper to reject arguments that shouldn't be passed because
|
data/test/client_test.rb
CHANGED
@@ -171,6 +171,15 @@ describe Elastomer::Client do
|
|
171
171
|
assert_match(/[\d\.]+/, $client.version)
|
172
172
|
end
|
173
173
|
|
174
|
+
it "does not make an HTTP request for version if it is provided at create time" do
|
175
|
+
request = stub_request(:get, "#{$client.url}/")
|
176
|
+
|
177
|
+
client = Elastomer::Client.new $client_params.merge(es_version: "5.6.6")
|
178
|
+
assert_equal "5.6.6", client.version
|
179
|
+
|
180
|
+
assert_not_requested request
|
181
|
+
end
|
182
|
+
|
174
183
|
it "gets semantic version" do
|
175
184
|
version_string = $client.version
|
176
185
|
assert_equal Semantic::Version.new(version_string), $client.semantic_version
|
data/test/test_helper.rb
CHANGED
@@ -43,6 +43,17 @@ raise "No server available at #{$client.url}" unless $client.available?
|
|
43
43
|
|
44
44
|
puts "Elasticsearch version is #{$client.version}"
|
45
45
|
|
46
|
+
# COMPATIBILITY
|
47
|
+
# Returns true if the Elasticsearch cluster defaults to supporting compression.
|
48
|
+
def supports_compressed_bodies_by_default?
|
49
|
+
$client.version_support.es_version_5_x?
|
50
|
+
end
|
51
|
+
|
52
|
+
# Now that we have the version, re-create the client with compression if supported.
|
53
|
+
if supports_compressed_bodies_by_default?
|
54
|
+
$client = Elastomer::Client.new $client_params.merge(compress_body: true)
|
55
|
+
end
|
56
|
+
|
46
57
|
# remove any lingering test indices from the cluster
|
47
58
|
MiniTest.after_run do
|
48
59
|
$client.cluster.indices.keys.each do |name|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elastomer-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.1.
|
4
|
+
version: 3.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Pease
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-
|
12
|
+
date: 2018-07-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: addressable
|
@@ -275,6 +275,7 @@ files:
|
|
275
275
|
- lib/elastomer/client/template.rb
|
276
276
|
- lib/elastomer/client/warmer.rb
|
277
277
|
- lib/elastomer/core_ext/time.rb
|
278
|
+
- lib/elastomer/middleware/compress.rb
|
278
279
|
- lib/elastomer/middleware/encode_json.rb
|
279
280
|
- lib/elastomer/middleware/limit_size.rb
|
280
281
|
- lib/elastomer/middleware/opaque_id.rb
|