class AWS::S3::Request

@private

Attributes

bucket[RW]

@return [bucket] S3 bucket name

force_path_style[RW]

@private

key[RW]

@return [String] S3 object key

service_path[RW]

@private

Public Class Methods

query_parameters() click to toggle source
# File lib/aws/s3/request.rb, line 191
def query_parameters
  %w(response-content-type response-content-language
     response-expires response-cache-control
     response-content-disposition response-content-encoding)
end
sub_resources() click to toggle source
# File lib/aws/s3/request.rb, line 183
def sub_resources
  %w(acl location logging notification partNumber policy
     requestPayment torrent uploadId uploads versionId
     versioning versions restore delete lifecycle tagging cors
     website
    )
end

Public Instance Methods

add_authorization!(credentials) click to toggle source
# File lib/aws/s3/request.rb, line 170
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
canonicalized_headers() click to toggle source

CanonicalizedAmzHeaders

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

# File lib/aws/s3/request.rb, line 154
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
canonicalized_resource() click to toggle source

From the S3 developer guide

CanonicalizedResource =
  [ "/" + Bucket ] +
  <HTTP-Request-URI, from the protocol name up to the querystring> +
  [ sub-resource, if present. e.g. "?acl", "?location",
  "?logging", or "?torrent"];
# File lib/aws/s3/request.rb, line 124
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
host() click to toggle source
# File lib/aws/s3/request.rb, line 59
def host
  path_style? ? @host : "#{bucket}.#{@host}"
end
metadata=(metadata) click to toggle source
# File lib/aws/s3/request.rb, line 37
def metadata= metadata
  Array(metadata).each do |name, value|
    headers["x-amz-meta-#{name}"] = value
  end
end
path_style?() click to toggle source
# File lib/aws/s3/request.rb, line 63
def path_style?
  if force_path_style
    true
  else
    Client.path_style_bucket_name?(bucket)
  end
end
query_parameters_for_signature() click to toggle source
# File lib/aws/s3/request.rb, line 166
def query_parameters_for_signature
  params.select { |p| self.class.query_parameters.include?(p.name) }
end
server_side_encryption=(sse) click to toggle source
# File lib/aws/s3/request.rb, line 51
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
signing_string_date() click to toggle source
# File lib/aws/s3/request.rb, line 106
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
storage_class=(storage_class) click to toggle source
# File lib/aws/s3/request.rb, line 43
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
string_to_sign() click to toggle source

From the S3 developer guide:

StringToSign =

HTTP-Verb + "\n" +
content-md5 + "\n" +
content-type + "\n" +
date + "\n" +
CanonicalizedAmzHeaders + CanonicalizedResource;
# File lib/aws/s3/request.rb, line 96
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
sub_resource_params() click to toggle source
# File lib/aws/s3/request.rb, line 162
def sub_resource_params
  params.select{|p| self.class.sub_resources.include?(p.name) }
end
uri() click to toggle source
# File lib/aws/s3/request.rb, line 71
def uri

  parts = []
  parts << bucket if bucket and path_style?
  parts << escape_path(key) if key

  path = service_path + parts.join('/')
  querystring = url_encoded_params

  uri = ''
  uri << path
  uri << "?#{querystring}" if querystring
  uri

end