From 704133ddd540eb9c3a49f973d4c00fc12910eb34 Mon Sep 17 00:00:00 2001 From: Karuppiah Natarajan Date: Tue, 8 Oct 2019 16:09:02 +0530 Subject: [PATCH] fix repo url being decoded while downloading repo index Signed-off-by: Karuppiah Natarajan --- pkg/repo/chartrepo.go | 7 +-- pkg/repo/index_test.go | 108 ++++++++++++++++++++++++++++++----------- 2 files changed, 83 insertions(+), 32 deletions(-) diff --git a/pkg/repo/chartrepo.go b/pkg/repo/chartrepo.go index a88f68527..c8d0d6a3d 100644 --- a/pkg/repo/chartrepo.go +++ b/pkg/repo/chartrepo.go @@ -23,6 +23,7 @@ import ( "io/ioutil" "net/url" "os" + "path" "path/filepath" "strings" @@ -109,14 +110,14 @@ func (r *ChartRepository) Load() error { // DownloadIndexFile fetches the index from a repository. func (r *ChartRepository) DownloadIndexFile() (string, error) { - var indexURL string parsedURL, err := url.Parse(r.Config.URL) if err != nil { return "", err } - parsedURL.Path = strings.TrimSuffix(parsedURL.Path, "/") + "/index.yaml" + parsedURL.RawPath = path.Join(parsedURL.RawPath, "index.yaml") + parsedURL.Path = path.Join(parsedURL.Path, "index.yaml") - indexURL = parsedURL.String() + indexURL := parsedURL.String() // TODO add user-agent resp, err := r.Client.Get(indexURL, getter.WithURL(r.Config.URL), diff --git a/pkg/repo/index_test.go b/pkg/repo/index_test.go index f5203646c..d0596c219 100644 --- a/pkg/repo/index_test.go +++ b/pkg/repo/index_test.go @@ -18,12 +18,14 @@ package repo import ( "io/ioutil" + "net/http" "os" "testing" - "helm.sh/helm/v3/pkg/chart" "helm.sh/helm/v3/pkg/cli" "helm.sh/helm/v3/pkg/getter" + + "helm.sh/helm/v3/pkg/chart" ) const ( @@ -128,39 +130,87 @@ func TestMerge(t *testing.T) { } func TestDownloadIndexFile(t *testing.T) { - srv, err := startLocalServerForTests(nil) - if err != nil { - t.Fatal(err) - } - defer srv.Close() + t.Run("should download index file", func(t *testing.T) { + srv, err := startLocalServerForTests(nil) + if err != nil { + t.Fatal(err) + } + defer srv.Close() + + r, err := NewChartRepository(&Entry{ + Name: testRepo, + URL: srv.URL, + }, getter.All(&cli.EnvSettings{})) + if err != nil { + t.Errorf("Problem creating chart repository from %s: %v", testRepo, err) + } - r, err := NewChartRepository(&Entry{ - Name: testRepo, - URL: srv.URL, - }, getter.All(&cli.EnvSettings{})) - if err != nil { - t.Errorf("Problem creating chart repository from %s: %v", testRepo, err) - } + idx, err := r.DownloadIndexFile() + if err != nil { + t.Fatalf("Failed to download index file to %s: %#v", idx, err) + } - idx, err := r.DownloadIndexFile() - if err != nil { - t.Fatalf("Failed to download index file to %s: %#v", idx, err) - } + if _, err := os.Stat(idx); err != nil { + t.Fatalf("error finding created index file: %#v", err) + } - if _, err := os.Stat(idx); err != nil { - t.Fatalf("error finding created index file: %#v", err) - } + b, err := ioutil.ReadFile(idx) + if err != nil { + t.Fatalf("error reading index file: %#v", err) + } - b, err := ioutil.ReadFile(idx) - if err != nil { - t.Fatalf("error reading index file: %#v", err) - } + i, err := loadIndex(b) + if err != nil { + t.Fatalf("Index %q failed to parse: %s", testfile, err) + } + verifyLocalIndex(t, i) + }) + + t.Run("should not decode the path in the repo url while downloading index", func(t *testing.T) { + chartRepoURLPath := "/some%2Fpath/test" + fileBytes, err := ioutil.ReadFile("testdata/local-index.yaml") + if err != nil { + t.Fatal(err) + } + handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.URL.RawPath == chartRepoURLPath+"/index.yaml" { + w.Write(fileBytes) + } + }) + srv, err := startLocalServerForTests(handler) + if err != nil { + t.Fatal(err) + } + defer srv.Close() + + r, err := NewChartRepository(&Entry{ + Name: testRepo, + URL: srv.URL + chartRepoURLPath, + }, getter.All(&cli.EnvSettings{})) + if err != nil { + t.Errorf("Problem creating chart repository from %s: %v", testRepo, err) + } - i, err := loadIndex(b) - if err != nil { - t.Fatalf("Index %q failed to parse: %s", testfile, err) - } - verifyLocalIndex(t, i) + idx, err := r.DownloadIndexFile() + if err != nil { + t.Fatalf("Failed to download index file to %s: %#v", idx, err) + } + + if _, err := os.Stat(idx); err != nil { + t.Fatalf("error finding created index file: %#v", err) + } + + b, err := ioutil.ReadFile(idx) + if err != nil { + t.Fatalf("error reading index file: %#v", err) + } + + i, err := loadIndex(b) + if err != nil { + t.Fatalf("Index %q failed to parse: %s", testfile, err) + } + verifyLocalIndex(t, i) + }) } func verifyLocalIndex(t *testing.T, i *IndexFile) {