aboutsummaryrefslogtreecommitdiff
path: root/weed/s3api
diff options
context:
space:
mode:
authorchrislu <chris.lu@gmail.com>2024-08-10 10:01:57 -0700
committerchrislu <chris.lu@gmail.com>2024-08-10 10:01:57 -0700
commit7438648d1cfacd5ca570dd029d1bdb5fd271bd70 (patch)
treecf12b49473be0373cb03d83470ddc75708454171 /weed/s3api
parent49893267e978cc3fda00dc991e00099742fb5a9d (diff)
parent63c707f9c1b4dc469ec39c446563c324ce4ccb6f (diff)
downloadseaweedfs-7438648d1cfacd5ca570dd029d1bdb5fd271bd70.tar.xz
seaweedfs-7438648d1cfacd5ca570dd029d1bdb5fd271bd70.zip
Merge branch 'master' into mq
Diffstat (limited to 'weed/s3api')
-rw-r--r--weed/s3api/AmazonS3.xsd1
-rw-r--r--weed/s3api/README.txt8
-rw-r--r--weed/s3api/auto_signature_v4_test.go18
-rw-r--r--weed/s3api/s3api_acl_helper.go4
-rw-r--r--weed/s3api/s3api_bucket_handlers.go34
-rw-r--r--weed/s3api/s3api_bucket_handlers_test.go29
-rw-r--r--weed/s3api/s3api_object_handlers.go48
-rw-r--r--weed/s3api/s3api_object_handlers_copy.go9
-rw-r--r--weed/s3api/s3api_object_handlers_delete.go22
-rw-r--r--weed/s3api/s3api_object_handlers_list.go122
-rw-r--r--weed/s3api/s3api_object_handlers_list_test.go2
-rw-r--r--weed/s3api/s3api_object_handlers_put.go2
-rw-r--r--weed/s3api/s3api_server.go107
-rw-r--r--weed/s3api/s3api_xsd_generated.go1066
-rw-r--r--weed/s3api/s3api_xsd_generated_helper.go10
-rw-r--r--weed/s3api/s3err/error_handler.go1
16 files changed, 1032 insertions, 451 deletions
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 @@
<xsd:element name="IsTruncated" type="xsd:boolean"/>
<xsd:element name="Contents" type="tns:ListEntry" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="CommonPrefixes" type="tns:PrefixEntry" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="EncodingType" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
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/auto_signature_v4_test.go b/weed/s3api/auto_signature_v4_test.go
index 6ff67b5bf..bb67c35c2 100644
--- a/weed/s3api/auto_signature_v4_test.go
+++ b/weed/s3api/auto_signature_v4_test.go
@@ -43,7 +43,7 @@ func TestIsRequestPresignedSignatureV4(t *testing.T) {
for i, testCase := range testCases {
// creating an input HTTP request.
// Only the query parameters are relevant for this particular test.
- inputReq, err := http.NewRequest("GET", "http://example.com", nil)
+ inputReq, err := http.NewRequest(http.MethodGet, "http://example.com", nil)
if err != nil {
t.Fatalf("Error initializing input HTTP request: %v", err)
}
@@ -85,9 +85,9 @@ func TestIsReqAuthenticated(t *testing.T) {
s3Error s3err.ErrorCode
}{
// When request is unsigned, access denied is returned.
- {mustNewRequest("GET", "http://127.0.0.1:9000", 0, nil, t), s3err.ErrAccessDenied},
+ {mustNewRequest(http.MethodGet, "http://127.0.0.1:9000", 0, nil, t), s3err.ErrAccessDenied},
// When request is properly signed, error is none.
- {mustNewSignedRequest("GET", "http://127.0.0.1:9000", 0, nil, t), s3err.ErrNone},
+ {mustNewSignedRequest(http.MethodGet, "http://127.0.0.1:9000", 0, nil, t), s3err.ErrNone},
}
// Validates all testcases.
@@ -117,8 +117,8 @@ func TestCheckaAnonymousRequestAuthType(t *testing.T) {
ErrCode s3err.ErrorCode
Action Action
}{
- {Request: mustNewRequest("GET", "http://127.0.0.1:9000/bucket", 0, nil, t), ErrCode: s3err.ErrNone, Action: s3_constants.ACTION_READ},
- {Request: mustNewRequest("PUT", "http://127.0.0.1:9000/bucket", 0, nil, t), ErrCode: s3err.ErrAccessDenied, Action: s3_constants.ACTION_WRITE},
+ {Request: mustNewRequest(http.MethodGet, "http://127.0.0.1:9000/bucket", 0, nil, t), ErrCode: s3err.ErrNone, Action: s3_constants.ACTION_READ},
+ {Request: mustNewRequest(http.MethodPut, "http://127.0.0.1:9000/bucket", 0, nil, t), ErrCode: s3err.ErrAccessDenied, Action: s3_constants.ACTION_WRITE},
}
for i, testCase := range testCases {
_, s3Error := iam.authRequest(testCase.Request, testCase.Action)
@@ -155,9 +155,9 @@ func TestCheckAdminRequestAuthType(t *testing.T) {
Request *http.Request
ErrCode s3err.ErrorCode
}{
- {Request: mustNewRequest("GET", "http://127.0.0.1:9000", 0, nil, t), ErrCode: s3err.ErrAccessDenied},
- {Request: mustNewSignedRequest("GET", "http://127.0.0.1:9000", 0, nil, t), ErrCode: s3err.ErrNone},
- {Request: mustNewPresignedRequest(iam, "GET", "http://127.0.0.1:9000", 0, nil, t), ErrCode: s3err.ErrNone},
+ {Request: mustNewRequest(http.MethodGet, "http://127.0.0.1:9000", 0, nil, t), ErrCode: s3err.ErrAccessDenied},
+ {Request: mustNewSignedRequest(http.MethodGet, "http://127.0.0.1:9000", 0, nil, t), ErrCode: s3err.ErrNone},
+ {Request: mustNewPresignedRequest(iam, http.MethodGet, "http://127.0.0.1:9000", 0, nil, t), ErrCode: s3err.ErrNone},
}
for i, testCase := range testCases {
if _, s3Error := iam.reqSignatureV4Verify(testCase.Request); s3Error != testCase.ErrCode {
@@ -214,7 +214,7 @@ func mustNewPresignedRequest(iam *IdentityAccessManagement, method string, urlSt
// Returns new HTTP request object.
func newTestRequest(method, urlStr string, contentLength int64, body io.ReadSeeker) (*http.Request, error) {
if method == "" {
- method = "POST"
+ method = http.MethodPost
}
// Save for subsequent use
diff --git a/weed/s3api/s3api_acl_helper.go b/weed/s3api/s3api_acl_helper.go
index 0332b6a39..b9fb1131e 100644
--- a/weed/s3api/s3api_acl_helper.go
+++ b/weed/s3api/s3api_acl_helper.go
@@ -9,9 +9,9 @@ import (
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
"github.com/seaweedfs/seaweedfs/weed/s3api/s3_constants"
"github.com/seaweedfs/seaweedfs/weed/s3api/s3err"
- "github.com/seaweedfs/seaweedfs/weed/util"
"net/http"
"strings"
+ util_http "github.com/seaweedfs/seaweedfs/weed/util/http"
)
type AccountManager interface {
@@ -32,7 +32,7 @@ func GetAccountId(r *http.Request) string {
// ExtractAcl extracts the acl from the request body, or from the header if request body is empty
func ExtractAcl(r *http.Request, accountManager AccountManager, ownership, bucketOwnerId, ownerId, accountId string) (grants []*s3.Grant, errCode s3err.ErrorCode) {
if r.Body != nil && r.Body != http.NoBody {
- defer util.CloseRequest(r)
+ defer util_http.CloseRequest(r)
var acp s3.AccessControlPolicy
err := xmlutil.UnmarshalXML(&acp, xml.NewDecoder(r.Body), "")
diff --git a/weed/s3api/s3api_bucket_handlers.go b/weed/s3api/s3api_bucket_handlers.go
index 12d2c0432..7d0d76ea4 100644
--- a/weed/s3api/s3api_bucket_handlers.go
+++ b/weed/s3api/s3api_bucket_handlers.go
@@ -13,7 +13,6 @@ import (
"github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil"
"github.com/seaweedfs/seaweedfs/weed/s3api/s3bucket"
- "github.com/seaweedfs/seaweedfs/weed/util"
"github.com/seaweedfs/seaweedfs/weed/filer"
"github.com/seaweedfs/seaweedfs/weed/s3api/s3_constants"
@@ -26,14 +25,9 @@ import (
"github.com/seaweedfs/seaweedfs/weed/glog"
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
+ util_http "github.com/seaweedfs/seaweedfs/weed/util/http"
)
-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)
@@ -461,7 +455,11 @@ func (s3a *S3ApiServer) DeleteBucketLifecycleHandler(w http.ResponseWriter, r *h
for prefix, ttl := range collectionTtls {
bucketPrefix := fmt.Sprintf("%s/%s/", s3a.option.BucketsPath, bucket)
if strings.HasPrefix(prefix, bucketPrefix) && strings.HasSuffix(ttl, "d") {
- fc.DeleteLocationConf(prefix)
+ pathConf, found := fc.GetLocationConf(prefix)
+ if found {
+ pathConf.Ttl = ""
+ fc.SetLocationConf(pathConf)
+ }
changed = true
}
}
@@ -487,7 +485,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
@@ -513,7 +511,7 @@ func (s3a *S3ApiServer) PutBucketOwnershipControls(w http.ResponseWriter, r *htt
}
var v s3.OwnershipControls
- defer util.CloseRequest(r)
+ defer util_http.CloseRequest(r)
err := xmlutil.UnmarshalXML(&v, xml.NewDecoder(r.Body), "")
if err != nil {
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 := `<?xml version="1.0" encoding="UTF-8"?>
-<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><DisplayName></DisplayName><ID></ID></Owner><Buckets><Bucket><CreationDate>2011-04-09T12:34:49Z</CreationDate><Name>test1</Name></Bucket><Bucket><CreationDate>2011-02-09T12:34:49Z</CreationDate><Name>test2</Name></Bucket></Buckets></ListAllMyBucketsResult>`
+<ListAllMyBucketsResult><Owner><ID></ID></Owner><Buckets><Bucket><Name>test1</Name><CreationDate>2011-04-09T12:34:49Z</CreationDate></Bucket><Bucket><Name>test2</Name><CreationDate>2011-02-09T12:34:49Z</CreationDate></Bucket></Buckets></ListAllMyBucketsResult>`
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 1d58af8bc..3ab72285f 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"
@@ -14,7 +16,7 @@ import (
"github.com/seaweedfs/seaweedfs/weed/util/mem"
"github.com/seaweedfs/seaweedfs/weed/glog"
- "github.com/seaweedfs/seaweedfs/weed/util"
+ util_http "github.com/seaweedfs/seaweedfs/weed/util/http"
)
func mimeDetect(r *http.Request, dataReader io.Reader) io.ReadCloser {
@@ -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",
@@ -131,7 +171,7 @@ func (s3a *S3ApiServer) proxyToFiler(w http.ResponseWriter, r *http.Request, des
s3err.WriteErrorResponse(w, r, s3err.ErrInternalError)
return
}
- defer util.CloseResponse(resp)
+ defer util_http.CloseResponse(resp)
if resp.StatusCode == http.StatusPreconditionFailed {
s3err.WriteErrorResponse(w, r, s3err.ErrPreconditionFailed)
@@ -143,7 +183,7 @@ func (s3a *S3ApiServer) proxyToFiler(w http.ResponseWriter, r *http.Request, des
return
}
- if r.Method == "DELETE" {
+ if r.Method == http.MethodDelete {
if resp.StatusCode == http.StatusNotFound {
// this is normal
responseStatusCode := responseFn(resp, w)
diff --git a/weed/s3api/s3api_object_handlers_copy.go b/weed/s3api/s3api_object_handlers_copy.go
index 8d13fe17e..4ca8010d2 100644
--- a/weed/s3api/s3api_object_handlers_copy.go
+++ b/weed/s3api/s3api_object_handlers_copy.go
@@ -14,6 +14,7 @@ import (
"github.com/seaweedfs/seaweedfs/weed/s3api/s3_constants"
"github.com/seaweedfs/seaweedfs/weed/s3api/s3err"
"github.com/seaweedfs/seaweedfs/weed/util"
+ util_http "github.com/seaweedfs/seaweedfs/weed/util/http"
)
const (
@@ -87,12 +88,12 @@ func (s3a *S3ApiServer) CopyObjectHandler(w http.ResponseWriter, r *http.Request
srcUrl := fmt.Sprintf("http://%s%s/%s%s",
s3a.option.Filer.ToHttpAddress(), s3a.option.BucketsPath, srcBucket, urlEscapeObject(srcObject))
- _, _, resp, err := util.DownloadFile(srcUrl, s3a.maybeGetFilerJwtAuthorizationToken(false))
+ _, _, resp, err := util_http.DownloadFile(srcUrl, s3a.maybeGetFilerJwtAuthorizationToken(false))
if err != nil {
s3err.WriteErrorResponse(w, r, s3err.ErrInvalidCopySource)
return
}
- defer util.CloseResponse(resp)
+ defer util_http.CloseResponse(resp)
tagErr := processMetadata(r.Header, resp.Header, replaceMeta, replaceTagging, s3a.getTags, dir, name)
if tagErr != nil {
@@ -175,12 +176,12 @@ func (s3a *S3ApiServer) CopyObjectPartHandler(w http.ResponseWriter, r *http.Req
srcUrl := fmt.Sprintf("http://%s%s/%s%s",
s3a.option.Filer.ToHttpAddress(), s3a.option.BucketsPath, srcBucket, urlEscapeObject(srcObject))
- resp, dataReader, err := util.ReadUrlAsReaderCloser(srcUrl, s3a.maybeGetFilerJwtAuthorizationToken(false), rangeHeader)
+ resp, dataReader, err := util_http.ReadUrlAsReaderCloser(srcUrl, s3a.maybeGetFilerJwtAuthorizationToken(false), rangeHeader)
if err != nil {
s3err.WriteErrorResponse(w, r, s3err.ErrInvalidCopySource)
return
}
- defer util.CloseResponse(resp)
+ defer util_http.CloseResponse(resp)
defer dataReader.Close()
glog.V(2).Infof("copy from %s to %s", srcUrl, dstUrl)
diff --git a/weed/s3api/s3api_object_handlers_delete.go b/weed/s3api/s3api_object_handlers_delete.go
index 580578593..7656b9d38 100644
--- a/weed/s3api/s3api_object_handlers_delete.go
+++ b/weed/s3api/s3api_object_handlers_delete.go
@@ -27,14 +27,13 @@ func (s3a *S3ApiServer) DeleteObjectHandler(w http.ResponseWriter, r *http.Reque
bucket, object := s3_constants.GetBucketAndObject(r)
glog.V(3).Infof("DeleteObjectHandler %s %s", bucket, object)
- object = urlPathEscape(removeDuplicateSlashes(object))
+ target := util.FullPath(fmt.Sprintf("%s/%s%s", s3a.option.BucketsPath, bucket, object))
+ dir, name := target.DirAndName()
- s3a.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error {
+ err := s3a.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error {
- err := doDeleteEntry(client, s3a.option.BucketsPath+"/"+bucket, object, true, false)
- if err != nil {
- // skip deletion error, usually the file is not found
- return nil
+ if err := doDeleteEntry(client, dir, name, true, false); err != nil {
+ return err
}
if s3a.option.AllowEmptyFolder {
@@ -42,11 +41,8 @@ func (s3a *S3ApiServer) DeleteObjectHandler(w http.ResponseWriter, r *http.Reque
}
directoriesWithDeletion := make(map[string]int)
- lastSeparator := strings.LastIndex(object, "/")
- if lastSeparator > 0 {
- parentDirectoryPath := fmt.Sprintf("%s/%s%s", s3a.option.BucketsPath, bucket, object[:lastSeparator])
- directoriesWithDeletion[parentDirectoryPath]++
-
+ if strings.LastIndex(object, "/") > 0 {
+ directoriesWithDeletion[dir]++
// purge empty folders, only checking folders with deletions
for len(directoriesWithDeletion) > 0 {
directoriesWithDeletion = s3a.doDeleteEmptyDirectories(client, directoriesWithDeletion)
@@ -55,6 +51,10 @@ func (s3a *S3ApiServer) DeleteObjectHandler(w http.ResponseWriter, r *http.Reque
return nil
})
+ if err != nil {
+ s3err.WriteErrorResponse(w, r, s3err.ErrInternalError)
+ return
+ }
w.WriteHeader(http.StatusNoContent)
}
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 := `<?xml version="1.0" encoding="UTF-8"?>
-<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Name>test_container</Name><Prefix></Prefix><Marker></Marker><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated><Contents><Key>1.zip</Key><ETag>&#34;4397da7a7649e8085de9916c240e8166&#34;</ETag><Size>1234567</Size><Owner><ID>65a011niqo39cdf8ec533ec3d1ccaafsa932</ID></Owner><StorageClass>STANDARD</StorageClass><LastModified>2011-04-09T12:34:49Z</LastModified></Contents></ListBucketResult>`
+<ListBucketResult><Name>test_container</Name><Prefix></Prefix><Marker></Marker><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated><Contents><Key>1.zip</Key><ETag>&#34;4397da7a7649e8085de9916c240e8166&#34;</ETag><Size>1234567</Size><Owner><ID>65a011niqo39cdf8ec533ec3d1ccaafsa932</ID></Owner><StorageClass>STANDARD</StorageClass><LastModified>2011-04-09T12:34:49Z</LastModified></Contents><EncodingType></EncodingType></ListBucketResult>`
response := ListBucketResult{
Name: "test_container",
diff --git a/weed/s3api/s3api_object_handlers_put.go b/weed/s3api/s3api_object_handlers_put.go
index 49d385afc..0f8743a30 100644
--- a/weed/s3api/s3api_object_handlers_put.go
+++ b/weed/s3api/s3api_object_handlers_put.go
@@ -110,7 +110,7 @@ func (s3a *S3ApiServer) putToFiler(r *http.Request, uploadUrl string, dataReader
hash := md5.New()
var body = io.TeeReader(dataReader, hash)
- proxyReq, err := http.NewRequest("PUT", uploadUrl, body)
+ proxyReq, err := http.NewRequest(http.MethodPut, uploadUrl, body)
if err != nil {
glog.Errorf("NewRequest %s: %v", uploadUrl, err)
diff --git a/weed/s3api/s3api_server.go b/weed/s3api/s3api_server.go
index 9422318ce..e0517ffb7 100644
--- a/weed/s3api/s3api_server.go
+++ b/weed/s3api/s3api_server.go
@@ -20,6 +20,8 @@ import (
"github.com/seaweedfs/seaweedfs/weed/security"
"github.com/seaweedfs/seaweedfs/weed/util"
"google.golang.org/grpc"
+ util_http "github.com/seaweedfs/seaweedfs/weed/util/http"
+ util_http_client "github.com/seaweedfs/seaweedfs/weed/util/http/client"
)
type S3ApiServerOption struct {
@@ -44,7 +46,7 @@ type S3ApiServer struct {
cb *CircuitBreaker
randomClientId int32
filerGuard *security.Guard
- client *http.Client
+ client util_http_client.HTTPClientInterface
bucketRegistry *BucketRegistry
}
@@ -84,10 +86,9 @@ func NewS3ApiServer(router *mux.Router, option *S3ApiServerOption) (s3ApiServer
}
s3ApiServer.bucketRegistry = NewBucketRegistry(s3ApiServer)
if option.LocalFilerSocket == "" {
- s3ApiServer.client = &http.Client{Transport: &http.Transport{
- MaxIdleConns: 1024,
- MaxIdleConnsPerHost: 1024,
- }}
+ if s3ApiServer.client, err = util_http.NewGlobalHttpClient(); err != nil {
+ return nil, err
+ }
} else {
s3ApiServer.client = &http.Client{
Transport: &http.Transport{
@@ -109,9 +110,9 @@ func (s3a *S3ApiServer) registerRouter(router *mux.Router) {
apiRouter := router.PathPrefix("/").Subrouter()
// Readiness Probe
- apiRouter.Methods("GET").Path("/status").HandlerFunc(s3a.StatusHandler)
+ apiRouter.Methods(http.MethodGet).Path("/status").HandlerFunc(s3a.StatusHandler)
- apiRouter.Methods("OPTIONS").HandlerFunc(
+ apiRouter.Methods(http.MethodOptions).HandlerFunc(
func(w http.ResponseWriter, r *http.Request) {
origin := r.Header.Get("Origin")
if origin != "" {
@@ -161,135 +162,135 @@ func (s3a *S3ApiServer) registerRouter(router *mux.Router) {
// objects with query
// CopyObjectPart
- bucket.Methods("PUT").Path("/{object:.+}").HeadersRegexp("X-Amz-Copy-Source", `.*?(\/|%2F).*?`).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.CopyObjectPartHandler, ACTION_WRITE)), "PUT")).Queries("partNumber", "{partNumber:[0-9]+}", "uploadId", "{uploadId:.*}")
+ bucket.Methods(http.MethodPut).Path("/{object:.+}").HeadersRegexp("X-Amz-Copy-Source", `.*?(\/|%2F).*?`).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.CopyObjectPartHandler, ACTION_WRITE)), "PUT")).Queries("partNumber", "{partNumber:[0-9]+}", "uploadId", "{uploadId:.*}")
// PutObjectPart
- bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectPartHandler, ACTION_WRITE)), "PUT")).Queries("partNumber", "{partNumber:[0-9]+}", "uploadId", "{uploadId:.*}")
+ bucket.Methods(http.MethodPut).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectPartHandler, ACTION_WRITE)), "PUT")).Queries("partNumber", "{partNumber:[0-9]+}", "uploadId", "{uploadId:.*}")
// CompleteMultipartUpload
- bucket.Methods("POST").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.CompleteMultipartUploadHandler, ACTION_WRITE)), "POST")).Queries("uploadId", "{uploadId:.*}")
+ bucket.Methods(http.MethodPost).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.CompleteMultipartUploadHandler, ACTION_WRITE)), "POST")).Queries("uploadId", "{uploadId:.*}")
// NewMultipartUpload
- bucket.Methods("POST").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.NewMultipartUploadHandler, ACTION_WRITE)), "POST")).Queries("uploads", "")
+ bucket.Methods(http.MethodPost).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.NewMultipartUploadHandler, ACTION_WRITE)), "POST")).Queries("uploads", "")
// AbortMultipartUpload
- bucket.Methods("DELETE").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.AbortMultipartUploadHandler, ACTION_WRITE)), "DELETE")).Queries("uploadId", "{uploadId:.*}")
+ bucket.Methods(http.MethodDelete).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.AbortMultipartUploadHandler, ACTION_WRITE)), "DELETE")).Queries("uploadId", "{uploadId:.*}")
// ListObjectParts
- bucket.Methods("GET").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.ListObjectPartsHandler, ACTION_READ)), "GET")).Queries("uploadId", "{uploadId:.*}")
+ bucket.Methods(http.MethodGet).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.ListObjectPartsHandler, ACTION_READ)), "GET")).Queries("uploadId", "{uploadId:.*}")
// ListMultipartUploads
- bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.ListMultipartUploadsHandler, ACTION_READ)), "GET")).Queries("uploads", "")
+ bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.ListMultipartUploadsHandler, ACTION_READ)), "GET")).Queries("uploads", "")
// GetObjectTagging
- bucket.Methods("GET").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetObjectTaggingHandler, ACTION_READ)), "GET")).Queries("tagging", "")
+ bucket.Methods(http.MethodGet).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetObjectTaggingHandler, ACTION_READ)), "GET")).Queries("tagging", "")
// PutObjectTagging
- bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectTaggingHandler, ACTION_TAGGING)), "PUT")).Queries("tagging", "")
+ bucket.Methods(http.MethodPut).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectTaggingHandler, ACTION_TAGGING)), "PUT")).Queries("tagging", "")
// DeleteObjectTagging
- bucket.Methods("DELETE").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteObjectTaggingHandler, ACTION_TAGGING)), "DELETE")).Queries("tagging", "")
+ bucket.Methods(http.MethodDelete).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteObjectTaggingHandler, ACTION_TAGGING)), "DELETE")).Queries("tagging", "")
// PutObjectACL
- bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectAclHandler, ACTION_WRITE_ACP)), "PUT")).Queries("acl", "")
+ bucket.Methods(http.MethodPut).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectAclHandler, ACTION_WRITE_ACP)), "PUT")).Queries("acl", "")
// PutObjectRetention
- bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectRetentionHandler, ACTION_WRITE)), "PUT")).Queries("retention", "")
+ bucket.Methods(http.MethodPut).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectRetentionHandler, ACTION_WRITE)), "PUT")).Queries("retention", "")
// PutObjectLegalHold
- bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectLegalHoldHandler, ACTION_WRITE)), "PUT")).Queries("legal-hold", "")
+ bucket.Methods(http.MethodPut).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectLegalHoldHandler, ACTION_WRITE)), "PUT")).Queries("legal-hold", "")
// PutObjectLockConfiguration
- bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectLockConfigurationHandler, ACTION_WRITE)), "PUT")).Queries("object-lock", "")
+ bucket.Methods(http.MethodPut).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectLockConfigurationHandler, ACTION_WRITE)), "PUT")).Queries("object-lock", "")
// GetObjectACL
- bucket.Methods("GET").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetObjectAclHandler, ACTION_READ_ACP)), "GET")).Queries("acl", "")
+ bucket.Methods(http.MethodGet).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetObjectAclHandler, ACTION_READ_ACP)), "GET")).Queries("acl", "")
// objects with query
// raw objects
// HeadObject
- bucket.Methods("HEAD").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.HeadObjectHandler, ACTION_READ)), "GET"))
+ bucket.Methods(http.MethodHead).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.HeadObjectHandler, ACTION_READ)), "GET"))
// GetObject, but directory listing is not supported
- bucket.Methods("GET").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetObjectHandler, ACTION_READ)), "GET"))
+ bucket.Methods(http.MethodGet).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetObjectHandler, ACTION_READ)), "GET"))
// CopyObject
- bucket.Methods("PUT").Path("/{object:.+}").HeadersRegexp("X-Amz-Copy-Source", ".*?(\\/|%2F).*?").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.CopyObjectHandler, ACTION_WRITE)), "COPY"))
+ bucket.Methods(http.MethodPut).Path("/{object:.+}").HeadersRegexp("X-Amz-Copy-Source", ".*?(\\/|%2F).*?").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.CopyObjectHandler, ACTION_WRITE)), "COPY"))
// PutObject
- bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectHandler, ACTION_WRITE)), "PUT"))
+ bucket.Methods(http.MethodPut).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutObjectHandler, ACTION_WRITE)), "PUT"))
// DeleteObject
- bucket.Methods("DELETE").Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteObjectHandler, ACTION_WRITE)), "DELETE"))
+ bucket.Methods(http.MethodDelete).Path("/{object:.+}").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteObjectHandler, ACTION_WRITE)), "DELETE"))
// raw objects
// buckets with query
// DeleteMultipleObjects
- bucket.Methods("POST").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteMultipleObjectsHandler, ACTION_WRITE)), "DELETE")).Queries("delete", "")
+ bucket.Methods(http.MethodPost).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteMultipleObjectsHandler, ACTION_WRITE)), "DELETE")).Queries("delete", "")
// GetBucketACL
- bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketAclHandler, ACTION_READ_ACP)), "GET")).Queries("acl", "")
+ bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketAclHandler, ACTION_READ_ACP)), "GET")).Queries("acl", "")
// PutBucketACL
- bucket.Methods("PUT").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketAclHandler, ACTION_WRITE_ACP)), "PUT")).Queries("acl", "")
+ bucket.Methods(http.MethodPut).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketAclHandler, ACTION_WRITE_ACP)), "PUT")).Queries("acl", "")
// GetBucketPolicy
- bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketPolicyHandler, ACTION_READ)), "GET")).Queries("policy", "")
+ bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketPolicyHandler, ACTION_READ)), "GET")).Queries("policy", "")
// PutBucketPolicy
- bucket.Methods("PUT").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketPolicyHandler, ACTION_WRITE)), "PUT")).Queries("policy", "")
+ bucket.Methods(http.MethodPut).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketPolicyHandler, ACTION_WRITE)), "PUT")).Queries("policy", "")
// DeleteBucketPolicy
- bucket.Methods("DELETE").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteBucketPolicyHandler, ACTION_WRITE)), "DELETE")).Queries("policy", "")
+ bucket.Methods(http.MethodDelete).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteBucketPolicyHandler, ACTION_WRITE)), "DELETE")).Queries("policy", "")
// GetBucketCors
- bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketCorsHandler, ACTION_READ)), "GET")).Queries("cors", "")
+ bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketCorsHandler, ACTION_READ)), "GET")).Queries("cors", "")
// PutBucketCors
- bucket.Methods("PUT").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketCorsHandler, ACTION_WRITE)), "PUT")).Queries("cors", "")
+ bucket.Methods(http.MethodPut).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketCorsHandler, ACTION_WRITE)), "PUT")).Queries("cors", "")
// DeleteBucketCors
- bucket.Methods("DELETE").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteBucketCorsHandler, ACTION_WRITE)), "DELETE")).Queries("cors", "")
+ bucket.Methods(http.MethodDelete).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteBucketCorsHandler, ACTION_WRITE)), "DELETE")).Queries("cors", "")
// GetBucketLifecycleConfiguration
- bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketLifecycleConfigurationHandler, ACTION_READ)), "GET")).Queries("lifecycle", "")
+ bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketLifecycleConfigurationHandler, ACTION_READ)), "GET")).Queries("lifecycle", "")
// PutBucketLifecycleConfiguration
- bucket.Methods("PUT").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketLifecycleConfigurationHandler, ACTION_WRITE)), "PUT")).Queries("lifecycle", "")
+ bucket.Methods(http.MethodPut).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketLifecycleConfigurationHandler, ACTION_WRITE)), "PUT")).Queries("lifecycle", "")
// DeleteBucketLifecycleConfiguration
- bucket.Methods("DELETE").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteBucketLifecycleHandler, ACTION_WRITE)), "DELETE")).Queries("lifecycle", "")
+ bucket.Methods(http.MethodDelete).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteBucketLifecycleHandler, ACTION_WRITE)), "DELETE")).Queries("lifecycle", "")
// GetBucketLocation
- bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketLocationHandler, ACTION_READ)), "GET")).Queries("location", "")
+ bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketLocationHandler, ACTION_READ)), "GET")).Queries("location", "")
// GetBucketRequestPayment
- bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketRequestPaymentHandler, ACTION_READ)), "GET")).Queries("requestPayment", "")
+ bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketRequestPaymentHandler, ACTION_READ)), "GET")).Queries("requestPayment", "")
// GetBucketVersioning
- bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketVersioningHandler, ACTION_READ)), "GET")).Queries("versioning", "")
- bucket.Methods("PUT").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketVersioningHandler, ACTION_WRITE)), "PUT")).Queries("versioning", "")
+ bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.GetBucketVersioningHandler, ACTION_READ)), "GET")).Queries("versioning", "")
+ bucket.Methods(http.MethodPut).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketVersioningHandler, ACTION_WRITE)), "PUT")).Queries("versioning", "")
// ListObjectsV2
- bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.ListObjectsV2Handler, ACTION_LIST)), "LIST")).Queries("list-type", "2")
+ bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.ListObjectsV2Handler, ACTION_LIST)), "LIST")).Queries("list-type", "2")
// buckets with query
// PutBucketOwnershipControls
- bucket.Methods("PUT").HandlerFunc(track(s3a.iam.Auth(s3a.PutBucketOwnershipControls, ACTION_ADMIN), "PUT")).Queries("ownershipControls", "")
+ bucket.Methods(http.MethodPut).HandlerFunc(track(s3a.iam.Auth(s3a.PutBucketOwnershipControls, ACTION_ADMIN), "PUT")).Queries("ownershipControls", "")
//GetBucketOwnershipControls
- bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.GetBucketOwnershipControls, ACTION_READ), "GET")).Queries("ownershipControls", "")
+ bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.GetBucketOwnershipControls, ACTION_READ), "GET")).Queries("ownershipControls", "")
//DeleteBucketOwnershipControls
- bucket.Methods("DELETE").HandlerFunc(track(s3a.iam.Auth(s3a.DeleteBucketOwnershipControls, ACTION_ADMIN), "DELETE")).Queries("ownershipControls", "")
+ bucket.Methods(http.MethodDelete).HandlerFunc(track(s3a.iam.Auth(s3a.DeleteBucketOwnershipControls, ACTION_ADMIN), "DELETE")).Queries("ownershipControls", "")
// raw buckets
// PostPolicy
- bucket.Methods("POST").HeadersRegexp("Content-Type", "multipart/form-data*").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PostPolicyBucketHandler, ACTION_WRITE)), "POST"))
+ bucket.Methods(http.MethodPost).HeadersRegexp("Content-Type", "multipart/form-data*").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PostPolicyBucketHandler, ACTION_WRITE)), "POST"))
// HeadBucket
- bucket.Methods("HEAD").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.HeadBucketHandler, ACTION_READ)), "GET"))
+ bucket.Methods(http.MethodHead).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.HeadBucketHandler, ACTION_READ)), "GET"))
// PutBucket
- bucket.Methods("PUT").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketHandler, ACTION_ADMIN)), "PUT"))
+ bucket.Methods(http.MethodPut).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.PutBucketHandler, ACTION_ADMIN)), "PUT"))
// DeleteBucket
- bucket.Methods("DELETE").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteBucketHandler, ACTION_DELETE_BUCKET)), "DELETE"))
+ bucket.Methods(http.MethodDelete).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.DeleteBucketHandler, ACTION_DELETE_BUCKET)), "DELETE"))
// ListObjectsV1 (Legacy)
- bucket.Methods("GET").HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.ListObjectsV1Handler, ACTION_LIST)), "LIST"))
+ bucket.Methods(http.MethodGet).HandlerFunc(track(s3a.iam.Auth(s3a.cb.Limit(s3a.ListObjectsV1Handler, ACTION_LIST)), "LIST"))
// raw buckets
}
// ListBuckets
- apiRouter.Methods("GET").Path("/").HandlerFunc(track(s3a.ListBucketsHandler, "LIST"))
+ apiRouter.Methods(http.MethodGet).Path("/").HandlerFunc(track(s3a.ListBucketsHandler, "LIST"))
// NotFound
apiRouter.NotFoundHandler = http.HandlerFunc(s3err.NotFoundHandler)
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/s3api/s3err/error_handler.go b/weed/s3api/s3err/error_handler.go
index 3fb04a313..466c0e61b 100644
--- a/weed/s3api/s3err/error_handler.go
+++ b/weed/s3api/s3err/error_handler.go
@@ -79,6 +79,7 @@ func setCommonHeaders(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Accept-Ranges", "bytes")
if r.Header.Get("Origin") != "" {
w.Header().Set("Access-Control-Allow-Origin", "*")
+ w.Header().Set("Access-Control-Expose-Headers", "*")
w.Header().Set("Access-Control-Allow-Credentials", "true")
}
}