class GrapeAPISignature::AWSRequest

Constants

RFC8601BASIC

Attributes

body[RW]
digester[RW]
headers[RW]
method[RW]
service[RW]
uri[RW]

Public Class Methods

formatted_time(time) click to toggle source
# File lib/grape_api_signature/aws_request.rb, line 13
def self.formatted_time(time)
  time.utc.strftime(RFC8601BASIC)
end
new(method, uri, headers, body, digester = GrapeAPISignature::AWSDigester) click to toggle source
# File lib/grape_api_signature/aws_request.rb, line 17
def initialize(method, uri, headers, body, digester = GrapeAPISignature::AWSDigester)
  self.method = method.upcase
  self.uri = uri
  self.headers = headers.each_with_object({}) { |(key, value), result_hash| result_hash[key.downcase] = (value || '').strip }
  self.body = body
  self.service = uri.host.split('.', 2)[0]
  self.digester = digester
end

Public Instance Methods

canonical_request() click to toggle source
# File lib/grape_api_signature/aws_request.rb, line 26
def canonical_request
  [
    method,
    clean_path,
    query_string,
    headers_as_str + "\n",
    headers.keys.sort.join(';'),
    digester.hexdigest(body || '')
  ].join("\n")
end
date() click to toggle source
# File lib/grape_api_signature/aws_request.rb, line 42
def date
  datetime[0, 8]
end
datetime() click to toggle source
# File lib/grape_api_signature/aws_request.rb, line 37
def datetime
  date_header = headers['date'] || headers['x-amz-date']
  self.class.formatted_time(date_header ? Time.parse(date_header) : Time.now)
end

Protected Instance Methods

clean_path() click to toggle source
# File lib/grape_api_signature/aws_request.rb, line 52
def clean_path
  path = Pathname.new(uri.path).cleanpath.to_s
  path << '/' if uri.path.end_with?('/') && !path.end_with?('/')
  path
end
headers_as_str() click to toggle source
# File lib/grape_api_signature/aws_request.rb, line 48
def headers_as_str
  headers.sort.map { |k, v| [k, v].join(':') }.join("\n")
end
query_string() click to toggle source
# File lib/grape_api_signature/aws_request.rb, line 58
def query_string
  return nil if uri.query.nil?
  uri.query.split('&').sort.join('&')
end