From 519ccac2949695ad54a8f8b159b353b998462e03 Mon Sep 17 00:00:00 2001 From: Karuppiah Natarajan Date: Wed, 9 Oct 2019 16:55:56 +0530 Subject: [PATCH] fix repo url being decoded while downloading repo index (#6060) Signed-off-by: Karuppiah Natarajan --- pkg/repo/chartrepo.go | 8 +-- pkg/repo/index_test.go | 130 +++++++++++++++++++++++++++++------------ 2 files changed, 98 insertions(+), 40 deletions(-) diff --git a/pkg/repo/chartrepo.go b/pkg/repo/chartrepo.go index c512c5b7e..e19aa52c5 100644 --- a/pkg/repo/chartrepo.go +++ b/pkg/repo/chartrepo.go @@ -21,6 +21,7 @@ import ( "io/ioutil" "net/url" "os" + "path" "path/filepath" "strings" @@ -111,14 +112,13 @@ func (r *ChartRepository) Load() error { // cachePath is prepended to any index that does not have an absolute path. This // is for pre-2.2.0 repo files. func (r *ChartRepository) DownloadIndexFile(cachePath 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" - - indexURL = parsedURL.String() + parsedURL.RawPath = path.Join(parsedURL.RawPath, "index.yaml") + parsedURL.Path = path.Join(parsedURL.Path, "index.yaml") + indexURL := parsedURL.String() r.setCredentials() resp, err := r.Client.Get(indexURL) diff --git a/pkg/repo/index_test.go b/pkg/repo/index_test.go index 7e9998a4d..de53efacf 100644 --- a/pkg/repo/index_test.go +++ b/pkg/repo/index_test.go @@ -18,6 +18,7 @@ package repo import ( "io/ioutil" + "net/http" "os" "path/filepath" "strings" @@ -143,48 +144,105 @@ 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() - dirName, err := ioutil.TempDir("", "tmp") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dirName) - - indexFilePath := filepath.Join(dirName, testRepo+"-index.yaml") - r, err := NewChartRepository(&Entry{ - Name: testRepo, - URL: srv.URL, - Cache: indexFilePath, - }, getter.All(environment.EnvSettings{})) - if err != nil { - t.Errorf("Problem creating chart repository from %s: %v", testRepo, err) - } + dirName, err := ioutil.TempDir("", "tmp") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(dirName) + + indexFilePath := filepath.Join(dirName, testRepo+"-index.yaml") + r, err := NewChartRepository(&Entry{ + Name: testRepo, + URL: srv.URL, + Cache: indexFilePath, + }, getter.All(environment.EnvSettings{})) + if err != nil { + t.Errorf("Problem creating chart repository from %s: %v", testRepo, err) + } - if err := r.DownloadIndexFile(""); err != nil { - t.Errorf("%#v", err) - } + if err := r.DownloadIndexFile(""); err != nil { + t.Errorf("%#v", err) + } - if _, err := os.Stat(indexFilePath); err != nil { - t.Errorf("error finding created index file: %#v", err) - } + if _, err := os.Stat(indexFilePath); err != nil { + t.Errorf("error finding created index file: %#v", err) + } - b, err := ioutil.ReadFile(indexFilePath) - if err != nil { - t.Errorf("error reading index file: %#v", err) - } + b, err := ioutil.ReadFile(indexFilePath) + if err != nil { + t.Errorf("error reading index file: %#v", err) + } - i, err := loadIndex(b) - if err != nil { - t.Errorf("Index %q failed to parse: %s", testfile, err) - return - } + i, err := loadIndex(b) + if err != nil { + t.Errorf("Index %q failed to parse: %s", testfile, err) + return + } - verifyLocalIndex(t, i) + 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() + + dirName, err := ioutil.TempDir("", "tmp") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(dirName) + + indexFilePath := filepath.Join(dirName, testRepo+"-index.yaml") + r, err := NewChartRepository(&Entry{ + Name: testRepo, + URL: srv.URL + chartRepoURLPath, + Cache: indexFilePath, + }, getter.All(environment.EnvSettings{})) + if err != nil { + t.Errorf("Problem creating chart repository from %s: %v", "testrepo", err) + } + + if err := r.DownloadIndexFile(""); err != nil { + t.Errorf("%#v", err) + } + + if _, err := os.Stat(indexFilePath); err != nil { + t.Errorf("error finding created index file: %#v", err) + } + + b, err := ioutil.ReadFile(indexFilePath) + if err != nil { + t.Errorf("error reading index file: %#v", err) + } + + i, err := loadIndex(b) + if err != nil { + t.Errorf("Index %q failed to parse: %s", testfile, err) + return + } + + verifyLocalIndex(t, i) + }) } func verifyLocalIndex(t *testing.T, i *IndexFile) {