package server import ( "bytes" "context" "github.com/gorilla/mux" "html/template" "net" "net/http" "time" "git.giftfish.de/ston1th/gowiki/pkg/db" "git.giftfish.de/ston1th/gowiki/pkg/log" "git.giftfish.de/ston1th/jwt" ) const ( cookieName = "gosession" ) type HTTPServer struct { Version string indexPath 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, version, indexPath string, secCookie bool) (srv *HTTPServer) { srv = &HTTPServer{ Version: version, listener: l, } srv.loadTemplates() srv.srv = &http.Server{ Handler: srv.buildRoutes(), } return } func (s *HTTPServer) Start() (err error) { //TODO make secret configurable buf := bytes.NewBufferString("be688838ca8686e5c90689bf2ab585cef1137c999b48c70b92f67a5c34dc15697b5d11c982ed6d71be1e1e7f7b4e0733884aa97c3f7a339a8ed03577cf74be09") s.JWT, err = jwt.New(jwt.DefaultExpiry, jwt.NewMemBlacklist(), buf) if err != nil { return } s.DB, err = db.New(s.indexPath) 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)) } }