lib/ace-client/query2.rb in ace-client-0.0.2 vs lib/ace-client/query2.rb in ace-client-0.0.3
- old
+ new
@@ -1,45 +1,95 @@
require 'openssl'
require 'cgi'
+require 'nokogiri'
module AceClient
class Query2 < Base
attr_accessor :http_method
attr_accessor :signature_method # TODO: HMAC-SHA256 or HMAC-SHA1
+ attr_accessor :sampler
format :xml
- #debug_output $stderr
+ debug_output $stderr
def initialize(options={})
super(options)
@signature_method = options[:signature_method] || 'HmacSHA256'
+ @sampler = options[:sampler]
end
def action(action, params={})
params.update('Action' => action)
execute(params)
end
- def execute(params={})
+ def dryrun(action, params={})
+ params.update('Action' => action)
+ execute(params, true)
+ end
+
+ 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
- response = record_response do
- response = self.class.send(
- http_method,
- endpoint_url + @path,
- :headers => {'Content-Type' => 'application/x-www-form-urlencoded;charset=UTF-8', 'User-Agent' => 'ace-client v0.0.1'},
- :query => @params
- )
+ 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
- response
+
+ 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
+
+ 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
+
+ def sample_response(response)
+ @sampler[:output].puts "## response"
+ @sampler[:output].puts Nokogiri::XML(response.body).to_xml(:indent => 4)
end
def endpoint_url
protocol = use_ssl ? 'https' : 'http'
protocol + '://' + endpoint