@private
@private
# File lib/aws/s3/client.rb, line 51 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
# File lib/aws/s3/client.rb, line 103 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
# File lib/aws/s3/client.rb, line 1375 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
# File lib/aws/s3/client.rb, line 1335 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
@param [String] possible_xml @return [Boolean] Returns true
if
the given string is a valid xml
document.
# File lib/aws/s3/client.rb, line 1398 def is_xml? possible_xml begin REXML::Document.new(possible_xml).has_elements? rescue false end end
# File lib/aws/s3/client.rb, line 1406 def md5 str Base64.encode64(Digest::MD5.digest(str)).strip end
Previously the access control policy could be specified via :acl as a string or an object that responds to to_xml. The prefered method now is to pass :access_control_policy an xml document.
# File lib/aws/s3/client.rb, line 1385 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
# File lib/aws/s3/client.rb, line 1369 def new_request req = S3::Request.new req.force_path_style = config.s3_force_path_style? req end
There are a few of s3 requests that can generate empty bodies and yet still be errors. These return empty bodies to comply with the HTTP spec. We have to detect these errors specially.
# File lib/aws/s3/client.rb, line 1350 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
# File lib/aws/s3/client.rb, line 1360 def retryable_error? 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