diff options
author | Marc Pervaz Boocha <mboocha@sudomsg.com> | 2025-08-02 22:23:13 +0530 |
---|---|---|
committer | Marc Pervaz Boocha <mboocha@sudomsg.com> | 2025-08-02 23:02:30 +0530 |
commit | 178e0bfc2d8709ae4d3abd7519b260df09b2d3b5 (patch) | |
tree | 10cbdd013c62586190074d9f088e2269f88c4cab /repo | |
parent | Fixed Broken .gitignore (diff) | |
download | gopkgserver-178e0bfc2d8709ae4d3abd7519b260df09b2d3b5.tar gopkgserver-178e0bfc2d8709ae4d3abd7519b260df09b2d3b5.tar.gz gopkgserver-178e0bfc2d8709ae4d3abd7519b260df09b2d3b5.tar.bz2 gopkgserver-178e0bfc2d8709ae4d3abd7519b260df09b2d3b5.tar.lz gopkgserver-178e0bfc2d8709ae4d3abd7519b260df09b2d3b5.tar.xz gopkgserver-178e0bfc2d8709ae4d3abd7519b260df09b2d3b5.tar.zst gopkgserver-178e0bfc2d8709ae4d3abd7519b260df09b2d3b5.zip |
Diffstat (limited to '')
-rw-r--r-- | repo/repo.go | 7 | ||||
-rw-r--r-- | repo/repo_test.go | 137 |
2 files changed, 141 insertions, 3 deletions
diff --git a/repo/repo.go b/repo/repo.go index 2c052d6..b3eeef0 100644 --- a/repo/repo.go +++ b/repo/repo.go @@ -6,7 +6,7 @@ import ( "fmt" "html/template" "net/http" - "strings" + "path" ) //go:embed meta.html @@ -45,8 +45,9 @@ func New(repo map[string]Repo) (*RepoHandler, error) { } func (h *RepoHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { - key := fmt.Sprintf("%s%s", r.Host, r.URL.Path) - key = strings.TrimSuffix(key, "/") + host := r.Host + path := path.Clean(r.URL.Path) + key := host + path page, ok := h.Pages[key] if !ok { diff --git a/repo/repo_test.go b/repo/repo_test.go new file mode 100644 index 0000000..57f249c --- /dev/null +++ b/repo/repo_test.go @@ -0,0 +1,137 @@ +package repo_test + +import ( + "bytes" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "go.sudomsg.com/gopkgserver/repo" +) + +func TestMetaExec(t *testing.T) { + t.Parallel() + + meta, err := repo.NewMeta() + if err != nil { + t.Fatalf("failed to create Meta: %v", err) + } + + pkg := "example.com/foo" + r := repo.Repo{ + VCS: "git", + Repository: "https://github.com/user/foo", + Home: "https://github.com/user/foo", + Directory: "https://github.com/user/foo/tree/master{/dir}", + File: "https://github.com/user/foo/blob/master{/dir}/{file}#L{line}", + } + + html, err := meta.Exec(pkg, r) + if err != nil { + t.Fatalf("Exec failed: %v", err) + } + + htmlStr := string(html) + if !strings.Contains(htmlStr, `<meta name="go-import"`) { + t.Fatalf("missing go-import meta tag: %q", htmlStr) + } + if !strings.Contains(htmlStr, `<meta name="go-source"`) { + t.Fatalf("missing go-source meta tag: %q", htmlStr) + } + if !strings.Contains(htmlStr, pkg) { + t.Fatalf("missing package name in output: %q", htmlStr) + } +} + +func TestServeHTTP(t *testing.T) { + t.Parallel() + + repos := map[string]repo.Repo{ + "example.com/foo": { + VCS: "git", + Repository: "https://github.com/user/foo", + Home: "https://github.com/user/foo", + Directory: "https://github.com/user/foo/tree/master{/dir}", + File: "https://github.com/user/foo/blob/master{/dir}/{file}#L{line}", + }, + } + + t.Run("returns meta tag for go-get=1", func(t *testing.T) { + t.Parallel() + + handler, err := repo.New(repos) + if err != nil { + t.Fatalf("failed to create handler: %v", err) + } + + req := httptest.NewRequest(http.MethodGet, "http://example.com/foo?go-get=1", nil) + w := httptest.NewRecorder() + + handler.ServeHTTP(w, req) + + resp := w.Result() + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + t.Fatalf("expected %v, got %v", http.StatusOK, resp.StatusCode) + } + + var buf bytes.Buffer + buf.ReadFrom(resp.Body) + body := buf.String() + + if !strings.Contains(body, `<meta name="go-import"`) { + t.Fatalf("expected go-import tag in body, got: %v", body) + } + }) + + t.Run("redirects to pkg.go.dev otherwise", func(t *testing.T) { + t.Parallel() + + handler, err := repo.New(repos) + if err != nil { + t.Fatalf("failed to create handler: %v", err) + } + + req := httptest.NewRequest(http.MethodGet, "http://example.com/foo", nil) + w := httptest.NewRecorder() + + handler.ServeHTTP(w, req) + + resp := w.Result() + defer resp.Body.Close() + + if resp.StatusCode != http.StatusFound { + t.Fatalf("expected %v, got %v", http.StatusFound, resp.StatusCode) + } + loc, err := resp.Location() + if err != nil { + t.Fatalf("Invalid redirect location: %v", err) + } + + if !strings.HasPrefix(loc.String(), "https://pkg.go.dev/example.com/foo") { + t.Fatalf("unexpected redirect location: %v", loc) + } + }) + + t.Run("returns 404 for unknown path", func(t *testing.T) { + t.Parallel() + + handler, err := repo.New(repos) + if err != nil { + t.Fatalf("failed to create handler: %v", err) + } + + w := httptest.NewRecorder() + req := httptest.NewRequest(http.MethodGet, "http://example.com/bar", nil) + handler.ServeHTTP(w, req) + + resp := w.Result() + defer resp.Body.Close() + + if resp.StatusCode != http.StatusNotFound { + t.Fatalf("expected %v, got %v", http.StatusNotFound, resp.StatusCode) + } + }) +} |