Skip to content

Commit

Permalink
gateway: add user controlled system-defined object metadata
Browse files Browse the repository at this point in the history
  • Loading branch information
prOOrc committed Jan 17, 2025
1 parent 8cd99ab commit a04fd12
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 21 deletions.
11 changes: 6 additions & 5 deletions cmd/gateway.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,11 +153,12 @@ func gateway(c *cli.Context) error {
jfs,
conf,
&jfsgateway.Config{
MultiBucket: c.Bool("multi-buckets"),
KeepEtag: c.Bool("keep-etag"),
Umask: uint16(umask),
ObjTag: c.Bool("object-tag"),
ObjMeta: c.Bool("object-meta"),
MultiBucket: c.Bool("multi-buckets"),
KeepEtag: c.Bool("keep-etag"),
Umask: uint16(umask),
ObjTag: c.Bool("object-tag"),
ObjMeta: c.Bool("object-meta"),
ObjSystemMeta: c.Bool("object-system-meta"),
},
)
if err != nil {
Expand Down
1 change: 1 addition & 0 deletions docs/en/guide/gateway.md
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ Object tags are not supported by default, but you can use `--object-tag` to enab
### Enable object metadata

Object metadata is not supported by default, but you can use `--object-meta` to enable them.
To enable user controlled system-defined object metadata, you can use `--object-system-meta`.

### Enable virtual host-style requests

Expand Down
55 changes: 39 additions & 16 deletions pkg/gateway/gateway.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,12 @@ var mctx meta.Context
var logger = utils.GetLogger("juicefs")

type Config struct {
MultiBucket bool
KeepEtag bool
Umask uint16
ObjTag bool
ObjMeta bool
MultiBucket bool
KeepEtag bool
Umask uint16
ObjTag bool
ObjMeta bool
ObjSystemMeta bool
}

func NewJFSGateway(jfs *fs.FileSystem, conf *vfs.Config, gConf *Config) (minio.ObjectLayer, error) {
Expand Down Expand Up @@ -705,6 +706,8 @@ func (n *jfsObjects) GetObjectInfo(ctx context.Context, bucket, object string, o
for k, v := range objMeta {
opts.UserDefined[k] = v
}
contentType := utils.GuessMimeType(object)
contentType = n.getObjContentType(objMeta, contentType)
return minio.ObjectInfo{
Bucket: bucket,
Name: object,
Expand All @@ -713,7 +716,7 @@ func (n *jfsObjects) GetObjectInfo(ctx context.Context, bucket, object string, o
IsDir: fi.IsDir(),
AccTime: fi.ModTime(),
ETag: string(etag),
ContentType: utils.GuessMimeType(object),
ContentType: contentType,
UserTags: string(tagStr),
UserDefined: minio.CleanMetadata(opts.UserDefined),
}, nil
Expand Down Expand Up @@ -901,6 +904,13 @@ const s3Tags = "s3-tags"
// S3 object metadata
const s3Meta = "s3-meta"
const amzMeta = "x-amz-meta-"
const metaContentType = "content-type"

var s3UserControlledSystemMeta = []string{
"cache-control",
"content-disposition",
"content-type",
}

func (n *jfsObjects) getObjMeta(p string) (objMeta map[string]string, err error) {
if n.gConf.ObjMeta {
Expand All @@ -910,29 +920,42 @@ func (n *jfsObjects) getObjMeta(p string) (objMeta map[string]string, err error)
return objMeta, errno
}
if len(metadataStr) > 0 {
var meta map[string]string
err = json.Unmarshal(metadataStr, &meta)
if err != nil {
return objMeta, err
}
objMeta = make(map[string]string, len(meta))
for k, v := range meta {
objMeta[amzMeta+k] = v
}
err = json.Unmarshal(metadataStr, &objMeta)
return objMeta, err
}
} else {
objMeta = make(map[string]string)
}
return objMeta, nil
}

func (n *jfsObjects) getObjContentType(objMeta map[string]string, fileContentType string) (contentType string) {
if !n.gConf.ObjSystemMeta {
return fileContentType
}
var exist bool
contentType, exist = objMeta[metaContentType]
if !exist || len(contentType) == 0 {
return fileContentType
} else {
return contentType
}
}

func (n *jfsObjects) setObjMeta(p string, metadata map[string]string) error {
if n.gConf.ObjMeta && metadata != nil {
meta := make(map[string]string)
for k, v := range metadata {
k = strings.ToLower(k)
if strings.HasPrefix(k, amzMeta) {
meta[k[len(amzMeta):]] = v
meta[k] = v
} else if n.gConf.ObjSystemMeta {
for _, systemMetaKey := range s3UserControlledSystemMeta {
if k == systemMetaKey {
meta[k] = v
break
}
}
}
}
if len(meta) > 0 {
Expand Down

0 comments on commit a04fd12

Please sign in to comment.