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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8a45d6b813ecd784711b722f4092e5bae4092f7f
4
- data.tar.gz: 1b0371ff2fbdc251693656e9e63b91f9763417eb
3
+ metadata.gz: f8123cb6d1ba413d6e482a5396d2675340256e1b
4
+ data.tar.gz: 3e8541a2b1070b50dc270c54bb5f76a24e29cd24
5
5
  SHA512:
6
- metadata.gz: 7da7f3bd0bef93c74d9adb84f5b9190a1781b50aced54ad8366d04cdf6f27ac745e7a37d7e17b20c62ced7a6d176d1fb3adc68ed9434834c973322f3b4a1b5ea
7
- data.tar.gz: a27712fd626d72ac2811b00590d887c786ad113ea40cf67ab5b1d89a3e48ec724c97809d6bed1be8bba908eddfe54346c0b96871db7189800ee1f9f7176bdcac
6
+ metadata.gz: 7bdbacf95cd257c635dd6d72486b32974408d9f09e4f81e1ec1233c4db0b709bbb0b48991c2820c80d1a94c305295b7809771dbc34ca5e8b0e885a1146053277
7
+ data.tar.gz: 901e31f20e95e0aa83fabaa4daf18470376aee5396cbe09cad474e5680ab1e56fee43ceae3e466b91f92d1b60b7de1a4b2ad777e86e309807bf3d5a733007fcd
@@ -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
- validate_content_length!(response, response.body.bytesize) if @ssl
304
- end
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
- status = response.code
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,
@@ -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 = nil
301
- client.get(url, params, header) do |res, chunk|
302
- unless response
303
- case res.status
304
- when 200
305
- if current_total_chunk_size != 0
306
- # try to resume but the server returns 200
307
- raise_error("Get job result failed", res)
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 response # at least a chunk is downloaded
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}-"
@@ -1,5 +1,5 @@
1
1
  module TreasureData
2
2
  class Client
3
- VERSION = '1.0.2'
3
+ VERSION = '1.0.3'
4
4
  end
5
5
  end
@@ -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.2
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-07-20 00:00:00.000000000 Z
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.11
203
+ rubygems_version: 2.6.13
204
204
  signing_key:
205
205
  specification_version: 4
206
206
  summary: Treasure Data API library for Ruby