module AWS::Core::Signature::Version3

def add_authorization!(signer)

def add_authorization!(signer)
  self.access_key_id = signer.access_key_id
  headers["x-amz-date"] ||= (headers["date"] ||= Time.now.rfc822)
  headers["host"] ||= host
  headers["x-amz-security-token"] = signer.session_token if 
    signer.respond_to?(:session_token) and signer.session_token
  # compute the authorization
  request_hash = OpenSSL::Digest::SHA256.digest(string_to_sign)
  signature = signer.sign(request_hash)
  headers["x-amzn-authorization"] =
    "AWS3 "+
    "AWSAccessKeyId=#{signer.access_key_id},"+
    "Algorithm=HmacSHA256,"+
    "SignedHeaders=#{headers_to_sign.join(';')},"+
    "Signature=#{signature}"
end

def add_authorization!(signer)

def add_authorization!(signer)
  self.access_key_id = signer.access_key_id
  headers["x-amz-date"] ||= (headers["date"] ||= Time.now.rfc822)
  headers["host"] ||= host
  headers["x-amz-security-token"] = signer.session_token if 
    signer.respond_to?(:session_token) and signer.session_token
  # compute the authorization
  request_hash = OpenSSL::Digest::SHA256.digest(string_to_sign)
  signature = signer.sign(request_hash)
  headers["x-amzn-authorization"] =
    "AWS3 "+
    "AWSAccessKeyId=#{signer.access_key_id},"+
    "Algorithm=HmacSHA256,"+
    "SignedHeaders=#{headers_to_sign.join(';')},"+
    "Signature=#{signature}"
end

def canonical_headers

def canonical_headers
  headers_to_sign.map do |name|
    value = headers[name]
    "#{name.downcase.strip}:#{value.strip}\n"
  end.sort.join
end

def canonical_headers

def canonical_headers
  headers_to_sign.map do |name|
    value = headers[name]
    "#{name.downcase.strip}:#{value.strip}\n"
  end.sort.join
end

def headers_to_sign

def headers_to_sign
  headers.keys.select do |header|
      header == "host" ||
      header == "content-encoding" ||
      header =~ /^x-amz/
  end
end

def headers_to_sign

def headers_to_sign
  headers.keys.select do |header|
      header == "host" ||
      header =~ /^x-amz/
  end
end

def string_to_sign

def string_to_sign
  [
    http_method,
    "/",
    "",
    canonical_headers,
    body
  ].join("\n")
end

def string_to_sign

def string_to_sign
  [
    http_method,
    "/",
    "",
    canonical_headers,
    body
  ].join("\n")
end