Browse Source

Merge pull request #1578 from taozix/master

S3 bucket list, response with uploaded storageclass.
pull/1584/head
Chris Lu 4 years ago
committed by GitHub
parent
commit
6f8b426f4f
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      weed/s3api/filer_util_tags.go
  2. 30
      weed/s3api/http/header.go
  3. 9
      weed/s3api/s3api_objects_list_handlers.go
  4. 5
      weed/server/filer_server_handlers_read.go
  5. 16
      weed/server/filer_server_handlers_write_autochunk.go

3
weed/s3api/filer_util_tags.go

@ -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

@ -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"
)

9
weed/s3api/s3api_objects_list_handlers.go

@ -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),
}) })
} }
}) })

5
weed/server/filer_server_handlers_read.go

@ -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))
} }
} }

16
weed/server/filer_server_handlers_write_autochunk.go

@ -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 != "" {
entry.Extended[storageClass] = []byte(sc)
if sc := r.Header.Get(xhttp.AmzStorageClass); 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)
} }

Loading…
Cancel
Save