diff --git a/pkg/gitea/gitea.go b/pkg/gitea/gitea.go index 2bb87e7..2409e13 100644 --- a/pkg/gitea/gitea.go +++ b/pkg/gitea/gitea.go @@ -67,6 +67,10 @@ func (d *openDir) ReadDir(count int) ([]fs.DirEntry, error) { return entries, nil } +func (d *openDir) ReadDirFile(count int) ([]fs.DirEntry, error) { + return d.ReadDir(count) +} + func NewClient(serverURL, token, giteapages, giteapagesAllowAll string) (*Client, error) { if giteapages == "" { giteapages = "gitea-pages" @@ -90,6 +94,39 @@ func NewClient(serverURL, token, giteapages, giteapagesAllowAll string) (*Client }, nil } +const defaultNotFoundPage = `<!DOCTYPE html> +<html> +<head> + <title>404 - Not Found</title> + <style> + body { font-family: sans-serif; text-align: center; padding: 50px; } + h1 { font-size: 48px; margin-bottom: 20px; } + p { color: #666; } + </style> +</head> +<body> + <h1>404</h1> + <p>The page you're looking for could not be found.</p> +</body> +</html>` + +func (c *Client) serveNotFound(owner, repo string) fs.File { + if repo != "" { + custom404, err := c.getRawFileOrLFS(owner, repo, "404.html", "main") + if err == nil { + return &openFile{ + content: custom404, + name: "404.html", + } + } + } + + return &openFile{ + content: []byte(defaultNotFoundPage), + name: "404.html", + } +} + func (c *Client) Open(name, ref string) (fs.File, error) { owner, repo, filepath := splitName(name) @@ -100,21 +137,29 @@ func (c *Client) Open(name, ref string) (fs.File, error) { isFluffyPagesRepo := strings.HasSuffix(repo, ".fluffy.pw") + _, resp, err := c.gc.GetRepo(owner, repo) + if err != nil { + if resp != nil && resp.StatusCode == http.StatusNotFound { + return c.serveNotFound(owner, repo), nil + } + return nil, fs.ErrNotExist + } + limited, allowall := c.allowsPages(owner, repo) if !limited && !allowall && !isFluffyPagesRepo { - return nil, fs.ErrNotExist + return c.serveNotFound(owner, repo), nil } hasConfig := true if err := c.readConfig(owner, repo); err != nil { if !isFluffyPagesRepo && !allowall { - return nil, err + return c.serveNotFound(owner, repo), nil } hasConfig = false } if !hasConfig && !validRefs(ref, allowall || isFluffyPagesRepo) { - return nil, fs.ErrNotExist + return c.serveNotFound(owner, repo), nil } entries, err := c.getDirectoryContents(owner, repo, filepath, ref) @@ -127,6 +172,9 @@ func (c *Client) Open(name, ref string) (fs.File, error) { res, err := c.getRawFileOrLFS(owner, repo, filepath, ref) if err != nil { + if err == fs.ErrNotExist { + return c.serveNotFound(owner, repo), nil + } return nil, err }