aliyun-sdk 0.3.3 → 0.3.4

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: b4b469a5bd4f206a09968a4a6a2a19d44f6a8adf
4
- data.tar.gz: d963b79eda62894d2adbae4391a45efa309096be
3
+ metadata.gz: 0a480b0f35aeed00c9b07e617d3609caedbfd862
4
+ data.tar.gz: e7ae01442d09525274a84389da0ea3055e46164a
5
5
  SHA512:
6
- metadata.gz: 7c3f0e7efdf6e88b33416c075f813da54f630f23415d3f7ba1b1e3a7e824e1e1681fc5eedf4e3c0ec2fa9ab1e6c9cf72b844afcdb69f9ffabb79f5b5f2f7278b
7
- data.tar.gz: 532c750ab5d898e7241698e9eab32ab5a8175122b1e88835a370f9182995f54c0a3e5c6e467f031f25c5db53055c54426a8bbbeb28b8d69b64a6a9f6a2d40a34
6
+ metadata.gz: 20b4634d8db8efd28f033013418846c130b669637db55406436e58112ef7bbd09c2f55b1bec979bd8eb498d1a2f071114f80b0a74ffb21713bcfa5358ad00643
7
+ data.tar.gz: 1a77e052686a50dfc1de71652d7da92c551f37065e9337446262fe8b19ca33c570d8764a4feea08111022e762e775bd95b923fbbaf0a55c882be435980ecc631
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  ## Change Log
2
2
 
3
+ ### v0.3.4
4
+
5
+ - Fix handling gzip/deflate response
6
+ - Change the default accept-encoding to 'identity'
7
+ - Allow setting custom HTTP headers in get_object
8
+
3
9
  ### v0.3.3
4
10
 
5
11
  - Fix object key problem in batch_delete
@@ -236,6 +236,8 @@ module Aliyun
236
236
  # * :if_unmodified_since (Time) 指定如果object从这个时间后再无修改,则下载
237
237
  # * :if_match_etag (String) 指定如果object的etag等于这个值,则下载
238
238
  # * :if_unmatch_etag (String) 指定如果object的etag不等于这个值,则下载
239
+ # @option opts [Hash] :headers 指定请求的HTTP Header,不区分大小
240
+ # 写。这里指定的值会覆盖通过`:range`和`:condition`设置的值。
239
241
  # @option opts [Hash] :rewrite 指定下载object时Server端返回的响应头部字段的值
240
242
  # * :content_type (String) 指定返回的响应中Content-Type的值
241
243
  # * :content_language (String) 指定返回的响应中Content-Language的值
@@ -472,10 +474,7 @@ module Aliyun
472
474
 
473
475
  args[:content_type] ||= get_content_type(file)
474
476
  args[:content_type] ||= get_content_type(key)
475
-
476
- unless cpt_file = args[:cpt_file]
477
- cpt_file = get_cpt_file(file)
478
- end
477
+ cpt_file = args[:cpt_file] || get_cpt_file(file)
479
478
 
480
479
  Multipart::Upload.new(
481
480
  @protocol, options: args,
@@ -507,6 +506,8 @@ module Aliyun
507
506
  # 则:cpt_file会被忽略。
508
507
  # @option opts [Hash] :condition 指定下载object需要满足的条件,
509
508
  # 同 {#get_object}
509
+ # @option opts [Hash] :headers 指定请求的HTTP Header,不区分大小
510
+ # 写。这里指定的值会覆盖通过`:condition`设置的值。
510
511
  # @option opts [Hash] :rewrite 指定下载object时Server端返回的响
511
512
  # 应头部字段的值,同 {#get_object}
512
513
  # @yield [Float] 如果调用的时候传递了block,则会将下载进度交由
@@ -529,10 +530,7 @@ module Aliyun
529
530
 
530
531
  args[:content_type] ||= get_content_type(file)
531
532
  args[:content_type] ||= get_content_type(key)
532
-
533
- unless cpt_file = args[:cpt_file]
534
- cpt_file = get_cpt_file(file)
535
- end
533
+ cpt_file = args[:cpt_file] || get_cpt_file(file)
536
534
 
537
535
  Multipart::Download.new(
538
536
  @protocol, options: args,
@@ -179,7 +179,8 @@ module Aliyun
179
179
  part_file = get_part_file(p)
180
180
  File.open(part_file, 'w') do |w|
181
181
  @protocol.get_object(
182
- bucket, object, :range => p[:range]) { |chunk| w.write(chunk) }
182
+ bucket, object,
183
+ @options.merge(range: p[:range])) { |chunk| w.write(chunk) }
183
184
  end
184
185
 
185
186
  sync_update_part(p.merge(done: true, md5: get_file_md5(part_file)))
@@ -32,6 +32,7 @@ module Aliyun
32
32
  class HTTP
33
33
 
34
34
  DEFAULT_CONTENT_TYPE = 'application/octet-stream'
35
+ DEFAULT_ACCEPT_ENCODING = 'identity'
35
36
  STS_HEADER = 'x-oss-security-token'
36
37
  OPEN_TIMEOUT = 10
37
38
  READ_TIMEOUT = 120
@@ -156,8 +157,25 @@ module Aliyun
156
157
  r.read_body
157
158
  else
158
159
  # streaming read body on success
159
- r.read_body do |chunk|
160
- yield RestClient::Request.decode(r['content-encoding'], chunk)
160
+ encoding = r['content-encoding']
161
+ if encoding == 'gzip'
162
+ stream = StreamWriter.new { |s| r.read_body { |chunk| s << chunk } }
163
+ reader = Zlib::GzipReader.new(stream)
164
+ yield reader.read(16 * 1024) until reader.eof?
165
+ elsif encoding == 'deflate'
166
+ begin
167
+ stream = Zlib::Inflate.new
168
+ r.read_body { |chunk| stream << chunk }
169
+ stream.finish { |chunk| yield chunk }
170
+ rescue Zlib::DataError
171
+ # No luck with Zlib decompression. Let's try with raw deflate,
172
+ # like some broken web servers do.
173
+ stream = Zlib::Inflate.new(-Zlib::MAX_WBITS)
174
+ r.read_body { |chunk| stream << chunk }
175
+ stream.finish { |chunk| yield chunk }
176
+ end
177
+ else
178
+ r.read_body { |chunk| yield chunk }
161
179
  end
162
180
  end
163
181
  end
@@ -210,6 +228,7 @@ module Aliyun
210
228
  headers['user-agent'] = get_user_agent
211
229
  headers['date'] = Time.now.httpdate
212
230
  headers['content-type'] ||= DEFAULT_CONTENT_TYPE
231
+ headers['accept-encoding'] ||= DEFAULT_ACCEPT_ENCODING
213
232
  headers[STS_HEADER] = @config.sts_token if @config.sts_token
214
233
 
215
234
  if body = http_options[:body]
@@ -718,6 +718,9 @@ module Aliyun
718
718
  # specified
719
719
  # * :if_unmatch_etag (String) get the object if its etag
720
720
  # doesn't match specified
721
+ # @option opts [Hash] :headers custom HTTP headers, case
722
+ # insensitive. Headers specified here will overwrite `:condition`
723
+ # and `:range`
721
724
  # @option opts [Hash] :rewrite response headers to rewrite
722
725
  # * :content_type (String) the Content-Type header
723
726
  # * :content_language (String) the Content-Language header
@@ -739,6 +742,7 @@ module Aliyun
739
742
  headers = {}
740
743
  headers['range'] = get_bytes_range(range) if range
741
744
  headers.merge!(get_conditions(conditions)) if conditions
745
+ headers.merge!(to_lower_case(opts[:headers])) if opts.key?(:headers)
742
746
 
743
747
  sub_res = {}
744
748
  if rewrites
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Aliyun
4
4
 
5
- VERSION = "0.3.3"
5
+ VERSION = "0.3.4"
6
6
 
7
7
  end # Aliyun
@@ -0,0 +1,59 @@
1
+ require 'minitest/autorun'
2
+ require 'yaml'
3
+ $LOAD_PATH.unshift(File.expand_path("../../lib", __FILE__))
4
+ require 'aliyun/oss'
5
+ require 'zlib'
6
+
7
+ class TestContentEncoding < Minitest::Test
8
+ def setup
9
+ Aliyun::Common::Logging.set_log_level(Logger::DEBUG)
10
+ conf_file = '~/.oss.yml'
11
+ conf = YAML.load(File.read(File.expand_path(conf_file)))
12
+ client = Aliyun::OSS::Client.new(
13
+ :endpoint => conf['endpoint'],
14
+ :cname => conf['cname'],
15
+ :access_key_id => conf['access_key_id'],
16
+ :access_key_secret => conf['access_key_secret'])
17
+ @bucket = client.get_bucket(conf['bucket'])
18
+
19
+ @prefix = "tests/content_encoding/"
20
+ end
21
+
22
+ def get_key(k)
23
+ "#{@prefix}#{k}"
24
+ end
25
+
26
+ def test_gzip_encoding
27
+ key = get_key('gzip')
28
+ File.open('/tmp/x', 'w') do |f|
29
+ 1000.times { f.write 'hello world' * 1024 }
30
+ end
31
+
32
+ @bucket.put_object(
33
+ key, file: '/tmp/x', content_type: 'text/plain')
34
+
35
+ @bucket.get_object(
36
+ key, file: '/tmp/y', headers: {'accept-encoding': 'gzip'})
37
+
38
+ assert File.exist?('/tmp/y')
39
+ diff = `diff /tmp/x /tmp/y`
40
+ assert diff.empty?
41
+ end
42
+
43
+ def test_deflate_encoding
44
+ key = get_key('deflate')
45
+ File.open('/tmp/x', 'w') do |f|
46
+ 1000.times { f.write 'hello world' * 1024 }
47
+ end
48
+
49
+ @bucket.put_object(
50
+ key, file: '/tmp/x', content_type: 'text/plain')
51
+
52
+ @bucket.get_object(
53
+ key, file: '/tmp/y', headers: {'accept-encoding': 'deflate'})
54
+
55
+ assert File.exist?('/tmp/y')
56
+ diff = `diff /tmp/x /tmp/y`
57
+ assert diff.empty?
58
+ end
59
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aliyun-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tianlong Wu
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-23 00:00:00.000000000 Z
11
+ date: 2015-12-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -179,6 +179,7 @@ files:
179
179
  - spec/aliyun/oss/util_spec.rb
180
180
  - spec/aliyun/sts/client_spec.rb
181
181
  - spec/aliyun/sts/util_spec.rb
182
+ - tests/test_content_encoding.rb
182
183
  - tests/test_content_type.rb
183
184
  - tests/test_custom_headers.rb
184
185
  - tests/test_encoding.rb
@@ -224,6 +225,7 @@ test_files:
224
225
  - spec/aliyun/oss/util_spec.rb
225
226
  - spec/aliyun/sts/client_spec.rb
226
227
  - spec/aliyun/sts/util_spec.rb
228
+ - tests/test_content_encoding.rb
227
229
  - tests/test_content_type.rb
228
230
  - tests/test_custom_headers.rb
229
231
  - tests/test_encoding.rb