| 
									
										
										
										
											2021-04-19 03:41:13 +08:00
										 |  |  | // Copyright (c) 2015-2021 MinIO, Inc.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // This file is part of MinIO Object Storage stack
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // This program is free software: you can redistribute it and/or modify
 | 
					
						
							|  |  |  | // it under the terms of the GNU Affero General Public License as published by
 | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or
 | 
					
						
							|  |  |  | // (at your option) any later version.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // This program is distributed in the hope that it will be useful
 | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					
						
							|  |  |  | // GNU Affero General Public License for more details.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // You should have received a copy of the GNU Affero General Public License
 | 
					
						
							|  |  |  | // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					
						
							| 
									
										
										
										
											2015-02-24 08:46:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  | package cmd | 
					
						
							| 
									
										
										
										
											2015-02-16 09:03:27 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2019-10-02 04:09:29 +08:00
										 |  |  | 	"encoding/base64" | 
					
						
							| 
									
										
										
										
											2015-02-16 09:03:27 +08:00
										 |  |  | 	"net/url" | 
					
						
							|  |  |  | 	"strconv" | 
					
						
							| 
									
										
										
										
											2015-02-27 09:23:42 +08:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2015-02-16 09:03:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
											
												objectAPI: Fix object API interface, remove unnecessary structs.
ObjectAPI changes.
```
ListObjects(bucket, prefix, marker, delimiter string, maxKeys int) (ListObjectsInfo, *probe.Error)
ListMultipartUploads(bucket, objectPrefix, keyMarker, uploadIDMarker, delimiter string, maxUploads int) (ListMultipartsInfo, *probe.Error)
ListObjectParts(bucket, object, uploadID string, partNumberMarker, maxParts int) (ListPartsInfo, *probe.Error)
CompleteMultipartUpload(bucket string, object string, uploadID string, parts []completePart) (ObjectInfo, *probe.Error)
```
											
										 
											2016-04-03 16:34:20 +08:00
										 |  |  | // Parse bucket url queries
 | 
					
						
							| 
									
										
										
										
											2018-10-18 22:31:46 +08:00
										 |  |  | func getListObjectsV1Args(values url.Values) (prefix, marker, delimiter string, maxkeys int, encodingType string, errCode APIErrorCode) { | 
					
						
							|  |  |  | 	errCode = ErrNone | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-01 13:10:55 +08:00
										 |  |  | 	if values.Get("max-keys") != "" { | 
					
						
							| 
									
										
										
										
											2018-10-18 22:31:46 +08:00
										 |  |  | 		var err error | 
					
						
							|  |  |  | 		if maxkeys, err = strconv.Atoi(values.Get("max-keys")); err != nil { | 
					
						
							|  |  |  | 			errCode = ErrInvalidMaxKeys | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-06-01 13:10:55 +08:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		maxkeys = maxObjectList | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-10-18 22:31:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-12 05:57:03 +08:00
										 |  |  | 	prefix = trimLeadingSlash(values.Get("prefix")) | 
					
						
							|  |  |  | 	marker = trimLeadingSlash(values.Get("marker")) | 
					
						
							| 
									
										
										
										
											2018-10-18 22:31:46 +08:00
										 |  |  | 	delimiter = values.Get("delimiter") | 
					
						
							| 
									
										
										
										
											2016-06-01 13:10:55 +08:00
										 |  |  | 	encodingType = values.Get("encoding-type") | 
					
						
							|  |  |  | 	return | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-20 05:02:54 +08:00
										 |  |  | func getListBucketObjectVersionsArgs(values url.Values) (prefix, marker, delimiter string, maxkeys int, encodingType, versionIDMarker string, errCode APIErrorCode) { | 
					
						
							|  |  |  | 	errCode = ErrNone | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if values.Get("max-keys") != "" { | 
					
						
							|  |  |  | 		var err error | 
					
						
							|  |  |  | 		if maxkeys, err = strconv.Atoi(values.Get("max-keys")); err != nil { | 
					
						
							|  |  |  | 			errCode = ErrInvalidMaxKeys | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		maxkeys = maxObjectList | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-12 05:57:03 +08:00
										 |  |  | 	prefix = trimLeadingSlash(values.Get("prefix")) | 
					
						
							|  |  |  | 	marker = trimLeadingSlash(values.Get("key-marker")) | 
					
						
							| 
									
										
										
										
											2019-08-20 05:02:54 +08:00
										 |  |  | 	delimiter = values.Get("delimiter") | 
					
						
							|  |  |  | 	encodingType = values.Get("encoding-type") | 
					
						
							|  |  |  | 	versionIDMarker = values.Get("version-id-marker") | 
					
						
							|  |  |  | 	return | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-01 13:10:55 +08:00
										 |  |  | // Parse bucket url queries for ListObjects V2.
 | 
					
						
							| 
									
										
										
										
											2018-06-26 03:35:43 +08:00
										 |  |  | func getListObjectsV2Args(values url.Values) (prefix, token, startAfter, delimiter string, fetchOwner bool, maxkeys int, encodingType string, errCode APIErrorCode) { | 
					
						
							|  |  |  | 	errCode = ErrNone | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// The continuation-token cannot be empty.
 | 
					
						
							|  |  |  | 	if val, ok := values["continuation-token"]; ok { | 
					
						
							|  |  |  | 		if len(val[0]) == 0 { | 
					
						
							|  |  |  | 			errCode = ErrIncorrectContinuationToken | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-01 13:10:55 +08:00
										 |  |  | 	if values.Get("max-keys") != "" { | 
					
						
							| 
									
										
										
										
											2018-10-18 22:31:46 +08:00
										 |  |  | 		var err error | 
					
						
							|  |  |  | 		if maxkeys, err = strconv.Atoi(values.Get("max-keys")); err != nil { | 
					
						
							|  |  |  | 			errCode = ErrInvalidMaxKeys | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-06-01 13:10:55 +08:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		maxkeys = maxObjectList | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-10-18 22:31:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-12 05:57:03 +08:00
										 |  |  | 	prefix = trimLeadingSlash(values.Get("prefix")) | 
					
						
							|  |  |  | 	startAfter = trimLeadingSlash(values.Get("start-after")) | 
					
						
							| 
									
										
										
										
											2018-10-18 22:31:46 +08:00
										 |  |  | 	delimiter = values.Get("delimiter") | 
					
						
							| 
									
										
										
										
											2016-09-28 03:50:32 +08:00
										 |  |  | 	fetchOwner = values.Get("fetch-owner") == "true" | 
					
						
							| 
									
										
										
										
											2016-06-01 13:10:55 +08:00
										 |  |  | 	encodingType = values.Get("encoding-type") | 
					
						
							| 
									
										
										
										
											2019-10-02 04:09:29 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if token = values.Get("continuation-token"); token != "" { | 
					
						
							|  |  |  | 		decodedToken, err := base64.StdEncoding.DecodeString(token) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			errCode = ErrIncorrectContinuationToken | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		token = string(decodedToken) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-06-01 13:10:55 +08:00
										 |  |  | 	return | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
											
												objectAPI: Fix object API interface, remove unnecessary structs.
ObjectAPI changes.
```
ListObjects(bucket, prefix, marker, delimiter string, maxKeys int) (ListObjectsInfo, *probe.Error)
ListMultipartUploads(bucket, objectPrefix, keyMarker, uploadIDMarker, delimiter string, maxUploads int) (ListMultipartsInfo, *probe.Error)
ListObjectParts(bucket, object, uploadID string, partNumberMarker, maxParts int) (ListPartsInfo, *probe.Error)
CompleteMultipartUpload(bucket string, object string, uploadID string, parts []completePart) (ObjectInfo, *probe.Error)
```
											
										 
											2016-04-03 16:34:20 +08:00
										 |  |  | // Parse bucket url queries for ?uploads
 | 
					
						
							| 
									
										
										
										
											2018-10-18 22:31:46 +08:00
										 |  |  | func getBucketMultipartResources(values url.Values) (prefix, keyMarker, uploadIDMarker, delimiter string, maxUploads int, encodingType string, errCode APIErrorCode) { | 
					
						
							|  |  |  | 	errCode = ErrNone | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-05 10:55:07 +08:00
										 |  |  | 	if values.Get("max-uploads") != "" { | 
					
						
							| 
									
										
										
										
											2018-10-18 22:31:46 +08:00
										 |  |  | 		var err error | 
					
						
							|  |  |  | 		if maxUploads, err = strconv.Atoi(values.Get("max-uploads")); err != nil { | 
					
						
							|  |  |  | 			errCode = ErrInvalidMaxUploads | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-04-05 10:55:07 +08:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		maxUploads = maxUploadsList | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-10-18 22:31:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-12 05:57:03 +08:00
										 |  |  | 	prefix = trimLeadingSlash(values.Get("prefix")) | 
					
						
							|  |  |  | 	keyMarker = trimLeadingSlash(values.Get("key-marker")) | 
					
						
							| 
									
										
										
										
											2018-10-18 22:31:46 +08:00
										 |  |  | 	uploadIDMarker = values.Get("upload-id-marker") | 
					
						
							|  |  |  | 	delimiter = values.Get("delimiter") | 
					
						
							| 
									
										
										
											
												objectAPI: Fix object API interface, remove unnecessary structs.
ObjectAPI changes.
```
ListObjects(bucket, prefix, marker, delimiter string, maxKeys int) (ListObjectsInfo, *probe.Error)
ListMultipartUploads(bucket, objectPrefix, keyMarker, uploadIDMarker, delimiter string, maxUploads int) (ListMultipartsInfo, *probe.Error)
ListObjectParts(bucket, object, uploadID string, partNumberMarker, maxParts int) (ListPartsInfo, *probe.Error)
CompleteMultipartUpload(bucket string, object string, uploadID string, parts []completePart) (ObjectInfo, *probe.Error)
```
											
										 
											2016-04-03 16:34:20 +08:00
										 |  |  | 	encodingType = values.Get("encoding-type") | 
					
						
							| 
									
										
										
										
											2015-05-15 05:36:41 +08:00
										 |  |  | 	return | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
											
												objectAPI: Fix object API interface, remove unnecessary structs.
ObjectAPI changes.
```
ListObjects(bucket, prefix, marker, delimiter string, maxKeys int) (ListObjectsInfo, *probe.Error)
ListMultipartUploads(bucket, objectPrefix, keyMarker, uploadIDMarker, delimiter string, maxUploads int) (ListMultipartsInfo, *probe.Error)
ListObjectParts(bucket, object, uploadID string, partNumberMarker, maxParts int) (ListPartsInfo, *probe.Error)
CompleteMultipartUpload(bucket string, object string, uploadID string, parts []completePart) (ObjectInfo, *probe.Error)
```
											
										 
											2016-04-03 16:34:20 +08:00
										 |  |  | // Parse object url queries
 | 
					
						
							| 
									
										
										
										
											2018-10-18 22:31:46 +08:00
										 |  |  | func getObjectResources(values url.Values) (uploadID string, partNumberMarker, maxParts int, encodingType string, errCode APIErrorCode) { | 
					
						
							|  |  |  | 	var err error | 
					
						
							|  |  |  | 	errCode = ErrNone | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-05 10:55:07 +08:00
										 |  |  | 	if values.Get("max-parts") != "" { | 
					
						
							| 
									
										
										
										
											2018-10-18 22:31:46 +08:00
										 |  |  | 		if maxParts, err = strconv.Atoi(values.Get("max-parts")); err != nil { | 
					
						
							|  |  |  | 			errCode = ErrInvalidMaxParts | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-04-05 10:55:07 +08:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		maxParts = maxPartsList | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-10-18 22:31:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if values.Get("part-number-marker") != "" { | 
					
						
							|  |  |  | 		if partNumberMarker, err = strconv.Atoi(values.Get("part-number-marker")); err != nil { | 
					
						
							|  |  |  | 			errCode = ErrInvalidPartNumberMarker | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	uploadID = values.Get("uploadId") | 
					
						
							| 
									
										
										
											
												objectAPI: Fix object API interface, remove unnecessary structs.
ObjectAPI changes.
```
ListObjects(bucket, prefix, marker, delimiter string, maxKeys int) (ListObjectsInfo, *probe.Error)
ListMultipartUploads(bucket, objectPrefix, keyMarker, uploadIDMarker, delimiter string, maxUploads int) (ListMultipartsInfo, *probe.Error)
ListObjectParts(bucket, object, uploadID string, partNumberMarker, maxParts int) (ListPartsInfo, *probe.Error)
CompleteMultipartUpload(bucket string, object string, uploadID string, parts []completePart) (ObjectInfo, *probe.Error)
```
											
										 
											2016-04-03 16:34:20 +08:00
										 |  |  | 	encodingType = values.Get("encoding-type") | 
					
						
							| 
									
										
										
										
											2015-05-10 02:41:26 +08:00
										 |  |  | 	return | 
					
						
							|  |  |  | } |