aliyun-sdk 0.4.1 → 0.7.2
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 +5 -5
- data/CHANGELOG.md +25 -0
- data/README.md +174 -172
- data/examples/aliyun/oss/bucket.rb +0 -0
- data/examples/aliyun/oss/callback.rb +0 -0
- data/examples/aliyun/oss/object.rb +0 -0
- data/examples/aliyun/oss/resumable_download.rb +0 -0
- data/examples/aliyun/oss/resumable_upload.rb +0 -0
- data/examples/aliyun/oss/streaming.rb +0 -0
- data/examples/aliyun/oss/using_sts.rb +0 -0
- data/examples/aliyun/sts/assume_role.rb +0 -0
- data/ext/crcx/crc64_ecma.c +270 -0
- data/ext/crcx/crcx.c +45 -0
- data/ext/crcx/crcx.h +8 -0
- data/ext/crcx/extconf.rb +3 -0
- data/lib/aliyun/common.rb +0 -0
- data/lib/aliyun/common/exception.rb +0 -0
- data/lib/aliyun/common/logging.rb +6 -1
- data/lib/aliyun/common/struct.rb +0 -0
- data/lib/aliyun/oss.rb +1 -0
- data/lib/aliyun/oss/bucket.rb +41 -33
- data/lib/aliyun/oss/client.rb +10 -2
- data/lib/aliyun/oss/config.rb +4 -1
- data/lib/aliyun/oss/download.rb +2 -2
- data/lib/aliyun/oss/exception.rb +6 -0
- data/lib/aliyun/oss/http.rb +32 -48
- data/lib/aliyun/oss/iterator.rb +0 -0
- data/lib/aliyun/oss/multipart.rb +1 -1
- data/lib/aliyun/oss/object.rb +0 -0
- data/lib/aliyun/oss/protocol.rb +68 -8
- data/lib/aliyun/oss/struct.rb +2 -2
- data/lib/aliyun/oss/upload.rb +0 -0
- data/lib/aliyun/oss/util.rb +25 -1
- data/lib/aliyun/sts.rb +0 -0
- data/lib/aliyun/sts/client.rb +1 -1
- data/lib/aliyun/sts/config.rb +0 -0
- data/lib/aliyun/sts/exception.rb +0 -0
- data/lib/aliyun/sts/protocol.rb +3 -3
- data/lib/aliyun/sts/struct.rb +0 -0
- data/lib/aliyun/sts/util.rb +0 -0
- data/lib/aliyun/version.rb +1 -1
- data/spec/aliyun/oss/bucket_spec.rb +194 -18
- data/spec/aliyun/oss/client/bucket_spec.rb +342 -30
- data/spec/aliyun/oss/client/client_spec.rb +26 -1
- data/spec/aliyun/oss/client/resumable_download_spec.rb +0 -0
- data/spec/aliyun/oss/client/resumable_upload_spec.rb +0 -0
- data/spec/aliyun/oss/http_spec.rb +26 -0
- data/spec/aliyun/oss/multipart_spec.rb +53 -8
- data/spec/aliyun/oss/object_spec.rb +256 -10
- data/spec/aliyun/oss/service_spec.rb +0 -0
- data/spec/aliyun/oss/util_spec.rb +101 -0
- data/spec/aliyun/sts/client_spec.rb +0 -0
- data/spec/aliyun/sts/util_spec.rb +0 -0
- data/tests/config.rb +2 -0
- data/tests/helper.rb +15 -0
- data/tests/test_content_encoding.rb +0 -0
- data/tests/test_content_type.rb +0 -0
- data/tests/test_crc_check.rb +184 -0
- data/tests/test_custom_headers.rb +14 -6
- data/tests/test_encoding.rb +0 -0
- data/tests/test_large_file.rb +0 -0
- data/tests/test_multipart.rb +0 -0
- data/tests/test_object_acl.rb +0 -0
- data/tests/test_object_key.rb +18 -0
- data/tests/test_object_url.rb +20 -0
- data/tests/test_resumable.rb +0 -0
- metadata +33 -12
data/lib/aliyun/oss/client.rb
CHANGED
@@ -28,11 +28,15 @@ module Aliyun
|
|
28
28
|
# KEY SECRET,如果不填则会尝试匿名访问
|
29
29
|
# @option opts [Boolean] :cname [可选] 指定endpoint是否是用户绑
|
30
30
|
# 定的域名
|
31
|
+
# @option opts [Boolean] :upload_crc_enable [可选]指定上传处理
|
32
|
+
# 是否开启CRC校验,默认为开启(true)
|
33
|
+
# @option opts [Boolean] :download_crc_enable [可选]指定下载处理
|
34
|
+
# 是否开启CRC校验,默认为不开启(false)
|
31
35
|
# @option opts [String] :sts_token [可选] 指定STS的
|
32
36
|
# SecurityToken,如果指定,则使用STS授权访问
|
33
|
-
# @option opts [
|
37
|
+
# @option opts [Integer] :open_timeout [可选] 指定建立连接的超时
|
34
38
|
# 时间,默认为10秒
|
35
|
-
# @option opts [
|
39
|
+
# @option opts [Integer] :read_timeout [可选] 指定等待响应的超时
|
36
40
|
# 时间,默认为120秒
|
37
41
|
# @example 标准endpoint
|
38
42
|
# oss-cn-hangzhou.aliyuncs.com
|
@@ -66,6 +70,7 @@ module Aliyun
|
|
66
70
|
# @param opts [Hash] 创建Bucket的属性(可选)
|
67
71
|
# @option opts [:location] [String] 指定bucket所在的区域,默认为oss-cn-hangzhou
|
68
72
|
def create_bucket(name, opts = {})
|
73
|
+
Util.ensure_bucket_name_valid(name)
|
69
74
|
@protocol.create_bucket(name, opts)
|
70
75
|
end
|
71
76
|
|
@@ -73,6 +78,7 @@ module Aliyun
|
|
73
78
|
# @param name [String] Bucket名字
|
74
79
|
# @note 如果要删除的Bucket不为空(包含有object),则删除会失败
|
75
80
|
def delete_bucket(name)
|
81
|
+
Util.ensure_bucket_name_valid(name)
|
76
82
|
@protocol.delete_bucket(name)
|
77
83
|
end
|
78
84
|
|
@@ -80,6 +86,7 @@ module Aliyun
|
|
80
86
|
# @param name [String] Bucket名字
|
81
87
|
# @return [Boolean] 如果Bucket存在则返回true,否则返回false
|
82
88
|
def bucket_exists?(name)
|
89
|
+
Util.ensure_bucket_name_valid(name)
|
83
90
|
exist = false
|
84
91
|
|
85
92
|
begin
|
@@ -98,6 +105,7 @@ module Aliyun
|
|
98
105
|
# @param name [String] Bucket名字
|
99
106
|
# @return [Bucket] Bucket对象
|
100
107
|
def get_bucket(name)
|
108
|
+
Util.ensure_bucket_name_valid(name)
|
101
109
|
Bucket.new({:name => name}, @protocol)
|
102
110
|
end
|
103
111
|
|
data/lib/aliyun/oss/config.rb
CHANGED
@@ -11,7 +11,8 @@ module Aliyun
|
|
11
11
|
|
12
12
|
attrs :endpoint, :cname, :sts_token,
|
13
13
|
:access_key_id, :access_key_secret,
|
14
|
-
:open_timeout, :read_timeout
|
14
|
+
:open_timeout, :read_timeout,
|
15
|
+
:download_crc_enable, :upload_crc_enable
|
15
16
|
|
16
17
|
def initialize(opts = {})
|
17
18
|
super(opts)
|
@@ -19,6 +20,8 @@ module Aliyun
|
|
19
20
|
@access_key_id = @access_key_id.strip if @access_key_id
|
20
21
|
@access_key_secret = @access_key_secret.strip if @access_key_secret
|
21
22
|
normalize_endpoint if endpoint
|
23
|
+
@upload_crc_enable = (@upload_crc_enable == 'false' || @upload_crc_enable == false) ? false : true
|
24
|
+
@download_crc_enable = (@download_crc_enable == 'true' || @download_crc_enable == true) ? true : false
|
22
25
|
end
|
23
26
|
|
24
27
|
private
|
data/lib/aliyun/oss/download.rb
CHANGED
@@ -114,7 +114,7 @@ module Aliyun
|
|
114
114
|
|
115
115
|
parts = sync_get_all_parts
|
116
116
|
# concat all part files into the target file
|
117
|
-
File.open(@file, '
|
117
|
+
File.open(@file, 'wb') do |w|
|
118
118
|
parts.sort{ |x, y| x[:number] <=> y[:number] }.each do |p|
|
119
119
|
File.open(get_part_file(p)) do |r|
|
120
120
|
w.write(r.read(READ_SIZE)) until r.eof?
|
@@ -177,7 +177,7 @@ module Aliyun
|
|
177
177
|
logger.debug("Begin download part: #{p}")
|
178
178
|
|
179
179
|
part_file = get_part_file(p)
|
180
|
-
File.open(part_file, '
|
180
|
+
File.open(part_file, 'wb') do |w|
|
181
181
|
@protocol.get_object(
|
182
182
|
bucket, object,
|
183
183
|
@options.merge(range: p[:range])) { |chunk| w.write(chunk) }
|
data/lib/aliyun/oss/exception.rb
CHANGED
@@ -64,6 +64,12 @@ module Aliyun
|
|
64
64
|
class ClientError < Common::Exception
|
65
65
|
end # ClientError
|
66
66
|
|
67
|
+
##
|
68
|
+
# CrcInconsistentError will be raised after a upload operation,
|
69
|
+
# when the local crc is inconsistent with the response crc from server.
|
70
|
+
#
|
71
|
+
class CrcInconsistentError < Common::Exception; end
|
72
|
+
|
67
73
|
##
|
68
74
|
# FileInconsistentError happens in a resumable upload transaction,
|
69
75
|
# when the file to upload has changed during the uploading
|
data/lib/aliyun/oss/http.rb
CHANGED
@@ -43,10 +43,14 @@ module Aliyun
|
|
43
43
|
# A stream is any class that responds to :read(bytes, outbuf)
|
44
44
|
#
|
45
45
|
class StreamWriter
|
46
|
-
|
46
|
+
attr_reader :data_crc
|
47
|
+
|
48
|
+
def initialize(crc_enable = false, init_crc = 0)
|
47
49
|
@buffer = ""
|
48
50
|
@producer = Fiber.new { yield self if block_given? }
|
49
51
|
@producer.resume
|
52
|
+
@data_crc = init_crc.to_i
|
53
|
+
@crc_enable = crc_enable
|
50
54
|
end
|
51
55
|
|
52
56
|
def read(bytes = nil, outbuf = nil)
|
@@ -84,6 +88,8 @@ module Aliyun
|
|
84
88
|
# "". ios.read(positive-integer) returns nil.
|
85
89
|
return nil if ret.empty? && !bytes.nil? && bytes > 0
|
86
90
|
|
91
|
+
@data_crc = Aliyun::OSS::Util.crc(ret, @data_crc) if @crc_enable
|
92
|
+
|
87
93
|
ret
|
88
94
|
end
|
89
95
|
|
@@ -99,37 +105,12 @@ module Aliyun
|
|
99
105
|
false
|
100
106
|
end
|
101
107
|
|
102
|
-
def inspect
|
103
|
-
"@buffer: " + @buffer[0, 32].inspect + "...#{@buffer.size} bytes"
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
# RestClient requires the payload to respones to :read(bytes)
|
108
|
-
# and return a stream.
|
109
|
-
# We are not doing the real read here, just return a
|
110
|
-
# readable stream for RestClient playload.rb treats it as:
|
111
|
-
# def read(bytes=nil)
|
112
|
-
# @stream.read(bytes)
|
113
|
-
# end
|
114
|
-
# alias :to_s :read
|
115
|
-
# net_http_do_request(http, req, payload ? payload.to_s : nil,
|
116
|
-
# &@block_response)
|
117
|
-
class StreamPayload
|
118
|
-
def initialize(&block)
|
119
|
-
@stream = StreamWriter.new(&block)
|
120
|
-
end
|
121
|
-
|
122
|
-
def read(bytes = nil)
|
123
|
-
@stream
|
124
|
-
end
|
125
|
-
|
126
108
|
def close
|
127
109
|
end
|
128
110
|
|
129
|
-
def
|
130
|
-
|
111
|
+
def inspect
|
112
|
+
"@buffer: " + @buffer[0, 32].inspect + "...#{@buffer.size} bytes"
|
131
113
|
end
|
132
|
-
|
133
114
|
end
|
134
115
|
|
135
116
|
include Common::Logging
|
@@ -140,12 +121,13 @@ module Aliyun
|
|
140
121
|
|
141
122
|
def get_request_url(bucket, object)
|
142
123
|
url = @config.endpoint.dup
|
124
|
+
url.query = nil
|
125
|
+
url.fragment = nil
|
143
126
|
isIP = !!(url.host =~ Resolv::IPv4::Regex)
|
144
127
|
url.host = "#{bucket}." + url.host if bucket && !@config.cname && !isIP
|
145
128
|
url.path = '/'
|
146
129
|
url.path << "#{bucket}/" if bucket && isIP
|
147
|
-
url.path <<
|
148
|
-
|
130
|
+
url.path << CGI.escape(object) if object
|
149
131
|
url.to_s
|
150
132
|
end
|
151
133
|
|
@@ -276,44 +258,46 @@ module Aliyun
|
|
276
258
|
headers[:params] = (sub_res || {}).merge(http_options[:query] || {})
|
277
259
|
|
278
260
|
block_response = ->(r) { handle_response(r, &block) } if block
|
279
|
-
|
261
|
+
request = RestClient::Request.new(
|
280
262
|
:method => verb,
|
281
263
|
:url => get_request_url(bucket, object),
|
282
264
|
:headers => headers,
|
283
265
|
:payload => http_options[:body],
|
284
266
|
:block_response => block_response,
|
285
267
|
:open_timeout => @config.open_timeout || OPEN_TIMEOUT,
|
286
|
-
:
|
287
|
-
)
|
288
|
-
|
289
|
-
if
|
290
|
-
e = ServerError.new(
|
268
|
+
:read_timeout => @config.read_timeout || READ_TIMEOUT
|
269
|
+
)
|
270
|
+
response = request.execute do |resp, &blk|
|
271
|
+
if resp.code >= 300
|
272
|
+
e = ServerError.new(resp)
|
291
273
|
logger.error(e.to_s)
|
292
274
|
raise e
|
293
275
|
else
|
294
|
-
|
276
|
+
resp.return!(&blk)
|
295
277
|
end
|
296
278
|
end
|
297
279
|
|
298
280
|
# If streaming read_body is used, we need to create the
|
299
281
|
# RestClient::Response ourselves
|
300
|
-
unless
|
301
|
-
if
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
282
|
+
unless response.is_a?(RestClient::Response)
|
283
|
+
if response.code.to_i >= 300
|
284
|
+
body = response.body
|
285
|
+
if RestClient::version < '2.1.0'
|
286
|
+
body = RestClient::Request.decode(response['content-encoding'], response.body)
|
287
|
+
end
|
288
|
+
response = RestClient::Response.create(body, response, request)
|
289
|
+
e = ServerError.new(response)
|
306
290
|
logger.error(e.to_s)
|
307
291
|
raise e
|
308
292
|
end
|
309
|
-
|
310
|
-
|
293
|
+
response = RestClient::Response.create(nil, response, request)
|
294
|
+
response.return!
|
311
295
|
end
|
312
296
|
|
313
|
-
logger.debug("Received HTTP response, code: #{
|
314
|
-
"#{
|
297
|
+
logger.debug("Received HTTP response, code: #{response.code}, headers: " \
|
298
|
+
"#{response.headers}, body: #{response.body}")
|
315
299
|
|
316
|
-
|
300
|
+
response
|
317
301
|
end
|
318
302
|
|
319
303
|
def get_user_agent
|
data/lib/aliyun/oss/iterator.rb
CHANGED
File without changes
|
data/lib/aliyun/oss/multipart.rb
CHANGED
data/lib/aliyun/oss/object.rb
CHANGED
File without changes
|
data/lib/aliyun/oss/protocol.rb
CHANGED
@@ -7,6 +7,7 @@ require 'time'
|
|
7
7
|
module Aliyun
|
8
8
|
module OSS
|
9
9
|
|
10
|
+
|
10
11
|
##
|
11
12
|
# Protocol implement the OSS Open API which is low-level. User
|
12
13
|
# should refer to {OSS::Client} for normal use.
|
@@ -345,10 +346,10 @@ module Aliyun
|
|
345
346
|
xml.Date Time.utc(
|
346
347
|
r.expiry.year, r.expiry.month, r.expiry.day)
|
347
348
|
.iso8601.sub('Z', '.000Z')
|
348
|
-
elsif r.expiry.is_a?(
|
349
|
+
elsif r.expiry.is_a?(Integer)
|
349
350
|
xml.Days r.expiry
|
350
351
|
else
|
351
|
-
fail ClientError, "Expiry must be a Date or
|
352
|
+
fail ClientError, "Expiry must be a Date or Integer."
|
352
353
|
end
|
353
354
|
}
|
354
355
|
}
|
@@ -534,9 +535,10 @@ module Aliyun
|
|
534
535
|
headers[CALLBACK_HEADER] = opts[:callback].serialize
|
535
536
|
end
|
536
537
|
|
538
|
+
payload = HTTP::StreamWriter.new(@config.upload_crc_enable, opts[:init_crc], &block)
|
537
539
|
r = @http.put(
|
538
540
|
{:bucket => bucket_name, :object => object_name},
|
539
|
-
{:headers => headers, :body =>
|
541
|
+
{:headers => headers, :body => payload})
|
540
542
|
|
541
543
|
if r.code == 203
|
542
544
|
e = CallbackError.new(r)
|
@@ -544,6 +546,11 @@ module Aliyun
|
|
544
546
|
raise e
|
545
547
|
end
|
546
548
|
|
549
|
+
if @config.upload_crc_enable && !r.headers[:x_oss_hash_crc64ecma].nil?
|
550
|
+
data_crc = payload.data_crc
|
551
|
+
Aliyun::OSS::Util.crc_check(data_crc, r.headers[:x_oss_hash_crc64ecma], 'put')
|
552
|
+
end
|
553
|
+
|
547
554
|
logger.debug('Done put object')
|
548
555
|
end
|
549
556
|
|
@@ -586,9 +593,19 @@ module Aliyun
|
|
586
593
|
|
587
594
|
headers.merge!(to_lower_case(opts[:headers])) if opts.key?(:headers)
|
588
595
|
|
596
|
+
payload = HTTP::StreamWriter.new(
|
597
|
+
@config.upload_crc_enable && !opts[:init_crc].nil?, opts[:init_crc], &block)
|
598
|
+
|
589
599
|
r = @http.post(
|
590
600
|
{:bucket => bucket_name, :object => object_name, :sub_res => sub_res},
|
591
|
-
{:headers => headers, :body =>
|
601
|
+
{:headers => headers, :body => payload})
|
602
|
+
|
603
|
+
if @config.upload_crc_enable &&
|
604
|
+
!r.headers[:x_oss_hash_crc64ecma].nil? &&
|
605
|
+
!opts[:init_crc].nil?
|
606
|
+
data_crc = payload.data_crc
|
607
|
+
Aliyun::OSS::Util.crc_check(data_crc, r.headers[:x_oss_hash_crc64ecma], 'append')
|
608
|
+
end
|
592
609
|
|
593
610
|
logger.debug('Done append object')
|
594
611
|
|
@@ -759,11 +776,22 @@ module Aliyun
|
|
759
776
|
rewrites[:expires].httpdate if rewrites.key?(:expires)
|
760
777
|
end
|
761
778
|
|
779
|
+
data_crc = opts[:init_crc].nil? ? 0 : opts[:init_crc]
|
762
780
|
r = @http.get(
|
763
781
|
{:bucket => bucket_name, :object => object_name,
|
764
782
|
:sub_res => sub_res},
|
765
783
|
{:headers => headers}
|
766
|
-
)
|
784
|
+
) do |chunk|
|
785
|
+
if block_given?
|
786
|
+
# crc enable and no range and oss server support crc
|
787
|
+
data_crc = Aliyun::OSS::Util.crc(chunk, data_crc) if @config.download_crc_enable && range.nil?
|
788
|
+
yield chunk
|
789
|
+
end
|
790
|
+
end
|
791
|
+
|
792
|
+
if @config.download_crc_enable && range.nil? && !r.headers[:x_oss_hash_crc64ecma].nil?
|
793
|
+
Aliyun::OSS::Util.crc_check(data_crc, r.headers[:x_oss_hash_crc64ecma], 'get')
|
794
|
+
end
|
767
795
|
|
768
796
|
h = r.headers
|
769
797
|
metas = {}
|
@@ -1082,9 +1110,16 @@ module Aliyun
|
|
1082
1110
|
"#{object_name}, txn id: #{txn_id}, part No: #{part_no}")
|
1083
1111
|
|
1084
1112
|
sub_res = {'partNumber' => part_no, 'uploadId' => txn_id}
|
1113
|
+
|
1114
|
+
payload = HTTP::StreamWriter.new(@config.upload_crc_enable, &block)
|
1085
1115
|
r = @http.put(
|
1086
1116
|
{:bucket => bucket_name, :object => object_name, :sub_res => sub_res},
|
1087
|
-
{:body =>
|
1117
|
+
{:body => payload})
|
1118
|
+
|
1119
|
+
if @config.upload_crc_enable && !r.headers[:x_oss_hash_crc64ecma].nil?
|
1120
|
+
data_crc = payload.data_crc
|
1121
|
+
Aliyun::OSS::Util.crc_check(data_crc, r.headers[:x_oss_hash_crc64ecma], 'put')
|
1122
|
+
end
|
1088
1123
|
|
1089
1124
|
logger.debug("Done upload part")
|
1090
1125
|
|
@@ -1359,12 +1394,26 @@ module Aliyun
|
|
1359
1394
|
@http.get_request_url(bucket, object)
|
1360
1395
|
end
|
1361
1396
|
|
1397
|
+
# Get bucket/object resource path
|
1398
|
+
# @param [String] bucket the bucket name
|
1399
|
+
# @param [String] object the bucket name
|
1400
|
+
# @return [String] resource path for the bucket/object
|
1401
|
+
def get_resource_path(bucket, object = nil)
|
1402
|
+
@http.get_resource_path(bucket, object)
|
1403
|
+
end
|
1404
|
+
|
1362
1405
|
# Get user's access key id
|
1363
1406
|
# @return [String] the access key id
|
1364
1407
|
def get_access_key_id
|
1365
1408
|
@config.access_key_id
|
1366
1409
|
end
|
1367
1410
|
|
1411
|
+
# Get user's access key secret
|
1412
|
+
# @return [String] the access key secret
|
1413
|
+
def get_access_key_secret
|
1414
|
+
@config.access_key_secret
|
1415
|
+
end
|
1416
|
+
|
1368
1417
|
# Get user's STS token
|
1369
1418
|
# @return [String] the STS token
|
1370
1419
|
def get_sts_token
|
@@ -1378,6 +1427,18 @@ module Aliyun
|
|
1378
1427
|
Util.sign(@config.access_key_secret, string_to_sign)
|
1379
1428
|
end
|
1380
1429
|
|
1430
|
+
# Get the download crc status
|
1431
|
+
# @return true(download crc enable) or false(download crc disable)
|
1432
|
+
def download_crc_enable
|
1433
|
+
@config.download_crc_enable
|
1434
|
+
end
|
1435
|
+
|
1436
|
+
# Get the upload crc status
|
1437
|
+
# @return true(upload crc enable) or false(upload crc disable)
|
1438
|
+
def upload_crc_enable
|
1439
|
+
@config.upload_crc_enable
|
1440
|
+
end
|
1441
|
+
|
1381
1442
|
private
|
1382
1443
|
|
1383
1444
|
# Parse body content to xml document
|
@@ -1470,7 +1531,7 @@ module Aliyun
|
|
1470
1531
|
def get_bytes_range(range)
|
1471
1532
|
if range &&
|
1472
1533
|
(!range.is_a?(Array) || range.size != 2 ||
|
1473
|
-
!range.at(0).is_a?(
|
1534
|
+
!range.at(0).is_a?(Integer) || !range.at(1).is_a?(Integer))
|
1474
1535
|
fail ClientError, "Range must be an array containing 2 Integers."
|
1475
1536
|
end
|
1476
1537
|
|
@@ -1493,7 +1554,6 @@ module Aliyun
|
|
1493
1554
|
result
|
1494
1555
|
end
|
1495
1556
|
end
|
1496
|
-
|
1497
1557
|
end # Protocol
|
1498
1558
|
end # OSS
|
1499
1559
|
end # Aliyun
|
data/lib/aliyun/oss/struct.rb
CHANGED
@@ -107,10 +107,10 @@ module Aliyun
|
|
107
107
|
# * id [String] the unique id of a rule
|
108
108
|
# * enabled [Boolean] whether to enable this rule
|
109
109
|
# * prefix [String] the prefix objects to apply this rule
|
110
|
-
# * expiry [Date] or [
|
110
|
+
# * expiry [Date] or [Integer] the expire time of objects
|
111
111
|
# * if expiry is a Date, it specifies the absolute date to
|
112
112
|
# expire objects
|
113
|
-
# * if expiry is a
|
113
|
+
# * if expiry is a Integer, it specifies the relative date to
|
114
114
|
# expire objects: how many days after the object's last
|
115
115
|
# modification time to expire the object
|
116
116
|
# @example Specify expiry as Date
|
data/lib/aliyun/oss/upload.rb
CHANGED
File without changes
|
data/lib/aliyun/oss/util.rb
CHANGED
@@ -7,6 +7,7 @@ require 'digest/md5'
|
|
7
7
|
|
8
8
|
module Aliyun
|
9
9
|
module OSS
|
10
|
+
|
10
11
|
##
|
11
12
|
# Util functions to help generate formatted Date, signatures,
|
12
13
|
# etc.
|
@@ -75,6 +76,29 @@ module Aliyun
|
|
75
76
|
end
|
76
77
|
end
|
77
78
|
|
79
|
+
# Get a crc value of the data
|
80
|
+
def crc(data, init_crc = 0)
|
81
|
+
CrcX::crc64(init_crc, data, data.size)
|
82
|
+
end
|
83
|
+
|
84
|
+
# Calculate a value of the crc1 combine with crc2.
|
85
|
+
def crc_combine(crc1, crc2, len2)
|
86
|
+
CrcX::crc64_combine(crc1, crc2, len2)
|
87
|
+
end
|
88
|
+
|
89
|
+
def crc_check(crc_a, crc_b, operation)
|
90
|
+
if crc_a.nil? || crc_b.nil? || crc_a.to_i != crc_b.to_i
|
91
|
+
logger.error("The crc of #{operation} between client and oss is not inconsistent. crc_a=#{crc_a} crc_b=#{crc_b}")
|
92
|
+
fail CrcInconsistentError.new("The crc of #{operation} between client and oss is not inconsistent.")
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def ensure_bucket_name_valid(name)
|
97
|
+
unless (name =~ %r|^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$|)
|
98
|
+
fail ClientError, "The bucket name is invalid."
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
78
102
|
end # self
|
79
103
|
end # Util
|
80
104
|
end # OSS
|
@@ -86,4 +110,4 @@ class String
|
|
86
110
|
return true if self =~ /^true$/i
|
87
111
|
false
|
88
112
|
end
|
89
|
-
end
|
113
|
+
end
|