From 6328e6c184594cfe80f38aa92bcca24417f752b5 Mon Sep 17 00:00:00 2001 From: OuYangJinTing Date: Fri, 8 May 2026 18:58:40 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4=20multi=5Fregion=20=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E9=A1=B9=EF=BC=8C=E9=BB=98=E8=AE=A4=E5=90=AF=E7=94=A8?= =?UTF-8?q?=E5=A4=9A=E5=8C=BA=E5=9F=9F=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除 Config 中的 multi_region 选项,HostManager 始终使用多区域 hosts - 调整 Auth 模块中类方法的位置,避免存在多处 `class << self; ... end` - 测试覆盖率工具由 codecov 切换为 simplecov-cobertura,codecov 已不再维护 - 新增 base64 运行时依赖,Ruby 3.4 已经将 base64 从标准库中移除 - CI 增加 Ruby 4.0 测试矩阵 - 测试使用的 bucket 支持通过环境变量配置 --- .github/workflows/test-ci.yml | 8 +++--- lib/qiniu/auth.rb | 52 ++++++++++++++++------------------- lib/qiniu/config.rb | 3 +- lib/qiniu/host_manager.rb | 40 +++++++-------------------- qiniu.gemspec | 8 ++++-- rails/qiniu.gemspec | 10 +++++-- spec/qiniu/auth_spec.rb | 33 +++++++++++----------- spec/qiniu/image_spec.rb | 2 +- spec/qiniu/management_spec.rb | 24 ++++------------ spec/qiniu/misc_spec.rb | 2 +- spec/qiniu/pfop_spec.rb | 2 +- spec/qiniu/qiniu_spec.rb | 4 +-- spec/qiniu/upload_spec.rb | 4 +-- spec/spec_helper.rb | 12 ++++---- 14 files changed, 85 insertions(+), 119 deletions(-) diff --git a/.github/workflows/test-ci.yml b/.github/workflows/test-ci.yml index 733617a..e2ed0b9 100644 --- a/.github/workflows/test-ci.yml +++ b/.github/workflows/test-ci.yml @@ -7,7 +7,7 @@ jobs: strategy: fail-fast: false matrix: - ruby-versions: ['2.4', '2.5', '2.6', '2.7', '3.0', '3.1', '3.2', 'ruby-head', 'jruby-head'] + ruby-versions: ['2.4', '2.5', '2.6', '2.7', '3.0', '3.1', '3.2', '4.0', 'ruby-head', 'jruby-head'] runs-on: ubuntu-latest steps: @@ -24,12 +24,12 @@ jobs: - name: Test run: bundle exec rspec - env: QINIU_ACCESS_KEY: ${{ secrets.QINIU_ACCESS_KEY }} QINIU_SECRET_KEY: ${{ secrets.QINIU_SECRET_KEY }} - QINIU_TEST_BUCKET: ${{ secrets.QINIU_TEST_BUCKET }} - QINIU_TEST_DOMAIN: ${{ secrets.QINIU_TEST_DOMAIN }} + BUCKET: ${{ secrets.BUCKET }} + BUCKET_NA0: ${{ secrets.BUCKET_NA0 }} + BUCKET_BC: ${{ secrets.BUCKET_BC }} - name: After_success run: bash <(curl -s https://codecov.io/bash) diff --git a/lib/qiniu/auth.rb b/lib/qiniu/auth.rb index b0e9043..f3c92c3 100755 --- a/lib/qiniu/auth.rb +++ b/lib/qiniu/auth.rb @@ -17,27 +17,6 @@ module Auth AUTHORIZATION_PREFIX_QBOX = 'QBox '.freeze AUTHORIZATION_PREFIX_QINIU = 'Qiniu '.freeze - class << self - def calculate_deadline(expires_in, deadline = nil) - ### 授权期计算 - if expires_in.is_a?(Integer) && expires_in > 0 then - # 指定相对时间,单位:秒 - return Time.now.to_i + expires_in - elsif deadline.is_a?(Integer) then - # 指定绝对时间,常用于调试和单元测试 - return deadline - end - - # 默认授权期1小时 - return Time.now.to_i + DEFAULT_AUTH_SECONDS - end # calculate_deadline - - def calculate_hmac_sha1_digest(sk, str) - raise ArgumentError, "Please set Qiniu's access_key and secret_key before authorize any tokens." if sk.nil? - OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha1'), sk, str) - end - end # class << self - class PutPolicy private def initialize(bucket, @@ -96,13 +75,11 @@ def scope!(bucket, key = nil) @scope = "#{bucket}:#{key}" end - if Config.settings[:multi_region] - begin - @uphosts = Config.host_manager.up_hosts(bucket) - @global = Config.host_manager.global(bucket) - rescue - # Do nothing - end + begin + @uphosts = Config.host_manager.up_hosts(bucket) + @global = Config.host_manager.global(bucket) + rescue + # Do nothing end end # scope! @@ -162,6 +139,25 @@ def to_json class << self EMPTY_ARGS = {} + def calculate_deadline(expires_in, deadline = nil) + ### 授权期计算 + if expires_in.is_a?(Integer) && expires_in > 0 then + # 指定相对时间,单位:秒 + return Time.now.to_i + expires_in + elsif deadline.is_a?(Integer) then + # 指定绝对时间,常用于调试和单元测试 + return deadline + end + + # 默认授权期1小时 + return Time.now.to_i + DEFAULT_AUTH_SECONDS + end # calculate_deadline + + def calculate_hmac_sha1_digest(sk, str) + raise ArgumentError, "Please set Qiniu's access_key and secret_key before authorize any tokens." if sk.nil? + OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha1'), sk, str) + end + ### 生成下载授权URL def authorize_download_url(url, args = EMPTY_ARGS) ### 提取AK/SK信息 diff --git a/lib/qiniu/config.rb b/lib/qiniu/config.rb index 9dcc586..d41d1aa 100755 --- a/lib/qiniu/config.rb +++ b/lib/qiniu/config.rb @@ -74,8 +74,7 @@ def default_options :block_size => 1024*1024*4, :chunk_size => 1024*256, :enable_debug => true, - :tmpdir => Dir.tmpdir + File::SEPARATOR + 'QiniuRuby', - :multi_region => true + :tmpdir => Dir.tmpdir + File::SEPARATOR + 'QiniuRuby' }.freeze end diff --git a/lib/qiniu/host_manager.rb b/lib/qiniu/host_manager.rb index 0ff25de..db01b97 100644 --- a/lib/qiniu/host_manager.rb +++ b/lib/qiniu/host_manager.rb @@ -13,41 +13,25 @@ def initialize(config) end def up_host(bucket, opts = {}) - if !multi_region_support? - "#{extract_protocol(opts)}://up.qiniup.com" - elsif bucket - host = hosts(bucket) - "#{extract_protocol(opts)}://" + host.dig('up', 'acc', 'main', 0) rescue "#{extract_protocol(opts)}://" + host.dig('up', 'src', 'main', 0) - end + host = hosts(bucket) + "#{extract_protocol(opts)}://" + host.dig('up', 'acc', 'main', 0) rescue "#{extract_protocol(opts)}://" + host.dig('up', 'src', 'main', 0) end def fetch_host(bucket, opts = {}) - if !multi_region_support? - "#{extract_protocol(opts)}://iovip.qbox.me" - elsif bucket - host = hosts(bucket) - "#{extract_protocol(opts)}://" + host.dig('io', 'acc', 'main', 0) rescue "#{extract_protocol(opts)}://" + host.dig('io', 'src', 'main', 0) - end + host = hosts(bucket) + "#{extract_protocol(opts)}://" + host.dig('io', 'acc', 'main', 0) rescue "#{extract_protocol(opts)}://" + host.dig('io', 'src', 'main', 0) end def up_hosts(bucket, opts = {}) - if multi_region_support? - host = hosts(bucket)['up'] - multi_region_hosts = [] - multi_region_hosts |= host.dig('acc', 'main') || [] - multi_region_hosts |= host.dig('src', 'main') || [] - return multi_region_hosts - else - raise 'HostManager#up_hosts: multi_region must be enabled' - end + host = hosts(bucket)['up'] + up_hosts = [] + up_hosts |= host.dig('acc', 'main') || [] + up_hosts |= host.dig('src', 'main') || [] + up_hosts end def global(bucket, opts = {}) - if multi_region_support? - !!hosts(bucket)['global'] - else - raise 'HostManager#global: multi_region must be enabled' - end + !!hosts(bucket)['global'] end private @@ -56,10 +40,6 @@ def extract_protocol(opts) (opts[:protocol] || @config[:protocol]).to_s end - def multi_region_support? - @config[:multi_region] - end - def hosts(bucket) host = read_host(bucket) if host diff --git a/qiniu.gemspec b/qiniu.gemspec index d9abb64..d43447c 100755 --- a/qiniu.gemspec +++ b/qiniu.gemspec @@ -21,10 +21,12 @@ Gem::Specification.new do |gem| gem.add_development_dependency 'rake', '~> 12' gem.add_development_dependency 'rspec', '~> 3.5' gem.add_development_dependency 'webmock', '~> 2.3' - if Gem::Version.create(RUBY_VERSION) >= Gem::Version::create('2.4.0') - gem.add_development_dependency 'codecov', '~> 0.6.0' - gem.add_development_dependency 'simplecov', '~> 0.18.5' + if Gem::Version.create(RUBY_VERSION) >= Gem::Version::create('2.5.0') + gem.add_development_dependency 'simplecov', '~> 0.22' + gem.add_development_dependency 'simplecov-cobertura', '>= 2.0.0', '< 4.0.0' end + + gem.add_runtime_dependency 'base64', '< 1.0.0' gem.add_runtime_dependency 'rexml', '~> 3.2' gem.add_runtime_dependency 'rest-client', '~> 2.0' gem.add_runtime_dependency 'mime-types', '~> 3.1' diff --git a/rails/qiniu.gemspec b/rails/qiniu.gemspec index 98ef282..43ec9c3 100755 --- a/rails/qiniu.gemspec +++ b/rails/qiniu.gemspec @@ -21,13 +21,17 @@ Gem::Specification.new do |gem| gem.add_development_dependency 'rake', '~> 12' gem.add_development_dependency 'rspec', '~> 3.5' gem.add_development_dependency 'webmock', '~> 2.3' - if Gem::Version.create(RUBY_VERSION) >= Gem::Version::create('2.3.0') - gem.add_development_dependency 'codecov', '~> 0.2.5' + if Gem::Version.create(RUBY_VERSION) >= Gem::Version::create('2.5.0') + gem.add_development_dependency 'simplecov', '~> 0.22' + gem.add_development_dependency 'simplecov-cobertura', '>= 2.0.0', '< 4.0.0' + elsif Gem::Version.create(RUBY_VERSION) >= Gem::Version::create('2.3.0') gem.add_development_dependency 'simplecov', '~> 0.18.5' + gem.add_development_dependency 'simplecov-cobertura', '~> 1.4' else - gem.add_development_dependency 'codecov', '~> 0.1.20' gem.add_development_dependency 'simplecov', '~> 0.17.1' end + + gem.add_runtime_dependency 'base64', '< 1.0.0' gem.add_runtime_dependency 'rexml', '~> 3.2' gem.add_runtime_dependency 'rest-client', '~> 2.0' gem.add_runtime_dependency 'mime-types', '~> 3.1' diff --git a/spec/qiniu/auth_spec.rb b/spec/qiniu/auth_spec.rb index bca3355..68fe6d2 100755 --- a/spec/qiniu/auth_spec.rb +++ b/spec/qiniu/auth_spec.rb @@ -12,7 +12,7 @@ module Auth describe Auth do before :all do - @bucket = 'rubysdk' + @bucket = BUCKET end after :all do end @@ -68,22 +68,21 @@ module Auth expect(code).to eq(200) end - it "should generate uphosts and global for multi_region" do - origin_multi_region = Config.settings[:multi_region] - begin - Config.settings[:multi_region] = true - ### 生成Key - key = 'a_private_file' - key = make_unique_key_in_bucket(key) - puts "key=#{key}" - - ### 生成 PutPolicy - pp = Auth::PutPolicy.new(@bucket, key) - expect(pp.instance_variable_get(:@uphosts)).to eq ["upload.qiniup.com", "up.qiniup.com"] - expect(pp.instance_variable_get(:@global)).to be false - ensure - Config.settings[:multi_region] = origin_multi_region - end + it "should generate uphosts and global" do + ### 生成Key + key = 'a_private_file' + key = make_unique_key_in_bucket(key) + puts "key=#{key}" + + ### 生成 PutPolicy + pp = Auth::PutPolicy.new(@bucket, key) + expect(pp.instance_variable_get(:@global)).to be false + uphosts = pp.instance_variable_get(:@uphosts) + expect(uphosts.size).to eq 2 + patterns = [/^upload-.*\.qiniup\.com$/, /^up-.*\.qiniup\.com$/] + expect(uphosts).to satisfy { |hosts| + patterns.all? { |pat| hosts.any? { |host| host.match?(pat) } } + } end end end diff --git a/spec/qiniu/image_spec.rb b/spec/qiniu/image_spec.rb index be28214..b87e641 100755 --- a/spec/qiniu/image_spec.rb +++ b/spec/qiniu/image_spec.rb @@ -10,7 +10,7 @@ module Fop describe Fop do before :all do - @bucket = 'rubysdk' + @bucket = BUCKET pic_fname = "image_logo_for_test.png" @key = make_unique_key_in_bucket(pic_fname) diff --git a/spec/qiniu/management_spec.rb b/spec/qiniu/management_spec.rb index ac2dd15..a86c5ad 100755 --- a/spec/qiniu/management_spec.rb +++ b/spec/qiniu/management_spec.rb @@ -129,30 +129,18 @@ module Storage end end - describe 'When multi_region is disabled' do + describe 'for z0 bucket' do before :all do - Config.settings[:multi_region] = false - @bucket = 'rubysdk' + @bucket = BUCKET end include_examples 'Management Specs' end - describe 'When multi_region is enabled' do - describe 'for z0 bucket' do - before :all do - Config.settings[:multi_region] = true - @bucket = 'rubysdk' - end - include_examples 'Management Specs' - end - - describe 'for z1 bucket' do - before :all do - Config.settings[:multi_region] = true - @bucket = 'rubysdk-bc' - end - include_examples 'Management Specs' + describe 'for z1 bucket' do + before :all do + @bucket = BUCKET_BC end + include_examples 'Management Specs' end end # module Storage end # module Qiniu diff --git a/spec/qiniu/misc_spec.rb b/spec/qiniu/misc_spec.rb index 08f3c24..9074dba 100755 --- a/spec/qiniu/misc_spec.rb +++ b/spec/qiniu/misc_spec.rb @@ -10,7 +10,7 @@ module Misc describe Misc do before :all do - @bucket = 'rubysdk' + @bucket = BUCKET end after :all do diff --git a/spec/qiniu/pfop_spec.rb b/spec/qiniu/pfop_spec.rb index b9505df..4c13f01 100644 --- a/spec/qiniu/pfop_spec.rb +++ b/spec/qiniu/pfop_spec.rb @@ -12,7 +12,7 @@ module Persistance describe Persistance do before :all do - @bucket = 'rubysdk' + @bucket = BUCKET pic_fname = "image_logo_for_test.png" @key = make_unique_key_in_bucket(pic_fname) diff --git a/spec/qiniu/qiniu_spec.rb b/spec/qiniu/qiniu_spec.rb index 8128ea9..fc8418b 100755 --- a/spec/qiniu/qiniu_spec.rb +++ b/spec/qiniu/qiniu_spec.rb @@ -9,9 +9,7 @@ module Qiniu describe Qiniu do before :all do - Config.settings[:multi_region] = true - - @bucket = 'rubysdk-na0' + @bucket = BUCKET_NA0 @test_image_bucket = @bucket @key = Digest::SHA1.hexdigest Time.now.to_s diff --git a/spec/qiniu/upload_spec.rb b/spec/qiniu/upload_spec.rb index 481d2f1..ae1b1bb 100755 --- a/spec/qiniu/upload_spec.rb +++ b/spec/qiniu/upload_spec.rb @@ -10,8 +10,6 @@ module Qiniu module Storage shared_examples "Upload Specs" do before :all do - Config.settings[:multi_region] = true - @key = Digest::SHA1.hexdigest((Time.now.to_i+rand(100)).to_s) @key = make_unique_key_in_bucket(@key) puts "key=#{@key}" @@ -480,7 +478,7 @@ module Storage describe 'for na0 bucket' do before :all do - @bucket = 'rubysdk-na0' + @bucket = BUCKET_NA0 end include_examples 'Upload Specs' end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index dc5c7dd..be2dd84 100755 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -5,14 +5,16 @@ require 'rspec' require 'webmock' -if RUBY_ENGINE == 'jruby' && Gem::Version.create(RUBY_VERSION) < Gem::Version::create('2.3.0') - # Do nothing -else +BUCKET = ENV['BUCKET'] || 'rubysdk' +BUCKET_NA0 = ENV['BUCKET_NA0'] || 'rubysdk-na0' +BUCKET_BC = ENV['BUCKET_BC'] || 'rubysdk-bc' + +if RUBY_ENGINE != 'jruby' && Gem::Version.create(RUBY_VERSION) >= Gem::Version::create('2.5.0') require 'simplecov' - require 'codecov' + require 'simplecov-cobertura' + SimpleCov.formatter = SimpleCov::Formatter::CoberturaFormatter SimpleCov.start - SimpleCov.formatter = SimpleCov::Formatter::Codecov end RSpec.configure do |config|