class QingCloud::SDK::Signer

Public Class Methods

do(input) click to toggle source
# File lib/qingcloud/sdk/request/signer.rb, line 24
def self.do(input)
  input[:request_params].each do |k, v|
    v = CGI.escape v.to_s.gsub(' ', '%20')
    input[:request_params][k] = v.gsub '%2520', '%20'
  end

  # build string_to_sign
  string_to_sign = "#{input[:request_method]}\n#{input[:config][:uri]}\n" \
                   "#{input[:request_params].sort.map { |k, v| "#{k}=#{v}" }.join('&')}"

  # build signature
  signature = Base64.encode64(
    OpenSSL::HMAC.digest(
      OpenSSL::Digest.new('sha256'),
      input[:config][:qy_secret_access_key].to_s,
      string_to_sign,
    ),
  ).strip
  signature.tr! ' ', '+'
  signature = CGI.escape signature

  input[:request_params][:signature] = signature

  Logger.debug "QingCloud request string to sign: [#{input[:id]}] #{string_to_sign}"
  Logger.debug "QingCloud request signature: [#{input[:id]}] #{signature}"
  input
end