class AWS::S3::Client

Client class for Amazon Simple Storage Service (S3).

def self.bucket_method(method_name, verb, *args, &block)

def self.bucket_method(method_name, verb, *args, &block)
  method_options = (args.pop if args.last.kind_of?(Hash)) || {}
  xml_grammar = (args.pop if args.last.respond_to?(:rules))
  verb = verb.to_s.upcase
  subresource = args.first
  add_client_request_method(method_name) do
    configure_request do |req, options|
      require_bucket_name!(options[:bucket_name])
      req.http_method = verb
      req.bucket = options[:bucket_name]
      req.add_param(subresource) if subresource
      if header_options = method_options[:header_options]
        header_options.each do |(opt, header)|
          if value = options[opt]
            # for backwards compatability we translate canned acls
            # header values from symbols to strings (e.g. 
            # :public_read translates to 'public-read')
            value = (opt == :acl ? value.to_s.tr('_', '-') : value)
            req.headers[header] = value
          end
        end
      end
    end
    instance_eval(&block) if block
    if xml_grammar
      parser = Core::XML::Parser.new(xml_grammar.rules)
      process_response do |resp|
        resp.data = parser.parse(resp.http_response.body)
        super(resp)
      end
      simulate_response do |resp|
        resp.data = parser.simulate
        super(resp)
      end
    end
  end
end

def self.object_method(method_name, verb, *args, &block)

def self.object_method(method_name, verb, *args, &block)
  bucket_method(method_name, verb, *args) do
    configure_request do |req, options|
      validate_key!(options[:key])
      super(req, options)
      req.key = options[:key]
    end
    instance_eval(&block) if block
  end
end

def add_sse_to_response response

def add_sse_to_response response
  if sse = response.http_response.header('x-amz-server-side-encryption')
    sse = sse.downcase.to_sym
  end
  response.data[:server_side_encryption] = sse
end

def extract_error_details response

def extract_error_details response
  if 
    (response.http_response.status >= 300 ||
      response.request_type == :complete_multipart_upload) and
    body = response.http_response.body and
    error = Core::XML::Parser.parse(body) and
    error[:code]
  then
    [error[:code], error[:message]]
  end
end

def is_xml? possible_xml

Parameters:
  • possible_xml (String) --
def is_xml? possible_xml
  begin
    REXML::Document.new(possible_xml).has_elements?
  rescue
    false
  end
end

def move_access_control_policy options

method now is to pass :access_control_policy an xml document.
as a string or an object that responds to #to_xml. The prefered
Previously the access control policy could be specified via :acl
def move_access_control_policy options
  if acl = options[:acl]
    if acl.is_a?(String) and is_xml?(acl)
      options[:access_control_policy] = options.delete(:acl)
    elsif acl.respond_to?(:to_xml)
      options[:access_control_policy] = options.delete(:acl).to_xml
    end
  end
end

def new_request

def new_request
  S3::Request.new
end

def populate_error resp

HTTP spec. We have to detect these errors specially.
yet still be errors. These return empty bodies to comply with the
There are a few of s3 requests that can generate empty bodies and
def populate_error resp
  code = resp.http_response.status
  if EMPTY_BODY_ERRORS.include?(code) and resp.http_response.body.nil?
    error_class = EMPTY_BODY_ERRORS[code]
    resp.error = error_class.new(resp.http_request, resp.http_response)
  else
    super
  end
end

def set_request_data request, options, block

def set_request_data request, options, block
  request.body_stream = data_stream_from(options, &block)
  request.headers['Content-Length'] = content_length_from(options)
end

def should_retry? response

def should_retry? response
  super or
    response.request_type == :complete_multipart_upload &&
    extract_error_details(response)
    # complete multipart upload can return an error inside a 
    # 200 level response -- this forces us to parse the
    # response for errors every time
end