class Aliyun::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_ruby_api/service.rb, line 26 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_name, *args)
click to toggle source
The method entry to call ECS url method
# File lib/aliyun_ruby_api/service.rb, line 38 def method_missing(method_name, *args) if $DEBUG puts "Not Found Method: #{method_name}" end if args[0].nil? raise AliyunAPIException.new "No such method #{method_name}!" end call_aliyun_with_parameter(method_name, args[0]) end
Private Instance Methods
calculate_signature(key, string_to_sign)
click to toggle source
calculate the signature
# File lib/aliyun_ruby_api/service.rb, line 133 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_name, params)
click to toggle source
Dispatch the request with parameter
# File lib/aliyun_ruby_api/service.rb, line 52 def call_aliyun_with_parameter(method_name, params) params = gen_request_parameters method_name, params uri = URI(endpoint_url) uri.query = URI.encode_www_form(params) http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true if (uri.scheme == "https") http.verify_mode = OpenSSL::SSL::VERIFY_NONE if $DEBUG puts "request url: #{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 error code: #{response.code} and details #{response.body}" end end
compute_signature(params)
click to toggle source
compute the signature of the parameters String
# File lib/aliyun_ruby_api/service.rb, line 101 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 = "" sorted_keys.each {|key| canonicalized_query_string << SEPARATOR canonicalized_query_string << percent_encode(key.to_s) canonicalized_query_string << '=' canonicalized_query_string << percent_encode(params[key]) } length = canonicalized_query_string.length string_to_sign = HTTP_METHOD + SEPARATOR + percent_encode('/') + SEPARATOR + percent_encode(canonicalized_query_string[1,length]) 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_name, params)
click to toggle source
generate the parameters
# File lib/aliyun_ruby_api/service.rb, line 83 def gen_request_parameters method_name, params #add common parameters params.merge! DEFAULT_PARAMETERS params.merge! self.options params[:Action] = method_name.to_s params[:TimeStamp] = Time.now.utc.iso8601 params[:SignatureNonce] = SecureRandom.uuid params[:Signature] = compute_signature params params end
percent_encode(value)
click to toggle source
encode the value to aliyun's requirement
# File lib/aliyun_ruby_api/service.rb, line 144 def percent_encode value value = URI.encode_www_form_component(value).gsub(/\+/,'%20').gsub(/\*/,'%2A').gsub(/%7E/,'~') end