package main import ( "embed" "flag" "log" "net/http" "time" bolt "go.etcd.io/bbolt" "git.c3pb.de/gbe/invinoveritas/auth" ) //go:embed templates/*.tpl var templateFS embed.FS //go:embed static/* var staticFS embed.FS func httpError(w http.ResponseWriter, msg string, err error, status int) { if err != nil { msg += ": " + err.Error() } log.Println(msg) http.Error(w, msg, status) } type Handler struct { db *bolt.DB ap authProvider } func logRequest(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() defer func() { d := time.Since(start) log.Println("handled", r.Method, r.URL, "from", r.RemoteAddr, "by", auth.Get(r), "in", d) }() next.ServeHTTP(w, r) }) } func main() { dbPath := flag.String("db", "vino.db", "Path to database file") listenAddr := flag.String("listen", "127.0.0.1:7878", "Listening address") flag.Parse() db, err := bolt.Open(*dbPath, 0644, nil) if err != nil { log.Fatalln("can't open DB:", err) } defer db.Close() err = initDB(db) if err != nil { log.Fatalln("can't initialize DB:", err) } http.HandleFunc("/favicon.ico", http.NotFound) http.Handle("/static/", logRequest(http.FileServer(http.FS(staticFS)))) ap := authProvider{ db: db, } handler := Handler{ db: db, ap: ap, } http.Handle("/details/img", auth.Require(logRequest(handler.img()), ap)) http.Handle("/details/", auth.Require(logRequest(handler.details()), ap)) http.Handle("/user/", auth.Require(logRequest(handler.user()), ap)) http.Handle("/", auth.Require(logRequest(handler.index()), ap)) log.Printf("here we go, listening on http://%s", *listenAddr) err = http.ListenAndServe(*listenAddr, nil) if err != nil { log.Fatalln("http handler failed:", err) } }