module Jeff

Jeff mixes in client behaviour for Amazon Web Services (AWS) that require Signature version 2 authentication.

Constants

VERSION

Attributes

aws_access_key_id[W]
aws_endpoint[RW]
aws_secret_access_key[W]

Public Class Methods

included(base) click to toggle source
Calls superclass method
# File lib/jeff.rb, line 91
def self.included(base)
  base.extend(ClassMethods)

  # Common parameters required by all AWS requests.
  #
  # Add other common parameters using `Jeff.params` if required in your
  # implementation.
  base.params(
    'AWSAccessKeyId' => -> { aws_access_key_id },
    'SignatureVersion' => '2',
    'SignatureMethod' => 'HmacSHA256',
    'Timestamp' => -> { Time.now.utc.iso8601 }
  )

  super
end

Public Instance Methods

aws_access_key_id() click to toggle source
# File lib/jeff.rb, line 121
def aws_access_key_id
  @aws_access_key_id || ENV['AWS_ACCESS_KEY_ID']
end
aws_secret_access_key() click to toggle source
# File lib/jeff.rb, line 125
def aws_secret_access_key
  @aws_secret_access_key || ENV['AWS_SECRET_ACCESS_KEY']
end
connection() click to toggle source

A reusable HTTP connection.

# File lib/jeff.rb, line 109
def connection
  @connection ||= Excon.new(aws_endpoint, connection_params)
end
connection_params() click to toggle source
# File lib/jeff.rb, line 113
def connection_params
  @connection_params ||= default_connection_params
end
proxy=(url) click to toggle source
# File lib/jeff.rb, line 129
def proxy=(url)
  connection_params.store(:proxy, url)
end

Private Instance Methods

add_md5_digest(options) click to toggle source
# File lib/jeff.rb, line 156
def add_md5_digest(options)
  return unless options.key?(:body)

  md5 = Content.new(options[:body]).md5
  query = options[:query] ||= {}
  query.store('ContentMD5Value', md5)
end
default_connection_params() click to toggle source
# File lib/jeff.rb, line 148
def default_connection_params
  {
    headers: { 'User-Agent' => self.class.user_agent },
    expects: 200,
    omit_default_port: true
  }
end
default_query_values() click to toggle source
# File lib/jeff.rb, line 186
def default_query_values
  self.class.params
      .reduce({}) do |qv, (k, v)|
    v = v.respond_to?(:call) ? instance_exec(&v) : v

    # Ignore keys with nil values
    v.nil? ? qv : qv.update(k => v)
  end
end
move_query_to_body(options) click to toggle source
# File lib/jeff.rb, line 178
def move_query_to_body(options)
  return if options[:body]

  options[:headers] ||= {}
  options[:headers].store('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8')
  options.store(:body, options.delete(:query))
end
sign(options) click to toggle source
# File lib/jeff.rb, line 164
def sign(options)
  # Build query string.
  query_values = default_query_values.merge(options.fetch(:query, {}))
  query_string = Query.new(query_values).to_s

  # Generate signature.
  signature = Signer
              .new(options[:method], connection.data[:host], options[:path] || connection.data[:path], query_string)
              .sign_with(aws_secret_access_key)

  # Append escaped signature to query.
  options.store(:query, "#{query_string}&Signature=#{Utils.escape(signature)}")
end