aliyun-sdk 0.4.1 → 0.5.0
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 +4 -4
- data/CHANGELOG.md +5 -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/oss.rb +1 -0
- data/lib/aliyun/oss/bucket.rb +12 -1
- data/lib/aliyun/oss/client.rb +4 -0
- 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 +9 -4
- data/lib/aliyun/oss/multipart.rb +1 -1
- data/lib/aliyun/oss/protocol.rb +50 -5
- data/lib/aliyun/oss/util.rb +19 -1
- data/lib/aliyun/version.rb +1 -1
- data/spec/aliyun/oss/bucket_spec.rb +54 -0
- data/spec/aliyun/oss/client/bucket_spec.rb +66 -0
- data/spec/aliyun/oss/http_spec.rb +26 -0
- data/spec/aliyun/oss/multipart_spec.rb +45 -0
- data/spec/aliyun/oss/object_spec.rb +153 -0
- data/spec/aliyun/oss/util_spec.rb +50 -0
- data/tests/config.rb +2 -0
- data/tests/helper.rb +15 -0
- data/tests/test_crc_check.rb +184 -0
- data/tests/test_custom_headers.rb +14 -6
- metadata +27 -4
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
|
|
@@ -115,8 +121,8 @@ module Aliyun
|
|
115
121
|
# net_http_do_request(http, req, payload ? payload.to_s : nil,
|
116
122
|
# &@block_response)
|
117
123
|
class StreamPayload
|
118
|
-
def initialize(&block)
|
119
|
-
@stream = StreamWriter.new(&block)
|
124
|
+
def initialize(crc_enable = false, init_crc = 0, &block)
|
125
|
+
@stream = StreamWriter.new(crc_enable, init_crc, &block)
|
120
126
|
end
|
121
127
|
|
122
128
|
def read(bytes = nil)
|
@@ -129,7 +135,6 @@ module Aliyun
|
|
129
135
|
def closed?
|
130
136
|
false
|
131
137
|
end
|
132
|
-
|
133
138
|
end
|
134
139
|
|
135
140
|
include Common::Logging
|
data/lib/aliyun/oss/multipart.rb
CHANGED
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.
|
@@ -534,9 +535,10 @@ module Aliyun
|
|
534
535
|
headers[CALLBACK_HEADER] = opts[:callback].serialize
|
535
536
|
end
|
536
537
|
|
538
|
+
payload = HTTP::StreamPayload.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.read.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,18 @@ module Aliyun
|
|
586
593
|
|
587
594
|
headers.merge!(to_lower_case(opts[:headers])) if opts.key?(:headers)
|
588
595
|
|
596
|
+
payload = HTTP::StreamPayload.new(@config.upload_crc_enable && !opts[:init_crc].nil?, opts[:init_crc], &block)
|
597
|
+
|
589
598
|
r = @http.post(
|
590
599
|
{:bucket => bucket_name, :object => object_name, :sub_res => sub_res},
|
591
|
-
{:headers => headers, :body =>
|
600
|
+
{:headers => headers, :body => payload})
|
601
|
+
|
602
|
+
if @config.upload_crc_enable &&
|
603
|
+
!r.headers[:x_oss_hash_crc64ecma].nil? &&
|
604
|
+
!opts[:init_crc].nil?
|
605
|
+
data_crc = payload.read.data_crc
|
606
|
+
Aliyun::OSS::Util.crc_check(data_crc, r.headers[:x_oss_hash_crc64ecma], 'append')
|
607
|
+
end
|
592
608
|
|
593
609
|
logger.debug('Done append object')
|
594
610
|
|
@@ -759,11 +775,22 @@ module Aliyun
|
|
759
775
|
rewrites[:expires].httpdate if rewrites.key?(:expires)
|
760
776
|
end
|
761
777
|
|
778
|
+
data_crc = opts[:init_crc].nil? ? 0 : opts[:init_crc]
|
762
779
|
r = @http.get(
|
763
780
|
{:bucket => bucket_name, :object => object_name,
|
764
781
|
:sub_res => sub_res},
|
765
782
|
{:headers => headers}
|
766
|
-
)
|
783
|
+
) do |chunk|
|
784
|
+
if block_given?
|
785
|
+
# crc enable and no range and oss server support crc
|
786
|
+
data_crc = Aliyun::OSS::Util.crc(chunk, data_crc) if @config.download_crc_enable && range.nil?
|
787
|
+
yield chunk
|
788
|
+
end
|
789
|
+
end
|
790
|
+
|
791
|
+
if @config.download_crc_enable && range.nil? && !r.headers[:x_oss_hash_crc64ecma].nil?
|
792
|
+
Aliyun::OSS::Util.crc_check(data_crc, r.headers[:x_oss_hash_crc64ecma], 'get')
|
793
|
+
end
|
767
794
|
|
768
795
|
h = r.headers
|
769
796
|
metas = {}
|
@@ -1082,9 +1109,16 @@ module Aliyun
|
|
1082
1109
|
"#{object_name}, txn id: #{txn_id}, part No: #{part_no}")
|
1083
1110
|
|
1084
1111
|
sub_res = {'partNumber' => part_no, 'uploadId' => txn_id}
|
1112
|
+
|
1113
|
+
payload = HTTP::StreamPayload.new(@config.upload_crc_enable, &block)
|
1085
1114
|
r = @http.put(
|
1086
1115
|
{:bucket => bucket_name, :object => object_name, :sub_res => sub_res},
|
1087
|
-
{:body =>
|
1116
|
+
{:body => payload})
|
1117
|
+
|
1118
|
+
if @config.upload_crc_enable && !r.headers[:x_oss_hash_crc64ecma].nil?
|
1119
|
+
data_crc = payload.read.data_crc
|
1120
|
+
Aliyun::OSS::Util.crc_check(data_crc, r.headers[:x_oss_hash_crc64ecma], 'put')
|
1121
|
+
end
|
1088
1122
|
|
1089
1123
|
logger.debug("Done upload part")
|
1090
1124
|
|
@@ -1378,6 +1412,18 @@ module Aliyun
|
|
1378
1412
|
Util.sign(@config.access_key_secret, string_to_sign)
|
1379
1413
|
end
|
1380
1414
|
|
1415
|
+
# Get the download crc status
|
1416
|
+
# @return true(download crc enable) or false(download crc disable)
|
1417
|
+
def download_crc_enable
|
1418
|
+
@config.download_crc_enable
|
1419
|
+
end
|
1420
|
+
|
1421
|
+
# Get the upload crc status
|
1422
|
+
# @return true(upload crc enable) or false(upload crc disable)
|
1423
|
+
def upload_crc_enable
|
1424
|
+
@config.upload_crc_enable
|
1425
|
+
end
|
1426
|
+
|
1381
1427
|
private
|
1382
1428
|
|
1383
1429
|
# Parse body content to xml document
|
@@ -1493,7 +1539,6 @@ module Aliyun
|
|
1493
1539
|
result
|
1494
1540
|
end
|
1495
1541
|
end
|
1496
|
-
|
1497
1542
|
end # Protocol
|
1498
1543
|
end # OSS
|
1499
1544
|
end # Aliyun
|
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,23 @@ 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
|
+
|
78
96
|
end # self
|
79
97
|
end # Util
|
80
98
|
end # OSS
|
@@ -86,4 +104,4 @@ class String
|
|
86
104
|
return true if self =~ /^true$/i
|
87
105
|
false
|
88
106
|
end
|
89
|
-
end
|
107
|
+
end
|
data/lib/aliyun/version.rb
CHANGED
@@ -591,6 +591,60 @@ module Aliyun
|
|
591
591
|
|
592
592
|
end # acl, logging, cors, etc
|
593
593
|
|
594
|
+
context "crc" do
|
595
|
+
it "should download crc enable equal config setting" do
|
596
|
+
protocol = Protocol.new(
|
597
|
+
Config.new(:endpoint => @endpoint,
|
598
|
+
:access_key_id => 'xxx', :access_key_secret => 'yyy',
|
599
|
+
:download_crc_enable => 'true'))
|
600
|
+
expect(protocol.download_crc_enable).to eq(true)
|
601
|
+
|
602
|
+
protocol = Protocol.new(
|
603
|
+
Config.new(:endpoint => @endpoint,
|
604
|
+
:access_key_id => 'xxx', :access_key_secret => 'yyy',
|
605
|
+
:download_crc_enable => true))
|
606
|
+
expect(protocol.download_crc_enable).to eq(true)
|
607
|
+
|
608
|
+
protocol = Protocol.new(
|
609
|
+
Config.new(:endpoint => @endpoint,
|
610
|
+
:access_key_id => 'xxx', :access_key_secret => 'yyy',
|
611
|
+
:download_crc_enable => 'false'))
|
612
|
+
expect(protocol.download_crc_enable).to eq(false)
|
613
|
+
|
614
|
+
protocol = Protocol.new(
|
615
|
+
Config.new(:endpoint => @endpoint,
|
616
|
+
:access_key_id => 'xxx', :access_key_secret => 'yyy',
|
617
|
+
:download_crc_enable => false))
|
618
|
+
expect(protocol.download_crc_enable).to eq(false)
|
619
|
+
end
|
620
|
+
|
621
|
+
it "should upload crc enable equal config setting" do
|
622
|
+
protocol = Protocol.new(
|
623
|
+
Config.new(:endpoint => @endpoint,
|
624
|
+
:access_key_id => 'xxx', :access_key_secret => 'yyy',
|
625
|
+
:upload_crc_enable => 'true'))
|
626
|
+
expect(protocol.upload_crc_enable).to eq(true)
|
627
|
+
|
628
|
+
protocol = Protocol.new(
|
629
|
+
Config.new(:endpoint => @endpoint,
|
630
|
+
:access_key_id => 'xxx', :access_key_secret => 'yyy',
|
631
|
+
:upload_crc_enable => true))
|
632
|
+
expect(protocol.upload_crc_enable).to eq(true)
|
633
|
+
|
634
|
+
protocol = Protocol.new(
|
635
|
+
Config.new(:endpoint => @endpoint,
|
636
|
+
:access_key_id => 'xxx', :access_key_secret => 'yyy',
|
637
|
+
:upload_crc_enable => 'false'))
|
638
|
+
expect(protocol.upload_crc_enable).to eq(false)
|
639
|
+
|
640
|
+
protocol = Protocol.new(
|
641
|
+
Config.new(:endpoint => @endpoint,
|
642
|
+
:access_key_id => 'xxx', :access_key_secret => 'yyy',
|
643
|
+
:upload_crc_enable => false))
|
644
|
+
expect(protocol.upload_crc_enable).to eq(false)
|
645
|
+
end
|
646
|
+
end # crc
|
647
|
+
|
594
648
|
end # Bucket
|
595
649
|
|
596
650
|
end # OSS
|
@@ -549,6 +549,72 @@ module Aliyun
|
|
549
549
|
end
|
550
550
|
end # multipart operations
|
551
551
|
|
552
|
+
context "crc" do
|
553
|
+
it "should download crc enable equal config setting" do
|
554
|
+
bucket = Client.new(
|
555
|
+
:endpoint => @endpoint,
|
556
|
+
:access_key_id => 'xxx', :access_key_secret => 'yyy',
|
557
|
+
:download_crc_enable => 'true').get_bucket(@bucket_name)
|
558
|
+
expect(bucket.download_crc_enable).to eq(true)
|
559
|
+
|
560
|
+
bucket = Client.new(
|
561
|
+
:endpoint => @endpoint,
|
562
|
+
:access_key_id => 'xxx', :access_key_secret => 'yyy',
|
563
|
+
:download_crc_enable => true).get_bucket(@bucket_name)
|
564
|
+
expect(bucket.download_crc_enable).to eq(true)
|
565
|
+
|
566
|
+
bucket = Client.new(
|
567
|
+
:endpoint => @endpoint,
|
568
|
+
:access_key_id => 'xxx', :access_key_secret => 'yyy',
|
569
|
+
:download_crc_enable => 'false').get_bucket(@bucket_name)
|
570
|
+
expect(bucket.download_crc_enable).to eq(false)
|
571
|
+
|
572
|
+
bucket = Client.new(
|
573
|
+
:endpoint => @endpoint,
|
574
|
+
:access_key_id => 'xxx', :access_key_secret => 'yyy',
|
575
|
+
:download_crc_enable => false).get_bucket(@bucket_name)
|
576
|
+
expect(bucket.download_crc_enable).to eq(false)
|
577
|
+
|
578
|
+
# check default value
|
579
|
+
bucket = Client.new(
|
580
|
+
:endpoint => @endpoint,
|
581
|
+
:access_key_id => 'xxx', :access_key_secret => 'yyy').get_bucket(@bucket_name)
|
582
|
+
expect(bucket.download_crc_enable).to eq(false)
|
583
|
+
end
|
584
|
+
|
585
|
+
it "should upload crc enable equal config setting" do
|
586
|
+
bucket = Client.new(
|
587
|
+
:endpoint => @endpoint,
|
588
|
+
:access_key_id => 'xxx', :access_key_secret => 'yyy',
|
589
|
+
:upload_crc_enable => 'true').get_bucket(@bucket_name)
|
590
|
+
expect(bucket.upload_crc_enable).to eq(true)
|
591
|
+
|
592
|
+
bucket = Client.new(
|
593
|
+
:endpoint => @endpoint,
|
594
|
+
:access_key_id => 'xxx', :access_key_secret => 'yyy',
|
595
|
+
:upload_crc_enable => true).get_bucket(@bucket_name)
|
596
|
+
expect(bucket.upload_crc_enable).to eq(true)
|
597
|
+
|
598
|
+
bucket = Client.new(
|
599
|
+
:endpoint => @endpoint,
|
600
|
+
:access_key_id => 'xxx', :access_key_secret => 'yyy',
|
601
|
+
:upload_crc_enable => 'false').get_bucket(@bucket_name)
|
602
|
+
expect(bucket.upload_crc_enable).to eq(false)
|
603
|
+
|
604
|
+
bucket = Client.new(
|
605
|
+
:endpoint => @endpoint,
|
606
|
+
:access_key_id => 'xxx', :access_key_secret => 'yyy',
|
607
|
+
:upload_crc_enable => false).get_bucket(@bucket_name)
|
608
|
+
expect(bucket.upload_crc_enable).to eq(false)
|
609
|
+
|
610
|
+
# check default value
|
611
|
+
bucket = Client.new(
|
612
|
+
:endpoint => @endpoint,
|
613
|
+
:access_key_id => 'xxx', :access_key_secret => 'yyy').get_bucket(@bucket_name)
|
614
|
+
expect(bucket.upload_crc_enable).to eq(true)
|
615
|
+
end
|
616
|
+
end # crc
|
617
|
+
|
552
618
|
end # Bucket
|
553
619
|
end # OSS
|
554
620
|
end # Aliyun
|
@@ -76,6 +76,32 @@ module Aliyun
|
|
76
76
|
r = s.read(1000)
|
77
77
|
expect(r.size).to eq(64)
|
78
78
|
end
|
79
|
+
|
80
|
+
it "should read with a correct crc" do
|
81
|
+
content = "hello world"
|
82
|
+
content_crc = Aliyun::OSS::Util.crc(content)
|
83
|
+
s = HTTP::StreamWriter.new(true) do |sr|
|
84
|
+
sr << content
|
85
|
+
end
|
86
|
+
|
87
|
+
r = s.read(content.size + 1)
|
88
|
+
expect(r.size).to eq(content.size)
|
89
|
+
expect(s.data_crc).to eq(content_crc)
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should read with a correct crc when setting init_crc" do
|
93
|
+
content = "hello world"
|
94
|
+
init_crc = 100
|
95
|
+
content_crc = Aliyun::OSS::Util.crc(content, init_crc)
|
96
|
+
|
97
|
+
s = HTTP::StreamWriter.new(true, init_crc) do |sr|
|
98
|
+
sr << content
|
99
|
+
end
|
100
|
+
|
101
|
+
r = s.read(content.size + 1)
|
102
|
+
expect(r.size).to eq(content.size)
|
103
|
+
expect(s.data_crc).to eq(content_crc)
|
104
|
+
end
|
79
105
|
end # StreamWriter
|
80
106
|
|
81
107
|
end # HTTP
|
@@ -23,6 +23,15 @@ module Aliyun
|
|
23
23
|
"#{@bucket}.#{@endpoint}/#{@object}"
|
24
24
|
end
|
25
25
|
|
26
|
+
def crc_protocol
|
27
|
+
Protocol.new(
|
28
|
+
Config.new(:endpoint => @endpoint,
|
29
|
+
:access_key_id => 'xxx',
|
30
|
+
:access_key_secret => 'yyy',
|
31
|
+
:upload_crc_enable => true,
|
32
|
+
:download_crc_enable => true))
|
33
|
+
end
|
34
|
+
|
26
35
|
def mock_txn_id(txn_id)
|
27
36
|
Nokogiri::XML::Builder.new do |xml|
|
28
37
|
xml.InitiateMultipartUploadResult {
|
@@ -207,6 +216,42 @@ module Aliyun
|
|
207
216
|
.with(:body => nil, :query => query)
|
208
217
|
end
|
209
218
|
|
219
|
+
it "should raise crc exception on error" do
|
220
|
+
txn_id = 'xxxyyyzzz'
|
221
|
+
part_no = 1
|
222
|
+
query = {'partNumber' => part_no, 'uploadId' => txn_id}
|
223
|
+
|
224
|
+
content = "hello world"
|
225
|
+
content_crc = Aliyun::OSS::Util.crc(content)
|
226
|
+
|
227
|
+
stub_request(:put, request_path).with(:query => query).to_return(
|
228
|
+
:status => 200, :headers => {:x_oss_hash_crc64ecma => content_crc + 1})
|
229
|
+
|
230
|
+
expect {
|
231
|
+
crc_protocol.upload_part(@bucket, @object, txn_id, part_no) do |body|
|
232
|
+
body << content
|
233
|
+
end
|
234
|
+
}.to raise_error(CrcInconsistentError, "The crc of put between client and oss is not inconsistent.")
|
235
|
+
end
|
236
|
+
|
237
|
+
it "should not raise crc exception on error" do
|
238
|
+
txn_id = 'xxxyyyzzz'
|
239
|
+
part_no = 1
|
240
|
+
query = {'partNumber' => part_no, 'uploadId' => txn_id}
|
241
|
+
|
242
|
+
content = "hello world"
|
243
|
+
content_crc = Aliyun::OSS::Util.crc(content)
|
244
|
+
|
245
|
+
stub_request(:put, request_path).with(:query => query).to_return(
|
246
|
+
:status => 200, :headers => {:x_oss_hash_crc64ecma => content_crc})
|
247
|
+
|
248
|
+
expect {
|
249
|
+
crc_protocol.upload_part(@bucket, @object, txn_id, part_no) do |body|
|
250
|
+
body << content
|
251
|
+
end
|
252
|
+
}.not_to raise_error
|
253
|
+
end
|
254
|
+
|
210
255
|
end # upload part
|
211
256
|
|
212
257
|
context "Upload part by copy object" do
|
@@ -17,6 +17,15 @@ module Aliyun
|
|
17
17
|
@bucket = 'rubysdk-bucket'
|
18
18
|
end
|
19
19
|
|
20
|
+
def crc_protocol
|
21
|
+
Protocol.new(
|
22
|
+
Config.new(:endpoint => @endpoint,
|
23
|
+
:access_key_id => 'xxx',
|
24
|
+
:access_key_secret => 'yyy',
|
25
|
+
:upload_crc_enable => true,
|
26
|
+
:download_crc_enable => true))
|
27
|
+
end
|
28
|
+
|
20
29
|
def get_request_path(object = nil)
|
21
30
|
p = "#{@bucket}.#{@endpoint}/"
|
22
31
|
p += CGI.escape(object) if object
|
@@ -190,6 +199,35 @@ module Aliyun
|
|
190
199
|
'x-oss-meta-people' => 'mary'})
|
191
200
|
end
|
192
201
|
|
202
|
+
it "should raise crc exception on error" do
|
203
|
+
object_name = 'ruby'
|
204
|
+
url = get_request_path(object_name)
|
205
|
+
content = "hello world"
|
206
|
+
content_crc = Aliyun::OSS::Util.crc(content)
|
207
|
+
stub_request(:put, url).to_return(
|
208
|
+
:status => 200, :headers => {:x_oss_hash_crc64ecma => content_crc.to_i + 1})
|
209
|
+
expect(crc_protocol.upload_crc_enable).to eq(true)
|
210
|
+
expect {
|
211
|
+
crc_protocol.put_object(@bucket, object_name) do |c|
|
212
|
+
c << content
|
213
|
+
end
|
214
|
+
}.to raise_error(CrcInconsistentError, "The crc of put between client and oss is not inconsistent.")
|
215
|
+
end
|
216
|
+
|
217
|
+
it "should not raise crc exception on error" do
|
218
|
+
object_name = 'ruby'
|
219
|
+
url = get_request_path(object_name)
|
220
|
+
content = "hello world"
|
221
|
+
content_crc = Aliyun::OSS::Util.crc(content)
|
222
|
+
stub_request(:put, url).to_return(
|
223
|
+
:status => 200, :headers => {:x_oss_hash_crc64ecma => content_crc})
|
224
|
+
expect(crc_protocol.upload_crc_enable).to eq(true)
|
225
|
+
expect {
|
226
|
+
crc_protocol.put_object(@bucket, object_name) do |c|
|
227
|
+
c << content
|
228
|
+
end
|
229
|
+
}.not_to raise_error
|
230
|
+
end
|
193
231
|
end # put object
|
194
232
|
|
195
233
|
context "Append object" do
|
@@ -290,6 +328,72 @@ module Aliyun
|
|
290
328
|
'x-oss-meta-year' => '2015',
|
291
329
|
'x-oss-meta-people' => 'mary'})
|
292
330
|
end
|
331
|
+
|
332
|
+
it "should raise crc exception on error" do
|
333
|
+
object_name = 'ruby'
|
334
|
+
url = get_request_path(object_name)
|
335
|
+
content = "hello world"
|
336
|
+
content_crc = Aliyun::OSS::Util.crc(content)
|
337
|
+
|
338
|
+
query = {'append' => '', 'position' => 11}
|
339
|
+
return_headers = {'x-oss-next-append-position' => '101', :x_oss_hash_crc64ecma => content_crc.to_i + 1}
|
340
|
+
stub_request(:post, url).with(:query => query)
|
341
|
+
.to_return(:headers => return_headers)
|
342
|
+
expect(crc_protocol.upload_crc_enable).to eq(true)
|
343
|
+
expect {
|
344
|
+
crc_protocol.append_object(@bucket, object_name, 11, :init_crc => 0) do |c|
|
345
|
+
c << content
|
346
|
+
end
|
347
|
+
}.to raise_error(CrcInconsistentError, "The crc of append between client and oss is not inconsistent.")
|
348
|
+
end
|
349
|
+
|
350
|
+
it "should not raise crc exception with init_crc" do
|
351
|
+
object_name = 'ruby'
|
352
|
+
url = get_request_path(object_name)
|
353
|
+
content = "hello world"
|
354
|
+
content_crc = Aliyun::OSS::Util.crc(content)
|
355
|
+
|
356
|
+
query = {'append' => '', 'position' => 11}
|
357
|
+
return_headers = {'x-oss-next-append-position' => '101', :x_oss_hash_crc64ecma => content_crc}
|
358
|
+
stub_request(:post, url).with(:query => query)
|
359
|
+
.to_return(:headers => return_headers)
|
360
|
+
|
361
|
+
expect(crc_protocol.upload_crc_enable).to eq(true)
|
362
|
+
next_pos = 0
|
363
|
+
expect {
|
364
|
+
next_pos = crc_protocol.append_object(@bucket, object_name, 11, :init_crc => 0) do |c|
|
365
|
+
c << content
|
366
|
+
end
|
367
|
+
}.not_to raise_error
|
368
|
+
|
369
|
+
expect(WebMock).to have_requested(:post, url)
|
370
|
+
.with(:body => content, :query => query)
|
371
|
+
expect(next_pos).to eq(101)
|
372
|
+
end
|
373
|
+
|
374
|
+
it "should not raise crc exception without init_crc" do
|
375
|
+
object_name = 'ruby'
|
376
|
+
url = get_request_path(object_name)
|
377
|
+
content = "hello world"
|
378
|
+
content_crc = Aliyun::OSS::Util.crc(content)
|
379
|
+
|
380
|
+
query = {'append' => '', 'position' => 11}
|
381
|
+
return_headers = {'x-oss-next-append-position' => '101', :x_oss_hash_crc64ecma => content_crc + 1}
|
382
|
+
stub_request(:post, url).with(:query => query)
|
383
|
+
.to_return(:headers => return_headers)
|
384
|
+
|
385
|
+
expect(crc_protocol.upload_crc_enable).to eq(true)
|
386
|
+
next_pos = 0
|
387
|
+
expect {
|
388
|
+
next_pos = crc_protocol.append_object(@bucket, object_name, 11) do |c|
|
389
|
+
c << content
|
390
|
+
end
|
391
|
+
}.not_to raise_error
|
392
|
+
|
393
|
+
expect(WebMock).to have_requested(:post, url)
|
394
|
+
.with(:body => content, :query => query)
|
395
|
+
expect(next_pos).to eq(101)
|
396
|
+
end
|
293
397
|
end # append object
|
294
398
|
|
295
399
|
context "Copy object" do
|
@@ -557,6 +661,55 @@ module Aliyun
|
|
557
661
|
expect(WebMock).to have_requested(:get, url)
|
558
662
|
.with(:body => nil, :query => query)
|
559
663
|
end
|
664
|
+
|
665
|
+
|
666
|
+
it "should raise crc exception on error" do
|
667
|
+
object_name = 'ruby'
|
668
|
+
url = get_request_path(object_name)
|
669
|
+
content = "hello world"
|
670
|
+
content_crc = Aliyun::OSS::Util.crc(content)
|
671
|
+
stub_request(:get, url).to_return(
|
672
|
+
:status => 200, :body => content, :headers => {:x_oss_hash_crc64ecma => content_crc.to_i + 1})
|
673
|
+
response_content = ""
|
674
|
+
expect(crc_protocol.download_crc_enable).to eq(true)
|
675
|
+
expect {
|
676
|
+
crc_protocol.get_object(@bucket, object_name) {|c| response_content << c}
|
677
|
+
}.to raise_error(CrcInconsistentError, "The crc of get between client and oss is not inconsistent.")
|
678
|
+
end
|
679
|
+
|
680
|
+
it "should not raise crc exception on error" do
|
681
|
+
object_name = 'ruby'
|
682
|
+
url = get_request_path(object_name)
|
683
|
+
content = "hello world"
|
684
|
+
content_crc = Aliyun::OSS::Util.crc(content)
|
685
|
+
stub_request(:get, url).to_return(
|
686
|
+
:status => 200, :body => content, :headers => {:x_oss_hash_crc64ecma => content_crc})
|
687
|
+
response_content = ""
|
688
|
+
expect(crc_protocol.download_crc_enable).to eq(true)
|
689
|
+
expect {
|
690
|
+
crc_protocol.get_object(@bucket, object_name) {|c| response_content << c}
|
691
|
+
}.not_to raise_error
|
692
|
+
expect(response_content).to eq(content)
|
693
|
+
end
|
694
|
+
|
695
|
+
it "should not raise crc exception on error when setting range" do
|
696
|
+
object_name = 'ruby'
|
697
|
+
url = get_request_path(object_name)
|
698
|
+
content = "hello world 0123456789"
|
699
|
+
content_crc = Aliyun::OSS::Util.crc(content)
|
700
|
+
stub_request(:get, url).to_return(
|
701
|
+
:status => 200, :body => content, :headers => {:x_oss_hash_crc64ecma => content_crc.to_i + 1})
|
702
|
+
response_content = ""
|
703
|
+
expect(crc_protocol.download_crc_enable).to eq(true)
|
704
|
+
expect {
|
705
|
+
crc_protocol.get_object(@bucket, object_name, {range: [0, 10]}) {|c| response_content << c}
|
706
|
+
}.not_to raise_error
|
707
|
+
expect(WebMock).to have_requested(:get, url)
|
708
|
+
.with(:body => nil, :query => {},
|
709
|
+
:headers => {
|
710
|
+
'Range' => 'bytes=0-9'
|
711
|
+
})
|
712
|
+
end
|
560
713
|
end # Get object
|
561
714
|
|
562
715
|
context "Get object meta" do
|