td-client 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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