You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							131 lines
						
					
					
						
							4.2 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							131 lines
						
					
					
						
							4.2 KiB
						
					
					
				| 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 ( | |
| 	ErrNone ErrorCode = iota | |
| 	ErrMethodNotAllowed | |
| 	ErrBucketNotEmpty | |
| 	ErrBucketAlreadyExists | |
| 	ErrBucketAlreadyOwnedByYou | |
| 	ErrNoSuchBucket | |
| 	ErrNoSuchUpload | |
| 	ErrInvalidBucketName | |
| 	ErrInvalidDigest | |
| 	ErrInvalidMaxKeys | |
| 	ErrInvalidMaxUploads | |
| 	ErrInvalidMaxParts | |
| 	ErrInvalidPartNumberMarker | |
| 	ErrInvalidPart | |
| 	ErrInternalError | |
| 	ErrNotImplemented | |
| ) | |
| 
 | |
| // 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, | |
| 	}, | |
| 	ErrInvalidDigest: { | |
| 		Code:           "InvalidDigest", | |
| 		Description:    "The Content-Md5 you specified is not valid.", | |
| 		HTTPStatusCode: http.StatusBadRequest, | |
| 	}, | |
| 	ErrInvalidMaxUploads: { | |
| 		Code:           "InvalidArgument", | |
| 		Description:    "Argument max-uploads must be an integer between 0 and 2147483647", | |
| 		HTTPStatusCode: http.StatusBadRequest, | |
| 	}, | |
| 	ErrInvalidMaxKeys: { | |
| 		Code:           "InvalidArgument", | |
| 		Description:    "Argument maxKeys must be an integer between 0 and 2147483647", | |
| 		HTTPStatusCode: http.StatusBadRequest, | |
| 	}, | |
| 	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, | |
| 	}, | |
| 	ErrNoSuchBucket: { | |
| 		Code:           "NoSuchBucket", | |
| 		Description:    "The specified bucket does not exist", | |
| 		HTTPStatusCode: http.StatusNotFound, | |
| 	}, | |
| 	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, | |
| 	}, | |
| 	ErrInternalError: { | |
| 		Code:           "InternalError", | |
| 		Description:    "We encountered an internal error, please try again.", | |
| 		HTTPStatusCode: http.StatusInternalServerError, | |
| 	}, | |
| 
 | |
| 	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, | |
| 	}, | |
| 	ErrNotImplemented: { | |
| 		Code:           "NotImplemented", | |
| 		Description:    "A header you provided implies functionality that is not implemented", | |
| 		HTTPStatusCode: http.StatusNotImplemented, | |
| 	}, | |
| } | |
| 
 | |
| // getAPIError provides API Error for input API error code. | |
| func getAPIError(code ErrorCode) APIError { | |
| 	return errorCodeResponse[code] | |
| }
 |