about summary refs log tree commit diff
path: root/handlers/cgit/cgit.go
diff options
context:
space:
mode:
Diffstat (limited to 'handlers/cgit/cgit.go')
-rw-r--r--handlers/cgit/cgit.go61
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
+}