46 lines
1.1 KiB
Go
46 lines
1.1 KiB
Go
|
|
package objectstorage
|
||
|
|
|
||
|
|
import (
|
||
|
|
"net/url"
|
||
|
|
"strings"
|
||
|
|
)
|
||
|
|
|
||
|
|
func objectKeyFromPublicURL(publicBase string, value string) (string, bool) {
|
||
|
|
value = strings.TrimSpace(value)
|
||
|
|
publicBase = strings.TrimRight(strings.TrimSpace(publicBase), "/")
|
||
|
|
if value == "" || publicBase == "" {
|
||
|
|
return "", false
|
||
|
|
}
|
||
|
|
|
||
|
|
if strings.HasPrefix(value, publicBase+"/") {
|
||
|
|
return unescapeObjectKey(strings.TrimPrefix(strings.Split(value, "?")[0], publicBase+"/"))
|
||
|
|
}
|
||
|
|
|
||
|
|
parsedValue, err := url.Parse(value)
|
||
|
|
if err != nil {
|
||
|
|
return "", false
|
||
|
|
}
|
||
|
|
parsedBase, err := url.Parse(publicBase)
|
||
|
|
if err != nil {
|
||
|
|
return "", false
|
||
|
|
}
|
||
|
|
basePath := strings.TrimRight(parsedBase.EscapedPath(), "/")
|
||
|
|
valuePath := parsedValue.EscapedPath()
|
||
|
|
if basePath == "" || !strings.HasPrefix(valuePath, basePath+"/") {
|
||
|
|
return "", false
|
||
|
|
}
|
||
|
|
return unescapeObjectKey(strings.TrimPrefix(valuePath, basePath+"/"))
|
||
|
|
}
|
||
|
|
|
||
|
|
func unescapeObjectKey(value string) (string, bool) {
|
||
|
|
value = strings.TrimLeft(strings.TrimSpace(value), "/")
|
||
|
|
if value == "" {
|
||
|
|
return "", false
|
||
|
|
}
|
||
|
|
objectKey, err := url.PathUnescape(value)
|
||
|
|
if err != nil {
|
||
|
|
return "", false
|
||
|
|
}
|
||
|
|
return objectKey, objectKey != ""
|
||
|
|
}
|