Class: AceClient::Query2

Inherits:
Base
  • Object
show all
Defined in:
lib/ace-client/query2.rb

Instance Attribute Summary collapse

Attributes inherited from Base

#access_key_id, #endpoint, #http_proxy, #last_response, #last_response_time, #secret_access_key, #use_ssl, #user_agent

Instance Method Summary collapse

Methods inherited from Base

#record_response, #set_http_proxy

Constructor Details

#initialize(options = {}) ⇒ Query2

Returns a new instance of Query2.



14
15
16
17
18
# File 'lib/ace-client/query2.rb', line 14

def initialize(options={})
  super(options)
  @signature_method = options[:signature_method] || 'HmacSHA256'
  @sampler = options[:sampler]
end

Instance Attribute Details

#http_methodObject

Returns the value of attribute http_method.



7
8
9
# File 'lib/ace-client/query2.rb', line 7

def http_method
  @http_method
end

#samplerObject

Returns the value of attribute sampler.



9
10
11
# File 'lib/ace-client/query2.rb', line 9

def sampler
  @sampler
end

#signature_methodObject

TODO: HMAC-SHA256 or HMAC-SHA1



8
9
10
# File 'lib/ace-client/query2.rb', line 8

def signature_method
  @signature_method
end

Instance Method Details

#action(action, params = {}) ⇒ Object



20
21
22
23
# File 'lib/ace-client/query2.rb', line 20

def action(action, params={})
  params.update('Action' => action)
  execute(params)
end

#canonical_query_stringObject



108
109
110
111
112
# File 'lib/ace-client/query2.rb', line 108

def canonical_query_string
  @params.sort.collect { |param|
    "#{CGI::escape(param[0])}=#{CGI::escape(param[1])}"
  }.join("&").gsub('+', '%20').gsub('%7E', '~')
end

#create_signatureObject



99
100
101
102
# File 'lib/ace-client/query2.rb', line 99

def create_signature
  digest = OpenSSL::Digest::Digest.new(@signature_method.downcase.gsub(/hmac/, ''))
  Base64.encode64(OpenSSL::HMAC.digest(digest, secret_access_key, string_to_sign)).strip
end

#dryrun(action, params = {}) ⇒ Object



25
26
27
28
# File 'lib/ace-client/query2.rb', line 25

def dryrun(action, params={})
  params.update('Action' => action)
  execute(params, true)
end

#endpoint_urlObject



94
95
96
97
# File 'lib/ace-client/query2.rb', line 94

def endpoint_url
  protocol = use_ssl ? 'https' : 'http' 
  protocol + '://' + endpoint
end

#execute(params = {}, dryrun = false) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/ace-client/query2.rb', line 30

def execute(params={}, dryrun=false)
  @params = params
  @params.update(
    'SignatureVersion' => '2',
    'SignatureMethod' => @signature_method,
    'AWSAccessKeyId' => @access_key_id,
    'Timestamp' => Time.now.getutc.iso8601.sub(/Z/, sprintf(".%03dZ",(Time.now.getutc.usec/1000)))
  )
  @params['Version'] = @version if @version
  @params['Signature'] = create_signature

  options = {
    :headers => {
      'Content-Type' => 'application/x-www-form-urlencoded;charset=UTF-8'
    },
    :query => @params
  }
  options[:headers]['User-Agent'] = @user_agent if @user_agent

  if http_method == :get
    http_method_class = Net::HTTP::Get
  elsif http_method == :post
    http_method_class = Net::HTTP::Post
  end

  request = HTTParty::Request.new(http_method_class, endpoint_url + @path, options)
  if dryrun
    request
  else
    sample_request(request) if @sampler
    response = record_response { request.perform }
    sample_response(response) if @sampler
    response
  end
end

#sample_request(request) ⇒ Object



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/ace-client/query2.rb', line 66

def sample_request(request)
  query = request.options[:query].dup
  variable_keys = %w(Version SignatureVersion SignatureMethod Timestamp AWSAccessKeyId Signature)
  variables = {}
  variable_keys.each do |key|
    variables[key] = query.delete(key)
  end
  action = query.delete('Action')
  @sampler[:output].puts "# #{action}"
  @sampler[:output].puts "## request"
  @sampler[:output].puts "#{request.path.to_s}"
  @sampler[:output].puts "    ?Action=#{action}"
  query.each do |key, value|
    @sampler[:output].puts "    &#{key}=#{CGI.escape(value)}"
  end
  variable_keys.each do |key|
    if variables[key]
      value = @sampler[:echo][key] || CGI.escape(variables[key])
      @sampler[:output].puts "    &#{key}=#{value}"
    end
  end
end

#sample_response(response) ⇒ Object



89
90
91
92
# File 'lib/ace-client/query2.rb', line 89

def sample_response(response)
  @sampler[:output].puts "## response"
  @sampler[:output].puts Nokogiri::XML(response.body).to_xml(:indent => 4)
end

#string_to_signObject



104
105
106
# File 'lib/ace-client/query2.rb', line 104

def string_to_sign
  [@http_method.to_s.upcase, @endpoint, @path, canonical_query_string].join("\n")
end