/*
 * MinIO Go Library for Amazon S3 Compatible Cloud Storage
 * Copyright 2015-2017 MinIO, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package minio

// Constants for error keys
const (
	NoSuchBucket                      = "NoSuchBucket"
	NoSuchKey                         = "NoSuchKey"
	NoSuchUpload                      = "NoSuchUpload"
	AccessDenied                      = "AccessDenied"
	Conflict                          = "Conflict"
	PreconditionFailed                = "PreconditionFailed"
	InvalidArgument                   = "InvalidArgument"
	EntityTooLarge                    = "EntityTooLarge"
	EntityTooSmall                    = "EntityTooSmall"
	UnexpectedEOF                     = "UnexpectedEOF"
	APINotSupported                   = "APINotSupported"
	InvalidRegion                     = "InvalidRegion"
	NoSuchBucketPolicy                = "NoSuchBucketPolicy"
	BadDigest                         = "BadDigest"
	IncompleteBody                    = "IncompleteBody"
	InternalError                     = "InternalError"
	InvalidAccessKeyID                = "InvalidAccessKeyId"
	InvalidBucketName                 = "InvalidBucketName"
	InvalidDigest                     = "InvalidDigest"
	InvalidRange                      = "InvalidRange"
	MalformedXML                      = "MalformedXML"
	MissingContentLength              = "MissingContentLength"
	MissingContentMD5                 = "MissingContentMD5"
	MissingRequestBodyError           = "MissingRequestBodyError"
	NotImplemented                    = "NotImplemented"
	RequestTimeTooSkewed              = "RequestTimeTooSkewed"
	SignatureDoesNotMatch             = "SignatureDoesNotMatch"
	MethodNotAllowed                  = "MethodNotAllowed"
	InvalidPart                       = "InvalidPart"
	InvalidPartOrder                  = "InvalidPartOrder"
	InvalidObjectState                = "InvalidObjectState"
	AuthorizationHeaderMalformed      = "AuthorizationHeaderMalformed"
	MalformedPOSTRequest              = "MalformedPOSTRequest"
	BucketNotEmpty                    = "BucketNotEmpty"
	AllAccessDisabled                 = "AllAccessDisabled"
	MalformedPolicy                   = "MalformedPolicy"
	MissingFields                     = "MissingFields"
	AuthorizationQueryParametersError = "AuthorizationQueryParametersError"
	MalformedDate                     = "MalformedDate"
	BucketAlreadyOwnedByYou           = "BucketAlreadyOwnedByYou"
	InvalidDuration                   = "InvalidDuration"
	XAmzContentSHA256Mismatch         = "XAmzContentSHA256Mismatch"
	XMinioInvalidObjectName           = "XMinioInvalidObjectName"
	NoSuchCORSConfiguration           = "NoSuchCORSConfiguration"
	BucketAlreadyExists               = "BucketAlreadyExists"
	NoSuchVersion                     = "NoSuchVersion"
	NoSuchTagSet                      = "NoSuchTagSet"
	Testing                           = "Testing"
	Success                           = "Success"
)

// Non exhaustive list of AWS S3 standard error responses -
// http://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html
var s3ErrorResponseMap = map[string]string{
	AccessDenied:                      "Access Denied.",
	BadDigest:                         "The Content-Md5 you specified did not match what we received.",
	EntityTooSmall:                    "Your proposed upload is smaller than the minimum allowed object size.",
	EntityTooLarge:                    "Your proposed upload exceeds the maximum allowed object size.",
	IncompleteBody:                    "You did not provide the number of bytes specified by the Content-Length HTTP header.",
	InternalError:                     "We encountered an internal error, please try again.",
	InvalidAccessKeyID:                "The access key ID you provided does not exist in our records.",
	InvalidBucketName:                 "The specified bucket is not valid.",
	InvalidDigest:                     "The Content-Md5 you specified is not valid.",
	InvalidRange:                      "The requested range is not satisfiable.",
	MalformedXML:                      "The XML you provided was not well-formed or did not validate against our published schema.",
	MissingContentLength:              "You must provide the Content-Length HTTP header.",
	MissingContentMD5:                 "Missing required header for this request: Content-Md5.",
	MissingRequestBodyError:           "Request body is empty.",
	NoSuchBucket:                      "The specified bucket does not exist.",
	NoSuchBucketPolicy:                "The bucket policy does not exist.",
	NoSuchKey:                         "The specified key does not exist.",
	NoSuchUpload:                      "The specified multipart upload does not exist. The upload ID may be invalid, or the upload may have been aborted or completed.",
	NotImplemented:                    "A header you provided implies functionality that is not implemented.",
	PreconditionFailed:                "At least one of the pre-conditions you specified did not hold.",
	RequestTimeTooSkewed:              "The difference between the request time and the server's time is too large.",
	SignatureDoesNotMatch:             "The request signature we calculated does not match the signature you provided. Check your key and signing method.",
	MethodNotAllowed:                  "The specified method is not allowed against this resource.",
	InvalidPart:                       "One or more of the specified parts could not be found.",
	InvalidPartOrder:                  "The list of parts was not in ascending order. The parts list must be specified in order by part number.",
	InvalidObjectState:                "The operation is not valid for the current state of the object.",
	AuthorizationHeaderMalformed:      "The authorization header is malformed; the region is wrong.",
	MalformedPOSTRequest:              "The body of your POST request is not well-formed multipart/form-data.",
	BucketNotEmpty:                    "The bucket you tried to delete is not empty.",
	AllAccessDisabled:                 "All access to this bucket has been disabled.",
	MalformedPolicy:                   "Policy has invalid resource.",
	MissingFields:                     "Missing fields in request.",
	AuthorizationQueryParametersError: "Error parsing the X-Amz-Credential parameter; the Credential is mal-formed; expecting \"<YOUR-AKID>/YYYYMMDD/REGION/SERVICE/aws4_request\".",
	MalformedDate:                     "Invalid date format header, expected to be in ISO8601, RFC1123 or RFC1123Z time format.",
	BucketAlreadyOwnedByYou:           "Your previous request to create the named bucket succeeded and you already own it.",
	InvalidDuration:                   "Duration provided in the request is invalid.",
	XAmzContentSHA256Mismatch:         "The provided 'x-amz-content-sha256' header does not match what was computed.",
	NoSuchCORSConfiguration:           "The specified bucket does not have a CORS configuration.",
	Conflict:                          "Bucket not empty.",
	// Add new API errors here.
}
