class Aliyun::Services::Base

Attributes

access_key_id[RW]
access_key_secret[RW]

Public Class Methods

new(options) click to toggle source
# File lib/aliyun/services/base.rb, line 17
def initialize(options)
  self.access_key_id = options[:access_key_id]
  self.access_key_secret = options[:access_key_secret]
end

Private Class Methods

load_service_action_definitions(service_name) click to toggle source
# File lib/aliyun/services/base.rb, line 166
def self.load_service_action_definitions(service_name)
  @@service_action_definitions ||= {}
  @@service_action_definitions[service_name] ||=  Dir["#{api_definition_dir}/#{service_name}/*.yml"].map do |file|
                                                    File.basename(file, '.yml')
                                                  end.reduce({}) do |actions, action_name|
                                                    actions[action_name.to_sym] = Aliyun::Utils.symbolize_hash_keys(
                                                      YAML::load_file("#{api_definition_dir}/#{service_name}/#{action_name}.yml")
                                                    )
                                                    actions
                                                  end
end
load_service_definition(service_name) click to toggle source
# File lib/aliyun/services/base.rb, line 158
def self.load_service_definition(service_name)
  @@service_definition ||= {}
  @@service_definition[service_name] ||= Aliyun::Utils.symbolize_hash_keys(
    YAML::load_file("#{api_definition_dir}/#{service_name}.yml")
  )
end

Public Instance Methods

api_version() click to toggle source
# File lib/aliyun/services/base.rb, line 63
def api_version
  service_definition[:version]
end
base_url() click to toggle source
# File lib/aliyun/services/base.rb, line 39
def base_url
  "#{request_schema}://#{request_host}"
end
http_method() click to toggle source
# File lib/aliyun/services/base.rb, line 71
def http_method
  'GET'
end
method_missing(method, *args, &block) click to toggle source
Calls superclass method
# File lib/aliyun/services/base.rb, line 22
def method_missing(method, *args, &block)
  if service_actions.include?(action = method.to_sym)
    params = args[0].nil? ? {} : args[0]
    send_request(action, params)
  else
    super
  end
end
name() click to toggle source
# File lib/aliyun/services/base.rb, line 47
def name
  self.class::NAME
end
request_host() click to toggle source
# File lib/aliyun/services/base.rb, line 51
def request_host
  service_definition[:host]
end
request_schema() click to toggle source
# File lib/aliyun/services/base.rb, line 55
def request_schema
  service_definition[:schema] || Aliyun.config.default_schema || 'https'
end
respond_to?(method, include_private = false) click to toggle source
Calls superclass method
# File lib/aliyun/services/base.rb, line 31
def respond_to?(method, include_private = false)
  if service_actions.include?(method.to_sym)
    true
  else
    super
  end
end
response_format() click to toggle source
# File lib/aliyun/services/base.rb, line 59
def response_format
  service_definition[:format] || Aliyun.config.default_format || 'JSON'
end
secure?() click to toggle source
# File lib/aliyun/services/base.rb, line 43
def secure?
  request_schema == 'https'
end
separator() click to toggle source
# File lib/aliyun/services/base.rb, line 67
def separator
  "&"
end
service_action_definitions() click to toggle source
# File lib/aliyun/services/base.rb, line 87
def service_action_definitions
  self.class.load_service_action_definitions(name)
end
service_actions() click to toggle source
# File lib/aliyun/services/base.rb, line 83
def service_actions
  service_action_definitions.keys
end
service_definition() click to toggle source
# File lib/aliyun/services/base.rb, line 79
def service_definition
  self.class.load_service_definition(name)
end
signature_method() click to toggle source
# File lib/aliyun/services/base.rb, line 75
def signature_method
  Aliyun::SignatureMethods[service_definition[:signature_method]]
end

Private Instance Methods

default_params(action) click to toggle source
# File lib/aliyun/services/base.rb, line 141
def default_params(action)
  {
    'Format'            => response_format,
    'Version'           => api_version,
    'Action'            => service_action_definitions[action][:action],
    'AccessKeyId'       => access_key_id,
    'Timestamp'         => Time.now.utc.iso8601,
    'SignatureMethod'   => signature_method.name,
    'SignatureVersion'  => signature_method.version,
    'SignatureNonce'    => SecureRandom.uuid
  }
end
generate_request_params(action, params) click to toggle source
# File lib/aliyun/services/base.rb, line 113
def generate_request_params(action, params)
  params = process_params(action, params)
  logger.debug params
  params = params.merge(default_params(action))
  logger.debug params
  params['Signature'] = signature_method.generate(params, self)
  logger.debug params
  params
end
logger() click to toggle source
# File lib/aliyun/services/base.rb, line 154
def logger
  Aliyun.config.logger || Logger.new(STDOUT)
end
process_data(action, data) click to toggle source
# File lib/aliyun/services/base.rb, line 133
def process_data(action, data)
  JSON.parse(data)
end
process_error(action, error_code, error_message) click to toggle source
# File lib/aliyun/services/base.rb, line 137
def process_error(action, error_code, error_message)
  Aliyun::Errors::Base.new("Response code: #{error_code}, message: #{error_message}")
end
process_params(action, params) click to toggle source
# File lib/aliyun/services/base.rb, line 123
def process_params(action, params)
  param_definitions = service_action_definitions[action][:parameters]
  params.reduce({}) do |new_params, (k,v)|
    unless param_definitions[k].nil?
      new_params[param_definitions[k][:parameter]] = v
    end
    new_params
  end
end
send_request(action, params) click to toggle source
# File lib/aliyun/services/base.rb, line 93
def send_request(action, params)
  uri = URI(base_url)
  uri.query = URI.encode_www_form(generate_request_params(action, params))

  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = secure?
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE

  request = Net::HTTP::Get.new(uri.request_uri)
  logger.debug uri.request_uri
  response = http.request(request)

  case response
  when Net::HTTPSuccess
    return process_data(action, response.body)
  else
    raise process_error(action, response.code, response.body)
  end
end