lib/fir/util/ali_uploader.rb
# frozen_string_literal: true
require_relative './app_uploader'
module FIR
class AliUploader < AppUploader
def upload_icon
if skip_update_icon?
logger.info 'skip update icon...'
return
end
try_to_action('upload icon') do
# 拿到 icon 的授权
icon_url = uploading_info[:cert][:icon][:upload_url]
icon_info = uploading_icon_info
logger.debug "icon_url = #{icon_url}, icon_info = #{icon_info}"
put_file(icon_url, uploading_icon_info, uploading_info[:cert][:icon][:custom_headers], false)
callback_to_api(callback_url, callback_icon_information)
end
rescue StandardError => e
# ignore icon error
logger.info "ignore icon upload error #{e.message}"
end
def upload_binary
try_to_action 'upload binary ...' do
binary_url = uploading_info[:cert][:binary][:upload_url]
binary_info = uploading_binary_info
logger.debug "binary_url = #{binary_url}, binary_info = #{binary_info}"
headers = uploading_info[:cert][:binary][:custom_headers]
headers_copy = {
'CONTENT-DISPOSITION' => headers[:"CONTENT-DISPOSITION"],
'Content-Type' => headers[:"content-type"],
'date' => headers[:date],
'x-oss-date' => headers[:"x-oss-date"],
'authorization' => headers[:authorization]
}
logger.debug headers_copy
put_file(binary_url, binary_info, headers_copy)
callback_to_api(callback_url, callback_binary_information)
end
rescue StandardError => e
logger.error "binary upload to ali fail, #{e.message}"
exit 1
end
protected
def put_file(url, file, headers, need_progress = true)
uri = URI(url)
hostname = uri.hostname
File.open(file.path, 'rb') do |io|
t = Time.now
http = Net::HTTP.new(hostname, 443)
http.use_ssl = true
req = Net::HTTP::Put.new(uri.request_uri, headers)
req.content_length = io.size
req.body_stream = io
Net::HTTP::UploadProgress.new(req) do |progress|
if need_progress
if progress.upload_size == io.size
puts "upload finished"
else
if Time.now - t > 0.5
puts "progress: #{ ((progress.upload_size / io.size.to_f) * 100).round(2) }%"
t = Time.now
end
end
end
end
res = http.request(req)
end
# RestClient::Request.execute(
# method: 'PUT',
# url: url,
# payload: file,
# headers: headers,
# timeout: 300
# )
end
def callback_url
"#{fir_api[:base_url]}/auth/ali/callback"
end
def uploading_icon_info
File.new(icon_file_path, 'rb')
end
def uploading_binary_info
File.new(file_path, 'rb')
end
end
end