| 
									
										
										
										
											2015-06-24 02:44:32 +08:00
										 |  |  | /* | 
					
						
							| 
									
										
										
										
											2015-07-25 08:51:40 +08:00
										 |  |  |  * Minio Cloud Storage, (C) 2015 Minio, Inc. | 
					
						
							| 
									
										
										
										
											2015-06-24 02:44:32 +08:00
										 |  |  |  * | 
					
						
							|  |  |  |  * 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. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  | package cmd | 
					
						
							| 
									
										
										
										
											2015-06-24 02:44:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-21 08:23:23 +08:00
										 |  |  | import ( | 
					
						
							| 
									
										
										
										
											2016-07-09 08:22:55 +08:00
										 |  |  | 	"errors" | 
					
						
							| 
									
										
										
										
											2016-04-21 08:23:23 +08:00
										 |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"io" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Converts underlying storage error. Convenience function written to
 | 
					
						
							|  |  |  | // handle all cases where we have known types of errors returned by
 | 
					
						
							|  |  |  | // underlying storage layer.
 | 
					
						
							|  |  |  | func toObjectErr(err error, params ...string) error { | 
					
						
							| 
									
										
										
										
											2016-08-26 00:39:01 +08:00
										 |  |  | 	e, ok := err.(*Error) | 
					
						
							|  |  |  | 	if ok { | 
					
						
							|  |  |  | 		err = e.e | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-21 08:23:23 +08:00
										 |  |  | 	switch err { | 
					
						
							|  |  |  | 	case errVolumeNotFound: | 
					
						
							|  |  |  | 		if len(params) >= 1 { | 
					
						
							| 
									
										
										
										
											2016-08-26 00:39:01 +08:00
										 |  |  | 			err = BucketNotFound{Bucket: params[0]} | 
					
						
							| 
									
										
										
										
											2016-04-21 08:23:23 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-05-05 16:35:21 +08:00
										 |  |  | 	case errVolumeNotEmpty: | 
					
						
							|  |  |  | 		if len(params) >= 1 { | 
					
						
							| 
									
										
										
										
											2016-08-26 00:39:01 +08:00
										 |  |  | 			err = BucketNotEmpty{Bucket: params[0]} | 
					
						
							| 
									
										
										
										
											2016-05-05 16:35:21 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-04-21 08:23:23 +08:00
										 |  |  | 	case errVolumeExists: | 
					
						
							|  |  |  | 		if len(params) >= 1 { | 
					
						
							| 
									
										
										
										
											2016-08-26 00:39:01 +08:00
										 |  |  | 			err = BucketExists{Bucket: params[0]} | 
					
						
							| 
									
										
										
										
											2016-04-21 08:23:23 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	case errDiskFull: | 
					
						
							| 
									
										
										
										
											2016-08-26 00:39:01 +08:00
										 |  |  | 		err = StorageFull{} | 
					
						
							| 
									
										
										
										
											2016-10-21 07:09:55 +08:00
										 |  |  | 	case errFileAccessDenied: | 
					
						
							|  |  |  | 		if len(params) >= 2 { | 
					
						
							|  |  |  | 			err = PrefixAccessDenied{ | 
					
						
							|  |  |  | 				Bucket: params[0], | 
					
						
							|  |  |  | 				Object: params[1], | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-05-05 03:18:40 +08:00
										 |  |  | 	case errIsNotRegular, errFileAccessDenied: | 
					
						
							| 
									
										
										
										
											2016-04-21 08:23:23 +08:00
										 |  |  | 		if len(params) >= 2 { | 
					
						
							| 
									
										
										
										
											2016-08-26 00:39:01 +08:00
										 |  |  | 			err = ObjectExistsAsDirectory{ | 
					
						
							| 
									
										
										
										
											2016-04-21 08:23:23 +08:00
										 |  |  | 				Bucket: params[0], | 
					
						
							|  |  |  | 				Object: params[1], | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-04-23 07:19:45 +08:00
										 |  |  | 	case errFileNotFound: | 
					
						
							| 
									
										
										
										
											2016-04-21 08:23:23 +08:00
										 |  |  | 		if len(params) >= 2 { | 
					
						
							| 
									
										
										
										
											2016-08-26 00:39:01 +08:00
										 |  |  | 			err = ObjectNotFound{ | 
					
						
							| 
									
										
										
										
											2016-04-21 08:23:23 +08:00
										 |  |  | 				Bucket: params[0], | 
					
						
							|  |  |  | 				Object: params[1], | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-05-12 03:55:02 +08:00
										 |  |  | 	case errFileNameTooLong: | 
					
						
							|  |  |  | 		if len(params) >= 2 { | 
					
						
							| 
									
										
										
										
											2016-08-26 00:39:01 +08:00
										 |  |  | 			err = ObjectNameInvalid{ | 
					
						
							| 
									
										
										
										
											2016-05-12 03:55:02 +08:00
										 |  |  | 				Bucket: params[0], | 
					
						
							|  |  |  | 				Object: params[1], | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-10-23 00:05:01 +08:00
										 |  |  | 	case errDataTooLarge: | 
					
						
							|  |  |  | 		if len(params) >= 2 { | 
					
						
							|  |  |  | 			err = ObjectTooLarge{ | 
					
						
							|  |  |  | 				Bucket: params[0], | 
					
						
							|  |  |  | 				Object: params[1], | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-10-25 14:47:03 +08:00
										 |  |  | 	case errDataTooSmall: | 
					
						
							|  |  |  | 		if len(params) >= 2 { | 
					
						
							|  |  |  | 			err = ObjectTooSmall{ | 
					
						
							|  |  |  | 				Bucket: params[0], | 
					
						
							|  |  |  | 				Object: params[1], | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-06-03 07:34:15 +08:00
										 |  |  | 	case errXLReadQuorum: | 
					
						
							| 
									
										
										
										
											2016-08-26 00:39:01 +08:00
										 |  |  | 		err = InsufficientReadQuorum{} | 
					
						
							| 
									
										
										
										
											2016-06-03 07:34:15 +08:00
										 |  |  | 	case errXLWriteQuorum: | 
					
						
							| 
									
										
										
										
											2016-08-26 00:39:01 +08:00
										 |  |  | 		err = InsufficientWriteQuorum{} | 
					
						
							| 
									
										
										
										
											2016-04-21 08:23:23 +08:00
										 |  |  | 	case io.ErrUnexpectedEOF, io.ErrShortWrite: | 
					
						
							| 
									
										
										
										
											2016-08-26 00:39:01 +08:00
										 |  |  | 		err = IncompleteBody{} | 
					
						
							| 
									
										
										
										
											2016-10-03 06:51:49 +08:00
										 |  |  | 	case errContentSHA256Mismatch: | 
					
						
							|  |  |  | 		err = SHA256Mismatch{} | 
					
						
							| 
									
										
										
										
											2016-08-26 00:39:01 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	if ok { | 
					
						
							|  |  |  | 		e.e = err | 
					
						
							|  |  |  | 		return e | 
					
						
							| 
									
										
										
										
											2016-04-21 08:23:23 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return err | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-07-01 07:30:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-03 06:51:49 +08:00
										 |  |  | // SHA256Mismatch - when content sha256 does not match with what was sent from client.
 | 
					
						
							|  |  |  | type SHA256Mismatch struct{} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (e SHA256Mismatch) Error() string { | 
					
						
							|  |  |  | 	return "sha256 computed does not match with what is expected" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 10:28:13 +08:00
										 |  |  | // StorageFull storage ran out of space.
 | 
					
						
							| 
									
										
										
										
											2016-04-19 17:42:10 +08:00
										 |  |  | type StorageFull struct{} | 
					
						
							| 
									
										
										
										
											2015-06-24 02:44:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-19 17:42:10 +08:00
										 |  |  | func (e StorageFull) Error() string { | 
					
						
							|  |  |  | 	return "Storage reached its minimum free disk threshold." | 
					
						
							| 
									
										
										
										
											2015-06-24 02:44:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-06 11:24:29 +08:00
										 |  |  | // InsufficientReadQuorum storage cannot satisfy quorum for read operation.
 | 
					
						
							|  |  |  | type InsufficientReadQuorum struct{} | 
					
						
							| 
									
										
										
										
											2016-04-21 08:23:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-06 11:24:29 +08:00
										 |  |  | func (e InsufficientReadQuorum) Error() string { | 
					
						
							| 
									
										
										
										
											2016-04-21 08:23:23 +08:00
										 |  |  | 	return "Storage resources are insufficient for the read operation." | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-06 11:24:29 +08:00
										 |  |  | // InsufficientWriteQuorum storage cannot satisfy quorum for write operation.
 | 
					
						
							|  |  |  | type InsufficientWriteQuorum struct{} | 
					
						
							| 
									
										
										
										
											2016-04-21 08:23:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-06 11:24:29 +08:00
										 |  |  | func (e InsufficientWriteQuorum) Error() string { | 
					
						
							|  |  |  | 	return "Storage resources are insufficient for the write operation." | 
					
						
							| 
									
										
										
										
											2016-04-21 08:23:23 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-19 17:42:10 +08:00
										 |  |  | // GenericError - generic object layer error.
 | 
					
						
							|  |  |  | type GenericError struct { | 
					
						
							|  |  |  | 	Bucket string | 
					
						
							|  |  |  | 	Object string | 
					
						
							| 
									
										
										
										
											2015-10-18 10:17:33 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 10:28:13 +08:00
										 |  |  | // BucketNotFound bucket does not exist.
 | 
					
						
							| 
									
										
										
										
											2016-04-19 17:42:10 +08:00
										 |  |  | type BucketNotFound GenericError | 
					
						
							| 
									
										
										
										
											2015-06-24 02:44:32 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (e BucketNotFound) Error() string { | 
					
						
							|  |  |  | 	return "Bucket not found: " + e.Bucket | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 10:28:13 +08:00
										 |  |  | // BucketNotEmpty bucket is not empty.
 | 
					
						
							| 
									
										
										
										
											2016-04-19 17:42:10 +08:00
										 |  |  | type BucketNotEmpty GenericError | 
					
						
							| 
									
										
										
										
											2015-06-24 02:44:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-17 02:26:01 +08:00
										 |  |  | func (e BucketNotEmpty) Error() string { | 
					
						
							|  |  |  | 	return "Bucket not empty: " + e.Bucket | 
					
						
							| 
									
										
										
										
											2015-06-24 02:44:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 10:28:13 +08:00
										 |  |  | // ObjectNotFound object does not exist.
 | 
					
						
							| 
									
										
										
										
											2016-04-19 17:42:10 +08:00
										 |  |  | type ObjectNotFound GenericError | 
					
						
							| 
									
										
										
										
											2015-06-24 02:44:32 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (e ObjectNotFound) Error() string { | 
					
						
							| 
									
										
										
										
											2015-10-17 02:26:01 +08:00
										 |  |  | 	return "Object not found: " + e.Bucket + "#" + e.Object | 
					
						
							| 
									
										
										
										
											2015-06-24 02:44:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-09 03:36:16 +08:00
										 |  |  | // ObjectExistsAsDirectory object already exists as a directory.
 | 
					
						
							|  |  |  | type ObjectExistsAsDirectory GenericError | 
					
						
							| 
									
										
										
										
											2016-02-03 07:23:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-09 03:36:16 +08:00
										 |  |  | func (e ObjectExistsAsDirectory) Error() string { | 
					
						
							|  |  |  | 	return "Object exists on : " + e.Bucket + " as directory " + e.Object | 
					
						
							| 
									
										
										
										
											2015-06-24 02:44:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-21 07:09:55 +08:00
										 |  |  | //PrefixAccessDenied object access is denied.
 | 
					
						
							|  |  |  | type PrefixAccessDenied GenericError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (e PrefixAccessDenied) Error() string { | 
					
						
							|  |  |  | 	return "Prefix access is denied: " + e.Bucket + "/" + e.Object | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 10:28:13 +08:00
										 |  |  | // BucketExists bucket exists.
 | 
					
						
							| 
									
										
										
										
											2016-04-19 17:42:10 +08:00
										 |  |  | type BucketExists GenericError | 
					
						
							| 
									
										
										
										
											2015-06-24 02:44:32 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (e BucketExists) Error() string { | 
					
						
							|  |  |  | 	return "Bucket exists: " + e.Bucket | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-13 08:08:15 +08:00
										 |  |  | // BadDigest - Content-MD5 you specified did not match what we received.
 | 
					
						
							| 
									
										
										
										
											2015-10-17 02:26:01 +08:00
										 |  |  | type BadDigest struct { | 
					
						
							| 
									
										
										
										
											2016-03-13 08:08:15 +08:00
										 |  |  | 	ExpectedMD5   string | 
					
						
							|  |  |  | 	CalculatedMD5 string | 
					
						
							| 
									
										
										
										
											2015-10-17 02:26:01 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-06-24 02:44:32 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (e BadDigest) Error() string { | 
					
						
							| 
									
										
										
										
											2016-04-28 10:28:13 +08:00
										 |  |  | 	return "Bad digest: Expected " + e.ExpectedMD5 + " is not valid with what we calculated " + e.CalculatedMD5 | 
					
						
							| 
									
										
										
										
											2015-06-24 02:44:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-11 16:29:18 +08:00
										 |  |  | // UnsupportedDelimiter - unsupported delimiter.
 | 
					
						
							|  |  |  | type UnsupportedDelimiter struct { | 
					
						
							|  |  |  | 	Delimiter string | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (e UnsupportedDelimiter) Error() string { | 
					
						
							|  |  |  | 	return fmt.Sprintf("delimiter '%s' is not supported. Only '/' is supported", e.Delimiter) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-19 17:42:10 +08:00
										 |  |  | // InvalidUploadIDKeyCombination - invalid upload id and key marker combination.
 | 
					
						
							| 
									
										
										
										
											2016-04-11 16:29:18 +08:00
										 |  |  | type InvalidUploadIDKeyCombination struct { | 
					
						
							|  |  |  | 	UploadIDMarker, KeyMarker string | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (e InvalidUploadIDKeyCombination) Error() string { | 
					
						
							|  |  |  | 	return fmt.Sprintf("Invalid combination of uploadID marker '%s' and marker '%s'", e.UploadIDMarker, e.KeyMarker) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // InvalidMarkerPrefixCombination - invalid marker and prefix combination.
 | 
					
						
							|  |  |  | type InvalidMarkerPrefixCombination struct { | 
					
						
							|  |  |  | 	Marker, Prefix string | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (e InvalidMarkerPrefixCombination) Error() string { | 
					
						
							|  |  |  | 	return fmt.Sprintf("Invalid combination of marker '%s' and prefix '%s'", e.Marker, e.Prefix) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
											
												accessPolicy: Implement Put, Get, Delete access policy.
This patch implements Get,Put,Delete bucket policies
Supporting - http://docs.aws.amazon.com/AmazonS3/latest/dev/access-policy-language-overview.html
Currently supports following actions.
   "*":                             true,
   "s3:*":                          true,
   "s3:GetObject":                  true,
   "s3:ListBucket":                 true,
   "s3:PutObject":                  true,
   "s3:CreateBucket":               true,
   "s3:GetBucketLocation":          true,
   "s3:DeleteBucket":               true,
   "s3:DeleteObject":               true,
   "s3:AbortMultipartUpload":       true,
   "s3:ListBucketMultipartUploads": true,
   "s3:ListMultipartUploadParts":   true,
following conditions for "StringEquals" and "StringNotEquals"
   "s3:prefix", "s3:max-keys"
											
										 
											2016-02-04 08:46:56 +08:00
										 |  |  | // BucketPolicyNotFound - no bucket policy found.
 | 
					
						
							| 
									
										
										
										
											2016-04-19 17:42:10 +08:00
										 |  |  | type BucketPolicyNotFound GenericError | 
					
						
							| 
									
										
										
											
												accessPolicy: Implement Put, Get, Delete access policy.
This patch implements Get,Put,Delete bucket policies
Supporting - http://docs.aws.amazon.com/AmazonS3/latest/dev/access-policy-language-overview.html
Currently supports following actions.
   "*":                             true,
   "s3:*":                          true,
   "s3:GetObject":                  true,
   "s3:ListBucket":                 true,
   "s3:PutObject":                  true,
   "s3:CreateBucket":               true,
   "s3:GetBucketLocation":          true,
   "s3:DeleteBucket":               true,
   "s3:DeleteObject":               true,
   "s3:AbortMultipartUpload":       true,
   "s3:ListBucketMultipartUploads": true,
   "s3:ListMultipartUploadParts":   true,
following conditions for "StringEquals" and "StringNotEquals"
   "s3:prefix", "s3:max-keys"
											
										 
											2016-02-04 08:46:56 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (e BucketPolicyNotFound) Error() string { | 
					
						
							|  |  |  | 	return "No bucket policy found for bucket: " + e.Bucket | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 10:28:13 +08:00
										 |  |  | /// Bucket related errors.
 | 
					
						
							| 
									
										
										
										
											2015-07-01 07:30:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 10:28:13 +08:00
										 |  |  | // BucketNameInvalid - bucketname provided is invalid.
 | 
					
						
							| 
									
										
										
										
											2016-04-19 17:42:10 +08:00
										 |  |  | type BucketNameInvalid GenericError | 
					
						
							| 
									
										
										
										
											2015-07-01 07:30:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 10:28:13 +08:00
										 |  |  | // Return string an error formatted as the given text.
 | 
					
						
							| 
									
										
										
										
											2015-07-01 07:30:02 +08:00
										 |  |  | func (e BucketNameInvalid) Error() string { | 
					
						
							|  |  |  | 	return "Bucket name invalid: " + e.Bucket | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 10:28:13 +08:00
										 |  |  | /// Object related errors.
 | 
					
						
							| 
									
										
										
										
											2016-04-19 17:42:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 10:28:13 +08:00
										 |  |  | // ObjectNameInvalid - object name provided is invalid.
 | 
					
						
							| 
									
										
										
										
											2016-04-19 17:42:10 +08:00
										 |  |  | type ObjectNameInvalid GenericError | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 10:28:13 +08:00
										 |  |  | // Return string an error formatted as the given text.
 | 
					
						
							| 
									
										
										
										
											2015-07-01 07:30:02 +08:00
										 |  |  | func (e ObjectNameInvalid) Error() string { | 
					
						
							|  |  |  | 	return "Object name invalid: " + e.Bucket + "#" + e.Object | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 10:28:13 +08:00
										 |  |  | // IncompleteBody You did not provide the number of bytes specified by the Content-Length HTTP header.
 | 
					
						
							| 
									
										
										
										
											2016-04-19 17:42:10 +08:00
										 |  |  | type IncompleteBody GenericError | 
					
						
							| 
									
										
										
										
											2015-07-09 11:18:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 10:28:13 +08:00
										 |  |  | // Return string an error formatted as the given text.
 | 
					
						
							| 
									
										
										
										
											2015-07-09 11:18:32 +08:00
										 |  |  | func (e IncompleteBody) Error() string { | 
					
						
							|  |  |  | 	return e.Bucket + "#" + e.Object + "has incomplete body" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-09 08:22:55 +08:00
										 |  |  | // errInvalidRange - returned when given range value is not valid.
 | 
					
						
							|  |  |  | var errInvalidRange = errors.New("Invalid range") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // InvalidRange - invalid range typed error.
 | 
					
						
							|  |  |  | type InvalidRange struct { | 
					
						
							|  |  |  | 	offsetBegin  int64 | 
					
						
							|  |  |  | 	offsetEnd    int64 | 
					
						
							|  |  |  | 	resourceSize int64 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (e InvalidRange) Error() string { | 
					
						
							|  |  |  | 	return fmt.Sprintf("The requested range \"bytes %d-%d/%d\" is not satisfiable.", e.offsetBegin, e.offsetEnd, e.resourceSize) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-23 00:05:01 +08:00
										 |  |  | // ObjectTooLarge error returned when the size of the object > max object size allowed (5G) per request.
 | 
					
						
							|  |  |  | type ObjectTooLarge GenericError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (e ObjectTooLarge) Error() string { | 
					
						
							|  |  |  | 	return "size of the object greater than what is allowed(5G)" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-25 14:47:03 +08:00
										 |  |  | // ObjectTooSmall error returned when the size of the object < what is expected.
 | 
					
						
							|  |  |  | type ObjectTooSmall GenericError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (e ObjectTooSmall) Error() string { | 
					
						
							|  |  |  | 	return "size of the object less than what is expected" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 10:28:13 +08:00
										 |  |  | /// Multipart related errors.
 | 
					
						
							| 
									
										
										
										
											2015-07-01 07:30:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-11 16:29:18 +08:00
										 |  |  | // MalformedUploadID malformed upload id.
 | 
					
						
							|  |  |  | type MalformedUploadID struct { | 
					
						
							|  |  |  | 	UploadID string | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (e MalformedUploadID) Error() string { | 
					
						
							|  |  |  | 	return "Malformed upload id " + e.UploadID | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // InvalidUploadID invalid upload id.
 | 
					
						
							| 
									
										
										
										
											2015-07-01 07:30:02 +08:00
										 |  |  | type InvalidUploadID struct { | 
					
						
							|  |  |  | 	UploadID string | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (e InvalidUploadID) Error() string { | 
					
						
							|  |  |  | 	return "Invalid upload id " + e.UploadID | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-07-09 07:54:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-14 10:29:32 +08:00
										 |  |  | // InvalidPart One or more of the specified parts could not be found
 | 
					
						
							|  |  |  | type InvalidPart struct{} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (e InvalidPart) Error() string { | 
					
						
							|  |  |  | 	return "One or more of the specified parts could not be found" | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-05-09 03:06:05 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | // PartTooSmall - error if part size is less than 5MB.
 | 
					
						
							| 
									
										
										
										
											2016-06-29 05:51:49 +08:00
										 |  |  | type PartTooSmall struct { | 
					
						
							|  |  |  | 	PartSize   int64 | 
					
						
							|  |  |  | 	PartNumber int | 
					
						
							|  |  |  | 	PartETag   string | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-05-09 03:06:05 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (e PartTooSmall) Error() string { | 
					
						
							| 
									
										
										
										
											2016-06-29 05:51:49 +08:00
										 |  |  | 	return fmt.Sprintf("Part size for %d should be atleast 5MB", e.PartNumber) | 
					
						
							| 
									
										
										
										
											2016-05-09 03:06:05 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-08-18 02:36:33 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | // NotImplemented If a feature is not implemented
 | 
					
						
							|  |  |  | type NotImplemented struct{} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (e NotImplemented) Error() string { | 
					
						
							|  |  |  | 	return "Not Implemented" | 
					
						
							|  |  |  | } |