td-client 1.0.2 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/td/client/api.rb +11 -10
- data/lib/td/client/api/job.rb +29 -25
- data/lib/td/client/version.rb +1 -1
- data/spec/spec_helper.rb +9 -0
- data/spec/td/client/job_api_spec.rb +21 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f8123cb6d1ba413d6e482a5396d2675340256e1b
|
4
|
+
data.tar.gz: 3e8541a2b1070b50dc270c54bb5f76a24e29cd24
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7bdbacf95cd257c635dd6d72486b32974408d9f09e4f81e1ec1233c4db0b709bbb0b48991c2820c80d1a94c305295b7809771dbc34ca5e8b0e885a1146053277
|
7
|
+
data.tar.gz: 901e31f20e95e0aa83fabaa4daf18470376aee5396cbe09cad474e5680ab1e56fee43ceae3e466b91f92d1b60b7de1a4b2ad777e86e309807bf3d5a733007fcd
|
data/lib/td/client/api.rb
CHANGED
@@ -289,6 +289,7 @@ private
|
|
289
289
|
if block
|
290
290
|
current_total_chunk_size = 0
|
291
291
|
response = client.get(target, params, header) {|res, chunk|
|
292
|
+
break if res.status != 200
|
292
293
|
current_total_chunk_size += chunk.bytesize
|
293
294
|
block.call(res, chunk, current_total_chunk_size)
|
294
295
|
}
|
@@ -300,17 +301,17 @@ private
|
|
300
301
|
else
|
301
302
|
response = client.get(target, params, header)
|
302
303
|
|
303
|
-
|
304
|
-
|
304
|
+
status = response.code
|
305
|
+
# retry if the HTTP error code is 500 or higher and we did not run out of retrying attempts
|
306
|
+
if status >= 500 && cumul_retry_delay < @max_cumul_retry_delay
|
307
|
+
$stderr.puts "Error #{status}: #{get_error(response)}. Retrying after #{retry_delay} seconds..."
|
308
|
+
sleep retry_delay
|
309
|
+
cumul_retry_delay += retry_delay
|
310
|
+
retry_delay *= 2
|
311
|
+
redo # restart from beginning of do-while loop
|
312
|
+
end
|
305
313
|
|
306
|
-
|
307
|
-
# retry if the HTTP error code is 500 or higher and we did not run out of retrying attempts
|
308
|
-
if !block_given? && status >= 500 && cumul_retry_delay < @max_cumul_retry_delay
|
309
|
-
$stderr.puts "Error #{status}: #{get_error(response)}. Retrying after #{retry_delay} seconds..."
|
310
|
-
sleep retry_delay
|
311
|
-
cumul_retry_delay += retry_delay
|
312
|
-
retry_delay *= 2
|
313
|
-
redo # restart from beginning of do-while loop
|
314
|
+
validate_content_length!(response, response.body.to_s.bytesize) if @ssl
|
314
315
|
end
|
315
316
|
rescue Errno::ECONNREFUSED, Errno::ECONNRESET, Timeout::Error, EOFError,
|
316
317
|
SystemCallError, OpenSSL::SSL::SSLError, SocketError, HTTPClient::TimeoutError,
|
data/lib/td/client/api/job.rb
CHANGED
@@ -272,6 +272,22 @@ module Job
|
|
272
272
|
end
|
273
273
|
end
|
274
274
|
|
275
|
+
def validate_response_status(res, current_total_chunk_size=0)
|
276
|
+
case res.status
|
277
|
+
when 200
|
278
|
+
if current_total_chunk_size != 0
|
279
|
+
# try to resume but the server returns 200
|
280
|
+
raise_error("Get job result failed", res)
|
281
|
+
end
|
282
|
+
when 206 # resuming
|
283
|
+
else
|
284
|
+
if res.status/100 == 5
|
285
|
+
raise HTTPServerException
|
286
|
+
end
|
287
|
+
raise_error("Get job result failed", res)
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
275
291
|
class HTTPServerException < StandardError
|
276
292
|
end
|
277
293
|
|
@@ -297,43 +313,31 @@ module Job
|
|
297
313
|
current_total_chunk_size = 0
|
298
314
|
infl = nil
|
299
315
|
begin # LOOP of Network/Server errors
|
300
|
-
response =
|
301
|
-
|
302
|
-
|
303
|
-
case res.
|
304
|
-
when
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
end
|
309
|
-
when 206 # resuming
|
310
|
-
else
|
311
|
-
if res.status/100 == 5
|
312
|
-
raise HTTPServerException
|
313
|
-
end
|
314
|
-
raise_error("Get job result failed", res)
|
315
|
-
end
|
316
|
-
if infl.nil? && autodecode
|
317
|
-
case res.header['Content-Encoding'][0].to_s.downcase
|
318
|
-
when 'gzip'
|
319
|
-
infl = Zlib::Inflate.new(Zlib::MAX_WBITS + 16)
|
320
|
-
when 'deflate'
|
321
|
-
infl = Zlib::Inflate.new
|
322
|
-
end
|
316
|
+
response = client.get(url, params, header) do |res, chunk|
|
317
|
+
validate_response_status(res, current_total_chunk_size)
|
318
|
+
if infl.nil? && autodecode
|
319
|
+
case res.header['Content-Encoding'][0].to_s.downcase
|
320
|
+
when 'gzip'
|
321
|
+
infl = Zlib::Inflate.new(Zlib::MAX_WBITS + 16)
|
322
|
+
when 'deflate'
|
323
|
+
infl = Zlib::Inflate.new
|
323
324
|
end
|
324
325
|
end
|
325
|
-
response = res
|
326
326
|
current_total_chunk_size += chunk.bytesize
|
327
327
|
chunk = infl.inflate(chunk) if infl
|
328
328
|
yield chunk, current_total_chunk_size
|
329
329
|
end
|
330
330
|
|
331
|
+
# for the case response body is empty
|
332
|
+
# Note that webmock returns response.body as "" instead of nil
|
333
|
+
validate_response_status(response, 0) if response.body.to_s.empty?
|
334
|
+
|
331
335
|
# completed?
|
332
336
|
validate_content_length_with_range(response, current_total_chunk_size)
|
333
337
|
rescue Errno::ECONNREFUSED, Errno::ECONNRESET, Timeout::Error, EOFError,
|
334
338
|
SystemCallError, OpenSSL::SSL::SSLError, SocketError, HTTPClient::TimeoutError,
|
335
339
|
HTTPServerException => e
|
336
|
-
if
|
340
|
+
if current_total_chunk_size > 0
|
337
341
|
if etag = response.header['ETag'][0]
|
338
342
|
header['If-Range'] = etag
|
339
343
|
header['Range'] = "bytes=#{current_total_chunk_size}-"
|
data/lib/td/client/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -34,6 +34,15 @@ require 'json'
|
|
34
34
|
|
35
35
|
include TreasureData
|
36
36
|
|
37
|
+
RSpec.configure do |config|
|
38
|
+
# This allows you to limit a spec run to individual examples or groups
|
39
|
+
# you care about by tagging them with `:focus` metadata. When nothing
|
40
|
+
# is tagged with `:focus`, all examples get run. RSpec also provides
|
41
|
+
# aliases for `it`, `describe`, and `context` that include `:focus`
|
42
|
+
# metadata: `fit`, `fdescribe` and `fcontext`, respectively.
|
43
|
+
config.filter_run_when_matching :focus
|
44
|
+
end
|
45
|
+
|
37
46
|
shared_context 'common helper' do
|
38
47
|
let :account_id do
|
39
48
|
1
|
@@ -320,6 +320,27 @@ describe 'Job API' do
|
|
320
320
|
expect(api.job_result(12345)).to eq ['hello', 'world']
|
321
321
|
end
|
322
322
|
|
323
|
+
it '200 (blank) -> 200 works fine' do
|
324
|
+
i = 0
|
325
|
+
stub_api_request(:get, '/v3/job/result/12345').
|
326
|
+
with(:query => {'format' => 'msgpack'}).
|
327
|
+
to_return do
|
328
|
+
i += 1
|
329
|
+
puts "count : #{i}"
|
330
|
+
{
|
331
|
+
:headers => {
|
332
|
+
'Content-Length' => packed.bytesize,
|
333
|
+
'Etag' => '"abcdefghijklmn"',
|
334
|
+
},
|
335
|
+
:body => (i == 1 ? nil : packed)
|
336
|
+
}
|
337
|
+
end
|
338
|
+
expect(api).to receive(:sleep).once
|
339
|
+
expect($stderr).to receive(:print)
|
340
|
+
expect($stderr).to receive(:puts)
|
341
|
+
expect(api.job_result(12345)).to eq ['hello', 'world']
|
342
|
+
end
|
343
|
+
|
323
344
|
end
|
324
345
|
|
325
346
|
describe 'job_result_format' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: td-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Treasure Data, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-09-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: msgpack
|
@@ -200,7 +200,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
200
200
|
version: '0'
|
201
201
|
requirements: []
|
202
202
|
rubyforge_project:
|
203
|
-
rubygems_version: 2.6.
|
203
|
+
rubygems_version: 2.6.13
|
204
204
|
signing_key:
|
205
205
|
specification_version: 4
|
206
206
|
summary: Treasure Data API library for Ruby
|