| 
									
										
										
										
											2015-02-15 16:48:15 +08:00
										 |  |  | /* | 
					
						
							| 
									
										
										
										
											2015-07-25 08:51:40 +08:00
										 |  |  |  * Minio Cloud Storage, (C) 2015 Minio, Inc. | 
					
						
							| 
									
										
										
										
											2015-02-15 16:48:15 +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. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-19 15:52:01 +08:00
										 |  |  | package main | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"encoding/xml" | 
					
						
							|  |  |  | 	"net/http" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-19 15:52:01 +08:00
										 |  |  | // APIError structure
 | 
					
						
							|  |  |  | type APIError struct { | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 	Code           string | 
					
						
							|  |  |  | 	Description    string | 
					
						
							| 
									
										
										
										
											2015-03-06 13:07:19 +08:00
										 |  |  | 	HTTPStatusCode int | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-19 15:52:01 +08:00
										 |  |  | // APIErrorResponse - error response format
 | 
					
						
							|  |  |  | type APIErrorResponse struct { | 
					
						
							| 
									
										
										
										
											2015-12-10 07:38:40 +08:00
										 |  |  | 	XMLName    xml.Name `xml:"Error" json:"-"` | 
					
						
							|  |  |  | 	Code       string | 
					
						
							|  |  |  | 	Message    string | 
					
						
							|  |  |  | 	Key        string | 
					
						
							|  |  |  | 	BucketName string | 
					
						
							|  |  |  | 	Resource   string | 
					
						
							|  |  |  | 	RequestID  string `xml:"RequestId"` | 
					
						
							|  |  |  | 	HostID     string `xml:"HostId"` | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | // APIErrorCode type of error status.
 | 
					
						
							|  |  |  | type APIErrorCode int | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-23 07:28:13 +08:00
										 |  |  | // Error codes, non exhaustive list - http://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html
 | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | const ( | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrNone APIErrorCode = iota | 
					
						
							|  |  |  | 	ErrAccessDenied | 
					
						
							|  |  |  | 	ErrBadDigest | 
					
						
							|  |  |  | 	ErrBucketAlreadyExists | 
					
						
							|  |  |  | 	ErrEntityTooSmall | 
					
						
							|  |  |  | 	ErrEntityTooLarge | 
					
						
							|  |  |  | 	ErrIncompleteBody | 
					
						
							|  |  |  | 	ErrInternalError | 
					
						
							|  |  |  | 	ErrInvalidAccessKeyID | 
					
						
							|  |  |  | 	ErrInvalidBucketName | 
					
						
							|  |  |  | 	ErrInvalidDigest | 
					
						
							|  |  |  | 	ErrInvalidRange | 
					
						
							|  |  |  | 	ErrInvalidMaxKeys | 
					
						
							|  |  |  | 	ErrInvalidMaxUploads | 
					
						
							|  |  |  | 	ErrInvalidMaxParts | 
					
						
							|  |  |  | 	ErrInvalidPartNumberMarker | 
					
						
							|  |  |  | 	ErrInvalidRequestBody | 
					
						
							|  |  |  | 	ErrInvalidCopySource | 
					
						
							|  |  |  | 	ErrInvalidCopyDest | 
					
						
							|  |  |  | 	ErrInvalidPolicyDocument | 
					
						
							|  |  |  | 	ErrMalformedXML | 
					
						
							|  |  |  | 	ErrMissingContentLength | 
					
						
							|  |  |  | 	ErrMissingContentMD5 | 
					
						
							|  |  |  | 	ErrMissingRequestBodyError | 
					
						
							|  |  |  | 	ErrNoSuchBucket | 
					
						
							|  |  |  | 	ErrNoSuchBucketPolicy | 
					
						
							|  |  |  | 	ErrNoSuchKey | 
					
						
							|  |  |  | 	ErrNoSuchUpload | 
					
						
							|  |  |  | 	ErrNotImplemented | 
					
						
							|  |  |  | 	ErrRequestTimeTooSkewed | 
					
						
							|  |  |  | 	ErrSignatureDoesNotMatch | 
					
						
							|  |  |  | 	ErrMethodNotAllowed | 
					
						
							|  |  |  | 	ErrInvalidPart | 
					
						
							|  |  |  | 	ErrInvalidPartOrder | 
					
						
							|  |  |  | 	ErrAuthorizationHeaderMalformed | 
					
						
							|  |  |  | 	ErrMalformedPOSTRequest | 
					
						
							|  |  |  | 	ErrSignatureVersionNotSupported | 
					
						
							|  |  |  | 	ErrBucketNotEmpty | 
					
						
							|  |  |  | 	ErrRootPathFull | 
					
						
							|  |  |  | 	ErrObjectExistsAsPrefix | 
					
						
							|  |  |  | 	ErrAllAccessDisabled | 
					
						
							|  |  |  | 	ErrMalformedPolicy | 
					
						
							|  |  |  | 	// Add new error codes here.
 | 
					
						
							| 
									
										
										
										
											2015-04-23 07:28:13 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | // error code to APIError structure, these fields carry respective
 | 
					
						
							|  |  |  | // descriptions for all the error responses.
 | 
					
						
							|  |  |  | var errorCodeResponse = map[APIErrorCode]APIError{ | 
					
						
							|  |  |  | 	ErrInvalidCopyDest: { | 
					
						
							| 
									
										
										
										
											2016-02-27 19:04:52 +08:00
										 |  |  | 		Code:           "InvalidRequest", | 
					
						
							|  |  |  | 		Description:    "This copy request is illegal because it is trying to copy an object to itself.", | 
					
						
							|  |  |  | 		HTTPStatusCode: http.StatusBadRequest, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrInvalidCopySource: { | 
					
						
							| 
									
										
										
										
											2016-02-27 19:04:52 +08:00
										 |  |  | 		Code:           "InvalidArgument", | 
					
						
							|  |  |  | 		Description:    "Copy Source must mention the source bucket and key: sourcebucket/sourcekey.", | 
					
						
							|  |  |  | 		HTTPStatusCode: http.StatusBadRequest, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrInvalidRequestBody: { | 
					
						
							| 
									
										
										
										
											2016-02-27 19:04:52 +08:00
										 |  |  | 		Code:           "InvalidArgument", | 
					
						
							|  |  |  | 		Description:    "Body shouldn't be set for this request.", | 
					
						
							|  |  |  | 		HTTPStatusCode: http.StatusBadRequest, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrInvalidMaxUploads: { | 
					
						
							| 
									
										
										
										
											2015-07-17 08:22:45 +08:00
										 |  |  | 		Code:           "InvalidArgument", | 
					
						
							| 
									
										
										
										
											2015-09-19 05:48:01 +08:00
										 |  |  | 		Description:    "Argument maxUploads must be an integer between 0 and 2147483647.", | 
					
						
							| 
									
										
										
										
											2015-07-17 08:22:45 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusBadRequest, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrInvalidMaxKeys: { | 
					
						
							| 
									
										
										
										
											2015-07-17 08:22:45 +08:00
										 |  |  | 		Code:           "InvalidArgument", | 
					
						
							| 
									
										
										
										
											2015-09-19 05:48:01 +08:00
										 |  |  | 		Description:    "Argument maxKeys must be an integer between 0 and 2147483647.", | 
					
						
							| 
									
										
										
										
											2015-07-17 08:22:45 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusBadRequest, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrInvalidMaxParts: { | 
					
						
							| 
									
										
										
										
											2015-07-17 08:22:45 +08:00
										 |  |  | 		Code:           "InvalidArgument", | 
					
						
							| 
									
										
										
										
											2015-09-19 05:48:01 +08:00
										 |  |  | 		Description:    "Argument maxParts must be an integer between 1 and 10000.", | 
					
						
							| 
									
										
										
										
											2015-07-17 08:22:45 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusBadRequest, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrInvalidPartNumberMarker: { | 
					
						
							| 
									
										
										
										
											2015-07-17 08:22:45 +08:00
										 |  |  | 		Code:           "InvalidArgument", | 
					
						
							| 
									
										
										
										
											2015-09-19 05:48:01 +08:00
										 |  |  | 		Description:    "Argument partNumberMarker must be an integer.", | 
					
						
							| 
									
										
										
										
											2015-07-17 08:22:45 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusBadRequest, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrInvalidPolicyDocument: { | 
					
						
							| 
									
										
										
											
												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
										 |  |  | 		Code:           "InvalidPolicyDocument", | 
					
						
							|  |  |  | 		Description:    "The content of the form does not meet the conditions specified in the policy document.", | 
					
						
							|  |  |  | 		HTTPStatusCode: http.StatusBadRequest, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrAccessDenied: { | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 		Code:           "AccessDenied", | 
					
						
							| 
									
										
										
										
											2015-09-19 05:48:01 +08:00
										 |  |  | 		Description:    "Access Denied.", | 
					
						
							| 
									
										
										
										
											2015-03-06 13:07:19 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusForbidden, | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrBadDigest: { | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 		Code:           "BadDigest", | 
					
						
							| 
									
										
										
										
											2016-03-06 08:43:48 +08:00
										 |  |  | 		Description:    "The Content-Md5 you specified did not match what we received.", | 
					
						
							| 
									
										
										
										
											2015-03-06 13:07:19 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusBadRequest, | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrBucketAlreadyExists: { | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 		Code:           "BucketAlreadyExists", | 
					
						
							|  |  |  | 		Description:    "The requested bucket name is not available.", | 
					
						
							| 
									
										
										
										
											2015-03-06 13:07:19 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusConflict, | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrEntityTooSmall: { | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 		Code:           "EntityTooSmall", | 
					
						
							|  |  |  | 		Description:    "Your proposed upload is smaller than the minimum allowed object size.", | 
					
						
							| 
									
										
										
										
											2015-03-06 13:07:19 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusBadRequest, | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrEntityTooLarge: { | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 		Code:           "EntityTooLarge", | 
					
						
							|  |  |  | 		Description:    "Your proposed upload exceeds the maximum allowed object size.", | 
					
						
							| 
									
										
										
										
											2015-03-06 13:07:19 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusBadRequest, | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrIncompleteBody: { | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 		Code:           "IncompleteBody", | 
					
						
							| 
									
										
										
										
											2015-09-19 05:48:01 +08:00
										 |  |  | 		Description:    "You did not provide the number of bytes specified by the Content-Length HTTP header.", | 
					
						
							| 
									
										
										
										
											2015-03-06 13:07:19 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusBadRequest, | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrInternalError: { | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 		Code:           "InternalError", | 
					
						
							|  |  |  | 		Description:    "We encountered an internal error, please try again.", | 
					
						
							| 
									
										
										
										
											2015-03-06 13:07:19 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusInternalServerError, | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrInvalidAccessKeyID: { | 
					
						
							| 
									
										
										
										
											2015-03-06 13:07:19 +08:00
										 |  |  | 		Code:           "InvalidAccessKeyID", | 
					
						
							|  |  |  | 		Description:    "The access key ID you provided does not exist in our records.", | 
					
						
							|  |  |  | 		HTTPStatusCode: http.StatusForbidden, | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrInvalidBucketName: { | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 		Code:           "InvalidBucketName", | 
					
						
							|  |  |  | 		Description:    "The specified bucket is not valid.", | 
					
						
							| 
									
										
										
										
											2015-03-06 13:07:19 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusBadRequest, | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrInvalidDigest: { | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 		Code:           "InvalidDigest", | 
					
						
							| 
									
										
										
										
											2016-03-06 08:43:48 +08:00
										 |  |  | 		Description:    "The Content-Md5 you specified is not valid.", | 
					
						
							| 
									
										
										
										
											2015-03-06 13:07:19 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusBadRequest, | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrInvalidRange: { | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 		Code:           "InvalidRange", | 
					
						
							|  |  |  | 		Description:    "The requested range cannot be satisfied.", | 
					
						
							| 
									
										
										
										
											2015-03-06 13:07:19 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusRequestedRangeNotSatisfiable, | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrMalformedXML: { | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 		Code:           "MalformedXML", | 
					
						
							|  |  |  | 		Description:    "The XML you provided was not well-formed or did not validate against our published schema.", | 
					
						
							| 
									
										
										
										
											2015-03-06 13:07:19 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusBadRequest, | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrMissingContentLength: { | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 		Code:           "MissingContentLength", | 
					
						
							|  |  |  | 		Description:    "You must provide the Content-Length HTTP header.", | 
					
						
							| 
									
										
										
										
											2015-03-06 13:07:19 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusLengthRequired, | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrMissingContentMD5: { | 
					
						
							| 
									
										
										
										
											2016-03-06 08:43:48 +08:00
										 |  |  | 		Code:           "MissingContentMD5", | 
					
						
							|  |  |  | 		Description:    "Missing required header for this request: Content-Md5.", | 
					
						
							|  |  |  | 		HTTPStatusCode: http.StatusBadRequest, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrMissingRequestBodyError: { | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 		Code:           "MissingRequestBodyError", | 
					
						
							|  |  |  | 		Description:    "Request body is empty.", | 
					
						
							| 
									
										
										
										
											2015-03-06 13:07:19 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusLengthRequired, | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrNoSuchBucket: { | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 		Code:           "NoSuchBucket", | 
					
						
							|  |  |  | 		Description:    "The specified bucket does not exist.", | 
					
						
							| 
									
										
										
										
											2015-03-06 13:07:19 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusNotFound, | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrNoSuchBucketPolicy: { | 
					
						
							| 
									
										
										
											
												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
										 |  |  | 		Code:           "NoSuchBucketPolicy", | 
					
						
							|  |  |  | 		Description:    "The specified bucket does not have a bucket policy.", | 
					
						
							|  |  |  | 		HTTPStatusCode: http.StatusNotFound, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrNoSuchKey: { | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 		Code:           "NoSuchKey", | 
					
						
							|  |  |  | 		Description:    "The specified key does not exist.", | 
					
						
							| 
									
										
										
										
											2015-03-06 13:07:19 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusNotFound, | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrNoSuchUpload: { | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 		Code:           "NoSuchUpload", | 
					
						
							|  |  |  | 		Description:    "The specified multipart upload does not exist.", | 
					
						
							| 
									
										
										
										
											2015-03-06 13:07:19 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusNotFound, | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrNotImplemented: { | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 		Code:           "NotImplemented", | 
					
						
							|  |  |  | 		Description:    "A header you provided implies functionality that is not implemented.", | 
					
						
							| 
									
										
										
										
											2015-03-06 13:07:19 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusNotImplemented, | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrRequestTimeTooSkewed: { | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 		Code:           "RequestTimeTooSkewed", | 
					
						
							|  |  |  | 		Description:    "The difference between the request time and the server's time is too large.", | 
					
						
							| 
									
										
										
										
											2015-03-06 13:07:19 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusForbidden, | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrSignatureDoesNotMatch: { | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 		Code:           "SignatureDoesNotMatch", | 
					
						
							|  |  |  | 		Description:    "The request signature we calculated does not match the signature you provided.", | 
					
						
							| 
									
										
										
										
											2015-03-06 13:07:19 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusForbidden, | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrMethodNotAllowed: { | 
					
						
							| 
									
										
										
										
											2015-04-27 18:54:49 +08:00
										 |  |  | 		Code:           "MethodNotAllowed", | 
					
						
							|  |  |  | 		Description:    "The specified method is not allowed against this resource.", | 
					
						
							|  |  |  | 		HTTPStatusCode: http.StatusMethodNotAllowed, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrInvalidPart: { | 
					
						
							| 
									
										
										
										
											2015-05-08 13:43:19 +08:00
										 |  |  | 		Code:           "InvalidPart", | 
					
						
							| 
									
										
										
										
											2015-09-19 05:48:01 +08:00
										 |  |  | 		Description:    "One or more of the specified parts could not be found.", | 
					
						
							| 
									
										
										
										
											2015-05-08 13:43:19 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusBadRequest, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrInvalidPartOrder: { | 
					
						
							| 
									
										
										
										
											2015-05-08 17:02:51 +08:00
										 |  |  | 		Code:           "InvalidPartOrder", | 
					
						
							|  |  |  | 		Description:    "The list of parts was not in ascending order. The parts list must be specified in order by part number.", | 
					
						
							|  |  |  | 		HTTPStatusCode: http.StatusBadRequest, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrAuthorizationHeaderMalformed: { | 
					
						
							| 
									
										
										
										
											2015-09-19 05:48:01 +08:00
										 |  |  | 		Code:           "AuthorizationHeaderMalformed", | 
					
						
							| 
									
										
										
										
											2015-11-24 05:39:57 +08:00
										 |  |  | 		Description:    "The authorization header is malformed; the region is wrong; expecting 'us-east-1'.", | 
					
						
							| 
									
										
										
										
											2015-09-19 05:48:01 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusBadRequest, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrMalformedPOSTRequest: { | 
					
						
							| 
									
										
										
										
											2015-10-02 14:51:17 +08:00
										 |  |  | 		Code:           "MalformedPOSTRequest", | 
					
						
							|  |  |  | 		Description:    "The body of your POST request is not well-formed multipart/form-data.", | 
					
						
							|  |  |  | 		HTTPStatusCode: http.StatusBadRequest, | 
					
						
							| 
									
										
										
										
											2015-12-10 07:38:40 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrSignatureVersionNotSupported: { | 
					
						
							| 
									
										
										
										
											2015-12-10 07:38:40 +08:00
										 |  |  | 		Code:           "InvalidRequest", | 
					
						
							|  |  |  | 		Description:    "The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.", | 
					
						
							|  |  |  | 		HTTPStatusCode: http.StatusBadRequest, | 
					
						
							| 
									
										
										
										
											2015-10-02 14:51:17 +08:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrBucketNotEmpty: { | 
					
						
							| 
									
										
										
										
											2015-10-17 02:26:01 +08:00
										 |  |  | 		Code:           "BucketNotEmpty", | 
					
						
							|  |  |  | 		Description:    "The bucket you tried to delete is not empty.", | 
					
						
							|  |  |  | 		HTTPStatusCode: http.StatusConflict, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrRootPathFull: { | 
					
						
							| 
									
										
										
										
											2015-10-18 10:17:33 +08:00
										 |  |  | 		Code:           "RootPathFull", | 
					
						
							| 
									
										
										
										
											2015-10-20 01:29:54 +08:00
										 |  |  | 		Description:    "Root path has reached its minimum free disk threshold. Please delete few objects to proceed.", | 
					
						
							| 
									
										
										
										
											2015-10-18 10:17:33 +08:00
										 |  |  | 		HTTPStatusCode: http.StatusInternalServerError, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrObjectExistsAsPrefix: { | 
					
						
							| 
									
										
										
										
											2016-02-03 07:23:28 +08:00
										 |  |  | 		Code:           "ObjectExistsAsPrefix", | 
					
						
							|  |  |  | 		Description:    "An object already exists as your prefix, choose a different prefix to proceed.", | 
					
						
							|  |  |  | 		HTTPStatusCode: http.StatusConflict, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrAllAccessDisabled: { | 
					
						
							| 
									
										
										
										
											2016-02-17 10:50:36 +08:00
										 |  |  | 		Code:           "AllAccessDisabled", | 
					
						
							|  |  |  | 		Description:    "All access to this bucket has been disabled.", | 
					
						
							|  |  |  | 		HTTPStatusCode: http.StatusForbidden, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	ErrMalformedPolicy: { | 
					
						
							| 
									
										
										
											
												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
										 |  |  | 		Code:           "MalformedPolicy", | 
					
						
							|  |  |  | 		Description:    "Policy has invalid resource", | 
					
						
							|  |  |  | 		HTTPStatusCode: http.StatusBadRequest, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | 	// Add your error structure here.
 | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | // getAPIError provides API Error for input API error code.
 | 
					
						
							|  |  |  | func getAPIError(code APIErrorCode) APIError { | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 	return errorCodeResponse[code] | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-24 08:46:48 +08:00
										 |  |  | // getErrorResponse gets in standard error and resource value and
 | 
					
						
							|  |  |  | // provides a encodable populated response values
 | 
					
						
							| 
									
										
										
										
											2016-03-10 18:24:52 +08:00
										 |  |  | func getAPIErrorResponse(err APIError, resource string) APIErrorResponse { | 
					
						
							| 
									
										
										
										
											2015-09-19 15:52:01 +08:00
										 |  |  | 	var data = APIErrorResponse{} | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 	data.Code = err.Code | 
					
						
							|  |  |  | 	data.Message = err.Description | 
					
						
							| 
									
										
										
										
											2015-02-12 14:00:45 +08:00
										 |  |  | 	if resource != "" { | 
					
						
							|  |  |  | 		data.Resource = resource | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 	// TODO implement this in future
 | 
					
						
							| 
									
										
										
										
											2015-03-06 13:07:19 +08:00
										 |  |  | 	data.RequestID = "3L137" | 
					
						
							|  |  |  | 	data.HostID = "3L137" | 
					
						
							| 
									
										
										
										
											2015-02-11 19:23:15 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return data | 
					
						
							|  |  |  | } |