[#611] Split name processing from object info creation procedure
Signed-off-by: Alex Vanin <alexey@nspcc.ru>
This commit is contained in:
parent
97f81d3270
commit
e0136feb73
3 changed files with 51 additions and 71 deletions
|
@ -68,49 +68,23 @@ func userHeaders(attrs []object.Attribute) map[string]string {
|
|||
return result
|
||||
}
|
||||
|
||||
func objInfoFromMeta(bkt *data.BucketInfo, meta *object.Object) *data.ObjectInfo {
|
||||
return objectInfoFromMeta(bkt, meta, "", "")
|
||||
}
|
||||
|
||||
func objectInfoFromMeta(bkt *data.BucketInfo, meta *object.Object, prefix, delimiter string) *data.ObjectInfo {
|
||||
func objectInfoFromMeta(bkt *data.BucketInfo, meta *object.Object) *data.ObjectInfo {
|
||||
var (
|
||||
isDir bool
|
||||
size int64
|
||||
mimeType string
|
||||
creation time.Time
|
||||
filename = filenameFromObject(meta)
|
||||
)
|
||||
|
||||
if !strings.HasPrefix(filename, prefix) {
|
||||
return nil
|
||||
}
|
||||
|
||||
userHeaders := userHeaders(meta.Attributes())
|
||||
delete(userHeaders, object.AttributeFileName)
|
||||
if contentType, ok := userHeaders[object.AttributeContentType]; ok {
|
||||
headers := userHeaders(meta.Attributes())
|
||||
delete(headers, object.AttributeFileName)
|
||||
if contentType, ok := headers[object.AttributeContentType]; ok {
|
||||
mimeType = contentType
|
||||
delete(userHeaders, object.AttributeContentType)
|
||||
delete(headers, object.AttributeContentType)
|
||||
}
|
||||
if val, ok := userHeaders[object.AttributeTimestamp]; !ok {
|
||||
if val, ok := headers[object.AttributeTimestamp]; !ok {
|
||||
// ignore empty value
|
||||
} else if dt, err := strconv.ParseInt(val, 10, 64); err == nil {
|
||||
creation = time.Unix(dt, 0)
|
||||
delete(userHeaders, object.AttributeTimestamp)
|
||||
}
|
||||
|
||||
if len(delimiter) > 0 {
|
||||
tail := strings.TrimPrefix(filename, prefix)
|
||||
index := strings.Index(tail, delimiter)
|
||||
if index >= 0 {
|
||||
isDir = true
|
||||
mimeType = ""
|
||||
filename = prefix + tail[:index+1]
|
||||
userHeaders = nil
|
||||
} else {
|
||||
size = int64(meta.PayloadSize())
|
||||
}
|
||||
} else {
|
||||
size = int64(meta.PayloadSize())
|
||||
delete(headers, object.AttributeTimestamp)
|
||||
}
|
||||
|
||||
objID, _ := meta.ID()
|
||||
|
@ -118,19 +92,43 @@ func objectInfoFromMeta(bkt *data.BucketInfo, meta *object.Object, prefix, delim
|
|||
return &data.ObjectInfo{
|
||||
ID: objID,
|
||||
CID: bkt.CID,
|
||||
IsDir: isDir,
|
||||
IsDir: false,
|
||||
|
||||
Bucket: bkt.Name,
|
||||
Name: filename,
|
||||
Name: filenameFromObject(meta),
|
||||
Created: creation,
|
||||
ContentType: mimeType,
|
||||
Headers: userHeaders,
|
||||
Headers: headers,
|
||||
Owner: *meta.OwnerID(),
|
||||
Size: size,
|
||||
Size: int64(meta.PayloadSize()),
|
||||
HashSum: hex.EncodeToString(payloadChecksum.Value()),
|
||||
}
|
||||
}
|
||||
|
||||
// processObjectInfoName fixes name in objectInfo structure based on prefix and
|
||||
// delimiter from user request. If name does not contain prefix, nil value is
|
||||
// returned. If name should be modified, then function returns copy of objectInfo
|
||||
// structure.
|
||||
func processObjectInfoName(oi *data.ObjectInfo, prefix, delimiter string) *data.ObjectInfo {
|
||||
if !strings.HasPrefix(oi.Name, prefix) {
|
||||
return nil
|
||||
}
|
||||
if len(delimiter) == 0 {
|
||||
return oi
|
||||
}
|
||||
copiedObjInfo := *oi
|
||||
tail := strings.TrimPrefix(copiedObjInfo.Name, prefix)
|
||||
index := strings.Index(tail, delimiter)
|
||||
if index >= 0 {
|
||||
copiedObjInfo.IsDir = true
|
||||
copiedObjInfo.Size = 0
|
||||
copiedObjInfo.Headers = nil
|
||||
copiedObjInfo.ContentType = ""
|
||||
copiedObjInfo.Name = prefix + tail[:index+1]
|
||||
}
|
||||
return &copiedObjInfo
|
||||
}
|
||||
|
||||
func filenameFromObject(o *object.Object) string {
|
||||
for _, attr := range o.Attributes() {
|
||||
if attr.Key() == object.AttributeFileName {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue