From c8853b327b805dc33dcee57e0211fe1e2b4801c0 Mon Sep 17 00:00:00 2001 From: chrislu Date: Fri, 14 Nov 2025 18:41:47 -0800 Subject: [PATCH] headers --- weed/s3api/s3api_object_handlers_put.go | 8 +++++++- weed/server/filer_server_handlers_write_autochunk.go | 6 +++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/weed/s3api/s3api_object_handlers_put.go b/weed/s3api/s3api_object_handlers_put.go index 3c2b4647c..da1458b06 100644 --- a/weed/s3api/s3api_object_handlers_put.go +++ b/weed/s3api/s3api_object_handlers_put.go @@ -443,7 +443,13 @@ func (s3a *S3ApiServer) putToFiler(r *http.Request, uploadUrl string, dataReader // Copy user metadata and standard headers for k, v := range r.Header { if len(v) > 0 && len(v[0]) > 0 { - if strings.HasPrefix(k, "X-Amz-Meta-") || k == "Cache-Control" || k == "Expires" || k == "Content-Disposition" { + if strings.HasPrefix(k, "X-Amz-Meta-") { + // AWS S3 stores user metadata keys in lowercase + // Go's HTTP server canonicalizes headers (e.g., x-amz-meta-foo → X-Amz-Meta-Foo) + // but S3 expects lowercase, so convert back to lowercase for storage + lowerKey := strings.ToLower(k) + entry.Extended[lowerKey] = []byte(v[0]) + } else if k == "Cache-Control" || k == "Expires" || k == "Content-Disposition" { entry.Extended[k] = []byte(v[0]) } if k == "Response-Content-Disposition" { diff --git a/weed/server/filer_server_handlers_write_autochunk.go b/weed/server/filer_server_handlers_write_autochunk.go index fba693f43..b08f8d389 100644 --- a/weed/server/filer_server_handlers_write_autochunk.go +++ b/weed/server/filer_server_handlers_write_autochunk.go @@ -544,8 +544,12 @@ func SaveAmzMetaData(r *http.Request, existing map[string][]byte, isReplace bool for header, values := range r.Header { if strings.HasPrefix(header, s3_constants.AmzUserMetaPrefix) { + // AWS S3 stores user metadata keys in lowercase + // Go's HTTP server canonicalizes headers (e.g., x-amz-meta-foo → X-Amz-Meta-Foo) + // but S3 expects lowercase, so convert back to lowercase for storage + lowerHeader := strings.ToLower(header) for _, value := range values { - metadata[header] = []byte(value) + metadata[lowerHeader] = []byte(value) } } }