qiniu 6.8.1 → 6.9.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 82f51989fb126863f36c204186a0d3065d9d240e
4
- data.tar.gz: d691e53432a0b3cdffc3407cbc4b1f0798b9f194
3
+ metadata.gz: 306d8a843360b13bd622e22467add2b392657a78
4
+ data.tar.gz: 5e15d490efd048e1f3f8b00c04658cf29d00e46d
5
5
  SHA512:
6
- metadata.gz: 6457dd9d80b710e52fb52610af683f990460842f131937b477827791ffd202685361097d1126aa15382423d32e7b3037e622e3fb4db0efc2bf131a103dd1efae
7
- data.tar.gz: bda38a85d3b1dd1f199018bc4c78baf40431027c850faff7e6330238487fa5360a20234d9d61e61a348caf05bc58936c4474394613158301dc2b5919191a6947
6
+ metadata.gz: d9937b7d424f62640fcdf7b2cd84648799c41c4e6d739f79df01f3bd94fc83f6a30ecd22fdca8602437e2c854b49459e607421057597b1d28893ba2adbe6bf83
7
+ data.tar.gz: fdc93590e8b774bc5ea732171189555daad50b6d4023e809a6e585b36b32a51959feeb17c33c3d0080bb827034c1f762c0f3e4ae97d896c68c8d2ed328c48732
@@ -1,5 +1,17 @@
1
1
  ## CHANGE LOG
2
2
 
3
+ ### v6.9.0
4
+
5
+ - 增加 `Qiniu.establish_https_connection!` 方法,使所有七牛请求都使用 HTTPS 协议,保证连接的安全性。
6
+
7
+ - 重构随 gem 附带的 example 中的代码,使用更简洁易用的 API。
8
+
9
+ - 移除 `Qiniu::Config::DEFAULT_OPTIONS`,用户可以调用 `Qiniu::Config.settings` 获取七牛配置。
10
+
11
+ - 移除 `Qiniu.get`,`Qiniu.download` 和 `Qiniu::Storage.get` 方法以及它们的 `batch` 版本。
12
+
13
+ - 移除对于 Fixnum 的使用,支持 Ruby 2.4.x
14
+
3
15
  ### v6.8.1
4
16
 
5
17
  - 增加delafterdays 策略。[https://github.com/qiniu/ruby-sdk/pull/162](https://github.com/qiniu/ruby-sdk/pull/162)
data/README.md CHANGED
@@ -9,6 +9,7 @@
9
9
  * Ruby 2.1.x
10
10
  * Ruby 2.2.x
11
11
  * Ruby 2.3.x
12
+ * Ruby 2.4.x
12
13
  * JRuby 9.x
13
14
 
14
15
  如果您的应用程序需要在 Ruby 1.9、2.0 或 JRuby 1.7 上运行,请使用此 Ruby SDK 的 6.6.0 版本。
@@ -24,7 +25,7 @@
24
25
 
25
26
  在您 Ruby 应用程序的 `Gemfile` 文件中,添加如下一行代码:
26
27
 
27
- gem 'qiniu', '>= 6.8.0'
28
+ gem 'qiniu', '>= 6.9.0'
28
29
 
29
30
  然后,在应用程序所在的目录下,可以运行 `bundle` 安装依赖包:
30
31
 
@@ -3,20 +3,21 @@
3
3
  require 'qiniu/exceptions'
4
4
 
5
5
  module Qiniu
6
- autoload :Version, 'qiniu/version'
7
- autoload :Utils, 'qiniu/utils'
8
- autoload :Auth, 'qiniu/auth'
9
- autoload :Config, 'qiniu/config'
10
- autoload :Log, 'qiniu/log'
11
- autoload :AccessToken, 'qiniu/tokens/access_token'
12
- autoload :QboxToken, 'qiniu/tokens/qbox_token'
13
- autoload :UploadToken, 'qiniu/tokens/upload_token'
14
- autoload :DownloadToken, 'qiniu/tokens/download_token'
15
- autoload :Abstract, 'qiniu/abstract'
16
- autoload :Storage, 'qiniu/storage'
17
- autoload :Fop, 'qiniu/fop'
18
- autoload :Misc, 'qiniu/misc'
19
- autoload :HostManager, 'qiniu/host_manager'
6
+ require_relative 'qiniu/version'
7
+ require_relative 'qiniu/utils'
8
+ require_relative 'qiniu/auth'
9
+ require_relative 'qiniu/config'
10
+ require_relative 'qiniu/log'
11
+ require_relative 'qiniu/tokens/access_token'
12
+ require_relative 'qiniu/tokens/qbox_token'
13
+ require_relative 'qiniu/tokens/upload_token'
14
+ require_relative 'qiniu/tokens/download_token'
15
+ require_relative 'qiniu/abstract'
16
+ require_relative 'qiniu/storage'
17
+ require_relative 'qiniu/fop'
18
+ require_relative 'qiniu/misc'
19
+ require_relative 'qiniu/host_manager'
20
+ require_relative 'qiniu/http'
20
21
 
21
22
  class << self
22
23
 
@@ -26,6 +27,18 @@ module Qiniu
26
27
  Config.initialize_connect opts
27
28
  end
28
29
 
30
+ def establish_https_connection!(opts = {})
31
+ Config.initialize_connect_https opts
32
+ end
33
+
34
+ def switch_to_http!
35
+ Config.switch_to_http
36
+ end
37
+
38
+ def switch_to_https!
39
+ Config.switch_to_https
40
+ end
41
+
29
42
  def mkbucket(bucket_name)
30
43
  code, data = Storage.mkbucket(bucket_name)
31
44
  code == StatusOK
@@ -94,16 +107,6 @@ module Qiniu
94
107
  code == StatusOK ? data : false
95
108
  end
96
109
 
97
- def get(bucket, key, save_as = nil, expires_in = nil, version = nil)
98
- code, data = Storage.get(bucket, key, save_as, expires_in, version)
99
- code == StatusOK ? data : false
100
- end
101
-
102
- def download(bucket, key, save_as = nil, expires_in = nil, version = nil)
103
- code, data = Storage.get(bucket, key, save_as, expires_in, version)
104
- code == StatusOK ? data["url"] : false
105
- end
106
-
107
110
  def copy(source_bucket, source_key, target_bucket, target_key)
108
111
  code, data = Storage.copy(source_bucket, source_key, target_bucket, target_key)
109
112
  code == StatusOK
@@ -134,11 +137,6 @@ module Qiniu
134
137
  code == StatusOK ? data : false
135
138
  end
136
139
 
137
- def batch_get(bucket, keys)
138
- code, data = Storage.batch_get(bucket, keys)
139
- code == StatusOK ? data : false
140
- end
141
-
142
140
  def batch_copy(*args)
143
141
  code, data = Storage.batch_copy(args)
144
142
  code == StatusOK
@@ -149,14 +147,6 @@ module Qiniu
149
147
  code == StatusOK
150
148
  end
151
149
 
152
- def batch_download(bucket, keys)
153
- code, data = Storage.batch_get(bucket, keys)
154
- return false unless code == StatusOK
155
- links = []
156
- data.each { |e| links << e["data"]["url"] }
157
- links
158
- end
159
-
160
150
  def batch_delete(bucket, keys)
161
151
  code, data = Storage.batch_delete(bucket, keys)
162
152
  code == StatusOK ? data : false
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  # vim: sw=2 ts=2
3
3
 
4
- require 'hmac-sha1'
4
+ require 'openssl'
5
5
  require 'uri'
6
6
  require 'cgi'
7
7
 
@@ -27,15 +27,8 @@ module Qiniu
27
27
  end # calculate_deadline
28
28
 
29
29
  def calculate_hmac_sha1_digest(sk, str)
30
- begin
31
- sign = HMAC::SHA1.new(sk).update(str).digest
32
- rescue RuntimeError => e
33
- raise RuntimeError, "Please set Qiniu's access_key and secret_key before authorize any tokens."
34
- rescue
35
- raise
36
- else
37
- return sign
38
- end
30
+ raise ArgumentError, "Please set Qiniu's access_key and secret_key before authorize any tokens." if sk.nil?
31
+ OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha1'), sk, str)
39
32
  end
40
33
  end # class << self
41
34
 
@@ -171,7 +164,7 @@ module Qiniu
171
164
 
172
165
  ### URL变换:追加FOP指令
173
166
  if args[:fop].is_a?(String) && args[:fop] != '' then
174
- if download_url.index('?').is_a?(Fixnum) then
167
+ if download_url.include?('?')
175
168
  # 已有参数
176
169
  download_url = "#{download_url}&#{args[:fop]}"
177
170
  else
@@ -184,7 +177,7 @@ module Qiniu
184
177
  e = Auth.calculate_deadline(args[:expires_in], args[:deadline])
185
178
 
186
179
  ### URL变换:追加授权期参数
187
- if download_url.index('?').is_a?(Fixnum) then
180
+ if download_url.include?('?')
188
181
  # 已有参数
189
182
  download_url = "#{download_url}&e=#{e}"
190
183
  else
@@ -13,32 +13,6 @@ require 'tmpdir'
13
13
  module Qiniu
14
14
  module Config
15
15
  class << self
16
-
17
- DEFAULT_OPTIONS = {
18
- :user_agent => 'QiniuRuby/' + Version.to_s + ' ('+RUBY_PLATFORM+')' + ' Ruby/'+ RUBY_VERSION,
19
- :method => :post,
20
- :content_type => 'application/x-www-form-urlencoded',
21
- :auth_url => "https://acc.qbox.me/oauth2/token",
22
- :rs_host => "http://rs.qiniu.com",
23
- :fetch_host => nil,
24
- :rsf_host => "http://rsf.qbox.me",
25
- :up_host => nil,
26
- :pub_host => "http://pu.qbox.me:10200",
27
- :eu_host => "http://eu.qbox.me",
28
- :uc_host => "http://uc.qbox.me",
29
- :access_key => "",
30
- :secret_key => "",
31
- :auto_reconnect => true,
32
- :max_retry_times => 3,
33
- :block_size => 1024*1024*4,
34
- :chunk_size => 1024*256,
35
- :enable_debug => true,
36
- :tmpdir => Dir.tmpdir + File::SEPARATOR + 'QiniuRuby',
37
- :multi_region => true
38
- }
39
-
40
- REQUIRED_OPTION_KEYS = [:access_key, :secret_key]
41
-
42
16
  attr_reader :settings, :default_params, :host_manager
43
17
 
44
18
  def load config_file
@@ -52,14 +26,31 @@ module Qiniu
52
26
  end
53
27
 
54
28
  def initialize_connect options = {}
55
- @settings = DEFAULT_OPTIONS.merge!(options)
56
- REQUIRED_OPTION_KEYS.each do |opt|
29
+ options = if options[:protocol] == :https
30
+ https_options.merge(options)
31
+ else
32
+ http_options.merge(options)
33
+ end
34
+ @settings = default_options.merge(options)
35
+ required_options_keys.each do |opt|
57
36
  raise MissingArgsError, [opt] unless @settings.has_key?(opt)
58
37
  end
59
38
  @host_manager = HostManager.new(@settings)
60
39
  nil
61
40
  end
62
41
 
42
+ def initialize_connect_https options = {}
43
+ initialize_connect(options.merge(:protocol => :https))
44
+ end
45
+
46
+ def switch_to_http
47
+ @settings.merge!(http_options)
48
+ end
49
+
50
+ def switch_to_https
51
+ @settings.merge!(https_options)
52
+ end
53
+
63
54
  def up_host(bucket, opts = {})
64
55
  @settings[:up_host] || @host_manager.up_host(bucket, opts)
65
56
  end
@@ -67,6 +58,54 @@ module Qiniu
67
58
  def fetch_host(bucket, opts = {})
68
59
  @settings[:fetch_host] || @host_manager.fetch_host(bucket, opts)
69
60
  end
61
+
62
+ private
63
+
64
+ def default_options
65
+ {
66
+ :user_agent => 'QiniuRuby/' + Version.to_s + ' ('+RUBY_PLATFORM+')' + ' Ruby/'+ RUBY_VERSION,
67
+ :method => :post,
68
+ :content_type => 'application/x-www-form-urlencoded',
69
+ :auth_url => "https://acc.qbox.me/oauth2/token",
70
+ :access_key => "",
71
+ :secret_key => "",
72
+ :auto_reconnect => true,
73
+ :max_retry_times => 3,
74
+ :block_size => 1024*1024*4,
75
+ :chunk_size => 1024*256,
76
+ :enable_debug => true,
77
+ :tmpdir => Dir.tmpdir + File::SEPARATOR + 'QiniuRuby',
78
+ :multi_region => true
79
+ }.freeze
80
+ end
81
+
82
+ def http_options
83
+ {
84
+ :rs_host => "http://rs.qiniu.com",
85
+ :rsf_host => "http://rsf.qbox.me",
86
+ :pub_host => "http://pu.qbox.me:10200",
87
+ :eu_host => "http://eu.qbox.me",
88
+ :uc_host => "http://uc.qbox.me",
89
+ :api_host => "http://api.qiniu.com",
90
+ :protocol => :http
91
+ }.freeze
92
+ end
93
+
94
+ def https_options
95
+ {
96
+ :rs_host => "https://rs.qbox.me",
97
+ :rsf_host => "https://rsf.qbox.me",
98
+ :pub_host => "https://pu.qbox.me",
99
+ :eu_host => "https://eu.qbox.me",
100
+ :uc_host => "https://uc.qbox.me",
101
+ :api_host => "https://api.qiniu.com",
102
+ :protocol => :https
103
+ }.freeze
104
+ end
105
+
106
+ def required_options_keys
107
+ [:access_key, :secret_key].freeze
108
+ end
70
109
  end
71
110
  end # module Config
72
111
  end # module Qiniu
@@ -50,7 +50,7 @@ module Qiniu
50
50
  private
51
51
 
52
52
  def extract_protocol(opts)
53
- opts[:protocol] || 'http'
53
+ (opts[:protocol] || @config[:protocol]).to_s
54
54
  end
55
55
 
56
56
  def multi_region_support?
@@ -57,14 +57,6 @@ module Qiniu
57
57
  return HTTP.management_post(url)
58
58
  end # stat
59
59
 
60
- def get(bucket, key, save_as = nil, expires_in = nil, version = nil)
61
- url = Config.settings[:rs_host] + '/get/' + encode_entry_uri(bucket, key)
62
- url += '/base/' + version unless version.nil?
63
- url += '/attName/' + Utils.urlsafe_base64_encode(save_as) unless save_as.nil?
64
- url += '/expires/' + expires_in.to_s if !expires_in.nil? && expires_in > 0
65
- return HTTP.management_post(url)
66
- end # get
67
-
68
60
  def copy(source_bucket, source_key, target_bucket, target_key)
69
61
  uri = _generate_cp_or_mv_opstr('copy', source_bucket, source_key, target_bucket, target_key)
70
62
  url = Config.settings[:rs_host] + uri
@@ -97,16 +89,12 @@ module Qiniu
97
89
  return HTTP.management_post(url, execs.join("&"))
98
90
  end # batch
99
91
 
100
- def batch_get(bucket, keys)
101
- batch("get", bucket, keys)
102
- end # batch_get
103
-
104
92
  def batch_stat(bucket, keys)
105
93
  batch("stat", bucket, keys)
106
94
  end # batch_stat
107
95
 
108
96
  def batch_copy(*args)
109
- _batch_cp_or_mv('copy', args)
97
+ _batch_cp_or_mv('copy', *args)
110
98
  end # batch_copy
111
99
 
112
100
  def batch_move(*args)
@@ -149,6 +137,11 @@ module Qiniu
149
137
  return resp_code, resp_body, resp_headers, has_more, new_list_policy
150
138
  end # list
151
139
 
140
+ def domains(bucket)
141
+ url = Config.settings[:api_host] + '/v7/domain/list?tbl=' + bucket
142
+ return HTTP.management_post(url)
143
+ end
144
+
152
145
  private
153
146
 
154
147
  def _generate_cp_or_mv_opstr(command, source_bucket, source_key, target_bucket, target_key)
@@ -72,11 +72,8 @@ module Qiniu
72
72
 
73
73
  class << self
74
74
 
75
- API_HOST = 'http://api.qiniu.com'
76
-
77
- PFOP_URL = API_HOST + '/pfop/'
78
-
79
75
  def pfop (args)
76
+ pfop_url = Config.settings[:api_host] + '/pfop/'
80
77
  ### 生成fop指令串
81
78
  if args.is_a?(PfopPolicy) then
82
79
  # PfopPolicy的各个字段按固定顺序组织
@@ -90,12 +87,12 @@ module Qiniu
90
87
  end
91
88
 
92
89
  ### 发送请求
93
- return HTTP.management_post(PFOP_URL, body)
90
+ return HTTP.management_post(pfop_url, body)
94
91
  end # pfop
95
92
 
96
- PREFOP_URL = API_HOST + '/status/get/prefop?id='
97
93
 
98
94
  def prefop (persistent_id)
95
+ prefop_url = Config.settings[:api_host] + '/status/get/prefop?id='
99
96
  ### 抽取persistentId
100
97
  if persistent_id.is_a?(Hash) then
101
98
  pid = persistent_id['persistentId']
@@ -104,7 +101,7 @@ module Qiniu
104
101
  end
105
102
 
106
103
  ### 发送请求
107
- url = PREFOP_URL + pid
104
+ url = prefop_url + pid
108
105
  return HTTP.api_get(url)
109
106
  end # prefop
110
107
 
@@ -1,6 +1,6 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
- require 'hmac-sha1'
3
+ require 'openssl'
4
4
  require 'qiniu/config'
5
5
  require 'qiniu/utils'
6
6
 
@@ -14,9 +14,8 @@ module Qiniu
14
14
  attr_accessor :access_key, :secret_key
15
15
 
16
16
  def generate_encoded_digest(signature)
17
- hmac = HMAC::SHA1.new(@secret_key)
18
- hmac.update(signature)
19
- urlsafe_base64_encode(hmac.digest)
17
+ raw_hmac_digest = OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha1'), @secret_key, signature)
18
+ urlsafe_base64_encode(raw_hmac_digest)
20
19
  end
21
20
 
22
21
  end # AccessToken
@@ -6,7 +6,6 @@ require 'json'
6
6
  require 'zlib'
7
7
  require 'base64'
8
8
  require 'rest_client'
9
- require 'hmac-sha1'
10
9
  require 'qiniu/exceptions'
11
10
 
12
11
  module Qiniu
@@ -3,8 +3,8 @@
3
3
  module Qiniu
4
4
  module Version
5
5
  MAJOR = 6
6
- MINOR = 8
7
- PATCH = 1
6
+ MINOR = 9
7
+ PATCH = 0
8
8
  # Returns a version string by joining <tt>MAJOR</tt>, <tt>MINOR</tt>, and <tt>PATCH</tt> with <tt>'.'</tt>
9
9
  #
10
10
  # Example
@@ -39,11 +39,10 @@ module Qiniu
39
39
  puts raw_headers.inspect
40
40
 
41
41
  ### 获取下载地址
42
- code, data = Qiniu::Storage.get(@bucket, key)
43
- code.should == 200
44
- puts data.inspect
45
-
46
- url = data['url']
42
+ code, domains, = Qiniu::Storage.domains(@bucket)
43
+ domains.should_not be_empty
44
+ domain = domains.first['domain']
45
+ url = "http://#{domain}/#{key}"
47
46
 
48
47
  ### 授权下载地址(不带参数)
49
48
  download_url = Qiniu::Auth.authorize_download_url(url)
@@ -54,12 +53,7 @@ module Qiniu
54
53
  result.body.should_not be_empty
55
54
 
56
55
  ### 授权下载地址(带参数)
57
- download_url = Qiniu::Auth.authorize_download_url(
58
- url,
59
- {
60
- :fop => 'download/a.m3u8'
61
- }
62
- )
56
+ download_url = Qiniu::Auth.authorize_download_url(url, fop: 'qhash/md5')
63
57
  puts "download_url=#{download_url}"
64
58
 
65
59
  result = RestClient.get(download_url)
@@ -68,8 +62,8 @@ module Qiniu
68
62
 
69
63
  ### 删除文件
70
64
  code, data = Qiniu::Storage.delete(@bucket, key)
71
- code.should == 200
72
65
  puts data.inspect
66
+ code.should == 200
73
67
  end
74
68
 
75
69
  it "should generate uphosts and global for multi_region" do
@@ -83,7 +77,7 @@ module Qiniu
83
77
 
84
78
  ### 生成 PutPolicy
85
79
  pp = Auth::PutPolicy.new(@bucket, key)
86
- expect(pp.instance_variable_get(:@uphosts)).to eq ["http://up.qiniu.com", "http://upload.qiniu.com", "-H up.qiniu.com http://183.136.139.16"]
80
+ expect(pp.instance_variable_get(:@uphosts)).to eq ["http://up.qiniu.com", "http://upload.qiniu.com", "-H up.qiniu.com http://183.131.7.18"]
87
81
  expect(pp.instance_variable_get(:@global)).to be false
88
82
  ensure
89
83
  Config.settings[:multi_region] = origin_multi_region