qiniu-rs 3.2.2 → 3.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +4 -0
- data/Gemfile.lock +7 -7
- data/README.md +1 -1
- data/docs/README.md +147 -503
- data/lib/qiniu/rs.rb +15 -3
- data/lib/qiniu/rs/up.rb +5 -9
- data/lib/qiniu/rs/version.rb +2 -2
- data/lib/qiniu/tokens/download_token.rb +33 -0
- data/lib/qiniu/tokens/qbox_token.rb +6 -4
- data/lib/qiniu/tokens/upload_token.rb +1 -1
- data/qiniu-rs.gemspec +1 -1
- data/spec/qiniu/rs/eu_spec.rb +2 -0
- data/spec/qiniu/rs/io_spec.rb +2 -2
- data/spec/qiniu/rs/rs_spec.rb +1 -1
- data/spec/qiniu/rs/up_spec.rb +2 -2
- data/spec/qiniu/rs_spec.rb +44 -3
- data/spec/qiniu/tokens/qbox_token_spec.rb +29 -0
- metadata +9 -6
data/lib/qiniu/rs.rb
CHANGED
@@ -17,6 +17,7 @@ module Qiniu
|
|
17
17
|
autoload :AccessToken, 'qiniu/tokens/access_token'
|
18
18
|
autoload :QboxToken, 'qiniu/tokens/qbox_token'
|
19
19
|
autoload :UploadToken, 'qiniu/tokens/upload_token'
|
20
|
+
autoload :DownloadToken, 'qiniu/tokens/download_token'
|
20
21
|
autoload :Abstract, 'qiniu/rs/abstract'
|
21
22
|
|
22
23
|
class << self
|
@@ -100,12 +101,14 @@ module Qiniu
|
|
100
101
|
end
|
101
102
|
|
102
103
|
def upload_file opts = {}
|
103
|
-
[:uptoken, :file, :bucket, :key]
|
104
|
-
|
105
|
-
|
104
|
+
uncontained_opts = [:uptoken, :file, :bucket, :key] - opts.keys
|
105
|
+
raise MissingArgsError, uncontained_opts unless uncontained_opts.empty?
|
106
|
+
|
106
107
|
source_file = opts[:file]
|
107
108
|
raise NoSuchFileError, source_file unless File.exist?(source_file)
|
109
|
+
|
108
110
|
opts[:enable_resumable_upload] = true unless opts.has_key?(:enable_resumable_upload)
|
111
|
+
|
109
112
|
if opts[:enable_resumable_upload] && File::size(source_file) > Config.settings[:block_size]
|
110
113
|
code, data = UP.upload_with_token(opts[:uptoken],
|
111
114
|
opts[:file],
|
@@ -230,6 +233,15 @@ module Qiniu
|
|
230
233
|
token_obj.generate_token
|
231
234
|
end
|
232
235
|
|
236
|
+
def generate_download_token(opts = {})
|
237
|
+
token_obj = DownloadToken.new(opts)
|
238
|
+
token_obj.access_key = Config.settings[:access_key]
|
239
|
+
token_obj.secret_key = Config.settings[:secret_key]
|
240
|
+
#token_obj.expires_in = opts[:expires_in]
|
241
|
+
#token_obj.pattern = opts[:pattern]
|
242
|
+
token_obj.generate_token
|
243
|
+
end
|
244
|
+
|
233
245
|
end
|
234
246
|
|
235
247
|
end
|
data/lib/qiniu/rs/up.rb
CHANGED
@@ -58,7 +58,7 @@ module Qiniu
|
|
58
58
|
class TmpData
|
59
59
|
def initialize(dir, filename)
|
60
60
|
@tmpdir = Config.settings[:tmpdir] + File::SEPARATOR + dir
|
61
|
-
FileUtils.mkdir_p(@tmpdir) unless
|
61
|
+
FileUtils.mkdir_p(@tmpdir) unless File.directory?(@tmpdir)
|
62
62
|
@tmpfile = @tmpdir + File::SEPARATOR + filename
|
63
63
|
end
|
64
64
|
|
@@ -83,7 +83,7 @@ module Qiniu
|
|
83
83
|
end
|
84
84
|
|
85
85
|
def sweep!
|
86
|
-
FileUtils.rm_r(@tmpdir) if
|
86
|
+
FileUtils.rm_r(@tmpdir) if File.directory?(@tmpdir)
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
@@ -100,7 +100,6 @@ module Qiniu
|
|
100
100
|
customer = nil,
|
101
101
|
callback_params = nil,
|
102
102
|
rotate = nil)
|
103
|
-
raise NoSuchFileError, local_file unless File.exist?(local_file)
|
104
103
|
begin
|
105
104
|
ifile = File.open(local_file, 'rb')
|
106
105
|
fh = FileData.new(ifile)
|
@@ -110,11 +109,7 @@ module Qiniu
|
|
110
109
|
mime = MIME::Types.type_for local_file
|
111
110
|
mime_type = mime.empty? ? 'application/octet-stream' : mime[0].content_type
|
112
111
|
end
|
113
|
-
|
114
|
-
code, data = _resumable_upload(uptoken, fh, fsize, bucket, key, mime_type, custom_meta, customer, callback_params, rotate)
|
115
|
-
else
|
116
|
-
code, data = IO.upload_with_token(uptoken, local_file, bucket, key, mime_type, custom_meta, callback_params, true, rotate)
|
117
|
-
end
|
112
|
+
code, data = _resumable_upload(uptoken, fh, fsize, bucket, key, mime_type, custom_meta, customer, callback_params, rotate)
|
118
113
|
[code, data]
|
119
114
|
ensure
|
120
115
|
ifile.close unless ifile.nil?
|
@@ -175,7 +170,7 @@ module Qiniu
|
|
175
170
|
_call_binary_with_token(uptoken, url, body)
|
176
171
|
end
|
177
172
|
|
178
|
-
def _resumable_put_block(uptoken, fh, block_index, block_size, chunk_size, progress, retry_times
|
173
|
+
def _resumable_put_block(uptoken, fh, block_index, block_size, chunk_size, progress, retry_times, notifier)
|
179
174
|
code, data = 0, {}
|
180
175
|
fpath = fh.path
|
181
176
|
# this block has never been uploaded.
|
@@ -323,6 +318,7 @@ module Qiniu
|
|
323
318
|
end
|
324
319
|
|
325
320
|
end
|
321
|
+
|
326
322
|
end
|
327
323
|
end
|
328
324
|
end
|
data/lib/qiniu/rs/version.rb
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require 'qiniu/tokens/access_token'
|
5
|
+
require 'qiniu/rs/utils'
|
6
|
+
|
7
|
+
module Qiniu
|
8
|
+
module RS
|
9
|
+
class DownloadToken < AccessToken
|
10
|
+
|
11
|
+
include Utils
|
12
|
+
|
13
|
+
attr_accessor :pattern, :expires_in
|
14
|
+
|
15
|
+
def initialize(opts = {})
|
16
|
+
@pattern = opts[:pattern] || "*"
|
17
|
+
@expires_in = opts[:expires_in] || 3600
|
18
|
+
end
|
19
|
+
|
20
|
+
def generate_signature
|
21
|
+
params = {"S" => @pattern, "E" => Time.now.to_i + @expires_in}
|
22
|
+
Utils.urlsafe_base64_encode(params.to_json)
|
23
|
+
end
|
24
|
+
|
25
|
+
def generate_token
|
26
|
+
signature = generate_signature
|
27
|
+
encoded_digest = generate_encoded_digest(signature)
|
28
|
+
%Q(#{@access_key}:#{encoded_digest}:#{signature})
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -8,6 +8,8 @@ module Qiniu
|
|
8
8
|
module RS
|
9
9
|
class QboxToken < AccessToken
|
10
10
|
|
11
|
+
include Utils
|
12
|
+
|
11
13
|
attr_accessor :url, :params
|
12
14
|
|
13
15
|
def initialize(opts = {})
|
@@ -20,16 +22,16 @@ module Qiniu
|
|
20
22
|
signature = uri.path
|
21
23
|
query_string = uri.query
|
22
24
|
signature += '?' + query_string if !query_string.nil? && !query_string.empty?
|
23
|
-
signature += "\n"
|
25
|
+
signature += "\n"
|
24
26
|
if @params.is_a?(Hash)
|
25
|
-
|
26
|
-
|
27
|
+
params_string = Utils.generate_query_string(@params)
|
28
|
+
signature += params_string
|
27
29
|
end
|
28
30
|
signature
|
29
31
|
end
|
30
32
|
|
31
33
|
def generate_token
|
32
|
-
encoded_digest = generate_encoded_digest(
|
34
|
+
encoded_digest = generate_encoded_digest(generate_signature)
|
33
35
|
%Q(#{@access_key}:#{encoded_digest})
|
34
36
|
end
|
35
37
|
|
@@ -27,7 +27,7 @@ module Qiniu
|
|
27
27
|
params[:callbackBodyType] = @callback_body_type if !@callback_body_type.nil? && !@callback_body_type.empty?
|
28
28
|
params[:customer] = @customer if !@customer.nil? && !@customer.empty?
|
29
29
|
params[:escape] = 1 if @escape == 1 || @escape == true
|
30
|
-
urlsafe_base64_encode(params.to_json)
|
30
|
+
Utils.urlsafe_base64_encode(params.to_json)
|
31
31
|
end
|
32
32
|
|
33
33
|
def generate_token
|
data/qiniu-rs.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |gem|
|
|
18
18
|
|
19
19
|
# specify any dependencies here; for example:
|
20
20
|
gem.add_development_dependency "rake", ">= 0.9"
|
21
|
-
gem.add_development_dependency "rspec", "
|
21
|
+
gem.add_development_dependency "rspec", ">= 2.11"
|
22
22
|
gem.add_development_dependency "fakeweb", "~> 1.3"
|
23
23
|
gem.add_runtime_dependency "json", "~> 1.7"
|
24
24
|
gem.add_runtime_dependency "rest-client", "~> 1.6"
|
data/spec/qiniu/rs/eu_spec.rb
CHANGED
data/spec/qiniu/rs/io_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
require 'qiniu/rs/auth'
|
@@ -11,7 +11,7 @@ module Qiniu
|
|
11
11
|
|
12
12
|
before :all do
|
13
13
|
@bucket = "io_test_bucket"
|
14
|
-
@key = Digest::SHA1.hexdigest
|
14
|
+
@key = Digest::SHA1.hexdigest((Time.now.to_i+rand(100)).to_s)
|
15
15
|
|
16
16
|
result = Qiniu::RS.mkbucket(@bucket)
|
17
17
|
puts result.inspect
|
data/spec/qiniu/rs/rs_spec.rb
CHANGED
@@ -12,7 +12,7 @@ module Qiniu
|
|
12
12
|
|
13
13
|
before :all do
|
14
14
|
@bucket = "rs_test_bucket"
|
15
|
-
@key = Digest::SHA1.hexdigest
|
15
|
+
@key = Digest::SHA1.hexdigest((Time.now.to_i+rand(100)).to_s)
|
16
16
|
@domain = 'rs-test-bucket.dn.qbox.me'
|
17
17
|
|
18
18
|
code, data = Qiniu::RS::RS.mkbucket(@bucket)
|
data/spec/qiniu/rs/up_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
2
|
|
3
3
|
require 'digest/sha1'
|
4
4
|
require 'spec_helper'
|
@@ -11,7 +11,7 @@ module Qiniu
|
|
11
11
|
|
12
12
|
before :all do
|
13
13
|
@localfile = "bigfile.txt"
|
14
|
-
File.open(@localfile, "w"){|f| 5242888.times{f.write(
|
14
|
+
File.open(@localfile, "w"){|f| 5242888.times{f.write(rand(9).to_s)}}
|
15
15
|
@bucket = "up_test_bucket"
|
16
16
|
@key = Digest::SHA1.hexdigest(@localfile+Time.now.to_s)
|
17
17
|
|
data/spec/qiniu/rs_spec.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
require 'digest/sha1'
|
4
4
|
require 'spec_helper'
|
5
5
|
require 'qiniu/rs'
|
6
|
+
require 'qiniu/rs/exceptions'
|
6
7
|
|
7
8
|
module Qiniu
|
8
9
|
describe RS do
|
@@ -30,10 +31,13 @@ module Qiniu
|
|
30
31
|
end
|
31
32
|
|
32
33
|
after :all do
|
33
|
-
result = Qiniu::RS.
|
34
|
-
puts result.inspect
|
34
|
+
result = Qiniu::RS.unpublish(@domain)
|
35
35
|
result.should_not be_false
|
36
36
|
|
37
|
+
result1 = Qiniu::RS.drop(@bucket)
|
38
|
+
puts result1.inspect
|
39
|
+
result1.should_not be_false
|
40
|
+
|
37
41
|
result2 = Qiniu::RS.drop(@test_image_bucket)
|
38
42
|
puts result2.inspect
|
39
43
|
result2.should_not be_false
|
@@ -79,6 +83,7 @@ module Qiniu
|
|
79
83
|
end
|
80
84
|
end
|
81
85
|
|
86
|
+
=begin
|
82
87
|
context ".set_watermark" do
|
83
88
|
it "should works" do
|
84
89
|
options = {
|
@@ -97,6 +102,7 @@ module Qiniu
|
|
97
102
|
puts result.inspect
|
98
103
|
end
|
99
104
|
end
|
105
|
+
=end
|
100
106
|
|
101
107
|
context ".put_auth" do
|
102
108
|
it "should works" do
|
@@ -148,13 +154,36 @@ module Qiniu
|
|
148
154
|
result.should_not be_false
|
149
155
|
puts result.inspect
|
150
156
|
end
|
157
|
+
|
158
|
+
it "should raise MissingArgsError" do
|
159
|
+
uptoken_opts = {:scope => @bucket, :escape => 0}
|
160
|
+
upload_opts = {
|
161
|
+
:uptoken => Qiniu::RS.generate_upload_token(uptoken_opts),
|
162
|
+
:file => __FILE__,
|
163
|
+
:key => @key,
|
164
|
+
:enable_crc32_check => true
|
165
|
+
}
|
166
|
+
lambda { Qiniu::RS.upload_file(upload_opts) }.should raise_error(RS::MissingArgsError)
|
167
|
+
end
|
168
|
+
|
169
|
+
it "should raise NoSuchFileError" do
|
170
|
+
uptoken_opts = {:scope => @bucket, :escape => 0}
|
171
|
+
upload_opts = {
|
172
|
+
:uptoken => Qiniu::RS.generate_upload_token(uptoken_opts),
|
173
|
+
:file => 'no_this_file',
|
174
|
+
:bucket => @bucket,
|
175
|
+
:key => @key,
|
176
|
+
:enable_crc32_check => true
|
177
|
+
}
|
178
|
+
lambda { Qiniu::RS.upload_file(upload_opts) }.should raise_error(RS::NoSuchFileError)
|
179
|
+
end
|
151
180
|
end
|
152
181
|
|
153
182
|
context ".resumable_upload_file" do
|
154
183
|
it "should works" do
|
155
184
|
# generate bigfile for testing
|
156
185
|
localfile = "test_bigfile"
|
157
|
-
File.open(localfile, "w"){|f| 5242888.times{f.write(
|
186
|
+
File.open(localfile, "w"){|f| 5242888.times{f.write(rand(9).to_s)}}
|
158
187
|
key = Digest::SHA1.hexdigest(localfile+Time.now.to_s)
|
159
188
|
# generate the upload token
|
160
189
|
uptoken_opts = {:scope => @bucket, :expires_in => 3600, :customer => "awhy.xu@gmail.com", :escape => 0}
|
@@ -255,12 +284,14 @@ module Qiniu
|
|
255
284
|
end
|
256
285
|
end
|
257
286
|
|
287
|
+
=begin
|
258
288
|
context ".unpublish" do
|
259
289
|
it "should works" do
|
260
290
|
result = Qiniu::RS.unpublish(@domain)
|
261
291
|
result.should_not be_false
|
262
292
|
end
|
263
293
|
end
|
294
|
+
=end
|
264
295
|
|
265
296
|
context ".delete" do
|
266
297
|
it "should works" do
|
@@ -334,6 +365,16 @@ module Qiniu
|
|
334
365
|
data = Qiniu::RS.generate_upload_token({:scope => 'test_bucket', :expires_in => 3600, :escape => 0})
|
335
366
|
data.should_not be_empty
|
336
367
|
puts data.inspect
|
368
|
+
data.split(":").length.should == 3
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
context ".generate_download_token" do
|
373
|
+
it "should works" do
|
374
|
+
data = Qiniu::RS.generate_download_token({:expires_in => 1, :pattern => 'http://qiniu-rs-test.dn.qbox.me/*'})
|
375
|
+
data.should_not be_empty
|
376
|
+
puts data.inspect
|
377
|
+
data.split(":").length.should == 3
|
337
378
|
end
|
338
379
|
end
|
339
380
|
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'qiniu/tokens/qbox_token'
|
5
|
+
|
6
|
+
module Qiniu
|
7
|
+
module RS
|
8
|
+
describe QboxToken do
|
9
|
+
before :all do
|
10
|
+
@qbox_token = QboxToken.new(:url => 'www.qiniutek.com?key1=value1',
|
11
|
+
:params => { :key2 => 'value2' })
|
12
|
+
@qbox_token.access_key = 'access_key'
|
13
|
+
@qbox_token.secret_key = 'secret_key'
|
14
|
+
end
|
15
|
+
|
16
|
+
context "#generate_token" do
|
17
|
+
it "should generate token" do
|
18
|
+
@qbox_token.generate_token.should_not be_empty
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context "#generate_signature" do
|
23
|
+
it "should generate signature" do
|
24
|
+
@qbox_token.generate_signature.should == "www.qiniutek.com?key1=value1\nkey2=value2"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qiniu-rs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
33
33
|
none: false
|
34
34
|
requirements:
|
35
|
-
- -
|
35
|
+
- - ! '>='
|
36
36
|
- !ruby/object:Gem::Version
|
37
37
|
version: '2.11'
|
38
38
|
type: :development
|
@@ -40,7 +40,7 @@ dependencies:
|
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|
43
|
-
- -
|
43
|
+
- - ! '>='
|
44
44
|
- !ruby/object:Gem::Version
|
45
45
|
version: '2.11'
|
46
46
|
- !ruby/object:Gem::Dependency
|
@@ -156,6 +156,7 @@ files:
|
|
156
156
|
- lib/qiniu/rs/utils.rb
|
157
157
|
- lib/qiniu/rs/version.rb
|
158
158
|
- lib/qiniu/tokens/access_token.rb
|
159
|
+
- lib/qiniu/tokens/download_token.rb
|
159
160
|
- lib/qiniu/tokens/qbox_token.rb
|
160
161
|
- lib/qiniu/tokens/upload_token.rb
|
161
162
|
- qiniu-rs.gemspec
|
@@ -171,6 +172,7 @@ files:
|
|
171
172
|
- spec/qiniu/rs/utils_spec.rb
|
172
173
|
- spec/qiniu/rs/version_spec.rb
|
173
174
|
- spec/qiniu/rs_spec.rb
|
175
|
+
- spec/qiniu/tokens/qbox_token_spec.rb
|
174
176
|
- spec/spec_helper.rb
|
175
177
|
homepage: https://github.com/qiniu/ruby-sdk
|
176
178
|
licenses: []
|
@@ -186,7 +188,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
186
188
|
version: '0'
|
187
189
|
segments:
|
188
190
|
- 0
|
189
|
-
hash:
|
191
|
+
hash: 3127268457999881368
|
190
192
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
191
193
|
none: false
|
192
194
|
requirements:
|
@@ -195,7 +197,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
195
197
|
version: '0'
|
196
198
|
segments:
|
197
199
|
- 0
|
198
|
-
hash:
|
200
|
+
hash: 3127268457999881368
|
199
201
|
requirements: []
|
200
202
|
rubyforge_project:
|
201
203
|
rubygems_version: 1.8.24
|
@@ -215,4 +217,5 @@ test_files:
|
|
215
217
|
- spec/qiniu/rs/utils_spec.rb
|
216
218
|
- spec/qiniu/rs/version_spec.rb
|
217
219
|
- spec/qiniu/rs_spec.rb
|
220
|
+
- spec/qiniu/tokens/qbox_token_spec.rb
|
218
221
|
- spec/spec_helper.rb
|