diff options
Diffstat (limited to 'handlers/cgit/cgit.go')
-rw-r--r-- | handlers/cgit/cgit.go | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/handlers/cgit/cgit.go b/handlers/cgit/cgit.go new file mode 100644 index 0000000..d971012 --- /dev/null +++ b/handlers/cgit/cgit.go @@ -0,0 +1,61 @@ +// Copyright 2022 Terin Stock. +// SPDX-License-Identifier: MPL-2.0 + +package cgit + +import ( + "fmt" + "log" + "net/http" + "net/http/cgi" + "path/filepath" + + "github.com/rs/zerolog" + "go.terinstock.com/cgit-httpd/server" +) + +type Options struct { + CGI string + ReposRoot string + AssetsDir string + ConfigFile string + Logger zerolog.Logger +} + +type Builder struct { + handler *cgi.Handler + register Register + assetsDir string +} + +type Register interface { + Register(path string, handler http.Handler) +} + +func New(options Options) *Builder { + return &Builder{ + handler: &cgi.Handler{ + Path: options.CGI, + Dir: options.ReposRoot, + Env: []string{ + fmt.Sprintf("CGIT_CONFIG=%s", options.ConfigFile), + }, + Logger: log.New(options.Logger, "", 0), + Stderr: options.Logger.Level(zerolog.ErrorLevel), + }, + } +} + +func (b *Builder) WithRegister(r Register) *Builder { + b.register = r + return b +} + +func (b *Builder) Build() (http.Handler, error) { + for _, a := range []string{"cgit.css", "cgit.png", "cgit.ico", "robots.txt"} { + b.register.Register("/"+a, server.FileHandler(filepath.Join(b.assetsDir, a))) + } + b.register.Register("/{_:.*}", b.handler) + + return b.handler, nil +} |