class AliyunGreen::Client

Attributes

access_key_id[RW]
access_key_secret[RW]
api_version[RW]
enable_internal[RW]
endpoint[RW]

Public Class Methods

new(config) click to toggle source
# File lib/aliyun_green/client.rb, line 11
def initialize(config)
  self.endpoint          = config[:endpoint]
  self.api_version       = config[:api_version]
  self.access_key_id     = config[:access_key_id]
  self.access_key_secret = config[:access_key_secret]
  self.enable_internal   = config[:enable_internal]
end

Public Instance Methods

authorization(string_to_sign) click to toggle source
# File lib/aliyun_green/client.rb, line 68
def authorization(string_to_sign)
  "acs #{self.access_key_id}:#{signature(string_to_sign)}"
end
canonicalized_headers(headers) click to toggle source
# File lib/aliyun_green/client.rb, line 58
def canonicalized_headers(headers)
  headers.keys.select { |key| key.to_s.start_with? 'x-acs-' }
    .sort.map { |key| "#{key}:#{headers[key].strip}\n" }.join
end
canonicalized_resource(uri, query_hash = {}) click to toggle source
# File lib/aliyun_green/client.rb, line 63
def canonicalized_resource(uri, query_hash = {})
  query_string = query_hash.sort.map { |key, value| "#{key}=#{value}" }.join('&')
  query_string.empty? ? uri : "#{uri}?#{query_string}"
end
default_headers() click to toggle source
# File lib/aliyun_green/client.rb, line 76
def default_headers
  default_headers = {
    'accept' => 'application/json',
    'content-type' => 'application/json',
    'date' => Time.now.httpdate,
    'host' => get_host(self.endpoint),
    'x-acs-version' => self.api_version,
    'x-acs-signature-nonce' => SecureRandom.hex(16),
    'x-acs-signature-version' => '1.0',
    'x-acs-signature-method' => 'HMAC-SHA1',
  }
  default_headers
end
get_host(endpoint) click to toggle source
# File lib/aliyun_green/client.rb, line 90
def get_host(endpoint)
  externals = {
    'cn-shanghai' => 'green.cn-shanghai.aliyuncs.com',
    'cn-beijing' => 'green.cn-beijing.aliyuncs.com',
    'cn-shenzhen' => 'green.cn-shenzhen.aliyuncs.com',
    'ap-southeast-1' => 'green.ap-southeast-1.aliyuncs.com'
  }
  internals = {
    'cn-shanghai' => 'green-vpc.cn-shanghai.aliyuncs.com',
    'cn-beijing' => 'green-vpc.cn-beijing.aliyuncs.com',
    'cn-shenzhen' => 'green-vpc.cn-shenzhen.aliyuncs.com',
    'ap-southeast-1' => 'green-vpc.ap-southeast-1.aliyuncs.com'
  }
  if self.enable_internal
    internals[endpoint]
  else
    externals[endpoint]
  end
end
post(uri , tasks, params = {}) click to toggle source
# File lib/aliyun_green/client.rb, line 19
def post(uri , tasks, params = {})
  payload = {
    bizType: 'default',
    scenes: ["antispam"],
    tasks: tasks
  }

  url = "https://#{get_host(self.endpoint)}#{uri}"

  mix_headers = default_headers
  request_body = payload.to_json

  mix_headers['content-md5']    = Digest::MD5.base64digest request_body
  mix_headers['content-length'] = request_body.length.to_s

  string2sign = string_to_sign('/green/text/scan', mix_headers, params)
  mix_headers.merge!(authorization: authorization(string2sign))

  response = HTTPX.with(headers: mix_headers).post(url, body: payload.to_json)

  r =  JSON.parse(response)

  raise AliyunGreen::Error::SignatureDoesNotMatchError if r["Code"] == 'SignatureDoesNotMatch'
  raise AliyunGreen::Error::ClientError.new(r["msg"], r["code"]) if r["code"] != 200

  r
end
signature(string_to_sign) click to toggle source
# File lib/aliyun_green/client.rb, line 72
def signature(string_to_sign)
  Base64.encode64(OpenSSL::HMAC.digest('sha1', self.access_key_secret, string_to_sign)).strip
end
string_to_sign(uri, headers, query = {}) click to toggle source
# File lib/aliyun_green/client.rb, line 47
def string_to_sign(uri, headers, query = {})
  header_string = [
    'POST',
    headers['accept'],
    headers['content-md5'] || '',
    headers['content-type'] || '',
    headers['date'],
  ].join("\n")
  "#{header_string}\n#{canonicalized_headers(headers)}#{canonicalized_resource(uri, query)}"
end