From 3e20c84456ec3194de8a35af3cd287a37c006549 Mon Sep 17 00:00:00 2001 From: Jaime Martinez Date: Wed, 9 Sep 2020 16:23:02 +1000 Subject: Rebase from base branch Add vfs.VFS implementation for zip Fix build errors Clean zip vfs Add tests for Root Add zip serving metric Return a zip.Instance() when source == zip Add simple acceptance test for zip serving Use correct contents No need to start testServer in go routine --- internal/serving/disk/zip/serving.go | 17 +++++++++ internal/serving/disk/zip/serving_test.go | 59 +++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 internal/serving/disk/zip/serving.go create mode 100644 internal/serving/disk/zip/serving_test.go (limited to 'internal/serving/disk/zip') diff --git a/internal/serving/disk/zip/serving.go b/internal/serving/disk/zip/serving.go new file mode 100644 index 00000000..42cc8f0c --- /dev/null +++ b/internal/serving/disk/zip/serving.go @@ -0,0 +1,17 @@ +package zip + +import ( + "gitlab.com/gitlab-org/gitlab-pages/internal/serving" + "gitlab.com/gitlab-org/gitlab-pages/internal/serving/disk" + "gitlab.com/gitlab-org/gitlab-pages/internal/vfs" + "gitlab.com/gitlab-org/gitlab-pages/internal/vfs/zip" + "gitlab.com/gitlab-org/gitlab-pages/metrics" +) + +var instance = disk.New(vfs.Instrumented(zip.New(), "zip"), metrics.ZipServingFileSize) + +// Instance returns a serving instance that is capable of reading files +// from a zip archives opened from a URL, most likely stored in object storage +func Instance() serving.Serving { + return instance +} diff --git a/internal/serving/disk/zip/serving_test.go b/internal/serving/disk/zip/serving_test.go new file mode 100644 index 00000000..14fdabdf --- /dev/null +++ b/internal/serving/disk/zip/serving_test.go @@ -0,0 +1,59 @@ +package zip + +import ( + "io/ioutil" + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/require" + + "gitlab.com/gitlab-org/gitlab-pages/internal/serving" + "gitlab.com/gitlab-org/gitlab-pages/internal/testhelpers" +) + +func TestZip_ServeFileHTTP(t *testing.T) { + testServerURL, cleanup := newZipFileServerURL(t, "group/zip.gitlab.io/public.zip") + defer cleanup() + + s := Instance() + w := httptest.NewRecorder() + r := httptest.NewRequest("GET", "http://zip.gitlab.io/zip/index.html", nil) + handler := serving.Handler{ + Writer: w, + Request: r, + LookupPath: &serving.LookupPath{ + Prefix: "", + Path: testServerURL + "/public.zip", + }, + SubPath: "/index.html", + } + + require.True(t, s.ServeFileHTTP(handler)) + + resp := w.Result() + defer resp.Body.Close() + + require.Equal(t, http.StatusOK, resp.StatusCode) + body, err := ioutil.ReadAll(resp.Body) + require.NoError(t, err) + + require.Contains(t, string(body), "zip.gitlab.io/project/index.html\n") +} + +var chdirSet = false + +func newZipFileServerURL(t *testing.T, zipFilePath string) (string, func()) { + t.Helper() + + chdir := testhelpers.ChdirInPath(t, "../../../../shared/pages", &chdirSet) + + testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + http.ServeFile(w, r, zipFilePath) + })) + + return testServer.URL, func() { + chdir() + testServer.Close() + } +} -- cgit v1.2.3