class AWS::S3::Request

@api private

def add_authorization! credentials

def add_authorization! credentials
  if token = credentials.session_token
    headers["x-amz-security-token"] = token
  end
  secret = credentials.secret_access_key
  signature = Core::Signer.sign(secret, string_to_sign, 'sha1')
  signature = URI.escape(signature)
  headers["authorization"] = "AWS #{credentials.access_key_id}:#{signature}"
end

def canonicalized_headers


is generated.
See the developer guide for more information on how this element

CanonicalizedAmzHeaders
def canonicalized_headers
  x_amz = headers.select{|name, value| name.to_s =~ /^x-amz-/i }
  x_amz = x_amz.collect{|name, value| [name.downcase, value] }
  x_amz = x_amz.sort_by{|name, value| name }
  x_amz = x_amz.collect{|name, value| "#{name}:#{value.to_s.strip}" }.join("\n")
  x_amz == '' ? nil : x_amz
end

def canonicalized_resource


"?logging", or "?torrent"];
[ sub-resource, if present. e.g. "?acl", "?location",
+
[ "/" ` Bucket ] `
CanonicalizedResource =

From the S3 developer guide
def canonicalized_resource
  parts = []
  # virtual hosted-style requests require the hostname to appear
  # in the canonicalized resource prefixed by a forward slash.
  if Client.dns_compatible_bucket_name?(bucket) and !path_style?
    parts << "/#{bucket}"
  end
  # all requests require the portion of the un-decoded uri up to
  # but not including the query string
  parts << path
  # lastly any sub resource querystring params need to be appened
  # in lexigraphical ordered joined by '&' and prefixed by '?'
  params = (sub_resource_params + query_parameters_for_signature)
  unless params.empty?
    parts << '?'
    parts << params.sort.collect{|p| p.to_s }.join('&')
  end
  parts.join
end

def host

def host
  path_style? ? @host : "#{bucket}.#{@host}"
end

def metadata= metadata

def metadata= metadata
  Array(metadata).each do |name, value|
    headers["x-amz-meta-#{name}"] = value
  end
end

def path_style?

def path_style?
  if force_path_style
    true
  else
    Client.path_style_bucket_name?(bucket)
  end
end

def query_parameters

def query_parameters
  %w(response-content-type response-content-language
     response-expires response-cache-control
     response-content-disposition response-content-encoding)
end

def query_parameters_for_signature

def query_parameters_for_signature
  params.select { |p| self.class.query_parameters.include?(p.name) }
end

def server_side_encryption= sse

def server_side_encryption= sse
  if sse.is_a?(Symbol)
    headers['x-amz-server-side-encryption'] = sse.to_s.upcase
  elsif sse
    headers['x-amz-server-side-encryption'] = sse
  end
end

def signing_string_date

def signing_string_date
  # if a date is provided via x-amz-date then we should omit the
  # Date header from the signing string (should appear as a blank line)
  if headers.detect{|k,v| k.to_s =~ /^x-amz-date$/i }
    ''
  else
    headers['date'] ||= Time.now.httpdate
  end
end

def storage_class= storage_class

def storage_class= storage_class
  if storage_class.kind_of?(Symbol)
    headers["x-amz-storage-class"] = storage_class.to_s.upcase
  elsif storage_class
    headers["x-amz-storage-class"] = storage_class
  end
end

def string_to_sign


CanonicalizedAmzHeaders + CanonicalizedResource;
date ` "\n" `
content-type ` "\n" `
content-md5 ` "\n" `
HTTP-Verb ` "\n" `
StringToSign =

From the S3 developer guide:
def string_to_sign
  [
    http_method,
    headers.values_at('content-md5', 'content-type').join("\n"),
    signing_string_date,
    canonicalized_headers,
    canonicalized_resource,
  ].flatten.compact.join("\n")
end

def sub_resource_params

def sub_resource_params
  params.select{|p| self.class.sub_resources.include?(p.name) }
end

def sub_resources

def sub_resources
  %w(acl location logging notification partNumber policy
     requestPayment torrent uploadId uploads versionId
     versioning versions restore delete lifecycle tagging cors
     website
    )
end

def uri

def uri
  parts = []
  parts << bucket if bucket and path_style?
  parts << escape_path(key) if key
  path = '/' + parts.join('/')
  querystring = url_encoded_params
  uri = ''
  uri << path
  uri << "?#{querystring}" if querystring
  uri
end