diff --git a/internal/helm/repository/utils.go b/internal/helm/repository/utils.go index 2b0b8ed8d..b784dec0d 100644 --- a/internal/helm/repository/utils.go +++ b/internal/helm/repository/utils.go @@ -47,10 +47,16 @@ func NormalizeURL(repositoryURL string) (string, error) { if u.Scheme == helmreg.OCIScheme { u.Path = strings.TrimRight(u.Path, "/") + // we perform the same operation on u.RawPath so that it will be a valid encoding + // of u.Path. This allows u.EscapedPath() (which is used in computing u.String()) to return + // the correct value when the path is url encoded. + // ref: https://pkg.go.dev/net/url#URL.EscapedPath + u.RawPath = strings.TrimRight(u.RawPath, "/") return u.String(), nil } u.Path = strings.TrimRight(u.Path, "/") + "/" + u.RawPath = strings.TrimRight(u.RawPath, "/") + "/" return u.String(), nil } diff --git a/internal/helm/repository/utils_test.go b/internal/helm/repository/utils_test.go index c9a022758..a1fa2dcaa 100644 --- a/internal/helm/repository/utils_test.go +++ b/internal/helm/repository/utils_test.go @@ -64,6 +64,16 @@ func TestNormalizeURL(t *testing.T) { url: "http://example.com/?st=pr", want: "http://example.com/?st=pr", }, + { + name: "url with encoded path", + url: "http://example.com/next%2Fpath", + want: "http://example.com/next%2Fpath/", + }, + { + name: "url with encoded path and slash", + url: "http://example.com/next%2Fpath/", + want: "http://example.com/next%2Fpath/", + }, { name: "empty url", url: "",