module AWS module S3 # Abstract super class of all AWS::S3 exceptions class S3Exception < StandardError end # All responses with a code between 300 and 599 that contain an body are wrapped in an # ErrorResponse which contains an Error object. This Error class generates a custom exception with the name # of the xml Error and its message. All such runtime generated exception classes descend from ResponseError # and contain the ErrorResponse object so that all code that makes a request can rescue ResponseError and get # access to the ErrorResponse. class ResponseError < S3Exception attr_reader :response def initialize(message, response) @response = response super(message) end end #:stopdoc: # Most ResponseError's are created just time on a need to have basis, but we explicitly define the # InternalError exception because we want to explicitly rescue InternalError in some cases. class InternalError < ResponseError end class NoSuchKey < ResponseError end class RequestTimeout < ResponseError end # Abstract super class for all invalid options. class InvalidOption < S3Exception end # Raised if an invalid value is passed to the :access option when creating a Bucket or an S3Object. class InvalidAccessControlLevel < InvalidOption def initialize(valid_levels, access_level) super("Valid access control levels are #{valid_levels.inspect}. You specified `#{access_level}'.") end end # Raised if either the access key id or secret access key arguments are missing when establishing a connection. class MissingAccessKey < InvalidOption def initialize(missing_keys) key_list = missing_keys.map {|key| key.to_s}.join(' and the ') super("You did not provide both required access keys. Please provide the #{key_list}.") end end # Raised if a request is attempted before any connections have been established. class NoConnectionEstablished < S3Exception end # Raised if an unrecognized option is passed when establishing a connection. class InvalidConnectionOption < InvalidOption def initialize(invalid_options) message = "The following connection options are invalid: #{invalid_options.join(', ')}. " + "The valid connection options are: #{Connection::Options::VALID_OPTIONS.join(', ')}." super(message) end end # Raised if an invalid bucket name is passed when creating a new Bucket. class InvalidBucketName < S3Exception def initialize(invalid_name) message = "`#{invalid_name}' is not a valid bucket name. " + "Bucket names must be between 3 and 255 bytes and " + "can contain letters, numbers, dashes and underscores." super(message) end end # Raised if an invalid key name is passed when creating an S3Object. class InvalidKeyName < S3Exception def initialize(invalid_name) message = "`#{invalid_name}' is not a valid key name. " + "Key names must be no more than 1024 bytes long." super(message) end end # Raised if an invalid value is assigned to an S3Object's specific metadata name. class InvalidMetadataValue < S3Exception def initialize(invalid_names) message = "The following metadata names have invalid values: #{invalid_names.join(', ')}. " + "Metadata can not be larger than 2kilobytes." super(message) end end # Raised if the current bucket can not be inferred when not explicitly specifying the target bucket in the calling # method's arguments. class CurrentBucketNotSpecified < S3Exception def initialize(address) message = "No bucket name can be inferred from your current connection's address (`#{address}')" super(message) end end # Raised when an orphaned S3Object belonging to no bucket tries to access its (non-existant) bucket. class NoBucketSpecified < S3Exception def initialize super('The current object must have its bucket set') end end # Raised if an attempt is made to save an S3Object that does not have a key set. class NoKeySpecified < S3Exception def initialize super('The current object must have its key set') end end # Raised if you try to save a deleted object. class DeletedObject < S3Exception def initialize super('You can not save a deleted object') end end class ExceptionClassClash < S3Exception #:nodoc: def initialize(klass) message = "The exception class you tried to create (`#{klass}') exists and is not an exception" super(message) end end #:startdoc: end end