hasshelper/web/server.go

58 lines
1.5 KiB
Go

package web
import (
"fmt"
"log/slog"
"net/http"
"time"
"github.com/spf13/viper"
)
type configObj struct {
logger *slog.Logger
port int
imageDir string
}
var config = configObj{}
// Run starts up the webserver part of hasshelper. It writes to exitch if
// the webserver ends unexpectedly. Config values will be read from viper.
func Run(rootLogger *slog.Logger, exitch chan bool) {
rootLogger = rootLogger.With("component", "web")
config.logger = rootLogger
config.port = viper.GetInt("webserver_port")
config.imageDir = viper.GetString("image_dir")
http.Handle("/img/", http.StripPrefix("/img", imageHandler()))
http.HandleFunc("/randimg/", randomImageFunc)
var logger = config.logger
logger.Info("Webserver startup", "port", config.port, "imageDir", config.imageDir)
addr := fmt.Sprintf(":%d", config.port)
if err := http.ListenAndServe(addr, middleware(http.DefaultServeMux)); err != nil {
logger.Error("Webserver fatal error", "err", err)
} else {
logger.Info("Webserver shutting down")
}
exitch <- true
}
func middleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
logger := config.logger.
WithGroup("request").
With("method", r.Method,
"url", r.URL,
"remote", r.RemoteAddr)
logger.Info("Starting web request")
start := time.Now()
next.ServeHTTP(w, r)
elapsed := time.Now().Sub(start)
logger.Info("Web request", "durationMS", elapsed.Milliseconds())
})
}