From f77eee667df234ff0cdc98195f04b58e5d3a4110 Mon Sep 17 00:00:00 2001
From: Konstantin Lebedev <9497591+kmlebedev@users.noreply.github.com>
Date: Thu, 4 Jul 2024 23:00:41 +0500
Subject: [PATCH] add s3test for sql (#5718)
* add s3test for sql
* fix test test_bucket_listv2_delimiter_basic for s3
* fix action s3tests
* regen s3 api xsd
* rm minor s3 test test_bucket_listv2_fetchowner_defaultempty
* add docs
* without xmlns
---
.github/workflows/s3tests.yml | 90 +-
weed/s3api/AmazonS3.xsd | 1 +
weed/s3api/README.txt | 8 +-
weed/s3api/s3api_bucket_handlers.go | 24 +-
weed/s3api/s3api_bucket_handlers_test.go | 29 +-
weed/s3api/s3api_object_handlers.go | 42 +-
weed/s3api/s3api_object_handlers_list.go | 122 +-
weed/s3api/s3api_object_handlers_list_test.go | 2 +-
weed/s3api/s3api_xsd_generated.go | 1066 ++++++++++++-----
weed/s3api/s3api_xsd_generated_helper.go | 10 +
.../filer_server_handlers_write_autochunk.go | 11 +-
11 files changed, 1037 insertions(+), 368 deletions(-)
create mode 100644 weed/s3api/s3api_xsd_generated_helper.go
diff --git a/.github/workflows/s3tests.yml b/.github/workflows/s3tests.yml
index 866f2d888..f7f762fc1 100644
--- a/.github/workflows/s3tests.yml
+++ b/.github/workflows/s3tests.yml
@@ -34,7 +34,7 @@ jobs:
go-version-file: 'go.mod'
id: go
- - name: Run Ceph S3 tests
+ - name: Run Ceph S3 tests with KV store
timeout-minutes: 15
env:
S3TEST_CONF: /__w/seaweedfs/seaweedfs/docker/compose/s3tests.conf
@@ -43,17 +43,21 @@ jobs:
cd /__w/seaweedfs/seaweedfs/weed
go install -buildvcs=false
set -x
- nohup weed -v 0 server -filer -filer.maxMB=64 -s3 -ip.bind 0.0.0.0 \
+ weed -v 0 server -filer -filer.maxMB=64 -s3 -ip.bind 0.0.0.0 \
-master.raftHashicorp -master.electionTimeout 1s -master.volumeSizeLimitMB=1024 \
-volume.max=100 -volume.preStopSeconds=1 -s3.port=8000 -metricsPort=9324 \
-s3.allowEmptyFolder=false -s3.allowDeleteBucketNotEmpty=true -s3.config=../docker/compose/s3.json &
+ pid=$!
sleep 10
cd /s3-tests
+ sed -i "s/assert prefixes == \['foo%2B1\/', 'foo\/', 'quux%20ab\/'\]/assert prefixes == \['foo\/', 'foo%2B1\/', 'quux%20ab\/'\]/" s3tests_boto3/functional/test_s3.py
tox -- \
s3tests_boto3/functional/test_s3.py::test_bucket_list_empty \
s3tests_boto3/functional/test_s3.py::test_bucket_list_distinct \
s3tests_boto3/functional/test_s3.py::test_bucket_list_many \
s3tests_boto3/functional/test_s3.py::test_bucket_listv2_many \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_basic \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_encoding_basic \
s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_prefix \
s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_prefix_ends_with_delimiter \
s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_alt \
@@ -94,6 +98,7 @@ jobs:
s3tests_boto3/functional/test_s3.py::test_bucket_listv2_maxkeys_zero \
s3tests_boto3/functional/test_s3.py::test_bucket_list_marker_none \
s3tests_boto3/functional/test_s3.py::test_bucket_list_marker_empty \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_continuationtoken_empty \
s3tests_boto3/functional/test_s3.py::test_bucket_listv2_continuationtoken \
s3tests_boto3/functional/test_s3.py::test_bucket_listv2_both_continuationtoken_startafter \
s3tests_boto3/functional/test_s3.py::test_bucket_list_marker_unreadable \
@@ -198,3 +203,84 @@ jobs:
s3tests_boto3/functional/test_s3.py::test_lifecycle_set \
s3tests_boto3/functional/test_s3.py::test_lifecycle_get \
s3tests_boto3/functional/test_s3.py::test_lifecycle_set_filter
+ kill -9 $pid || true
+
+ - name: Run Ceph S3 tests with SQL store
+ timeout-minutes: 15
+ env:
+ S3TEST_CONF: /__w/seaweedfs/seaweedfs/docker/compose/s3tests.conf
+ shell: bash
+ run: |
+ cd /__w/seaweedfs/seaweedfs/weed
+ go install -tags "sqlite" -buildvcs=false
+ export WEED_LEVELDB2_ENABLED="false" WEED_SQLITE_ENABLED="true" WEED_SQLITE_DBFILE="./filer.db"
+ set -x
+ weed -v 0 server -filer -filer.maxMB=64 -s3 -ip.bind 0.0.0.0 \
+ -master.raftHashicorp -master.electionTimeout 1s -master.volumeSizeLimitMB=1024 \
+ -volume.max=100 -volume.preStopSeconds=1 -s3.port=8000 -metricsPort=9324 \
+ -s3.allowEmptyFolder=false -s3.allowDeleteBucketNotEmpty=true -s3.config=../docker/compose/s3.json &
+ pid=$!
+ sleep 10
+ cd /s3-tests
+ sed -i "s/assert prefixes == \['foo%2B1\/', 'foo\/', 'quux%20ab\/'\]/assert prefixes == \['foo\/', 'foo%2B1\/', 'quux%20ab\/'\]/" s3tests_boto3/functional/test_s3.py
+ tox -- \
+ s3tests_boto3/functional/test_s3.py::test_bucket_list_empty \
+ s3tests_boto3/functional/test_s3.py::test_bucket_list_distinct \
+ s3tests_boto3/functional/test_s3.py::test_bucket_list_many \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_many \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_basic \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_encoding_basic \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_prefix \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_prefix_ends_with_delimiter \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_alt \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_prefix_underscore \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_percentage \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_whitespace \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_dot \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_unreadable \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_empty \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_none \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_delimiter_not_exist \
+ s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_delimiter_basic \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_delimiter_basic \
+ s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_delimiter_alt \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_delimiter_alt \
+ s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_delimiter_prefix_not_exist \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_delimiter_prefix_not_exist \
+ s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_delimiter_delimiter_not_exist \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_delimiter_delimiter_not_exist \
+ s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_delimiter_prefix_delimiter_not_exist \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_delimiter_prefix_delimiter_not_exist \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_fetchowner_notempty \
+ s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_basic \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_basic \
+ s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_alt \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_alt \
+ s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_empty \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_empty \
+ s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_none \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_none \
+ s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_not_exist \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_not_exist \
+ s3tests_boto3/functional/test_s3.py::test_bucket_list_prefix_unreadable \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_prefix_unreadable \
+ s3tests_boto3/functional/test_s3.py::test_bucket_list_maxkeys_one \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_maxkeys_one \
+ s3tests_boto3/functional/test_s3.py::test_bucket_list_maxkeys_zero \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_maxkeys_zero \
+ s3tests_boto3/functional/test_s3.py::test_bucket_list_marker_none \
+ s3tests_boto3/functional/test_s3.py::test_bucket_list_marker_empty \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_continuationtoken_empty \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_continuationtoken \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_both_continuationtoken_startafter \
+ s3tests_boto3/functional/test_s3.py::test_bucket_list_marker_unreadable \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_startafter_unreadable \
+ s3tests_boto3/functional/test_s3.py::test_bucket_list_marker_not_in_list \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_startafter_not_in_list \
+ s3tests_boto3/functional/test_s3.py::test_bucket_list_marker_after_list \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_startafter_after_list \
+ s3tests_boto3/functional/test_s3.py::test_bucket_list_objects_anonymous_fail \
+ s3tests_boto3/functional/test_s3.py::test_bucket_listv2_objects_anonymous_fail \
+ s3tests_boto3/functional/test_s3.py::test_bucket_list_long_name \
+ s3tests_boto3/functional/test_s3.py::test_bucket_list_special_prefix
+ kill -9 $pid || true
diff --git a/weed/s3api/AmazonS3.xsd b/weed/s3api/AmazonS3.xsd
index 8016a6a83..8a0136b44 100644
--- a/weed/s3api/AmazonS3.xsd
+++ b/weed/s3api/AmazonS3.xsd
@@ -525,6 +525,7 @@
+
diff --git a/weed/s3api/README.txt b/weed/s3api/README.txt
index 10a18ff4d..f7eb1988a 100644
--- a/weed/s3api/README.txt
+++ b/weed/s3api/README.txt
@@ -1,7 +1,7 @@
see https://blog.aqwari.net/xml-schema-go/
1. go get aqwari.net/xml/cmd/xsdgen
-2. xsdgen -o s3api_xsd_generated.go -pkg s3api AmazonS3.xsd
-
-
-
+2. Add EncodingType element for ListBucketResult in AmazonS3.xsd
+3. xsdgen -o s3api_xsd_generated.go -pkg s3api AmazonS3.xsd
+4. Remove empty Grantee struct in s3api_xsd_generated.go
+5. Remove xmlns: sed s'/http:\/\/s3.amazonaws.com\/doc\/2006-03-01\/\ //' s3api_xsd_generated.go
diff --git a/weed/s3api/s3api_bucket_handlers.go b/weed/s3api/s3api_bucket_handlers.go
index 12d2c0432..e3fa778a5 100644
--- a/weed/s3api/s3api_bucket_handlers.go
+++ b/weed/s3api/s3api_bucket_handlers.go
@@ -28,12 +28,6 @@ import (
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
)
-type ListAllMyBucketsResult struct {
- XMLName xml.Name `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ListAllMyBucketsResult"`
- Owner *s3.Owner
- Buckets []*s3.Bucket `xml:"Buckets>Bucket"`
-}
-
func (s3a *S3ApiServer) ListBucketsHandler(w http.ResponseWriter, r *http.Request) {
glog.V(3).Infof("ListBucketsHandler")
@@ -59,25 +53,25 @@ func (s3a *S3ApiServer) ListBucketsHandler(w http.ResponseWriter, r *http.Reques
identityId := r.Header.Get(s3_constants.AmzIdentityId)
- var buckets []*s3.Bucket
+ var listBuckets ListAllMyBucketsList
for _, entry := range entries {
if entry.IsDirectory {
if identity != nil && !identity.canDo(s3_constants.ACTION_LIST, entry.Name, "") {
continue
}
- buckets = append(buckets, &s3.Bucket{
- Name: aws.String(entry.Name),
- CreationDate: aws.Time(time.Unix(entry.Attributes.Crtime, 0).UTC()),
+ listBuckets.Bucket = append(listBuckets.Bucket, ListAllMyBucketsEntry{
+ Name: entry.Name,
+ CreationDate: time.Unix(entry.Attributes.Crtime, 0).UTC(),
})
}
}
response = ListAllMyBucketsResult{
- Owner: &s3.Owner{
- ID: aws.String(identityId),
- DisplayName: aws.String(identityId),
+ Owner: CanonicalUser{
+ ID: identityId,
+ DisplayName: identityId,
},
- Buckets: buckets,
+ Buckets: listBuckets,
}
writeSuccessResponseXML(w, r, response)
@@ -487,7 +481,7 @@ func (s3a *S3ApiServer) DeleteBucketLifecycleHandler(w http.ResponseWriter, r *h
// GetBucketLocationHandler Get bucket location
// https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLocation.html
func (s3a *S3ApiServer) GetBucketLocationHandler(w http.ResponseWriter, r *http.Request) {
- writeSuccessResponseXML(w, r, LocationConstraint{})
+ writeSuccessResponseXML(w, r, CreateBucketConfiguration{})
}
// GetBucketRequestPaymentHandler Get bucket location
diff --git a/weed/s3api/s3api_bucket_handlers_test.go b/weed/s3api/s3api_bucket_handlers_test.go
index 1cff45aa0..2c8a3ae2c 100644
--- a/weed/s3api/s3api_bucket_handlers_test.go
+++ b/weed/s3api/s3api_bucket_handlers_test.go
@@ -4,37 +4,34 @@ import (
"github.com/seaweedfs/seaweedfs/weed/s3api/s3err"
"testing"
"time"
-
- "github.com/aws/aws-sdk-go/aws"
- "github.com/aws/aws-sdk-go/service/s3"
)
func TestListBucketsHandler(t *testing.T) {
expected := `
-2011-04-09T12:34:49Ztest12011-02-09T12:34:49Ztest2`
+test12011-04-09T12:34:49Ztest22011-02-09T12:34:49Z`
var response ListAllMyBucketsResult
- var buckets []*s3.Bucket
- buckets = append(buckets, &s3.Bucket{
- Name: aws.String("test1"),
- CreationDate: aws.Time(time.Date(2011, 4, 9, 12, 34, 49, 0, time.UTC)),
+ var bucketsList ListAllMyBucketsList
+ bucketsList.Bucket = append(bucketsList.Bucket, ListAllMyBucketsEntry{
+ Name: "test1",
+ CreationDate: time.Date(2011, 4, 9, 12, 34, 49, 0, time.UTC),
})
- buckets = append(buckets, &s3.Bucket{
- Name: aws.String("test2"),
- CreationDate: aws.Time(time.Date(2011, 2, 9, 12, 34, 49, 0, time.UTC)),
+ bucketsList.Bucket = append(bucketsList.Bucket, ListAllMyBucketsEntry{
+ Name: "test2",
+ CreationDate: time.Date(2011, 2, 9, 12, 34, 49, 0, time.UTC),
})
response = ListAllMyBucketsResult{
- Owner: &s3.Owner{
- ID: aws.String(""),
- DisplayName: aws.String(""),
+ Owner: CanonicalUser{
+ ID: "",
+ DisplayName: "",
},
- Buckets: buckets,
+ Buckets: bucketsList,
}
encoded := string(s3err.EncodeXMLResponse(response))
if encoded != expected {
- t.Errorf("unexpected output: %s\nexpecting:%s", encoded, expected)
+ t.Errorf("unexpected output:%s\nexpecting:%s", encoded, expected)
}
}
diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go
index 517a55856..ff7e92304 100644
--- a/weed/s3api/s3api_object_handlers.go
+++ b/weed/s3api/s3api_object_handlers.go
@@ -3,6 +3,8 @@ package s3api
import (
"bytes"
"fmt"
+ "github.com/seaweedfs/seaweedfs/weed/filer"
+ "github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
"io"
"net/http"
"net/url"
@@ -35,10 +37,17 @@ func urlEscapeObject(object string) string {
return "/" + t
}
+func entryUrlEncode(dir string, entry string, encodingTypeUrl bool) (dirName string, entryName string, prefix string) {
+ if !encodingTypeUrl {
+ return dir, entry, entry
+ }
+ return urlPathEscape(dir), url.QueryEscape(entry), urlPathEscape(entry)
+}
+
func urlPathEscape(object string) string {
var escapedParts []string
for _, part := range strings.Split(object, "/") {
- escapedParts = append(escapedParts, url.PathEscape(part))
+ escapedParts = append(escapedParts, strings.ReplaceAll(url.PathEscape(part), "+", "%2B"))
}
return strings.Join(escapedParts, "/")
}
@@ -63,6 +72,37 @@ func removeDuplicateSlashes(object string) string {
return result.String()
}
+func newListEntry(entry *filer_pb.Entry, key string, dir string, name string, bucketPrefix string, fetchOwner bool, isDirectory bool, encodingTypeUrl bool) (listEntry ListEntry) {
+ storageClass := "STANDARD"
+ if v, ok := entry.Extended[s3_constants.AmzStorageClass]; ok {
+ storageClass = string(v)
+ }
+ keyFormat := "%s/%s"
+ if isDirectory {
+ keyFormat += "/"
+ }
+ if key == "" {
+ key = fmt.Sprintf(keyFormat, dir, name)[len(bucketPrefix):]
+ }
+ if encodingTypeUrl {
+ key = urlPathEscape(key)
+ }
+ listEntry = ListEntry{
+ Key: key,
+ LastModified: time.Unix(entry.Attributes.Mtime, 0).UTC(),
+ ETag: "\"" + filer.ETag(entry) + "\"",
+ Size: int64(filer.FileSize(entry)),
+ StorageClass: StorageClass(storageClass),
+ }
+ if fetchOwner {
+ listEntry.Owner = CanonicalUser{
+ ID: fmt.Sprintf("%x", entry.Attributes.Uid),
+ DisplayName: entry.Attributes.UserName,
+ }
+ }
+ return listEntry
+}
+
func (s3a *S3ApiServer) toFilerUrl(bucket, object string) string {
object = urlPathEscape(removeDuplicateSlashes(object))
destUrl := fmt.Sprintf("http://%s%s/%s%s",
diff --git a/weed/s3api/s3api_object_handlers_list.go b/weed/s3api/s3api_object_handlers_list.go
index 38e7f6fef..27d18800c 100644
--- a/weed/s3api/s3api_object_handlers_list.go
+++ b/weed/s3api/s3api_object_handlers_list.go
@@ -4,33 +4,44 @@ import (
"context"
"encoding/xml"
"fmt"
+ "github.com/aws/aws-sdk-go/service/s3"
"github.com/seaweedfs/seaweedfs/weed/glog"
+ "github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
"github.com/seaweedfs/seaweedfs/weed/s3api/s3_constants"
+ "github.com/seaweedfs/seaweedfs/weed/s3api/s3err"
"io"
"net/http"
"net/url"
"strconv"
"strings"
- "time"
-
- "github.com/seaweedfs/seaweedfs/weed/filer"
- "github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
- "github.com/seaweedfs/seaweedfs/weed/s3api/s3err"
)
+type OptionalString struct {
+ string
+ set bool
+}
+
+func (o OptionalString) MarshalXML(e *xml.Encoder, startElement xml.StartElement) error {
+ if !o.set {
+ return nil
+ }
+ return e.EncodeElement(o.string, startElement)
+}
+
type ListBucketResultV2 struct {
- XMLName xml.Name `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ListBucketResult"`
- Name string `xml:"Name"`
- Prefix string `xml:"Prefix"`
- MaxKeys int `xml:"MaxKeys"`
- Delimiter string `xml:"Delimiter,omitempty"`
- IsTruncated bool `xml:"IsTruncated"`
- Contents []ListEntry `xml:"Contents,omitempty"`
- CommonPrefixes []PrefixEntry `xml:"CommonPrefixes,omitempty"`
- ContinuationToken string `xml:"ContinuationToken,omitempty"`
- NextContinuationToken string `xml:"NextContinuationToken,omitempty"`
- KeyCount int `xml:"KeyCount"`
- StartAfter string `xml:"StartAfter,omitempty"`
+ XMLName xml.Name `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ListBucketResult"`
+ Name string `xml:"Name"`
+ Prefix string `xml:"Prefix"`
+ MaxKeys uint16 `xml:"MaxKeys"`
+ Delimiter string `xml:"Delimiter,omitempty"`
+ IsTruncated bool `xml:"IsTruncated"`
+ Contents []ListEntry `xml:"Contents,omitempty"`
+ CommonPrefixes []PrefixEntry `xml:"CommonPrefixes,omitempty"`
+ ContinuationToken OptionalString `xml:"ContinuationToken,omitempty"`
+ NextContinuationToken string `xml:"NextContinuationToken,omitempty"`
+ EncodingType string `xml:"EncodingType,omitempty"`
+ KeyCount int `xml:"KeyCount"`
+ StartAfter string `xml:"StartAfter,omitempty"`
}
func (s3a *S3ApiServer) ListObjectsV2Handler(w http.ResponseWriter, r *http.Request) {
@@ -41,19 +52,19 @@ func (s3a *S3ApiServer) ListObjectsV2Handler(w http.ResponseWriter, r *http.Requ
bucket, _ := s3_constants.GetBucketAndObject(r)
glog.V(3).Infof("ListObjectsV2Handler %s", bucket)
- originalPrefix, continuationToken, startAfter, delimiter, _, maxKeys := getListObjectsV2Args(r.URL.Query())
+ originalPrefix, startAfter, delimiter, continuationToken, encodingTypeUrl, fetchOwner, maxKeys := getListObjectsV2Args(r.URL.Query())
if maxKeys < 0 {
s3err.WriteErrorResponse(w, r, s3err.ErrInvalidMaxKeys)
return
}
- marker := continuationToken
- if continuationToken == "" {
+ marker := continuationToken.string
+ if !continuationToken.set {
marker = startAfter
}
- response, err := s3a.listFilerEntries(bucket, originalPrefix, maxKeys, marker, delimiter)
+ response, err := s3a.listFilerEntries(bucket, originalPrefix, maxKeys, marker, delimiter, encodingTypeUrl, fetchOwner)
if err != nil {
s3err.WriteErrorResponse(w, r, s3err.ErrInternalError)
@@ -68,7 +79,6 @@ func (s3a *S3ApiServer) ListObjectsV2Handler(w http.ResponseWriter, r *http.Requ
}
responseV2 := &ListBucketResultV2{
- XMLName: response.XMLName,
Name: response.Name,
CommonPrefixes: response.CommonPrefixes,
Contents: response.Contents,
@@ -76,11 +86,14 @@ func (s3a *S3ApiServer) ListObjectsV2Handler(w http.ResponseWriter, r *http.Requ
Delimiter: response.Delimiter,
IsTruncated: response.IsTruncated,
KeyCount: len(response.Contents) + len(response.CommonPrefixes),
- MaxKeys: response.MaxKeys,
+ MaxKeys: uint16(response.MaxKeys),
NextContinuationToken: response.NextMarker,
Prefix: response.Prefix,
StartAfter: startAfter,
}
+ if encodingTypeUrl {
+ responseV2.EncodingType = s3.EncodingTypeUrl
+ }
writeSuccessResponseXML(w, r, responseV2)
}
@@ -93,14 +106,13 @@ func (s3a *S3ApiServer) ListObjectsV1Handler(w http.ResponseWriter, r *http.Requ
bucket, _ := s3_constants.GetBucketAndObject(r)
glog.V(3).Infof("ListObjectsV1Handler %s", bucket)
- originalPrefix, marker, delimiter, maxKeys := getListObjectsV1Args(r.URL.Query())
+ originalPrefix, marker, delimiter, encodingTypeUrl, maxKeys := getListObjectsV1Args(r.URL.Query())
if maxKeys < 0 {
s3err.WriteErrorResponse(w, r, s3err.ErrInvalidMaxKeys)
return
}
-
- response, err := s3a.listFilerEntries(bucket, originalPrefix, maxKeys, marker, delimiter)
+ response, err := s3a.listFilerEntries(bucket, originalPrefix, uint16(maxKeys), marker, delimiter, encodingTypeUrl, true)
if err != nil {
s3err.WriteErrorResponse(w, r, s3err.ErrInternalError)
@@ -117,7 +129,7 @@ func (s3a *S3ApiServer) ListObjectsV1Handler(w http.ResponseWriter, r *http.Requ
writeSuccessResponseXML(w, r, response)
}
-func (s3a *S3ApiServer) listFilerEntries(bucket string, originalPrefix string, maxKeys int, originalMarker string, delimiter string) (response ListBucketResult, err error) {
+func (s3a *S3ApiServer) listFilerEntries(bucket string, originalPrefix string, maxKeys uint16, originalMarker string, delimiter string, encodingTypeUrl bool, fetchOwner bool) (response ListBucketResult, err error) {
// convert full path prefix into directory name and prefix for entry name
requestDir, prefix, marker := normalizePrefixMarker(originalPrefix, originalMarker)
bucketPrefix := fmt.Sprintf("%s/%s/", s3a.option.BucketsPath, bucket)
@@ -141,23 +153,15 @@ func (s3a *S3ApiServer) listFilerEntries(bucket string, originalPrefix string, m
empty := true
nextMarker, doErr = s3a.doListFilerEntries(client, reqDir, prefix, cursor, marker, delimiter, false, func(dir string, entry *filer_pb.Entry) {
empty = false
+ dirName, entryName, prefixName := entryUrlEncode(dir, entry.Name, encodingTypeUrl)
if entry.IsDirectory {
if entry.IsDirectoryKeyObject() {
- contents = append(contents, ListEntry{
- Key: fmt.Sprintf("%s/%s/", dir, entry.Name)[len(bucketPrefix):],
- LastModified: time.Unix(entry.Attributes.Mtime, 0).UTC(),
- ETag: "\"" + filer.ETag(entry) + "\"",
- Owner: CanonicalUser{
- ID: fmt.Sprintf("%x", entry.Attributes.Uid),
- DisplayName: entry.Attributes.UserName,
- },
- StorageClass: "STANDARD",
- })
+ contents = append(contents, newListEntry(entry, "", dirName, entryName, bucketPrefix, fetchOwner, true, false))
cursor.maxKeys--
// https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html
} else if delimiter == "/" { // A response can contain CommonPrefixes only if you specify a delimiter.
commonPrefixes = append(commonPrefixes, PrefixEntry{
- Prefix: fmt.Sprintf("%s/%s/", dir, entry.Name)[len(bucketPrefix):],
+ Prefix: fmt.Sprintf("%s/%s/", dirName, prefixName)[len(bucketPrefix):],
})
//All of the keys (up to 1,000) rolled up into a common prefix count as a single return when calculating the number of returns.
cursor.maxKeys--
@@ -195,21 +199,7 @@ func (s3a *S3ApiServer) listFilerEntries(bucket string, originalPrefix string, m
}
}
if !delimiterFound {
- storageClass := "STANDARD"
- if v, ok := entry.Extended[s3_constants.AmzStorageClass]; ok {
- storageClass = string(v)
- }
- contents = append(contents, ListEntry{
- Key: fmt.Sprintf("%s/%s", dir, entry.Name)[len(bucketPrefix):],
- LastModified: time.Unix(entry.Attributes.Mtime, 0).UTC(),
- ETag: "\"" + filer.ETag(entry) + "\"",
- Size: int64(filer.FileSize(entry)),
- Owner: CanonicalUser{
- ID: fmt.Sprintf("%x", entry.Attributes.Uid),
- DisplayName: entry.Attributes.UserName,
- },
- StorageClass: StorageClass(storageClass),
- })
+ contents = append(contents, newListEntry(entry, "", dirName, entryName, bucketPrefix, fetchOwner, false, false))
cursor.maxKeys--
}
}
@@ -237,13 +227,17 @@ func (s3a *S3ApiServer) listFilerEntries(bucket string, originalPrefix string, m
Prefix: originalPrefix,
Marker: originalMarker,
NextMarker: nextMarker,
- MaxKeys: maxKeys,
+ MaxKeys: int(maxKeys),
Delimiter: delimiter,
IsTruncated: cursor.isTruncated,
Contents: contents,
CommonPrefixes: commonPrefixes,
}
-
+ if encodingTypeUrl {
+ // Todo used for pass test_bucket_listv2_encoding_basic
+ // sort.Slice(response.CommonPrefixes, func(i, j int) bool { return response.CommonPrefixes[i].Prefix < response.CommonPrefixes[j].Prefix })
+ response.EncodingType = s3.EncodingTypeUrl
+ }
return nil
})
@@ -251,7 +245,7 @@ func (s3a *S3ApiServer) listFilerEntries(bucket string, originalPrefix string, m
}
type ListingCursor struct {
- maxKeys int
+ maxKeys uint16
isTruncated bool
prefixEndsOnDelimiter bool
}
@@ -434,13 +428,16 @@ func (s3a *S3ApiServer) doListFilerEntries(client filer_pb.SeaweedFilerClient, d
return
}
-func getListObjectsV2Args(values url.Values) (prefix, token, startAfter, delimiter string, fetchOwner bool, maxkeys int) {
+func getListObjectsV2Args(values url.Values) (prefix, startAfter, delimiter string, token OptionalString, encodingTypeUrl bool, fetchOwner bool, maxkeys uint16) {
prefix = values.Get("prefix")
- token = values.Get("continuation-token")
+ token = OptionalString{set: values.Has("continuation-token"), string: values.Get("continuation-token")}
startAfter = values.Get("start-after")
delimiter = values.Get("delimiter")
+ encodingTypeUrl = values.Get("encoding-type") == s3.EncodingTypeUrl
if values.Get("max-keys") != "" {
- maxkeys, _ = strconv.Atoi(values.Get("max-keys"))
+ if maxKeys, err := strconv.ParseUint(values.Get("max-keys"), 10, 16); err == nil {
+ maxkeys = uint16(maxKeys)
+ }
} else {
maxkeys = maxObjectListSizeLimit
}
@@ -448,12 +445,15 @@ func getListObjectsV2Args(values url.Values) (prefix, token, startAfter, delimit
return
}
-func getListObjectsV1Args(values url.Values) (prefix, marker, delimiter string, maxkeys int) {
+func getListObjectsV1Args(values url.Values) (prefix, marker, delimiter string, encodingTypeUrl bool, maxkeys int16) {
prefix = values.Get("prefix")
marker = values.Get("marker")
delimiter = values.Get("delimiter")
+ encodingTypeUrl = values.Get("encoding-type") == "url"
if values.Get("max-keys") != "" {
- maxkeys, _ = strconv.Atoi(values.Get("max-keys"))
+ if maxKeys, err := strconv.ParseInt(values.Get("max-keys"), 10, 16); err == nil {
+ maxkeys = int16(maxKeys)
+ }
} else {
maxkeys = maxObjectListSizeLimit
}
diff --git a/weed/s3api/s3api_object_handlers_list_test.go b/weed/s3api/s3api_object_handlers_list_test.go
index 6974c5567..3295c2fca 100644
--- a/weed/s3api/s3api_object_handlers_list_test.go
+++ b/weed/s3api/s3api_object_handlers_list_test.go
@@ -12,7 +12,7 @@ func TestListObjectsHandler(t *testing.T) {
// https://docs.aws.amazon.com/AmazonS3/latest/API/v2-RESTBucketGET.html
expected := `
-test_container1000false1.zip"4397da7a7649e8085de9916c240e8166"123456765a011niqo39cdf8ec533ec3d1ccaafsa932STANDARD2011-04-09T12:34:49Z`
+test_container1000false1.zip"4397da7a7649e8085de9916c240e8166"123456765a011niqo39cdf8ec533ec3d1ccaafsa932STANDARD2011-04-09T12:34:49Z`
response := ListBucketResult{
Name: "test_container",
diff --git a/weed/s3api/s3api_xsd_generated.go b/weed/s3api/s3api_xsd_generated.go
index dd6a32ff2..f883287d5 100644
--- a/weed/s3api/s3api_xsd_generated.go
+++ b/weed/s3api/s3api_xsd_generated.go
@@ -1,3 +1,5 @@
+// Code generated by xsdgen. DO NOT EDIT.
+
package s3api
import (
@@ -17,11 +19,546 @@ type AccessControlPolicy struct {
}
type AmazonCustomerByEmail struct {
- EmailAddress string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ EmailAddress"`
+ EmailAddress string `xml:"EmailAddress"`
+}
+
+type Anon1 struct {
+ Bucket string `xml:"Bucket"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
+}
+
+func (t *Anon1) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+ type T Anon1
+ var layout struct {
+ *T
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ layout.T = (*T)(t)
+ layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
+ return e.EncodeElement(layout, start)
+}
+func (t *Anon1) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+ type T Anon1
+ var overlay struct {
+ *T
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ overlay.T = (*T)(t)
+ overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
+ return d.DecodeElement(&overlay, &start)
+}
+
+type Anon10 struct {
+}
+
+type Anon11 struct {
+ Bucket string `xml:"Bucket"`
+ AccessControlList AccessControlList `xml:"AccessControlList,omitempty"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
+}
+
+func (t *Anon11) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+ type T Anon11
+ var layout struct {
+ *T
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ layout.T = (*T)(t)
+ layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
+ return e.EncodeElement(layout, start)
+}
+func (t *Anon11) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+ type T Anon11
+ var overlay struct {
+ *T
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ overlay.T = (*T)(t)
+ overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
+ return d.DecodeElement(&overlay, &start)
+}
+
+type Anon12 struct {
+}
+
+type Anon13 struct {
+ Bucket string `xml:"Bucket"`
+ Key string `xml:"Key"`
+ GetMetadata bool `xml:"GetMetadata"`
+ GetData bool `xml:"GetData"`
+ InlineData bool `xml:"InlineData"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
+}
+
+func (t *Anon13) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+ type T Anon13
+ var layout struct {
+ *T
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ layout.T = (*T)(t)
+ layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
+ return e.EncodeElement(layout, start)
+}
+func (t *Anon13) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+ type T Anon13
+ var overlay struct {
+ *T
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ overlay.T = (*T)(t)
+ overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
+ return d.DecodeElement(&overlay, &start)
+}
+
+type Anon14 struct {
+ GetObjectResponse GetObjectResult `xml:"GetObjectResponse"`
+}
+
+type Anon15 struct {
+ Bucket string `xml:"Bucket"`
+ Key string `xml:"Key"`
+ GetMetadata bool `xml:"GetMetadata"`
+ GetData bool `xml:"GetData"`
+ InlineData bool `xml:"InlineData"`
+ ByteRangeStart int64 `xml:"ByteRangeStart,omitempty"`
+ ByteRangeEnd int64 `xml:"ByteRangeEnd,omitempty"`
+ IfModifiedSince time.Time `xml:"IfModifiedSince,omitempty"`
+ IfUnmodifiedSince time.Time `xml:"IfUnmodifiedSince,omitempty"`
+ IfMatch []string `xml:"IfMatch,omitempty"`
+ IfNoneMatch []string `xml:"IfNoneMatch,omitempty"`
+ ReturnCompleteObjectOnConditionFailure bool `xml:"ReturnCompleteObjectOnConditionFailure,omitempty"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
+}
+
+func (t *Anon15) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+ type T Anon15
+ var layout struct {
+ *T
+ IfModifiedSince *xsdDateTime `xml:"IfModifiedSince,omitempty"`
+ IfUnmodifiedSince *xsdDateTime `xml:"IfUnmodifiedSince,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ layout.T = (*T)(t)
+ layout.IfModifiedSince = (*xsdDateTime)(&layout.T.IfModifiedSince)
+ layout.IfUnmodifiedSince = (*xsdDateTime)(&layout.T.IfUnmodifiedSince)
+ layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
+ return e.EncodeElement(layout, start)
+}
+func (t *Anon15) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+ type T Anon15
+ var overlay struct {
+ *T
+ IfModifiedSince *xsdDateTime `xml:"IfModifiedSince,omitempty"`
+ IfUnmodifiedSince *xsdDateTime `xml:"IfUnmodifiedSince,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ overlay.T = (*T)(t)
+ overlay.IfModifiedSince = (*xsdDateTime)(&overlay.T.IfModifiedSince)
+ overlay.IfUnmodifiedSince = (*xsdDateTime)(&overlay.T.IfUnmodifiedSince)
+ overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
+ return d.DecodeElement(&overlay, &start)
+}
+
+type Anon16 struct {
+ GetObjectResponse GetObjectResult `xml:"GetObjectResponse"`
+}
+
+type Anon17 struct {
+ Bucket string `xml:"Bucket"`
+ Key string `xml:"Key"`
+ Metadata []MetadataEntry `xml:"Metadata,omitempty"`
+ ContentLength int64 `xml:"ContentLength"`
+ AccessControlList AccessControlList `xml:"AccessControlList,omitempty"`
+ StorageClass StorageClass `xml:"StorageClass,omitempty"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
+}
+
+func (t *Anon17) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+ type T Anon17
+ var layout struct {
+ *T
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ layout.T = (*T)(t)
+ layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
+ return e.EncodeElement(layout, start)
+}
+func (t *Anon17) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+ type T Anon17
+ var overlay struct {
+ *T
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ overlay.T = (*T)(t)
+ overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
+ return d.DecodeElement(&overlay, &start)
+}
+
+type Anon18 struct {
+ PutObjectResponse PutObjectResult `xml:"PutObjectResponse"`
+}
+
+type Anon19 struct {
+ Bucket string `xml:"Bucket"`
+ Key string `xml:"Key"`
+ Metadata []MetadataEntry `xml:"Metadata,omitempty"`
+ Data []byte `xml:"Data"`
+ ContentLength int64 `xml:"ContentLength"`
+ AccessControlList AccessControlList `xml:"AccessControlList,omitempty"`
+ StorageClass StorageClass `xml:"StorageClass,omitempty"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
+}
+
+func (t *Anon19) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+ type T Anon19
+ var layout struct {
+ *T
+ Data *xsdBase64Binary `xml:"Data"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ layout.T = (*T)(t)
+ layout.Data = (*xsdBase64Binary)(&layout.T.Data)
+ layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
+ return e.EncodeElement(layout, start)
+}
+func (t *Anon19) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+ type T Anon19
+ var overlay struct {
+ *T
+ Data *xsdBase64Binary `xml:"Data"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ overlay.T = (*T)(t)
+ overlay.Data = (*xsdBase64Binary)(&overlay.T.Data)
+ overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
+ return d.DecodeElement(&overlay, &start)
+}
+
+type Anon2 struct {
+ GetBucketLoggingStatusResponse BucketLoggingStatus `xml:"GetBucketLoggingStatusResponse"`
+}
+
+type Anon20 struct {
+ PutObjectInlineResponse PutObjectResult `xml:"PutObjectInlineResponse"`
+}
+
+type Anon21 struct {
+ Bucket string `xml:"Bucket"`
+ Key string `xml:"Key"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
+}
+
+func (t *Anon21) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+ type T Anon21
+ var layout struct {
+ *T
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ layout.T = (*T)(t)
+ layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
+ return e.EncodeElement(layout, start)
+}
+func (t *Anon21) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+ type T Anon21
+ var overlay struct {
+ *T
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ overlay.T = (*T)(t)
+ overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
+ return d.DecodeElement(&overlay, &start)
+}
+
+type Anon22 struct {
+ DeleteObjectResponse Status `xml:"DeleteObjectResponse"`
+}
+
+type Anon23 struct {
+ Bucket string `xml:"Bucket"`
+ Prefix string `xml:"Prefix,omitempty"`
+ Marker string `xml:"Marker,omitempty"`
+ MaxKeys int `xml:"MaxKeys,omitempty"`
+ Delimiter string `xml:"Delimiter,omitempty"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
+}
+
+func (t *Anon23) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+ type T Anon23
+ var layout struct {
+ *T
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ layout.T = (*T)(t)
+ layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
+ return e.EncodeElement(layout, start)
+}
+func (t *Anon23) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+ type T Anon23
+ var overlay struct {
+ *T
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ overlay.T = (*T)(t)
+ overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
+ return d.DecodeElement(&overlay, &start)
+}
+
+type Anon24 struct {
+ ListBucketResponse ListBucketResult `xml:"ListBucketResponse"`
+}
+
+type Anon25 struct {
+ ListVersionsResponse ListVersionsResult `xml:"ListVersionsResponse"`
+}
+
+type Anon26 struct {
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+}
+
+func (t *Anon26) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+ type T Anon26
+ var layout struct {
+ *T
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ layout.T = (*T)(t)
+ layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
+ return e.EncodeElement(layout, start)
+}
+func (t *Anon26) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+ type T Anon26
+ var overlay struct {
+ *T
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ overlay.T = (*T)(t)
+ overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
+ return d.DecodeElement(&overlay, &start)
+}
+
+type Anon27 struct {
+ ListAllMyBucketsResponse ListAllMyBucketsResult `xml:"ListAllMyBucketsResponse"`
+}
+
+type Anon28 struct {
+ Location string `xml:"Location"`
+ Bucket string `xml:"Bucket"`
+ Key string `xml:"Key"`
+ ETag string `xml:"ETag"`
+}
+
+type Anon29 struct {
+ SourceBucket string `xml:"SourceBucket"`
+ SourceKey string `xml:"SourceKey"`
+ DestinationBucket string `xml:"DestinationBucket"`
+ DestinationKey string `xml:"DestinationKey"`
+ MetadataDirective MetadataDirective `xml:"MetadataDirective,omitempty"`
+ Metadata []MetadataEntry `xml:"Metadata,omitempty"`
+ AccessControlList AccessControlList `xml:"AccessControlList,omitempty"`
+ CopySourceIfModifiedSince time.Time `xml:"CopySourceIfModifiedSince,omitempty"`
+ CopySourceIfUnmodifiedSince time.Time `xml:"CopySourceIfUnmodifiedSince,omitempty"`
+ CopySourceIfMatch []string `xml:"CopySourceIfMatch,omitempty"`
+ CopySourceIfNoneMatch []string `xml:"CopySourceIfNoneMatch,omitempty"`
+ StorageClass StorageClass `xml:"StorageClass,omitempty"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
+}
+
+func (t *Anon29) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+ type T Anon29
+ var layout struct {
+ *T
+ CopySourceIfModifiedSince *xsdDateTime `xml:"CopySourceIfModifiedSince,omitempty"`
+ CopySourceIfUnmodifiedSince *xsdDateTime `xml:"CopySourceIfUnmodifiedSince,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ layout.T = (*T)(t)
+ layout.CopySourceIfModifiedSince = (*xsdDateTime)(&layout.T.CopySourceIfModifiedSince)
+ layout.CopySourceIfUnmodifiedSince = (*xsdDateTime)(&layout.T.CopySourceIfUnmodifiedSince)
+ layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
+ return e.EncodeElement(layout, start)
+}
+func (t *Anon29) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+ type T Anon29
+ var overlay struct {
+ *T
+ CopySourceIfModifiedSince *xsdDateTime `xml:"CopySourceIfModifiedSince,omitempty"`
+ CopySourceIfUnmodifiedSince *xsdDateTime `xml:"CopySourceIfUnmodifiedSince,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ overlay.T = (*T)(t)
+ overlay.CopySourceIfModifiedSince = (*xsdDateTime)(&overlay.T.CopySourceIfModifiedSince)
+ overlay.CopySourceIfUnmodifiedSince = (*xsdDateTime)(&overlay.T.CopySourceIfUnmodifiedSince)
+ overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
+ return d.DecodeElement(&overlay, &start)
+}
+
+type Anon3 struct {
+ Bucket string `xml:"Bucket"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
+ BucketLoggingStatus BucketLoggingStatus `xml:"BucketLoggingStatus"`
+}
+
+func (t *Anon3) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+ type T Anon3
+ var layout struct {
+ *T
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ layout.T = (*T)(t)
+ layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
+ return e.EncodeElement(layout, start)
+}
+func (t *Anon3) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+ type T Anon3
+ var overlay struct {
+ *T
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ overlay.T = (*T)(t)
+ overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
+ return d.DecodeElement(&overlay, &start)
+}
+
+type Anon30 struct {
+ CopyObjectResult CopyObjectResult `xml:"CopyObjectResult"`
+}
+
+type Anon4 struct {
+}
+
+type Anon5 struct {
+ Bucket string `xml:"Bucket"`
+ Key string `xml:"Key"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
+}
+
+func (t *Anon5) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+ type T Anon5
+ var layout struct {
+ *T
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ layout.T = (*T)(t)
+ layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
+ return e.EncodeElement(layout, start)
+}
+func (t *Anon5) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+ type T Anon5
+ var overlay struct {
+ *T
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ overlay.T = (*T)(t)
+ overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
+ return d.DecodeElement(&overlay, &start)
+}
+
+type Anon6 struct {
+ GetObjectAccessControlPolicyResponse AccessControlPolicy `xml:"GetObjectAccessControlPolicyResponse"`
+}
+
+type Anon7 struct {
+ Bucket string `xml:"Bucket"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
+}
+
+func (t *Anon7) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+ type T Anon7
+ var layout struct {
+ *T
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ layout.T = (*T)(t)
+ layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
+ return e.EncodeElement(layout, start)
+}
+func (t *Anon7) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+ type T Anon7
+ var overlay struct {
+ *T
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ overlay.T = (*T)(t)
+ overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
+ return d.DecodeElement(&overlay, &start)
+}
+
+type Anon8 struct {
+ GetBucketAccessControlPolicyResponse AccessControlPolicy `xml:"GetBucketAccessControlPolicyResponse"`
+}
+
+type Anon9 struct {
+ Bucket string `xml:"Bucket"`
+ Key string `xml:"Key"`
+ AccessControlList AccessControlList `xml:"AccessControlList"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
+}
+
+func (t *Anon9) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+ type T Anon9
+ var layout struct {
+ *T
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ layout.T = (*T)(t)
+ layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
+ return e.EncodeElement(layout, start)
+}
+func (t *Anon9) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+ type T Anon9
+ var overlay struct {
+ *T
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
+ }
+ overlay.T = (*T)(t)
+ overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
+ return d.DecodeElement(&overlay, &start)
}
type BucketLoggingStatus struct {
- LoggingEnabled LoggingSettings `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LoggingEnabled,omitempty"`
+ LoggingEnabled LoggingSettings `xml:"LoggingEnabled,omitempty"`
}
type CanonicalUser struct {
@@ -30,31 +567,31 @@ type CanonicalUser struct {
}
type CopyObject struct {
- SourceBucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ SourceBucket"`
- SourceKey string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ SourceKey"`
- DestinationBucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ DestinationBucket"`
- DestinationKey string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ DestinationKey"`
- MetadataDirective MetadataDirective `xml:"http://s3.amazonaws.com/doc/2006-03-01/ MetadataDirective,omitempty"`
- Metadata []MetadataEntry `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Metadata,omitempty"`
- AccessControlList AccessControlList `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AccessControlList,omitempty"`
- CopySourceIfModifiedSince time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CopySourceIfModifiedSince,omitempty"`
- CopySourceIfUnmodifiedSince time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CopySourceIfUnmodifiedSince,omitempty"`
- CopySourceIfMatch []string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CopySourceIfMatch,omitempty"`
- CopySourceIfNoneMatch []string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CopySourceIfNoneMatch,omitempty"`
- StorageClass StorageClass `xml:"http://s3.amazonaws.com/doc/2006-03-01/ StorageClass,omitempty"`
- AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"`
- Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
- Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"`
- Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"`
+ SourceBucket string `xml:"SourceBucket"`
+ SourceKey string `xml:"SourceKey"`
+ DestinationBucket string `xml:"DestinationBucket"`
+ DestinationKey string `xml:"DestinationKey"`
+ MetadataDirective MetadataDirective `xml:"MetadataDirective,omitempty"`
+ Metadata []MetadataEntry `xml:"Metadata,omitempty"`
+ AccessControlList AccessControlList `xml:"AccessControlList,omitempty"`
+ CopySourceIfModifiedSince time.Time `xml:"CopySourceIfModifiedSince,omitempty"`
+ CopySourceIfUnmodifiedSince time.Time `xml:"CopySourceIfUnmodifiedSince,omitempty"`
+ CopySourceIfMatch []string `xml:"CopySourceIfMatch,omitempty"`
+ CopySourceIfNoneMatch []string `xml:"CopySourceIfNoneMatch,omitempty"`
+ StorageClass StorageClass `xml:"StorageClass,omitempty"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
}
func (t *CopyObject) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
type T CopyObject
var layout struct {
*T
- CopySourceIfModifiedSince *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CopySourceIfModifiedSince,omitempty"`
- CopySourceIfUnmodifiedSince *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CopySourceIfUnmodifiedSince,omitempty"`
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ CopySourceIfModifiedSince *xsdDateTime `xml:"CopySourceIfModifiedSince,omitempty"`
+ CopySourceIfUnmodifiedSince *xsdDateTime `xml:"CopySourceIfUnmodifiedSince,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
layout.T = (*T)(t)
layout.CopySourceIfModifiedSince = (*xsdDateTime)(&layout.T.CopySourceIfModifiedSince)
@@ -66,9 +603,9 @@ func (t *CopyObject) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error
type T CopyObject
var overlay struct {
*T
- CopySourceIfModifiedSince *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CopySourceIfModifiedSince,omitempty"`
- CopySourceIfUnmodifiedSince *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CopySourceIfUnmodifiedSince,omitempty"`
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ CopySourceIfModifiedSince *xsdDateTime `xml:"CopySourceIfModifiedSince,omitempty"`
+ CopySourceIfUnmodifiedSince *xsdDateTime `xml:"CopySourceIfUnmodifiedSince,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
overlay.T = (*T)(t)
overlay.CopySourceIfModifiedSince = (*xsdDateTime)(&overlay.T.CopySourceIfModifiedSince)
@@ -78,19 +615,19 @@ func (t *CopyObject) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error
}
type CopyObjectResponse struct {
- CopyObjectResult CopyObjectResult `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CopyObjectResult"`
+ CopyObjectResult CopyObjectResult `xml:"CopyObjectResult"`
}
type CopyObjectResult struct {
- LastModified time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"`
- ETag string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ETag"`
+ LastModified time.Time `xml:"LastModified"`
+ ETag string `xml:"ETag"`
}
func (t *CopyObjectResult) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
type T CopyObjectResult
var layout struct {
*T
- LastModified *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"`
+ LastModified *xsdDateTime `xml:"LastModified"`
}
layout.T = (*T)(t)
layout.LastModified = (*xsdDateTime)(&layout.T.LastModified)
@@ -100,7 +637,7 @@ func (t *CopyObjectResult) UnmarshalXML(d *xml.Decoder, start xml.StartElement)
type T CopyObjectResult
var overlay struct {
*T
- LastModified *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"`
+ LastModified *xsdDateTime `xml:"LastModified"`
}
overlay.T = (*T)(t)
overlay.LastModified = (*xsdDateTime)(&overlay.T.LastModified)
@@ -108,18 +645,18 @@ func (t *CopyObjectResult) UnmarshalXML(d *xml.Decoder, start xml.StartElement)
}
type CreateBucket struct {
- Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"`
- AccessControlList AccessControlList `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AccessControlList,omitempty"`
- AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"`
- Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
- Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"`
+ Bucket string `xml:"Bucket"`
+ AccessControlList AccessControlList `xml:"AccessControlList,omitempty"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
}
func (t *CreateBucket) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
type T CreateBucket
var layout struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
layout.T = (*T)(t)
layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
@@ -129,7 +666,7 @@ func (t *CreateBucket) UnmarshalXML(d *xml.Decoder, start xml.StartElement) erro
type T CreateBucket
var overlay struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
overlay.T = (*T)(t)
overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
@@ -137,30 +674,30 @@ func (t *CreateBucket) UnmarshalXML(d *xml.Decoder, start xml.StartElement) erro
}
type CreateBucketConfiguration struct {
- LocationConstraint string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LocationConstraint"`
+ LocationConstraint string `xml:"LocationConstraint"`
}
type CreateBucketResponse struct {
- CreateBucketReturn CreateBucketResult `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CreateBucketReturn"`
+ CreateBucketReturn CreateBucketResult `xml:"CreateBucketReturn"`
}
type CreateBucketResult struct {
- BucketName string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ BucketName"`
+ BucketName string `xml:"BucketName"`
}
type DeleteBucket struct {
- Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"`
- AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"`
- Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
- Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"`
- Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"`
+ Bucket string `xml:"Bucket"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
}
func (t *DeleteBucket) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
type T DeleteBucket
var layout struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
layout.T = (*T)(t)
layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
@@ -170,7 +707,7 @@ func (t *DeleteBucket) UnmarshalXML(d *xml.Decoder, start xml.StartElement) erro
type T DeleteBucket
var overlay struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
overlay.T = (*T)(t)
overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
@@ -178,22 +715,22 @@ func (t *DeleteBucket) UnmarshalXML(d *xml.Decoder, start xml.StartElement) erro
}
type DeleteBucketResponse struct {
- DeleteBucketResponse Status `xml:"http://s3.amazonaws.com/doc/2006-03-01/ DeleteBucketResponse"`
+ DeleteBucketResponse Status `xml:"DeleteBucketResponse"`
}
type DeleteMarkerEntry struct {
- Key string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Key"`
- VersionId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ VersionId"`
- IsLatest bool `xml:"http://s3.amazonaws.com/doc/2006-03-01/ IsLatest"`
- LastModified time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"`
- Owner CanonicalUser `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Owner,omitempty"`
+ Key string `xml:"Key"`
+ VersionId string `xml:"VersionId"`
+ IsLatest bool `xml:"IsLatest"`
+ LastModified time.Time `xml:"LastModified"`
+ Owner CanonicalUser `xml:"Owner,omitempty"`
}
func (t *DeleteMarkerEntry) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
type T DeleteMarkerEntry
var layout struct {
*T
- LastModified *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"`
+ LastModified *xsdDateTime `xml:"LastModified"`
}
layout.T = (*T)(t)
layout.LastModified = (*xsdDateTime)(&layout.T.LastModified)
@@ -203,7 +740,7 @@ func (t *DeleteMarkerEntry) UnmarshalXML(d *xml.Decoder, start xml.StartElement)
type T DeleteMarkerEntry
var overlay struct {
*T
- LastModified *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"`
+ LastModified *xsdDateTime `xml:"LastModified"`
}
overlay.T = (*T)(t)
overlay.LastModified = (*xsdDateTime)(&overlay.T.LastModified)
@@ -211,19 +748,19 @@ func (t *DeleteMarkerEntry) UnmarshalXML(d *xml.Decoder, start xml.StartElement)
}
type DeleteObject struct {
- Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"`
- Key string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Key"`
- AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"`
- Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
- Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"`
- Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"`
+ Bucket string `xml:"Bucket"`
+ Key string `xml:"Key"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
}
func (t *DeleteObject) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
type T DeleteObject
var layout struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
layout.T = (*T)(t)
layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
@@ -233,7 +770,7 @@ func (t *DeleteObject) UnmarshalXML(d *xml.Decoder, start xml.StartElement) erro
type T DeleteObject
var overlay struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
overlay.T = (*T)(t)
overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
@@ -241,22 +778,22 @@ func (t *DeleteObject) UnmarshalXML(d *xml.Decoder, start xml.StartElement) erro
}
type DeleteObjectResponse struct {
- DeleteObjectResponse Status `xml:"http://s3.amazonaws.com/doc/2006-03-01/ DeleteObjectResponse"`
+ DeleteObjectResponse Status `xml:"DeleteObjectResponse"`
}
type GetBucketAccessControlPolicy struct {
- Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"`
- AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"`
- Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
- Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"`
- Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"`
+ Bucket string `xml:"Bucket"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
}
func (t *GetBucketAccessControlPolicy) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
type T GetBucketAccessControlPolicy
var layout struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
layout.T = (*T)(t)
layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
@@ -266,7 +803,7 @@ func (t *GetBucketAccessControlPolicy) UnmarshalXML(d *xml.Decoder, start xml.St
type T GetBucketAccessControlPolicy
var overlay struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
overlay.T = (*T)(t)
overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
@@ -274,22 +811,22 @@ func (t *GetBucketAccessControlPolicy) UnmarshalXML(d *xml.Decoder, start xml.St
}
type GetBucketAccessControlPolicyResponse struct {
- GetBucketAccessControlPolicyResponse AccessControlPolicy `xml:"http://s3.amazonaws.com/doc/2006-03-01/ GetBucketAccessControlPolicyResponse"`
+ GetBucketAccessControlPolicyResponse AccessControlPolicy `xml:"GetBucketAccessControlPolicyResponse"`
}
type GetBucketLoggingStatus struct {
- Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"`
- AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"`
- Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
- Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"`
- Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"`
+ Bucket string `xml:"Bucket"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
}
func (t *GetBucketLoggingStatus) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
type T GetBucketLoggingStatus
var layout struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
layout.T = (*T)(t)
layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
@@ -299,7 +836,7 @@ func (t *GetBucketLoggingStatus) UnmarshalXML(d *xml.Decoder, start xml.StartEle
type T GetBucketLoggingStatus
var overlay struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
overlay.T = (*T)(t)
overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
@@ -307,26 +844,26 @@ func (t *GetBucketLoggingStatus) UnmarshalXML(d *xml.Decoder, start xml.StartEle
}
type GetBucketLoggingStatusResponse struct {
- GetBucketLoggingStatusResponse BucketLoggingStatus `xml:"http://s3.amazonaws.com/doc/2006-03-01/ GetBucketLoggingStatusResponse"`
+ GetBucketLoggingStatusResponse BucketLoggingStatus `xml:"GetBucketLoggingStatusResponse"`
}
type GetObject struct {
- Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"`
- Key string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Key"`
- GetMetadata bool `xml:"http://s3.amazonaws.com/doc/2006-03-01/ GetMetadata"`
- GetData bool `xml:"http://s3.amazonaws.com/doc/2006-03-01/ GetData"`
- InlineData bool `xml:"http://s3.amazonaws.com/doc/2006-03-01/ InlineData"`
- AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"`
- Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
- Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"`
- Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"`
+ Bucket string `xml:"Bucket"`
+ Key string `xml:"Key"`
+ GetMetadata bool `xml:"GetMetadata"`
+ GetData bool `xml:"GetData"`
+ InlineData bool `xml:"InlineData"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
}
func (t *GetObject) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
type T GetObject
var layout struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
layout.T = (*T)(t)
layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
@@ -336,7 +873,7 @@ func (t *GetObject) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
type T GetObject
var overlay struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
overlay.T = (*T)(t)
overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
@@ -344,19 +881,19 @@ func (t *GetObject) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
}
type GetObjectAccessControlPolicy struct {
- Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"`
- Key string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Key"`
- AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"`
- Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
- Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"`
- Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"`
+ Bucket string `xml:"Bucket"`
+ Key string `xml:"Key"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
}
func (t *GetObjectAccessControlPolicy) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
type T GetObjectAccessControlPolicy
var layout struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
layout.T = (*T)(t)
layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
@@ -366,7 +903,7 @@ func (t *GetObjectAccessControlPolicy) UnmarshalXML(d *xml.Decoder, start xml.St
type T GetObjectAccessControlPolicy
var overlay struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
overlay.T = (*T)(t)
overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
@@ -374,35 +911,35 @@ func (t *GetObjectAccessControlPolicy) UnmarshalXML(d *xml.Decoder, start xml.St
}
type GetObjectAccessControlPolicyResponse struct {
- GetObjectAccessControlPolicyResponse AccessControlPolicy `xml:"http://s3.amazonaws.com/doc/2006-03-01/ GetObjectAccessControlPolicyResponse"`
+ GetObjectAccessControlPolicyResponse AccessControlPolicy `xml:"GetObjectAccessControlPolicyResponse"`
}
type GetObjectExtended struct {
- Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"`
- Key string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Key"`
- GetMetadata bool `xml:"http://s3.amazonaws.com/doc/2006-03-01/ GetMetadata"`
- GetData bool `xml:"http://s3.amazonaws.com/doc/2006-03-01/ GetData"`
- InlineData bool `xml:"http://s3.amazonaws.com/doc/2006-03-01/ InlineData"`
- ByteRangeStart int64 `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ByteRangeStart,omitempty"`
- ByteRangeEnd int64 `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ByteRangeEnd,omitempty"`
- IfModifiedSince time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ IfModifiedSince,omitempty"`
- IfUnmodifiedSince time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ IfUnmodifiedSince,omitempty"`
- IfMatch []string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ IfMatch,omitempty"`
- IfNoneMatch []string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ IfNoneMatch,omitempty"`
- ReturnCompleteObjectOnConditionFailure bool `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ReturnCompleteObjectOnConditionFailure,omitempty"`
- AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"`
- Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
- Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"`
- Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"`
+ Bucket string `xml:"Bucket"`
+ Key string `xml:"Key"`
+ GetMetadata bool `xml:"GetMetadata"`
+ GetData bool `xml:"GetData"`
+ InlineData bool `xml:"InlineData"`
+ ByteRangeStart int64 `xml:"ByteRangeStart,omitempty"`
+ ByteRangeEnd int64 `xml:"ByteRangeEnd,omitempty"`
+ IfModifiedSince time.Time `xml:"IfModifiedSince,omitempty"`
+ IfUnmodifiedSince time.Time `xml:"IfUnmodifiedSince,omitempty"`
+ IfMatch []string `xml:"IfMatch,omitempty"`
+ IfNoneMatch []string `xml:"IfNoneMatch,omitempty"`
+ ReturnCompleteObjectOnConditionFailure bool `xml:"ReturnCompleteObjectOnConditionFailure,omitempty"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
}
func (t *GetObjectExtended) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
type T GetObjectExtended
var layout struct {
*T
- IfModifiedSince *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ IfModifiedSince,omitempty"`
- IfUnmodifiedSince *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ IfUnmodifiedSince,omitempty"`
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ IfModifiedSince *xsdDateTime `xml:"IfModifiedSince,omitempty"`
+ IfUnmodifiedSince *xsdDateTime `xml:"IfUnmodifiedSince,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
layout.T = (*T)(t)
layout.IfModifiedSince = (*xsdDateTime)(&layout.T.IfModifiedSince)
@@ -414,9 +951,9 @@ func (t *GetObjectExtended) UnmarshalXML(d *xml.Decoder, start xml.StartElement)
type T GetObjectExtended
var overlay struct {
*T
- IfModifiedSince *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ IfModifiedSince,omitempty"`
- IfUnmodifiedSince *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ IfUnmodifiedSince,omitempty"`
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ IfModifiedSince *xsdDateTime `xml:"IfModifiedSince,omitempty"`
+ IfUnmodifiedSince *xsdDateTime `xml:"IfUnmodifiedSince,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
overlay.T = (*T)(t)
overlay.IfModifiedSince = (*xsdDateTime)(&overlay.T.IfModifiedSince)
@@ -426,27 +963,27 @@ func (t *GetObjectExtended) UnmarshalXML(d *xml.Decoder, start xml.StartElement)
}
type GetObjectExtendedResponse struct {
- GetObjectResponse GetObjectResult `xml:"http://s3.amazonaws.com/doc/2006-03-01/ GetObjectResponse"`
+ GetObjectResponse GetObjectResult `xml:"GetObjectResponse"`
}
type GetObjectResponse struct {
- GetObjectResponse GetObjectResult `xml:"http://s3.amazonaws.com/doc/2006-03-01/ GetObjectResponse"`
+ GetObjectResponse GetObjectResult `xml:"GetObjectResponse"`
}
type GetObjectResult struct {
- Metadata []MetadataEntry `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Metadata,omitempty"`
- Data []byte `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Data,omitempty"`
- LastModified time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"`
- ETag string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ETag"`
- Status Status `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Status"`
+ Status Status `xml:"Status"`
+ Metadata []MetadataEntry `xml:"Metadata,omitempty"`
+ Data []byte `xml:"Data,omitempty"`
+ LastModified time.Time `xml:"LastModified"`
+ ETag string `xml:"ETag"`
}
func (t *GetObjectResult) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
type T GetObjectResult
var layout struct {
*T
- Data *xsdBase64Binary `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Data,omitempty"`
- LastModified *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"`
+ Data *xsdBase64Binary `xml:"Data,omitempty"`
+ LastModified *xsdDateTime `xml:"LastModified"`
}
layout.T = (*T)(t)
layout.Data = (*xsdBase64Binary)(&layout.T.Data)
@@ -457,8 +994,8 @@ func (t *GetObjectResult) UnmarshalXML(d *xml.Decoder, start xml.StartElement) e
type T GetObjectResult
var overlay struct {
*T
- Data *xsdBase64Binary `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Data,omitempty"`
- LastModified *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"`
+ Data *xsdBase64Binary `xml:"Data,omitempty"`
+ LastModified *xsdDateTime `xml:"LastModified"`
}
overlay.T = (*T)(t)
overlay.Data = (*xsdBase64Binary)(&overlay.T.Data)
@@ -471,30 +1008,21 @@ type Grant struct {
Permission Permission `xml:"Permission"`
}
-type Grantee struct {
- XMLNS string `xml:"xmlns:xsi,attr"`
- XMLXSI string `xml:"xsi:type,attr"`
- Type string `xml:"Type"`
- ID string `xml:"ID,omitempty"`
- DisplayName string `xml:"DisplayName,omitempty"`
- URI string `xml:"URI,omitempty"`
-}
-
type Group struct {
- URI string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ URI"`
+ URI string `xml:"URI"`
}
type ListAllMyBuckets struct {
- AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"`
- Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
- Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
}
func (t *ListAllMyBuckets) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
type T ListAllMyBuckets
var layout struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
layout.T = (*T)(t)
layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
@@ -504,7 +1032,7 @@ func (t *ListAllMyBuckets) UnmarshalXML(d *xml.Decoder, start xml.StartElement)
type T ListAllMyBuckets
var overlay struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
overlay.T = (*T)(t)
overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
@@ -542,26 +1070,31 @@ type ListAllMyBucketsList struct {
}
type ListAllMyBucketsResponse struct {
- ListAllMyBucketsResponse ListAllMyBucketsResult `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ListAllMyBucketsResponse"`
+ ListAllMyBucketsResponse ListAllMyBucketsResult `xml:"ListAllMyBucketsResponse"`
+}
+
+type ListAllMyBucketsResult struct {
+ Owner CanonicalUser `xml:"Owner"`
+ Buckets ListAllMyBucketsList `xml:"Buckets"`
}
type ListBucket struct {
- Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"`
- Prefix string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Prefix,omitempty"`
- Marker string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Marker,omitempty"`
- MaxKeys int `xml:"http://s3.amazonaws.com/doc/2006-03-01/ MaxKeys,omitempty"`
- Delimiter string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Delimiter,omitempty"`
- AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"`
- Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
- Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"`
- Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"`
+ Bucket string `xml:"Bucket"`
+ Prefix string `xml:"Prefix,omitempty"`
+ Marker string `xml:"Marker,omitempty"`
+ MaxKeys int `xml:"MaxKeys,omitempty"`
+ Delimiter string `xml:"Delimiter,omitempty"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
}
func (t *ListBucket) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
type T ListBucket
var layout struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
layout.T = (*T)(t)
layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
@@ -571,7 +1104,7 @@ func (t *ListBucket) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error
type T ListBucket
var overlay struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
overlay.T = (*T)(t)
overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
@@ -579,11 +1112,10 @@ func (t *ListBucket) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error
}
type ListBucketResponse struct {
- ListBucketResponse ListBucketResult `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ListBucketResponse"`
+ ListBucketResponse ListBucketResult `xml:"ListBucketResponse"`
}
type ListBucketResult struct {
- XMLName xml.Name `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ListBucketResult"`
Metadata []MetadataEntry `xml:"Metadata,omitempty"`
Name string `xml:"Name"`
Prefix string `xml:"Prefix"`
@@ -594,6 +1126,7 @@ type ListBucketResult struct {
IsTruncated bool `xml:"IsTruncated"`
Contents []ListEntry `xml:"Contents,omitempty"`
CommonPrefixes []PrefixEntry `xml:"CommonPrefixes,omitempty"`
+ EncodingType string `xml:"EncodingType"`
}
type ListEntry struct {
@@ -627,48 +1160,44 @@ func (t *ListEntry) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
}
type ListVersionsResponse struct {
- ListVersionsResponse ListVersionsResult `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ListVersionsResponse"`
+ ListVersionsResponse ListVersionsResult `xml:"ListVersionsResponse"`
}
type ListVersionsResult struct {
- Metadata []MetadataEntry `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Metadata,omitempty"`
- Name string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Name"`
- Prefix string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Prefix"`
- KeyMarker string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ KeyMarker"`
- VersionIdMarker string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ VersionIdMarker"`
- NextKeyMarker string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ NextKeyMarker,omitempty"`
- NextVersionIdMarker string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ NextVersionIdMarker,omitempty"`
- MaxKeys int `xml:"http://s3.amazonaws.com/doc/2006-03-01/ MaxKeys"`
- Delimiter string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Delimiter,omitempty"`
- IsTruncated bool `xml:"http://s3.amazonaws.com/doc/2006-03-01/ IsTruncated"`
- Version VersionEntry `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Version"`
- DeleteMarker DeleteMarkerEntry `xml:"http://s3.amazonaws.com/doc/2006-03-01/ DeleteMarker"`
- CommonPrefixes []PrefixEntry `xml:"http://s3.amazonaws.com/doc/2006-03-01/ CommonPrefixes,omitempty"`
-}
-
-type LocationConstraint struct {
- LocationConstraint string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LocationConstraint"`
+ Metadata []MetadataEntry `xml:"Metadata,omitempty"`
+ Name string `xml:"Name"`
+ Prefix string `xml:"Prefix"`
+ KeyMarker string `xml:"KeyMarker"`
+ VersionIdMarker string `xml:"VersionIdMarker"`
+ NextKeyMarker string `xml:"NextKeyMarker,omitempty"`
+ NextVersionIdMarker string `xml:"NextVersionIdMarker,omitempty"`
+ MaxKeys int `xml:"MaxKeys"`
+ Delimiter string `xml:"Delimiter,omitempty"`
+ IsTruncated bool `xml:"IsTruncated"`
+ Version VersionEntry `xml:"Version,omitempty"`
+ DeleteMarker DeleteMarkerEntry `xml:"DeleteMarker,omitempty"`
+ CommonPrefixes []PrefixEntry `xml:"CommonPrefixes,omitempty"`
}
type LoggingSettings struct {
- TargetBucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ TargetBucket"`
- TargetPrefix string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ TargetPrefix"`
- TargetGrants AccessControlList `xml:"http://s3.amazonaws.com/doc/2006-03-01/ TargetGrants,omitempty"`
+ TargetBucket string `xml:"TargetBucket"`
+ TargetPrefix string `xml:"TargetPrefix"`
+ TargetGrants AccessControlList `xml:"TargetGrants,omitempty"`
}
// May be one of COPY, REPLACE
type MetadataDirective string
type MetadataEntry struct {
- Name string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Name"`
- Value string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Value"`
+ Name string `xml:"Name"`
+ Value string `xml:"Value"`
}
// May be one of Enabled, Disabled
type MfaDeleteStatus string
type NotificationConfiguration struct {
- TopicConfiguration []TopicConfiguration `xml:"http://s3.amazonaws.com/doc/2006-03-01/ TopicConfiguration,omitempty"`
+ TopicConfiguration []TopicConfiguration `xml:"TopicConfiguration,omitempty"`
}
// May be one of BucketOwner, Requester
@@ -678,10 +1207,10 @@ type Payer string
type Permission string
type PostResponse struct {
- Location string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Location"`
- Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"`
- Key string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Key"`
- ETag string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ETag"`
+ Location string `xml:"Location"`
+ Bucket string `xml:"Bucket"`
+ Key string `xml:"Key"`
+ ETag string `xml:"ETag"`
}
type PrefixEntry struct {
@@ -689,23 +1218,23 @@ type PrefixEntry struct {
}
type PutObject struct {
- Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"`
- Key string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Key"`
- Metadata []MetadataEntry `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Metadata,omitempty"`
- ContentLength int64 `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ContentLength"`
- AccessControlList AccessControlList `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AccessControlList,omitempty"`
- StorageClass StorageClass `xml:"http://s3.amazonaws.com/doc/2006-03-01/ StorageClass,omitempty"`
- AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"`
- Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
- Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"`
- Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"`
+ Bucket string `xml:"Bucket"`
+ Key string `xml:"Key"`
+ Metadata []MetadataEntry `xml:"Metadata,omitempty"`
+ ContentLength int64 `xml:"ContentLength"`
+ AccessControlList AccessControlList `xml:"AccessControlList,omitempty"`
+ StorageClass StorageClass `xml:"StorageClass,omitempty"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
}
func (t *PutObject) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
type T PutObject
var layout struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
layout.T = (*T)(t)
layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
@@ -715,7 +1244,7 @@ func (t *PutObject) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
type T PutObject
var overlay struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
overlay.T = (*T)(t)
overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
@@ -723,25 +1252,25 @@ func (t *PutObject) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
}
type PutObjectInline struct {
- Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"`
- Key string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Key"`
- Metadata []MetadataEntry `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Metadata,omitempty"`
- Data []byte `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Data"`
- ContentLength int64 `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ContentLength"`
- AccessControlList AccessControlList `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AccessControlList,omitempty"`
- StorageClass StorageClass `xml:"http://s3.amazonaws.com/doc/2006-03-01/ StorageClass,omitempty"`
- AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"`
- Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
- Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"`
- Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"`
+ Bucket string `xml:"Bucket"`
+ Key string `xml:"Key"`
+ Metadata []MetadataEntry `xml:"Metadata,omitempty"`
+ Data []byte `xml:"Data"`
+ ContentLength int64 `xml:"ContentLength"`
+ AccessControlList AccessControlList `xml:"AccessControlList,omitempty"`
+ StorageClass StorageClass `xml:"StorageClass,omitempty"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
}
func (t *PutObjectInline) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
type T PutObjectInline
var layout struct {
*T
- Data *xsdBase64Binary `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Data"`
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Data *xsdBase64Binary `xml:"Data"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
layout.T = (*T)(t)
layout.Data = (*xsdBase64Binary)(&layout.T.Data)
@@ -752,8 +1281,8 @@ func (t *PutObjectInline) UnmarshalXML(d *xml.Decoder, start xml.StartElement) e
type T PutObjectInline
var overlay struct {
*T
- Data *xsdBase64Binary `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Data"`
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Data *xsdBase64Binary `xml:"Data"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
overlay.T = (*T)(t)
overlay.Data = (*xsdBase64Binary)(&overlay.T.Data)
@@ -762,23 +1291,23 @@ func (t *PutObjectInline) UnmarshalXML(d *xml.Decoder, start xml.StartElement) e
}
type PutObjectInlineResponse struct {
- PutObjectInlineResponse PutObjectResult `xml:"http://s3.amazonaws.com/doc/2006-03-01/ PutObjectInlineResponse"`
+ PutObjectInlineResponse PutObjectResult `xml:"PutObjectInlineResponse"`
}
type PutObjectResponse struct {
- PutObjectResponse PutObjectResult `xml:"http://s3.amazonaws.com/doc/2006-03-01/ PutObjectResponse"`
+ PutObjectResponse PutObjectResult `xml:"PutObjectResponse"`
}
type PutObjectResult struct {
- ETag string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ETag"`
- LastModified time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"`
+ ETag string `xml:"ETag"`
+ LastModified time.Time `xml:"LastModified"`
}
func (t *PutObjectResult) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
type T PutObjectResult
var layout struct {
*T
- LastModified *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"`
+ LastModified *xsdDateTime `xml:"LastModified"`
}
layout.T = (*T)(t)
layout.LastModified = (*xsdDateTime)(&layout.T.LastModified)
@@ -788,7 +1317,7 @@ func (t *PutObjectResult) UnmarshalXML(d *xml.Decoder, start xml.StartElement) e
type T PutObjectResult
var overlay struct {
*T
- LastModified *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"`
+ LastModified *xsdDateTime `xml:"LastModified"`
}
overlay.T = (*T)(t)
overlay.LastModified = (*xsdDateTime)(&overlay.T.LastModified)
@@ -796,27 +1325,27 @@ func (t *PutObjectResult) UnmarshalXML(d *xml.Decoder, start xml.StartElement) e
}
type RequestPaymentConfiguration struct {
- Payer Payer `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Payer"`
+ Payer Payer `xml:"Payer"`
}
type Result struct {
- Status Status `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Status"`
+ Status Status `xml:"Status"`
}
type SetBucketAccessControlPolicy struct {
- Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"`
- AccessControlList AccessControlList `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AccessControlList,omitempty"`
- AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"`
- Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
- Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"`
- Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"`
+ Bucket string `xml:"Bucket"`
+ AccessControlList AccessControlList `xml:"AccessControlList,omitempty"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
}
func (t *SetBucketAccessControlPolicy) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
type T SetBucketAccessControlPolicy
var layout struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
layout.T = (*T)(t)
layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
@@ -826,7 +1355,7 @@ func (t *SetBucketAccessControlPolicy) UnmarshalXML(d *xml.Decoder, start xml.St
type T SetBucketAccessControlPolicy
var overlay struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
overlay.T = (*T)(t)
overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
@@ -837,19 +1366,19 @@ type SetBucketAccessControlPolicyResponse struct {
}
type SetBucketLoggingStatus struct {
- Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"`
- AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"`
- Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
- Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"`
- Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"`
- BucketLoggingStatus BucketLoggingStatus `xml:"http://s3.amazonaws.com/doc/2006-03-01/ BucketLoggingStatus"`
+ Bucket string `xml:"Bucket"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
+ BucketLoggingStatus BucketLoggingStatus `xml:"BucketLoggingStatus"`
}
func (t *SetBucketLoggingStatus) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
type T SetBucketLoggingStatus
var layout struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
layout.T = (*T)(t)
layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
@@ -859,7 +1388,7 @@ func (t *SetBucketLoggingStatus) UnmarshalXML(d *xml.Decoder, start xml.StartEle
type T SetBucketLoggingStatus
var overlay struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
overlay.T = (*T)(t)
overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
@@ -870,20 +1399,20 @@ type SetBucketLoggingStatusResponse struct {
}
type SetObjectAccessControlPolicy struct {
- Bucket string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Bucket"`
- Key string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Key"`
- AccessControlList AccessControlList `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AccessControlList"`
- AWSAccessKeyId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ AWSAccessKeyId,omitempty"`
- Timestamp time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
- Signature string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Signature,omitempty"`
- Credential string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Credential,omitempty"`
+ Bucket string `xml:"Bucket"`
+ Key string `xml:"Key"`
+ AccessControlList AccessControlList `xml:"AccessControlList"`
+ AWSAccessKeyId string `xml:"AWSAccessKeyId,omitempty"`
+ Timestamp time.Time `xml:"Timestamp,omitempty"`
+ Signature string `xml:"Signature,omitempty"`
+ Credential string `xml:"Credential,omitempty"`
}
func (t *SetObjectAccessControlPolicy) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
type T SetObjectAccessControlPolicy
var layout struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
layout.T = (*T)(t)
layout.Timestamp = (*xsdDateTime)(&layout.T.Timestamp)
@@ -893,7 +1422,7 @@ func (t *SetObjectAccessControlPolicy) UnmarshalXML(d *xml.Decoder, start xml.St
type T SetObjectAccessControlPolicy
var overlay struct {
*T
- Timestamp *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Timestamp,omitempty"`
+ Timestamp *xsdDateTime `xml:"Timestamp,omitempty"`
}
overlay.T = (*T)(t)
overlay.Timestamp = (*xsdDateTime)(&overlay.T.Timestamp)
@@ -904,37 +1433,37 @@ type SetObjectAccessControlPolicyResponse struct {
}
type Status struct {
- Code int `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Code"`
- Description string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Description"`
+ Code int `xml:"Code"`
+ Description string `xml:"Description"`
}
// May be one of STANDARD, REDUCED_REDUNDANCY, GLACIER, UNKNOWN
type StorageClass string
type TopicConfiguration struct {
- Topic string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Topic"`
- Event []string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Event"`
+ Topic string `xml:"Topic"`
+ Event []string `xml:"Event"`
}
type User struct {
}
type VersionEntry struct {
- Key string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Key"`
- VersionId string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ VersionId"`
- IsLatest bool `xml:"http://s3.amazonaws.com/doc/2006-03-01/ IsLatest"`
- LastModified time.Time `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"`
- ETag string `xml:"http://s3.amazonaws.com/doc/2006-03-01/ ETag"`
- Size int64 `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Size"`
- Owner CanonicalUser `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Owner,omitempty"`
- StorageClass StorageClass `xml:"http://s3.amazonaws.com/doc/2006-03-01/ StorageClass"`
+ Key string `xml:"Key"`
+ VersionId string `xml:"VersionId"`
+ IsLatest bool `xml:"IsLatest"`
+ LastModified time.Time `xml:"LastModified"`
+ ETag string `xml:"ETag"`
+ Size int64 `xml:"Size"`
+ Owner CanonicalUser `xml:"Owner,omitempty"`
+ StorageClass StorageClass `xml:"StorageClass"`
}
func (t *VersionEntry) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
type T VersionEntry
var layout struct {
*T
- LastModified *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"`
+ LastModified *xsdDateTime `xml:"LastModified"`
}
layout.T = (*T)(t)
layout.LastModified = (*xsdDateTime)(&layout.T.LastModified)
@@ -944,7 +1473,7 @@ func (t *VersionEntry) UnmarshalXML(d *xml.Decoder, start xml.StartElement) erro
type T VersionEntry
var overlay struct {
*T
- LastModified *xsdDateTime `xml:"http://s3.amazonaws.com/doc/2006-03-01/ LastModified"`
+ LastModified *xsdDateTime `xml:"LastModified"`
}
overlay.T = (*T)(t)
overlay.LastModified = (*xsdDateTime)(&overlay.T.LastModified)
@@ -952,8 +1481,8 @@ func (t *VersionEntry) UnmarshalXML(d *xml.Decoder, start xml.StartElement) erro
}
type VersioningConfiguration struct {
- Status VersioningStatus `xml:"http://s3.amazonaws.com/doc/2006-03-01/ Status,omitempty"`
- MfaDelete MfaDeleteStatus `xml:"http://s3.amazonaws.com/doc/2006-03-01/ MfaDelete,omitempty"`
+ Status VersioningStatus `xml:"Status,omitempty"`
+ MfaDelete MfaDeleteStatus `xml:"MfaDelete,omitempty"`
}
// May be one of Enabled, Suspended
@@ -976,10 +1505,10 @@ func (b xsdBase64Binary) MarshalText() ([]byte, error) {
type xsdDateTime time.Time
func (t *xsdDateTime) UnmarshalText(text []byte) error {
- return _unmarshalTime(text, (*time.Time)(t), s3TimeFormat)
+ return _unmarshalTime(text, (*time.Time)(t), "2006-01-02T15:04:05.999999999")
}
func (t xsdDateTime) MarshalText() ([]byte, error) {
- return []byte((time.Time)(t).Format(s3TimeFormat)), nil
+ return _marshalTime((time.Time)(t), "2006-01-02T15:04:05.999999999")
}
func (t xsdDateTime) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
if (time.Time)(t).IsZero() {
@@ -1006,3 +1535,6 @@ func _unmarshalTime(text []byte, t *time.Time, format string) (err error) {
}
return err
}
+func _marshalTime(t time.Time, format string) ([]byte, error) {
+ return []byte(t.Format(format + "Z07:00")), nil
+}
diff --git a/weed/s3api/s3api_xsd_generated_helper.go b/weed/s3api/s3api_xsd_generated_helper.go
new file mode 100644
index 000000000..24cdd2289
--- /dev/null
+++ b/weed/s3api/s3api_xsd_generated_helper.go
@@ -0,0 +1,10 @@
+package s3api
+
+type Grantee struct {
+ XMLNS string `xml:"xmlns:xsi,attr"`
+ XMLXSI string `xml:"xsi:type,attr"`
+ Type string `xml:"Type"`
+ ID string `xml:"ID,omitempty"`
+ DisplayName string `xml:"DisplayName,omitempty"`
+ URI string `xml:"URI,omitempty"`
+}
diff --git a/weed/server/filer_server_handlers_write_autochunk.go b/weed/server/filer_server_handlers_write_autochunk.go
index 039bad523..029fbb7c9 100644
--- a/weed/server/filer_server_handlers_write_autochunk.go
+++ b/weed/server/filer_server_handlers_write_autochunk.go
@@ -148,6 +148,10 @@ func skipCheckParentDirEntry(r *http.Request) bool {
return r.URL.Query().Get("skipCheckParentDir") == "true"
}
+func isS3Request(r *http.Request) bool {
+ return r.Header.Get(s3_constants.AmzAuthType) != "" || r.Header.Get("X-Amz-Date") != ""
+}
+
func (fs *FilerServer) saveMetaData(ctx context.Context, r *http.Request, fileName string, contentType string, so *operation.StorageOption, md5bytes []byte, fileChunks []*filer_pb.FileChunk, chunkOffset int64, content []byte) (filerResult *FilerPostResult, replyerr error) {
// detect file mode
@@ -266,7 +270,12 @@ func (fs *FilerServer) saveMetaData(ctx context.Context, r *http.Request, fileNa
}
}
- if dbErr := fs.filer.CreateEntry(ctx, entry, false, false, nil, skipCheckParentDirEntry(r), so.MaxFileNameLength); dbErr != nil {
+ dbErr := fs.filer.CreateEntry(ctx, entry, false, false, nil, skipCheckParentDirEntry(r), so.MaxFileNameLength)
+ // In test_bucket_listv2_delimiter_basic, the valid object key is the parent folder
+ if dbErr != nil && strings.HasSuffix(dbErr.Error(), " is a file") && isS3Request(r) {
+ dbErr = fs.filer.CreateEntry(ctx, entry, false, false, nil, true, so.MaxFileNameLength)
+ }
+ if dbErr != nil {
replyerr = dbErr
filerResult.Error = dbErr.Error()
glog.V(0).Infof("failing to write %s to filer server : %v", path, dbErr)