swift: fix parsing of X-Object-Manifest

Before this change we forgot to URL decode the X-Object-Manifest in a dynamic large object.

This problem was introduced by 2fe8285f89 "swift: reserve
segments of dynamic large object when delete objects in container what
was enabled versioning."
This commit is contained in:
Nick Craig-Wood 2019-11-21 13:25:02 +00:00
parent 4641bd5116
commit 1db31d7149

View File

@ -7,6 +7,7 @@ import (
"context"
"fmt"
"io"
"net/url"
"path"
"strconv"
"strings"
@ -952,8 +953,8 @@ func (o *Object) isStaticLargeObject() (bool, error) {
return o.hasHeader("X-Static-Large-Object")
}
func (o *Object) isInContainerVersioning() (bool, error) {
_, headers, err := o.fs.c.Container(o.fs.root)
func (o *Object) isInContainerVersioning(container string) (bool, error) {
_, headers, err := o.fs.c.Container(container)
if err != nil {
return false, err
}
@ -1130,6 +1131,10 @@ func (o *Object) getSegmentsDlo() (segmentsContainer string, prefix string, err
return
}
dirManifest := o.headers["X-Object-Manifest"]
dirManifest, err = url.PathUnescape(dirManifest)
if err != nil {
return
}
delimiter := strings.Index(dirManifest, "/")
if len(dirManifest) == 0 || delimiter < 0 {
err = errors.New("Missing or wrong structure of manifest of Dynamic large object")
@ -1341,7 +1346,7 @@ func (o *Object) Remove(ctx context.Context) (err error) {
}
// ...then segments if required
if isDynamicLargeObject {
isInContainerVersioning, err := o.isInContainerVersioning()
isInContainerVersioning, err := o.isInContainerVersioning(container)
if err != nil {
return err
}