diff --git a/restapi/client.go b/restapi/client.go index c68291559..ab3b39c23 100644 --- a/restapi/client.go +++ b/restapi/client.go @@ -389,7 +389,7 @@ func computeObjectURLWithoutEncode(bucketName, prefix string) (string, error) { objectURL = path.Join(objectURL, bucketName) } if strings.TrimSpace(prefix) != "" { - objectURL = path.Join(objectURL, prefix) + objectURL = pathJoinFinalSlash(objectURL, prefix) } objectURL = fmt.Sprintf("%s://%s", u.Scheme, objectURL) @@ -418,6 +418,16 @@ func newS3BucketClient(claims *models.Principal, bucketName string, prefix strin return s3Client, nil } +// pathJoinFinalSlash - like path.Join() but retains trailing slashSeparator of the last element +func pathJoinFinalSlash(elem ...string) string { + if len(elem) > 0 { + if strings.HasSuffix(elem[len(elem)-1], SlashSeparator) { + return path.Join(elem...) + SlashSeparator + } + } + return path.Join(elem...) +} + // newS3Config simply creates a new Config struct using the passed // parameters. func newS3Config(endpoint, accessKey, secretKey, sessionToken string, insecure bool) *mc.Config { diff --git a/restapi/consts.go b/restapi/consts.go index 434d314d3..aca0db703 100644 --- a/restapi/consts.go +++ b/restapi/consts.go @@ -54,4 +54,5 @@ const ( ConsoleLogQueryURL = "CONSOLE_LOG_QUERY_URL" ConsoleLogQueryAuthToken = "CONSOLE_LOG_QUERY_AUTH_TOKEN" LogSearchQueryAuthToken = "LOGSEARCH_QUERY_AUTH_TOKEN" + SlashSeparator = "/" )