Merge pull request #1578 from taozix/master
S3 bucket list, response with uploaded storageclass.
This commit is contained in:
@@ -4,10 +4,11 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb"
|
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb"
|
||||||
|
xhttp "github.com/chrislusf/seaweedfs/weed/s3api/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
S3TAG_PREFIX = "s3-"
|
S3TAG_PREFIX = xhttp.AmzObjectTagging + "-"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (s3a *S3ApiServer) getTags(parentDirectoryPath string, entryName string) (tags map[string]string, err error) {
|
func (s3a *S3ApiServer) getTags(parentDirectoryPath string, entryName string) (tags map[string]string, err error) {
|
||||||
|
|||||||
30
weed/s3api/http/header.go
Normal file
30
weed/s3api/http/header.go
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* MinIO Cloud Storage, (C) 2019 MinIO, Inc.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package http
|
||||||
|
|
||||||
|
// Standard S3 HTTP request constants
|
||||||
|
const (
|
||||||
|
// S3 storage class
|
||||||
|
AmzStorageClass = "x-amz-storage-class"
|
||||||
|
|
||||||
|
// S3 user-defined metadata
|
||||||
|
AmzUserMetaPrefix = "X-Amz-Meta-"
|
||||||
|
|
||||||
|
// S3 object tagging
|
||||||
|
AmzObjectTagging = "X-Amz-Tagging"
|
||||||
|
AmzTagCount = "x-amz-tagging-count"
|
||||||
|
)
|
||||||
@@ -4,7 +4,6 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/chrislusf/seaweedfs/weed/s3api/s3err"
|
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
@@ -15,6 +14,8 @@ import (
|
|||||||
|
|
||||||
"github.com/chrislusf/seaweedfs/weed/filer"
|
"github.com/chrislusf/seaweedfs/weed/filer"
|
||||||
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb"
|
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb"
|
||||||
|
xhttp "github.com/chrislusf/seaweedfs/weed/s3api/http"
|
||||||
|
"github.com/chrislusf/seaweedfs/weed/s3api/s3err"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ListBucketResultV2 struct {
|
type ListBucketResultV2 struct {
|
||||||
@@ -137,6 +138,10 @@ func (s3a *S3ApiServer) listFilerEntries(bucket string, originalPrefix string, m
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
storageClass := "STANDARD"
|
||||||
|
if v, ok := entry.Extended[xhttp.AmzStorageClass]; ok {
|
||||||
|
storageClass = string(v)
|
||||||
|
}
|
||||||
contents = append(contents, ListEntry{
|
contents = append(contents, ListEntry{
|
||||||
Key: fmt.Sprintf("%s/%s", dir, entry.Name)[len(bucketPrefix):],
|
Key: fmt.Sprintf("%s/%s", dir, entry.Name)[len(bucketPrefix):],
|
||||||
LastModified: time.Unix(entry.Attributes.Mtime, 0).UTC(),
|
LastModified: time.Unix(entry.Attributes.Mtime, 0).UTC(),
|
||||||
@@ -146,7 +151,7 @@ func (s3a *S3ApiServer) listFilerEntries(bucket string, originalPrefix string, m
|
|||||||
ID: fmt.Sprintf("%x", entry.Attributes.Uid),
|
ID: fmt.Sprintf("%x", entry.Attributes.Uid),
|
||||||
DisplayName: entry.Attributes.UserName,
|
DisplayName: entry.Attributes.UserName,
|
||||||
},
|
},
|
||||||
StorageClass: "STANDARD",
|
StorageClass: StorageClass(storageClass),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import (
|
|||||||
"github.com/chrislusf/seaweedfs/weed/glog"
|
"github.com/chrislusf/seaweedfs/weed/glog"
|
||||||
"github.com/chrislusf/seaweedfs/weed/images"
|
"github.com/chrislusf/seaweedfs/weed/images"
|
||||||
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb"
|
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb"
|
||||||
|
xhttp "github.com/chrislusf/seaweedfs/weed/s3api/http"
|
||||||
"github.com/chrislusf/seaweedfs/weed/stats"
|
"github.com/chrislusf/seaweedfs/weed/stats"
|
||||||
"github.com/chrislusf/seaweedfs/weed/util"
|
"github.com/chrislusf/seaweedfs/weed/util"
|
||||||
)
|
)
|
||||||
@@ -97,12 +98,12 @@ func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request,
|
|||||||
if r.Method == "GET" {
|
if r.Method == "GET" {
|
||||||
tagCount := 0
|
tagCount := 0
|
||||||
for k, _ := range entry.Extended {
|
for k, _ := range entry.Extended {
|
||||||
if strings.HasPrefix(k, "X-Amz-Tagging-") {
|
if strings.HasPrefix(k, xhttp.AmzObjectTagging+"-") {
|
||||||
tagCount++
|
tagCount++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if tagCount > 0 {
|
if tagCount > 0 {
|
||||||
w.Header().Set("x-amz-tag-count", strconv.Itoa(tagCount))
|
w.Header().Set(xhttp.AmzTagCount, strconv.Itoa(tagCount))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import (
|
|||||||
"github.com/chrislusf/seaweedfs/weed/glog"
|
"github.com/chrislusf/seaweedfs/weed/glog"
|
||||||
"github.com/chrislusf/seaweedfs/weed/operation"
|
"github.com/chrislusf/seaweedfs/weed/operation"
|
||||||
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb"
|
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb"
|
||||||
|
xhttp "github.com/chrislusf/seaweedfs/weed/s3api/http"
|
||||||
"github.com/chrislusf/seaweedfs/weed/security"
|
"github.com/chrislusf/seaweedfs/weed/security"
|
||||||
"github.com/chrislusf/seaweedfs/weed/stats"
|
"github.com/chrislusf/seaweedfs/weed/stats"
|
||||||
"github.com/chrislusf/seaweedfs/weed/util"
|
"github.com/chrislusf/seaweedfs/weed/util"
|
||||||
@@ -312,31 +313,26 @@ func (fs *FilerServer) mkdir(ctx context.Context, w http.ResponseWriter, r *http
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (fs *FilerServer) saveAmzMetaData(r *http.Request, entry *filer.Entry) {
|
func (fs *FilerServer) saveAmzMetaData(r *http.Request, entry *filer.Entry) {
|
||||||
var (
|
|
||||||
storageClass = "X-Amz-Storage-Class"
|
|
||||||
objectTagging = "X-Amz-Tagging"
|
|
||||||
userMetaPrefix = "X-Amz-Meta-"
|
|
||||||
)
|
|
||||||
|
|
||||||
if entry.Extended == nil {
|
if entry.Extended == nil {
|
||||||
entry.Extended = make(map[string][]byte)
|
entry.Extended = make(map[string][]byte)
|
||||||
}
|
}
|
||||||
|
|
||||||
if sc := r.Header.Get(storageClass); sc != "" {
|
if sc := r.Header.Get(xhttp.AmzStorageClass); sc != "" {
|
||||||
entry.Extended[storageClass] = []byte(sc)
|
entry.Extended[xhttp.AmzStorageClass] = []byte(sc)
|
||||||
}
|
}
|
||||||
|
|
||||||
if tags := r.Header.Get(objectTagging); tags != "" {
|
if tags := r.Header.Get(xhttp.AmzObjectTagging); tags != "" {
|
||||||
for _, v := range strings.Split(tags, "&") {
|
for _, v := range strings.Split(tags, "&") {
|
||||||
tag := strings.Split(v, "=")
|
tag := strings.Split(v, "=")
|
||||||
if len(tag) == 2 {
|
if len(tag) == 2 {
|
||||||
entry.Extended[objectTagging+"-"+tag[0]] = []byte(tag[1])
|
entry.Extended[xhttp.AmzObjectTagging+"-"+tag[0]] = []byte(tag[1])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for header, values := range r.Header {
|
for header, values := range r.Header {
|
||||||
if strings.HasPrefix(header, userMetaPrefix) {
|
if strings.HasPrefix(header, xhttp.AmzUserMetaPrefix) {
|
||||||
for _, value := range values {
|
for _, value := range values {
|
||||||
entry.Extended[header] = []byte(value)
|
entry.Extended[header] = []byte(value)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user