diff options
Diffstat (limited to 'weed/server/filer_server_handlers_write_autochunk.go')
| -rw-r--r-- | weed/server/filer_server_handlers_write_autochunk.go | 94 |
1 files changed, 4 insertions, 90 deletions
diff --git a/weed/server/filer_server_handlers_write_autochunk.go b/weed/server/filer_server_handlers_write_autochunk.go index 4a200cf43..8647bf696 100644 --- a/weed/server/filer_server_handlers_write_autochunk.go +++ b/weed/server/filer_server_handlers_write_autochunk.go @@ -7,7 +7,6 @@ import ( "fmt" "io" "net/http" - "net/url" "os" "path" "strconv" @@ -18,7 +17,6 @@ import ( "github.com/seaweedfs/seaweedfs/weed/glog" "github.com/seaweedfs/seaweedfs/weed/operation" "github.com/seaweedfs/seaweedfs/weed/pb/filer_pb" - "github.com/seaweedfs/seaweedfs/weed/s3api/s3_constants" "github.com/seaweedfs/seaweedfs/weed/storage/needle" "github.com/seaweedfs/seaweedfs/weed/util" "github.com/seaweedfs/seaweedfs/weed/util/constants" @@ -135,17 +133,8 @@ func (fs *FilerServer) doPutAutoChunk(ctx context.Context, w http.ResponseWriter if err := fs.checkPermissions(ctx, r, fileName); err != nil { return nil, nil, err } - // Disable TTL-based (creation time) deletion when S3 expiry (modification time) is enabled - soMaybeWithOutTTL := so - if so.TtlSeconds > 0 { - if s3ExpiresValue := r.Header.Get(s3_constants.SeaweedFSExpiresS3); s3ExpiresValue == "true" { - clone := *so - clone.TtlSeconds = 0 - soMaybeWithOutTTL = &clone - } - } - fileChunks, md5Hash, chunkOffset, err, smallContent := fs.uploadRequestToChunks(ctx, w, r, r.Body, chunkSize, fileName, contentType, contentLength, soMaybeWithOutTTL) + fileChunks, md5Hash, chunkOffset, err, smallContent := fs.uploadRequestToChunks(ctx, w, r, r.Body, chunkSize, fileName, contentType, contentLength, so) if err != nil { return nil, nil, err @@ -333,18 +322,13 @@ func (fs *FilerServer) saveMetaData(ctx context.Context, r *http.Request, fileNa Size: int64(entry.FileSize), } - entry.Extended = SaveAmzMetaData(r, entry.Extended, false) - if entry.TtlSec > 0 && r.Header.Get(s3_constants.SeaweedFSExpiresS3) == "true" { - entry.Extended[s3_constants.SeaweedFSExpiresS3] = []byte("true") - } + // Save standard HTTP headers as extended attributes + // Note: S3 API now writes directly to volume servers and saves metadata via gRPC + // This handler is for non-S3 clients (WebDAV, SFTP, mount, curl, etc.) for k, v := range r.Header { if len(v) > 0 && len(v[0]) > 0 { if strings.HasPrefix(k, needle.PairNamePrefix) || k == "Cache-Control" || k == "Expires" || k == "Content-Disposition" { entry.Extended[k] = []byte(v[0]) - // Log version ID header specifically for debugging - if k == "Seaweed-X-Amz-Version-Id" { - glog.V(0).Infof("filer: storing version ID header in Extended: %s=%s for path=%s", k, v[0], path) - } } if k == "Response-Content-Disposition" { entry.Extended["Content-Disposition"] = []byte(v[0]) @@ -456,73 +440,3 @@ func (fs *FilerServer) mkdir(ctx context.Context, w http.ResponseWriter, r *http } return filerResult, replyerr } - -func SaveAmzMetaData(r *http.Request, existing map[string][]byte, isReplace bool) (metadata map[string][]byte) { - - metadata = make(map[string][]byte) - if !isReplace { - for k, v := range existing { - metadata[k] = v - } - } - - if sc := r.Header.Get(s3_constants.AmzStorageClass); sc != "" { - metadata[s3_constants.AmzStorageClass] = []byte(sc) - } - - if ce := r.Header.Get("Content-Encoding"); ce != "" { - metadata["Content-Encoding"] = []byte(ce) - } - - if tags := r.Header.Get(s3_constants.AmzObjectTagging); tags != "" { - // Use url.ParseQuery for robust parsing and automatic URL decoding - parsedTags, err := url.ParseQuery(tags) - if err != nil { - glog.Errorf("Failed to parse S3 tags '%s': %v", tags, err) - } else { - for key, values := range parsedTags { - // According to S3 spec, if a key is provided multiple times, the last value is used. - // A tag value can be an empty string but not nil. - value := "" - if len(values) > 0 { - value = values[len(values)-1] - } - metadata[s3_constants.AmzObjectTagging+"-"+key] = []byte(value) - } - } - } - - for header, values := range r.Header { - if strings.HasPrefix(header, s3_constants.AmzUserMetaPrefix) { - // Go's HTTP server canonicalizes headers (e.g., x-amz-meta-foo → X-Amz-Meta-Foo) - // We store them as they come in (after canonicalization) to preserve the user's intent - for _, value := range values { - metadata[header] = []byte(value) - } - } - } - - // Handle SSE-C headers - if algorithm := r.Header.Get(s3_constants.AmzServerSideEncryptionCustomerAlgorithm); algorithm != "" { - metadata[s3_constants.AmzServerSideEncryptionCustomerAlgorithm] = []byte(algorithm) - } - if keyMD5 := r.Header.Get(s3_constants.AmzServerSideEncryptionCustomerKeyMD5); keyMD5 != "" { - // Store as-is; SSE-C MD5 is base64 and case-sensitive - metadata[s3_constants.AmzServerSideEncryptionCustomerKeyMD5] = []byte(keyMD5) - } - - //acp-owner - acpOwner := r.Header.Get(s3_constants.ExtAmzOwnerKey) - if len(acpOwner) > 0 { - metadata[s3_constants.ExtAmzOwnerKey] = []byte(acpOwner) - } - - //acp-grants - acpGrants := r.Header.Get(s3_constants.ExtAmzAclKey) - if len(acpGrants) > 0 { - metadata[s3_constants.ExtAmzAclKey] = []byte(acpGrants) - } - - return - -} |
