class Aliyun::SLB::Service

Attributes

access_key_id[RW]
access_key_secret[RW]
endpoint_url[RW]
options[RW]

Public Class Methods

new(options={}) click to toggle source
# File lib/aliyun/slb.rb, line 16
def initialize(options={})
  self.access_key_id = options[:access_key_id] || $ACCESS_KEY_ID || ""
  self.access_key_secret = options[:access_key_secret] || $ACCESS_KEY_SECRET || ""
  self.endpoint_url = options[:endpoint_url] || $ENDPOINT_URL || ALIYUN_API_ENDPOINT
  self.options = {:AccessKeyId => self.access_key_id}
end

Public Instance Methods

method_missing(method, *args) click to toggle source
# File lib/aliyun/slb.rb, line 23
def method_missing(method, *args)
  if $DEBUG
    puts "Not Found Method: #{method}"
  end

  if args[0].nil?
    raise AliyunAPIException.new "Method missing: #{method}!"
  end

  call_aliyun_with_parameter(method, args[0])
end

Private Instance Methods

calculate_signature(key, string_to_sign) click to toggle source

calculate the signature

# File lib/aliyun/slb.rb, line 107
def calculate_signature key, string_to_sign
  hmac = HMAC::SHA1.new(key)
  hmac.update(string_to_sign)
  signature = Base64.encode64(hmac.digest).gsub("\n", '')
  if $DEBUG
    puts "Signature #{signature}"
  end
  signature
end
call_aliyun_with_parameter(method, params) click to toggle source

Dispatch the request with parameter

# File lib/aliyun/slb.rb, line 37
def call_aliyun_with_parameter(method, params)
  params = gen_request_parameters method, params
  uri = URI(endpoint_url)

  uri.query = URI.encode_www_form(params)

  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = (uri.scheme == "https")

  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  if $DEBUG
    puts "Request URI: #{uri.request_uri}"
  end

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

  case response
  when Net::HTTPSuccess
    return JSON.parse(response.body)
  else
    raise AliyunAPIException.new "Response code: #{response.code}, message: #{response.body}"
  end
end
compute_signature(params) click to toggle source

compute the signature of the parameters String

# File lib/aliyun/slb.rb, line 78
def compute_signature params
  if $DEBUG
    puts "keys before sorted: #{params.keys}"
  end

  sorted_keys = params.keys.sort

  if $DEBUG
    puts "keys after sorted: #{sorted_keys}"
  end

  canonicalized_query_string = ""

  canonicalized_query_string = sorted_keys.map {|key|
    "%s=%s" % [safe_encode(key.to_s), safe_encode(params[key])]
  }.join(SEPARATOR)

  length = canonicalized_query_string.length

  string_to_sign = HTTP_METHOD + SEPARATOR + safe_encode('/') + SEPARATOR + safe_encode(canonicalized_query_string)

  if $DEBUG
    puts "string_to_sign is #{string_to_sign}"
  end

  signature = calculate_signature access_key_secret+"&", string_to_sign
end
gen_request_parameters(method, params) click to toggle source

generate the parameters

# File lib/aliyun/slb.rb, line 63
def gen_request_parameters method, params
  #add common parameters
  params.merge! DEFAULT_PARAMETERS

  params.merge! self.options

  params[:Action] = method.to_s
  params[:TimeStamp] = Time.now.utc.iso8601
  params[:SignatureNonce] = SecureRandom.uuid
  params[:Signature] = compute_signature params

  params
end
safe_encode(value) click to toggle source

encode the value to aliyun’s requirement

# File lib/aliyun/slb.rb, line 118
def safe_encode value
  value = URI.encode_www_form_component(value).gsub(/\+/,'%20').gsub(/\*/,'%2A').gsub(/%7E/,'~')
end