grim/hgkeeper

make hgweb its own type

2022-03-07, Gary Kramlich
578a90d306a3
Parents 334e63a51155
Children 00b9a40ac18c
make hgweb its own type
--- a/hgweb/hgweb.go Mon Mar 07 01:38:28 2022 -0600
+++ b/hgweb/hgweb.go Mon Mar 07 01:52:42 2022 -0600
@@ -3,16 +3,28 @@
import (
"embed"
"io/ioutil"
+ "net/http"
+ "net/http/cgi"
+ "os"
"path/filepath"
"text/template"
"keep.imfreedom.org/grim/hgkeeper/access"
)
+type HGWeb struct {
+ configPath string
+ cgiPath string
+}
+
//go:embed files/*
var files embed.FS
-func (s *Server) createConfig() error {
+func New() *HGWeb {
+ return &HGWeb{}
+}
+
+func (hgw *HGWeb) createConfig() error {
configPath, err := ioutil.TempFile("", "hgkeeper-hgweb-*.config")
if err != nil {
return err
@@ -35,12 +47,12 @@
return err
}
- s.configPath = configPath.Name()
+ hgw.configPath = configPath.Name()
return nil
}
-func (s *Server) createCGI() error {
+func (hgw *HGWeb) createCGI() error {
cgiPath, err := ioutil.TempFile("", "hgkeeper-hgweb-*.cgi")
if err != nil {
return err
@@ -62,14 +74,34 @@
// create our data
data := map[string]string{
- "HGWEB_CONFIG": s.configPath,
+ "HGWEB_CONFIG": hgw.configPath,
}
if err := t.Execute(cgiPath, data); err != nil {
return err
}
- s.cgiPath = cgiPath.Name()
+ hgw.cgiPath = cgiPath.Name()
return nil
}
+
+func (hgw *HGWeb) Handler() (http.Handler, error) {
+ if err := hgw.createConfig(); err != nil {
+ return nil, err
+ }
+
+ if err := hgw.createCGI(); err != nil {
+ return nil, err
+ }
+
+ return &cgi.Handler{Path: hgw.cgiPath}, nil
+}
+
+func (hgw *HGWeb) Close() error {
+ if err := os.Remove(hgw.cgiPath); err != nil {
+ return err
+ }
+
+ return nil
+}
--- a/hgweb/server.go Mon Mar 07 01:38:28 2022 -0600
+++ b/hgweb/server.go Mon Mar 07 01:52:42 2022 -0600
@@ -2,8 +2,6 @@
import (
"net/http"
- "net/http/cgi"
- "os"
"path/filepath"
log "github.com/sirupsen/logrus"
@@ -15,8 +13,7 @@
listenAddr string
server *http.Server
- configPath string
- cgiPath string
+ hgw *HGWeb
externalHostname string
externalPort string
@@ -28,20 +25,13 @@
server: &http.Server{
Addr: listenAddr,
},
+ hgw: New(),
externalHostname: externalHostname,
externalPort: externalPort,
}, nil
}
func (s *Server) Listen() error {
- if err := s.createConfig(); err != nil {
- return err
- }
-
- if err := s.createCGI(); err != nil {
- return err
- }
-
templatesDir, err := hg.TemplatesDir()
if err != nil {
return err
@@ -60,7 +50,12 @@
}
mux.Handle("/static/", http.StripPrefix("/static", fileServer))
- mux.Handle("/", &cgi.Handler{Path: s.cgiPath})
+
+ hgwHandler, err := s.hgw.Handler()
+ if err != nil {
+ return err
+ }
+ mux.Handle("/", hgwHandler)
s.server.Handler = Logger(mux)
@@ -70,8 +65,8 @@
}
func (s *Server) Close() {
- if err := os.Remove(s.cgiPath); err != nil {
- log.Warnf("failed to remove temporary cgi file %q: %v", s.cgiPath, err)
+ if err := s.hgw.Close(); err != nil {
+ log.Warnf("failed to close hgweb: %v", err)
}
if err := s.server.Close(); err != nil {