2018-07-18 17:37:09 +08:00
package s3api
import (
"encoding/xml"
"net/http"
)
// APIError structure
type APIError struct {
Code string
Description string
HTTPStatusCode int
}
// RESTErrorResponse - error response format
type RESTErrorResponse struct {
XMLName xml . Name ` xml:"Error" json:"-" `
Code string ` xml:"Code" json:"Code" `
Message string ` xml:"Message" json:"Message" `
Resource string ` xml:"Resource" json:"Resource" `
RequestID string ` xml:"RequestId" json:"RequestId" `
}
// ErrorCode type of error status.
type ErrorCode int
// Error codes, see full list at http://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html
const (
2018-07-22 16:15:11 +08:00
ErrNone ErrorCode = iota
2018-07-18 17:37:09 +08:00
ErrMethodNotAllowed
ErrBucketNotEmpty
ErrBucketAlreadyExists
ErrBucketAlreadyOwnedByYou
2018-07-19 16:43:27 +08:00
ErrNoSuchBucket
2018-09-04 15:42:44 +08:00
ErrNoSuchUpload
2018-07-22 01:39:02 +08:00
ErrInvalidBucketName
ErrInvalidDigest
2018-07-22 16:14:36 +08:00
ErrInvalidMaxKeys
2018-09-04 15:42:44 +08:00
ErrInvalidMaxUploads
ErrInvalidMaxParts
ErrInvalidPartNumberMarker
ErrInvalidPart
2018-07-18 17:37:09 +08:00
ErrInternalError
2018-07-22 16:14:36 +08:00
ErrNotImplemented
2018-07-18 17:37:09 +08:00
)
// error code to APIError structure, these fields carry respective
// descriptions for all the error responses.
var errorCodeResponse = map [ ErrorCode ] APIError {
ErrMethodNotAllowed : {
Code : "MethodNotAllowed" ,
Description : "The specified method is not allowed against this resource." ,
HTTPStatusCode : http . StatusMethodNotAllowed ,
} ,
ErrBucketNotEmpty : {
Code : "BucketNotEmpty" ,
Description : "The bucket you tried to delete is not empty" ,
HTTPStatusCode : http . StatusConflict ,
} ,
ErrBucketAlreadyExists : {
Code : "BucketAlreadyExists" ,
Description : "The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again." ,
HTTPStatusCode : http . StatusConflict ,
} ,
ErrBucketAlreadyOwnedByYou : {
Code : "BucketAlreadyOwnedByYou" ,
Description : "Your previous request to create the named bucket succeeded and you already own it." ,
HTTPStatusCode : http . StatusConflict ,
} ,
ErrInvalidBucketName : {
Code : "InvalidBucketName" ,
Description : "The specified bucket is not valid." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2018-07-22 01:39:02 +08:00
ErrInvalidDigest : {
Code : "InvalidDigest" ,
Description : "The Content-Md5 you specified is not valid." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2018-09-04 15:42:44 +08:00
ErrInvalidMaxUploads : {
Code : "InvalidArgument" ,
Description : "Argument max-uploads must be an integer between 0 and 2147483647" ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2018-07-22 16:14:36 +08:00
ErrInvalidMaxKeys : {
Code : "InvalidArgument" ,
Description : "Argument maxKeys must be an integer between 0 and 2147483647" ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2018-09-04 15:42:44 +08:00
ErrInvalidMaxParts : {
Code : "InvalidArgument" ,
Description : "Argument max-parts must be an integer between 0 and 2147483647" ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
ErrInvalidPartNumberMarker : {
Code : "InvalidArgument" ,
Description : "Argument partNumberMarker must be an integer." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2018-07-19 16:43:27 +08:00
ErrNoSuchBucket : {
Code : "NoSuchBucket" ,
Description : "The specified bucket does not exist" ,
HTTPStatusCode : http . StatusNotFound ,
} ,
2018-09-04 15:42:44 +08:00
ErrNoSuchUpload : {
Code : "NoSuchUpload" ,
Description : "The specified multipart upload does not exist. The upload ID may be invalid, or the upload may have been aborted or completed." ,
HTTPStatusCode : http . StatusNotFound ,
} ,
2018-07-18 17:37:09 +08:00
ErrInternalError : {
Code : "InternalError" ,
Description : "We encountered an internal error, please try again." ,
HTTPStatusCode : http . StatusInternalServerError ,
} ,
2018-09-12 15:46:12 +08:00
2018-09-04 15:42:44 +08:00
ErrInvalidPart : {
Code : "InvalidPart" ,
Description : "One or more of the specified parts could not be found. The part may not have been uploaded, or the specified entity tag may not match the part's entity tag." ,
HTTPStatusCode : http . StatusBadRequest ,
} ,
2018-07-22 16:14:36 +08:00
ErrNotImplemented : {
Code : "NotImplemented" ,
Description : "A header you provided implies functionality that is not implemented" ,
HTTPStatusCode : http . StatusNotImplemented ,
} ,
2018-07-18 17:37:09 +08:00
}
// getAPIError provides API Error for input API error code.
func getAPIError ( code ErrorCode ) APIError {
return errorCodeResponse [ code ]
}