aliyun-sdk 0.3.3 → 0.3.4

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: 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