// Copyright (C) 2018 Marius Schellenberger package server import ( "bytes" "context" "git.giftfish.de/ston1th/gowiki/pkg/core" "git.giftfish.de/ston1th/gowiki/pkg/db" "git.giftfish.de/ston1th/gowiki/pkg/log" "git.giftfish.de/ston1th/jwt/v3" "github.com/gorilla/mux" "html/template" "net" "net/http" "time" ) const ( cookieName = "gosession" ) type HTTPServer struct { Version string Secure bool Secret string DataDir string listener net.Listener srv *http.Server DB *db.DB JWT *jwt.JWT templ map[string]*template.Template res map[string][]byte } func NewHTTPServer(l net.Listener, conf core.Config) (srv *HTTPServer) { srv = &HTTPServer{ Version: conf.Version, Secure: conf.SecureCookie, Secret: conf.Secret, DataDir: conf.DataDir, listener: l, } srv.loadTemplates() srv.srv = &http.Server{ Handler: srv.buildRoutes(), } return } func (s *HTTPServer) Start() (err error) { s.DB, err = db.New(s.DataDir) if err != nil { return } if s.Secret != "" { s.JWT, err = jwt.New(jwt.DefaultExpiry, s.DB, bytes.NewBufferString(s.Secret)) } else { s.JWT, err = jwt.New(jwt.DefaultExpiry, s.DB, nil) } if err != nil { return } go func() { log.Println(s.srv.Serve(s.listener)) }() return } func (s *HTTPServer) Stop() error { s.DB.Close() s.JWT.Stop() ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() return s.srv.Shutdown(ctx) } func (s *HTTPServer) buildRoutes() http.Handler { m := mux.NewRouter() m.NotFoundHandler = ¬FoundHandler{s} for _, v := range routes { m.HandleFunc(v.Path, s.contextWrapper(v.Handler)).Methods(v.Methods...) } return m } func (s *HTTPServer) contextWrapper(h ctxHandler) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { h(newContext(w, r, s)) } }