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

#endpoint_url, #record_response, #set_http_proxy

Constructor Details

#initialize(options = {}) ⇒ Query2

debug_output $stderr



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

def initialize(options={})
  super(options)
  @signature_method = options[:signature_method] || 'HmacSHA256'
  @sampler = options[:sampler]
  @before_signature = options[:before_signature]
  @before_request = options[:before_request]
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



22
23
24
25
# File 'lib/ace-client/query2.rb', line 22

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

#canonical_query_stringObject



112
113
114
115
116
# File 'lib/ace-client/query2.rb', line 112

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

#create_signatureObject



101
102
103
104
# File 'lib/ace-client/query2.rb', line 101

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



27
28
29
30
# File 'lib/ace-client/query2.rb', line 27

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

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



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
65
66
67
68
69
70
71
# File 'lib/ace-client/query2.rb', line 32

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

  @before_signature.call(@params) if @before_signature

  @params['Signature'] = create_signature

  options = self.class.default_options.dup
  options[:headers] = {}
  options[:headers]['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'
  options[:headers]['User-Agent'] = @user_agent if @user_agent
  options[:headers].update(@headers)

  if http_method == :get
    options[:query] = @params
    http_method_class = Net::HTTP::Get
  elsif http_method == :post
    options[:body] = @params
    http_method_class = Net::HTTP::Post
  end

  @before_request.call(@params) if @before_request

  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



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/ace-client/query2.rb', line 73

def sample_request(request)
  query = (request.options[:query] || request.options[:body]).dup
  variable_keys = %W(Version SignatureVersion SignatureMethod Timestamp #{access_key_id_key} 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



96
97
98
99
# File 'lib/ace-client/query2.rb', line 96

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

#string_to_signObject



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

def string_to_sign
  host = @host ? @host : @endpoint 
  host = @host_with_port ? host : host.gsub(/\:\d+$/, '')
  [@http_method.to_s.upcase, host, @path, canonical_query_string].join("\n")
end