204: def call(method, params)
205: params.merge!( {
206: 'Version' => '2007-11-07',
207: 'SignatureVersion' => '1',
208: 'AWSAccessKeyId' => @access_key_id,
209: 'Timestamp' => Time.now.gmtime.iso8601
210: }
211: )
212: data = ''
213: query = []
214:
215: params.keys.sort_by { |k| k.upcase }.each do |key|
216: data << "#{key}#{params[key].to_s}"
217: query << "#{key}=#{CGI::escape(params[key].to_s)}"
218: end
219:
220: digest = OpenSSL::Digest::Digest.new('sha1')
221: hmac = OpenSSL::HMAC.digest(digest, @secret_access_key, data)
222: signature = Base64.encode64(hmac).strip
223: query << "Signature=#{CGI::escape(signature)}"
224: query = query.join('&')
225: url = "#{@base_url}?#{query}"
226: uri = URI.parse(url)
227:
228:
229:
230: response = execute_request(nil) {
231: Net::HTTP.new(uri.host, uri.port).send_request(method, uri.request_uri)
232: }
233:
234: if !response.nil?
235:
236: @debug.puts("#{response.code}\n#{response.body}") if @debug
237: raise(ConnectionError.new(response)) unless (200..400).include?(
238: response.code.to_i
239: )
240:
241:
242: doc = REXML::Document.new(response.body)
243: error = doc.get_elements('*/Errors/Error')[0]
244: raise(
245: Module.class_eval(
246: "Rudy::AWS::SDB::#{error.get_elements('Code')[0].text}Error"
247: ).new(
248: error.get_elements('Message')[0].text,
249: doc.get_elements('*/RequestID')[0].text
250: )
251: ) unless error.nil?
252: else
253: doc = nil
254: end
255: doc
256: end