class Amazon::Ecs

Constants

OPENSSL_DIGEST
OPENSSL_DIGEST_SUPPORT
SERVICE_URLS
VERSION

Public Class Methods

browse_node_lookup(browse_node_id, opts = {}) click to toggle source

Browse node lookup by node ID.

# File lib/amazon/ecs.rb, line 114
def self.browse_node_lookup(browse_node_id, opts = {})
  opts[:operation] = 'BrowseNodeLookup'
  opts[:browse_node_id] = browse_node_id

  self.send_request(opts)
end
configure() { |options| ... } click to toggle source
# File lib/amazon/ecs.rb, line 84
def self.configure(&proc)
  raise ArgumentError, "Block is required." unless block_given?
  yield @@options
end
debug() click to toggle source

Get debug flag.

# File lib/amazon/ecs.rb, line 75
def self.debug
  @@debug
end
debug=(dbg) click to toggle source

Set debug flag to true or false.

# File lib/amazon/ecs.rb, line 80
def self.debug=(dbg)
  @@debug = dbg
end
item_lookup(item_id, opts = {}) click to toggle source

Search an item by ASIN no.

# File lib/amazon/ecs.rb, line 106
def self.item_lookup(item_id, opts = {})
  opts[:operation] = 'ItemLookup'
  opts[:item_id] = item_id

  self.send_request(opts)
end
options() click to toggle source

Default search options

# File lib/amazon/ecs.rb, line 65
def self.options
  @@options
end
options=(opts) click to toggle source

Set default search options

# File lib/amazon/ecs.rb, line 70
def self.options=(opts)
  @@options = opts
end
send_request(opts) click to toggle source

Generic send request to ECS REST service. You have to specify the :operation parameter.

# File lib/amazon/ecs.rb, line 130
def self.send_request(opts)
  opts = self.options.merge(opts) if self.options

  # Include other required options
  opts[:timestamp] = Time.now.utc.strftime("%Y-%m-%dT%H:%M:%SZ")

  request_url = prepare_url(opts)
  log "Request URL: #{request_url}"

  res = Net::HTTP.get_response(URI::parse(request_url))
  unless res.kind_of? Net::HTTPSuccess
    raise Amazon::RequestError, "HTTP Response: #{res.code} #{res.message}"
  end
  Response.new(res.body)
end
similarity_lookup(item_id, opts = {}) click to toggle source

Similarity lookup by item ID.

# File lib/amazon/ecs.rb, line 122
def self.similarity_lookup(item_id, opts = {})
  opts[:operation] = 'SimilarityLookup'
  opts[:item_id] = item_id

  self.send_request(opts)
end
validate_request(opts) click to toggle source
# File lib/amazon/ecs.rb, line 146
def self.validate_request(opts)
  raise Amazon::RequestError, "" if opts[:associate_tag]
end

Protected Class Methods

log(s) click to toggle source
# File lib/amazon/ecs.rb, line 241
def self.log(s)
  return unless self.debug
  if defined? RAILS_DEFAULT_LOGGER
    RAILS_DEFAULT_LOGGER.error(s)
  elsif defined? LOGGER
    LOGGER.error(s)
  else
    puts s
  end
end

Private Class Methods

camelize(s) click to toggle source
# File lib/amazon/ecs.rb, line 297
def self.camelize(s)
  s.to_s.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }
end
prepare_url(opts) click to toggle source
# File lib/amazon/ecs.rb, line 253
def self.prepare_url(opts)
  country = opts.delete(:country)
  country = (country.nil?) ? 'us' : country
  request_url = SERVICE_URLS[country.to_sym]
  raise Amazon::RequestError, "Invalid country '#{country}'" unless request_url

  secret_key = opts.delete(:AWS_secret_key)
  request_host = URI.parse(request_url).host

  qs = ''

  opts = opts.collect do |a,b|
    [camelize(a.to_s), b.to_s]
  end

  opts = opts.sort do |c,d|
    c[0].to_s <=> d[0].to_s
  end

  opts.each do |e|
    log "Adding #{e[0]}=#{e[1]}"
    next unless e[1]
    e[1] = e[1].join(',') if e[1].is_a? Array
    # v = URI.encode(e[1].to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
    v = self.url_encode(e[1].to_s)
    qs << "&" unless qs.length == 0
    qs << "#{e[0]}=#{v}"
  end

  signature = ''
  unless secret_key.nil?
    request_to_sign="GET\n#{request_host}\n/onca/xml\n#{qs}"
    signature = "&Signature=#{sign_request(request_to_sign, secret_key)}"
  end

  "#{request_url}?#{qs}#{signature}"
end
sign_request(url, key) click to toggle source
# File lib/amazon/ecs.rb, line 301
def self.sign_request(url, key)
  return nil if key.nil?

  if OPENSSL_DIGEST_SUPPORT
    signature = OpenSSL::HMAC.digest(OPENSSL_DIGEST, key, url)
    signature = [signature].pack('m').chomp
  else
    signature = Base64.encode64(HMAC::SHA256.digest(key, url)).strip
  end
  signature = CGI.escape(signature)
  return signature
end
url_encode(string) click to toggle source
# File lib/amazon/ecs.rb, line 291
def self.url_encode(string)
  string.gsub( /([^a-zA-Z0-9_.~-]+)/ ) do
    '%' + $1.unpack( 'H2' * $1.bytesize ).join( '%' ).upcase
  end
end