aliyunoss 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -3
- data/aliyunoss.gemspec +3 -0
- data/lib/aliyunoss/#oss_request.rb# +154 -0
- data/lib/aliyunoss/api.rb +24 -24
- data/lib/aliyunoss/bucket.rb +1 -1
- data/lib/aliyunoss/extension.rb +1 -1
- data/lib/aliyunoss/oss_request.rb +11 -6
- data/lib/aliyunoss/version.rb +1 -1
- data/spec/aliyunoss/api_spec.rb +2 -1
- data/spec/aliyunoss/bucket_spec.rb +1 -1
- data/spec/aliyunoss/oss_request_spec.rb +1 -1
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e0859a2ea3ada1c1b72d5aa4bf7c19b475f2eee2
|
4
|
+
data.tar.gz: 3097869be179d2db30cf5c62cbac7f30994bc0bc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dedf4b7a770d1cf47d24433121c873906be73773d80910a018f445f7e61a50eb9dba647d824d36747275113cb3ef9e6467d4bd6bb90657aff484ab8ee678f062
|
7
|
+
data.tar.gz: cf277b1cb70111c855c9a997e523940d5198f60290196db1b67c8bd6b4d3ae755e96dd5a9768bde540490c035f386b7668c5c31f08429a1f65ee5f24b600781c
|
data/Gemfile
CHANGED
data/aliyunoss.gemspec
CHANGED
@@ -18,7 +18,10 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
+
spec.add_runtime_dependency 'nokogiri', '~> 1.6'
|
22
|
+
|
21
23
|
spec.add_development_dependency "bundler", "~> 1.7"
|
22
24
|
spec.add_development_dependency "rake", "~> 10.0"
|
23
25
|
spec.add_development_dependency "rspec", "~> 3.1"
|
26
|
+
|
24
27
|
end
|
@@ -0,0 +1,154 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require 'base64'
|
3
|
+
require 'openssl'
|
4
|
+
|
5
|
+
module Aliyun
|
6
|
+
module Oss
|
7
|
+
|
8
|
+
class OssRequest
|
9
|
+
|
10
|
+
include ConfigHelper
|
11
|
+
attr_accessor :bucket, :path, :body, :queris, :domain
|
12
|
+
|
13
|
+
def initialize(bucket, path, domain = nil, queries = {}, headers = {})
|
14
|
+
@bucket = bucket
|
15
|
+
@path = path
|
16
|
+
@queries = queries
|
17
|
+
@domain = domain
|
18
|
+
@headers = {"Content-Type" => "", "Content-MD5" => "", "Date" => Time.now.utc.strftime('%a, %d %b %Y %H:%M:%S GMT')}.merge(headers)
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_uri
|
22
|
+
if @domain
|
23
|
+
uri = URI("http://#{domain}/")
|
24
|
+
else
|
25
|
+
if @bucket
|
26
|
+
uri = URI("http://#{bucket.name}.#{bucket.location}.#{host}")
|
27
|
+
else
|
28
|
+
uri = URI("http://oss.#{host}")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
uri.path = @path
|
32
|
+
uri.query = @queries.to_query_string if @queries.count > 0
|
33
|
+
uri
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.add_operation(verb)
|
37
|
+
define_method(verb) do
|
38
|
+
uri = get_uri
|
39
|
+
|
40
|
+
request = Net::HTTP.send(:const_get, verb.to_s.capitalize).new(uri)
|
41
|
+
|
42
|
+
@headers.each_pair {|k,v| request[k] = v}
|
43
|
+
|
44
|
+
if @body
|
45
|
+
request.body = @body
|
46
|
+
digest = OpenSSL::Digest::MD5.digest(@body)
|
47
|
+
request['Content-MD5'] = Base64.encode64(digest).strip
|
48
|
+
request['Content-Length'] = @body.bytesize
|
49
|
+
end
|
50
|
+
|
51
|
+
request['Authorization'] = 'OSS ' + access_key_id + ':' +
|
52
|
+
signature(request)
|
53
|
+
|
54
|
+
logger.info(verb.to_s.upcase + ' ' + uri.to_s + ' ' + request.to_hash.to_s)
|
55
|
+
|
56
|
+
response = nil
|
57
|
+
Net::HTTP.start(uri.host, uri.port) do |http|
|
58
|
+
response = http.request(request)
|
59
|
+
logger.info(response.code.to_s + ' ' + response.message)
|
60
|
+
end
|
61
|
+
response
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
add_operation :get
|
66
|
+
add_operation :put
|
67
|
+
add_operation :delete
|
68
|
+
add_operation :head
|
69
|
+
add_operation :post
|
70
|
+
|
71
|
+
def url_for_sharing(expires_in)
|
72
|
+
uri = get_uri
|
73
|
+
request = Net::HTTP::Get.new(uri)
|
74
|
+
@headers.each_pair {|k,v| request[k] = v}
|
75
|
+
expires_at = (Time.now + expires_in).utc.to_i
|
76
|
+
request["Date"] = expires_at
|
77
|
+
uri.query = URI.encode_www_form({"OSSAccessKeyId" => access_key_id,
|
78
|
+
"Expires" => expires_at,
|
79
|
+
"Signature" => signature(request)})
|
80
|
+
uri.to_s
|
81
|
+
end
|
82
|
+
|
83
|
+
def [](key)
|
84
|
+
@headers[key]
|
85
|
+
end
|
86
|
+
|
87
|
+
def []=(key, value)
|
88
|
+
@headers[key] = value
|
89
|
+
end
|
90
|
+
|
91
|
+
private
|
92
|
+
def signature(req)
|
93
|
+
verb = req.class.to_s.gsub(/Net::HTTP::/, '').upcase
|
94
|
+
data = verb + "\n" + req["Content-MD5"] + "\n" +
|
95
|
+
req["Content-Type"] + "\n" + req["Date"] + "\n" +
|
96
|
+
canonicalized_oss_headers(req) +
|
97
|
+
canonicalized_resource()
|
98
|
+
|
99
|
+
digest = OpenSSL::Digest.new('sha1')
|
100
|
+
hmac = OpenSSL::HMAC.digest(digest, access_key_secret, data)
|
101
|
+
Base64.encode64(hmac).strip
|
102
|
+
end
|
103
|
+
|
104
|
+
# oss api 20140828.pdf - 4.2
|
105
|
+
# 1) 将所有以“x-oss-”为前缀的 HTTP 请求头的名字转换成小写字母。如 ’X-OSS-Meta-Name: TaoBao’
|
106
|
+
# 转换成 ’x-oss-meta-name: TaoBao’ 。
|
107
|
+
# 2) 将上一步得到的所有 HTTP 请求头按照字典序进行升序排列。
|
108
|
+
# 3) 如果有相同名字的请求头,则根据标准 RFC 2616, 4.2 章进行合并(两个值之间只用逗号分隔)。
|
109
|
+
# 如有两个名为’x-oss-meta-name’的请求头,对应的值分别为’TaoBao’和’Alipay’,则合并后
|
110
|
+
# 为: ’x-oss-meta-name:TaoBao,Alipay’ 。
|
111
|
+
# 4) 删除请求头和内容之间分隔符两端出现的任何空格。
|
112
|
+
# 如 ’x-oss-meta-name: TaoBao,Alipay’ 转换成: ’x-oss-meta-name:TaoBao,Alipay’ 。
|
113
|
+
# 5) 将所有的头和内容用 ’\n’ 分隔符分隔拼成最后的 CanonicalizedOSSHeader 。
|
114
|
+
def canonicalized_oss_headers(req)
|
115
|
+
hash = Hash.new
|
116
|
+
req.each_header do |header|
|
117
|
+
header = header.downcase
|
118
|
+
next unless header.start_with?('x-oss-')
|
119
|
+
if hash.has_key?(header)
|
120
|
+
hash[header] = hash[header] + "," + req[header].strip
|
121
|
+
else
|
122
|
+
hash[header] = req[header].strip
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
return "" if hash.count == 0
|
127
|
+
hash.keys.sort.map{|k| "#{k}:#{hash[k]}"}.join("\n") << "\n"
|
128
|
+
end
|
129
|
+
|
130
|
+
# oss api 20140828.pdf - 4.2
|
131
|
+
# 1) 将 CanonicalizedResource 置成空字符串( “” );
|
132
|
+
# 2) 放入要访问的 OSS 资源:“ /BucketName/ObjectName ”(无 ObjectName 则不填)
|
133
|
+
# 3) 如果请求的资源包括子资源 (sub-resource) ,那么将所有的子资源按照字典序,从小到大排列并
|
134
|
+
# 以 ’&’ 为分隔符生成子资源字符串。在 CanonicalizedResource 字符串尾添加“?”和子资源字
|
135
|
+
# 符串。此时的 CanonicalizedResource 例子如: /BucketName/ObjectName?acl &uploadId=UploadId
|
136
|
+
# 4) 如果用户请求在查询字符串 (query string) 中指定了要重写 (override) 返回请求的 header,那么将这
|
137
|
+
# 些查询字符串及其请求值按照字典序,从小到大排列,以 ’&’ 为分隔符,按参数的字典序添加到
|
138
|
+
# CanonicalizedResource 中。此时的 CanonicalizedResource 例子:
|
139
|
+
# /BucketName/ObjectName?acl&response-content-type=ContentType & uploadId =UploadId
|
140
|
+
def canonicalized_resource()
|
141
|
+
return @path unless @bucket
|
142
|
+
return "/#{@bucket.name}#{@path}" if @queries.count == 0
|
143
|
+
|
144
|
+
array = @queries.keys.sort.map do |k|
|
145
|
+
if @queries[k] then "#{k}=#{@queries[k]}" else "#{k}" end
|
146
|
+
end
|
147
|
+
|
148
|
+
"/#{@bucket.name}#{@path}?#{array.sort.join('&')}"
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
152
|
+
|
153
|
+
end
|
154
|
+
end
|
data/lib/aliyunoss/api.rb
CHANGED
@@ -9,7 +9,7 @@ module Aliyun
|
|
9
9
|
|
10
10
|
# List all buckets
|
11
11
|
def list_bucket(params = {})
|
12
|
-
Aliyun::Oss::OssRequest.new(nil, '/',
|
12
|
+
Aliyun::Oss::OssRequest.new(nil, '/', nil, {}, {}).get
|
13
13
|
end
|
14
14
|
alias :get_service :list_bucket
|
15
15
|
|
@@ -34,49 +34,49 @@ HERE
|
|
34
34
|
|
35
35
|
# Delete bucket logging
|
36
36
|
def delete_logging(bucket)
|
37
|
-
Aliyun::Oss::OssRequest.new(bucket, '/', 'logging'=>nil).delete
|
37
|
+
Aliyun::Oss::OssRequest.new(bucket, '/', nil, 'logging'=>nil).delete
|
38
38
|
end
|
39
39
|
|
40
40
|
# Delete bucket website
|
41
41
|
def delete_website(bucket)
|
42
|
-
Aliyun::Oss::OssRequest.new(bucket, '/', 'website'=>nil).delete
|
42
|
+
Aliyun::Oss::OssRequest.new(bucket, '/', nil, 'website'=>nil).delete
|
43
43
|
end
|
44
44
|
alias :disable_website :delete_website
|
45
45
|
|
46
46
|
# List objects in bucket
|
47
47
|
def list_object(bucket, queries = {})
|
48
|
-
Aliyun::Oss::OssRequest.new(bucket, '/', queries).get
|
48
|
+
Aliyun::Oss::OssRequest.new(bucket, '/', nil, queries).get
|
49
49
|
end
|
50
50
|
|
51
51
|
# Get bucket acl
|
52
52
|
def get_bucket_acl(bucket)
|
53
|
-
Aliyun::Oss::OssRequest.new(bucket, '/', 'acl'=>nil).get
|
53
|
+
Aliyun::Oss::OssRequest.new(bucket, '/', nil, 'acl'=>nil).get
|
54
54
|
end
|
55
55
|
|
56
56
|
# Get bucket location
|
57
57
|
def get_bucket_location(bucket)
|
58
|
-
Aliyun::Oss::OssRequest.new(bucket, '/', 'location'=>nil).get
|
58
|
+
Aliyun::Oss::OssRequest.new(bucket, '/', nil, 'location'=>nil).get
|
59
59
|
end
|
60
60
|
|
61
61
|
# Query bucket logging status
|
62
62
|
def get_bucket_logging(bucket)
|
63
|
-
Aliyun::Oss::OssRequest.new(bucket, '/', 'logging'=>nil).get
|
63
|
+
Aliyun::Oss::OssRequest.new(bucket, '/', nil, 'logging'=>nil).get
|
64
64
|
end
|
65
65
|
|
66
66
|
# Query bucket website status
|
67
67
|
def get_bucket_website(bucket)
|
68
|
-
Aliyun::Oss::OssRequest.new(bucket, '/', 'website'=>nil).get
|
68
|
+
Aliyun::Oss::OssRequest.new(bucket, '/', nil, 'website'=>nil).get
|
69
69
|
end
|
70
70
|
|
71
71
|
# Set bucket acl permission
|
72
72
|
def put_bucket_acl(bucket, permission)
|
73
|
-
Aliyun::Oss::OssRequest.new(bucket, '/', {}, 'x-oss-acl'=> permission).put
|
73
|
+
Aliyun::Oss::OssRequest.new(bucket, '/', nil, {}, 'x-oss-acl'=> permission).put
|
74
74
|
end
|
75
75
|
alias :set_bucket_acl :put_bucket_acl
|
76
76
|
|
77
77
|
# Enable or disable bucket logging
|
78
78
|
def enable_bucket_logging(bucket, bucket_name_for_logging, log_prefix)
|
79
|
-
request = Aliyun::Oss::OssRequest.new(bucket, '/', 'logging'=>nil)
|
79
|
+
request = Aliyun::Oss::OssRequest.new(bucket, '/', nil, 'logging'=>nil)
|
80
80
|
request.body = <<HERE
|
81
81
|
<?xml version="1.0" encoding="UTF-8"?>
|
82
82
|
<BucketLoggingStatus>
|
@@ -91,7 +91,7 @@ HERE
|
|
91
91
|
end
|
92
92
|
|
93
93
|
def disable_bucket_logging(bucket)
|
94
|
-
request = Aliyun::Oss::OssRequest.new(bucket, '/', 'logging'=>nil)
|
94
|
+
request = Aliyun::Oss::OssRequest.new(bucket, '/', nil, 'logging'=>nil)
|
95
95
|
request.body = <<HERE
|
96
96
|
<?xml version="1.0" encoding="UTF-8"?>
|
97
97
|
<BucketLoggingStatus>
|
@@ -103,7 +103,7 @@ HERE
|
|
103
103
|
|
104
104
|
# Set bucket website access
|
105
105
|
def put_bucket_website(bucket, index_page, error_page)
|
106
|
-
request = Aliyun::Oss::OssRequest.new(bucket, '/', 'website'=>nil)
|
106
|
+
request = Aliyun::Oss::OssRequest.new(bucket, '/', nil, 'website'=>nil)
|
107
107
|
request.body = <<HERE
|
108
108
|
<?xml version="1.0" encoding="UTF-8"?>
|
109
109
|
<WebsiteConfiguration>
|
@@ -123,7 +123,7 @@ HERE
|
|
123
123
|
# Copy Object
|
124
124
|
def copy_object(source_bucket, source_path, target_bucket, target_path, headers = {})
|
125
125
|
headers = headers.merge({'x-oss-copy-source'=> "/" + source_bucket.name + source_path})
|
126
|
-
Aliyun::Oss::OssRequest.new(target_bucket, target_path, {}, headers).put
|
126
|
+
Aliyun::Oss::OssRequest.new(target_bucket, target_path, nil, {}, headers).put
|
127
127
|
end
|
128
128
|
|
129
129
|
# Delete Object
|
@@ -138,24 +138,24 @@ HERE
|
|
138
138
|
xml << "<Quiet>#{quiet_mode}</Quiet>"
|
139
139
|
objects.each {|o| xml << "<Object><Key>#{o}</Key></Object>"}
|
140
140
|
xml << '</Delete>'
|
141
|
-
request = Aliyun::Oss::OssRequest.new(bucket, '/', 'delete'=>nil)
|
141
|
+
request = Aliyun::Oss::OssRequest.new(bucket, '/', nil, 'delete'=>nil)
|
142
142
|
request.body = xml
|
143
143
|
request.post
|
144
144
|
end
|
145
145
|
|
146
146
|
# Get Object
|
147
147
|
def get_object(bucket, path, headers = {})
|
148
|
-
Aliyun::Oss::OssRequest.new(bucket, path, {}, headers).get
|
148
|
+
Aliyun::Oss::OssRequest.new(bucket, path, nil, {}, headers).get
|
149
149
|
end
|
150
150
|
|
151
151
|
# Head Object
|
152
152
|
def head_object(bucket, path, headers = {})
|
153
|
-
Aliyun::Oss::OssRequest.new(bucket, path, {}, headers).head
|
153
|
+
Aliyun::Oss::OssRequest.new(bucket, path, nil, {}, headers).head
|
154
154
|
end
|
155
155
|
|
156
156
|
# Put Object
|
157
157
|
def put_object(bucket, path, data, headers = {})
|
158
|
-
request = Aliyun::Oss::OssRequest.new(bucket, path, {}, headers)
|
158
|
+
request = Aliyun::Oss::OssRequest.new(bucket, path, nil, {}, headers)
|
159
159
|
request.body = data
|
160
160
|
request.put
|
161
161
|
end
|
@@ -176,17 +176,17 @@ HERE
|
|
176
176
|
|
177
177
|
# Multipart Initiate
|
178
178
|
def multipart_upload_initiate(bucket, path)
|
179
|
-
Aliyun::Oss::OssRequest.new(bucket, path, 'uploads'=>nil).post
|
179
|
+
Aliyun::Oss::OssRequest.new(bucket, path, nil, 'uploads'=>nil).post
|
180
180
|
end
|
181
181
|
|
182
182
|
def multipart_upload_part(bucket, path, upload_id, data, part_number)
|
183
|
-
request = Aliyun::Oss::OssRequest.new(bucket, path, 'partNumber'=> part_number.to_s, 'uploadId'=> upload_id)
|
183
|
+
request = Aliyun::Oss::OssRequest.new(bucket, path, nil, 'partNumber'=> part_number.to_s, 'uploadId'=> upload_id)
|
184
184
|
request.body = data
|
185
185
|
request.put
|
186
186
|
end
|
187
187
|
|
188
188
|
def multipart_upload_from_copy(upload_id, source_bucket, source_path, target_bucket, target_path, part_number, part_size, range = nil)
|
189
|
-
request = Aliyun::Oss::OssRequest.new(target_bucket, target_path, 'partNumber'=> part_number.to_s, 'uploadId'=> upload_id)
|
189
|
+
request = Aliyun::Oss::OssRequest.new(target_bucket, target_path, nil, 'partNumber'=> part_number.to_s, 'uploadId'=> upload_id)
|
190
190
|
request['Content-Length'] = part_size
|
191
191
|
request['x-oss-copy-source'] = "/" + source_bucket.name + source_path
|
192
192
|
request['x-oss-copy-source-range'] = range if range
|
@@ -194,7 +194,7 @@ HERE
|
|
194
194
|
end
|
195
195
|
|
196
196
|
def multipart_upload_complete(bucket, path, upload_id, part_list)
|
197
|
-
request = Aliyun::Oss::OssRequest.new(bucket, path, 'uploadId'=> upload_id)
|
197
|
+
request = Aliyun::Oss::OssRequest.new(bucket, path, nil, 'uploadId'=> upload_id)
|
198
198
|
xml = '<?xml version="1.0" encoding="UTF-8"?>'
|
199
199
|
xml << '<CompleteMultipartUpload>'
|
200
200
|
part_list.each_pair {|k,v| xml << "<Part><PartNumber>#{k}</PartNumber><ETag>#{v}</ETag></Part>"}
|
@@ -204,15 +204,15 @@ HERE
|
|
204
204
|
end
|
205
205
|
|
206
206
|
def multipart_upload_abort(bucket, path, upload_id)
|
207
|
-
Aliyun::Oss::OssRequest.new(bucket, path, 'uploadId'=> upload_id).delete
|
207
|
+
Aliyun::Oss::OssRequest.new(bucket, path, nil, 'uploadId'=> upload_id).delete
|
208
208
|
end
|
209
209
|
|
210
210
|
def multipart_upload_finished_parts(bucket, path, upload_id)
|
211
|
-
Aliyun::Oss::OssRequest.new(bucket, path, 'uploadId'=> upload_id).get
|
211
|
+
Aliyun::Oss::OssRequest.new(bucket, path, nil, 'uploadId'=> upload_id).get
|
212
212
|
end
|
213
213
|
|
214
214
|
def multipart_upload_unfinished_task(bucket)
|
215
|
-
Aliyun::Oss::OssRequest.new(bucket, '/', 'uploads'=>nil).get
|
215
|
+
Aliyun::Oss::OssRequest.new(bucket, '/', nil, 'uploads'=>nil).get
|
216
216
|
end
|
217
217
|
|
218
218
|
end
|
data/lib/aliyunoss/bucket.rb
CHANGED
@@ -2,7 +2,7 @@ module Aliyun
|
|
2
2
|
module Oss
|
3
3
|
|
4
4
|
class Bucket
|
5
|
-
attr_accessor :location, :name, :creation_date
|
5
|
+
attr_accessor :location, :name, :creation_date, :domain, :extranet_endpoint, :intranet_endpoint
|
6
6
|
|
7
7
|
def initialize(params = {})
|
8
8
|
params.each_pair {|k,v| send("#{k.to_s}=", v) }
|
data/lib/aliyunoss/extension.rb
CHANGED
@@ -48,7 +48,7 @@ module Net
|
|
48
48
|
nodes = Nokogiri::XML(self.body).xpath('//Bucket') rescue []
|
49
49
|
nodes.map do |node|
|
50
50
|
bucket = Aliyun::Oss::Bucket.new
|
51
|
-
node.elements.each {|e| bucket.send("#{e.name.underscore}=".to_sym, e.content)}
|
51
|
+
node.elements.each {|e| bucket.send("#{e.name.underscore}=".to_sym, e.content) rescue nil }
|
52
52
|
bucket
|
53
53
|
end
|
54
54
|
end
|
@@ -8,20 +8,25 @@ module Aliyun
|
|
8
8
|
class OssRequest
|
9
9
|
|
10
10
|
include ConfigHelper
|
11
|
-
attr_accessor :bucket, :path, :body, :queris
|
11
|
+
attr_accessor :bucket, :path, :body, :queris, :domain
|
12
12
|
|
13
|
-
def initialize(bucket, path, queries = {}, headers = {})
|
13
|
+
def initialize(bucket, path, domain = nil, queries = {}, headers = {})
|
14
14
|
@bucket = bucket
|
15
15
|
@path = path
|
16
16
|
@queries = queries
|
17
|
+
@domain = domain
|
17
18
|
@headers = {"Content-Type" => "", "Content-MD5" => "", "Date" => Time.now.utc.strftime('%a, %d %b %Y %H:%M:%S GMT')}.merge(headers)
|
18
19
|
end
|
19
20
|
|
20
21
|
def get_uri
|
21
|
-
if @
|
22
|
-
uri = URI("http://#{
|
22
|
+
if @domain
|
23
|
+
uri = URI("http://#{domain}/")
|
23
24
|
else
|
24
|
-
|
25
|
+
if @bucket
|
26
|
+
uri = URI("http://#{bucket.name}.#{bucket.location}.#{host}")
|
27
|
+
else
|
28
|
+
uri = URI("http://oss.#{host}")
|
29
|
+
end
|
25
30
|
end
|
26
31
|
uri.path = @path
|
27
32
|
uri.query = @queries.to_query_string if @queries.count > 0
|
@@ -109,7 +114,7 @@ module Aliyun
|
|
109
114
|
def canonicalized_oss_headers(req)
|
110
115
|
hash = Hash.new
|
111
116
|
req.each_header do |header|
|
112
|
-
header = header.downcase
|
117
|
+
header = header.to_s.downcase
|
113
118
|
next unless header.start_with?('x-oss-')
|
114
119
|
if hash.has_key?(header)
|
115
120
|
hash[header] = hash[header] + "," + req[header].strip
|
data/lib/aliyunoss/version.rb
CHANGED
data/spec/aliyunoss/api_spec.rb
CHANGED
@@ -9,8 +9,9 @@ describe Aliyun::Oss::API do
|
|
9
9
|
bucket_name = "aliyunoss-gem-test-#{rand.to_s.delete('0.')}"
|
10
10
|
location = 'oss-cn-beijing'
|
11
11
|
response = Aliyun::Oss::API.put_bucket(bucket_name, location)
|
12
|
-
expect(response).to be_a(Net::HTTPOK)
|
13
12
|
|
13
|
+
expect(response).to be_a(Net::HTTPOK)
|
14
|
+
|
14
15
|
@api = Aliyun::Oss::API
|
15
16
|
@bucket = Aliyun::Oss::Bucket.new(name: bucket_name, location: location)
|
16
17
|
end
|
@@ -24,7 +24,7 @@ describe Aliyun::Oss::OssRequest do
|
|
24
24
|
path = '/ObjectName'
|
25
25
|
queries = {"acl"=>nil, "uploadId"=>"UploadId",
|
26
26
|
"response-content-type"=>"ContentType" }
|
27
|
-
result = Aliyun::Oss::OssRequest.new(bucket, path, queries).
|
27
|
+
result = Aliyun::Oss::OssRequest.new(bucket, path, nil, queries).
|
28
28
|
send(:canonicalized_resource)
|
29
29
|
expect(result).to eq("/BucketName/ObjectName?acl&response-content-type=ContentType&uploadId=UploadId")
|
30
30
|
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aliyunoss
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yijiecc
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-04-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: nokogiri
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.6'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.6'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,6 +80,7 @@ files:
|
|
66
80
|
- Rakefile
|
67
81
|
- aliyunoss.gemspec
|
68
82
|
- lib/aliyunoss.rb
|
83
|
+
- lib/aliyunoss/#oss_request.rb#
|
69
84
|
- lib/aliyunoss/api.rb
|
70
85
|
- lib/aliyunoss/bucket.rb
|
71
86
|
- lib/aliyunoss/config.rb
|
@@ -105,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
105
120
|
version: '0'
|
106
121
|
requirements: []
|
107
122
|
rubyforge_project:
|
108
|
-
rubygems_version: 2.
|
123
|
+
rubygems_version: 2.4.8
|
109
124
|
signing_key:
|
110
125
|
specification_version: 4
|
111
126
|
summary: A gem for accessing Aliyun Open Storage Service.
|