58 lines
1.5 KiB
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())
|
|
})
|
|
}
|