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 != "" }