diff --git a/.gitignore b/.gitignore index d3beee5..0381a2b 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ # Folders _obj _test +.idea # Architecture specific extensions/prefixes *.[568vq] diff --git a/server.go b/server.go index b436feb..602186f 100644 --- a/server.go +++ b/server.go @@ -1,65 +1,57 @@ package snap import ( - "github.com/gorilla/mux" "html/template" "net/http" "os" + "path" "path/filepath" "strings" "time" - "path" + "github.com/gorilla/mux" "git.thirdmartini.com/pub/fancylog" "git.thirdmartini.com/pub/snap/auth" ) - type Server struct { address string path string - theme string + theme string debug bool auth auth.AuthManager router *mux.Router + templates string cachedTmpl *template.Template } - type SnapBaseContent struct { - Theme string + Theme string Content interface{} } -func (s *Server) makeContext( auth *auth.AuthData, w http.ResponseWriter, r *http.Request ) (*Context) { +func (s *Server) makeContext(auth *auth.AuthData, w http.ResponseWriter, r *http.Request) *Context { c := &Context{ - r: r, - w: w, - srv: s, + r: r, + w: w, + srv: s, auth: auth, vars: mux.Vars(r), } return c } - -func (s *Server) plain(f func(c *Context)) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - c := s.makeContext( nil, w,r) - f(c) - } -} - - func (s *Server) authenticated(auth auth.AuthManager, handle func(c *Context)) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - rec, ok := auth.DoAuth( w, r ) + log.Debug("authenticated request: ", r.RequestURI) + + rec, ok := auth.DoAuth(w, r) if !ok { http.Error(w, "Not authorized", 401) } else { - c := s.makeContext( rec, w,r) + c := s.makeContext(rec, w, r) handle(c) } } @@ -67,16 +59,16 @@ func (s *Server) authenticated(auth auth.AuthManager, handle func(c *Context)) h func (s *Server) wrapper(handle func(c *Context)) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - c := s.makeContext( nil, w,r) + log.Debug("request: ", r.RequestURI) + c := s.makeContext(nil, w, r) handle(c) } } - func (s *Server) loadTemplates() *template.Template { tmpl := template.New("") - err := filepath.Walk(path.Join(s.path, "templates"), func(path string, info os.FileInfo, err error) error { + err := filepath.Walk(path.Join(s.path, s.templates), func(path string, info os.FileInfo, err error) error { if strings.Contains(path, ".html") { _, err = tmpl.ParseFiles(path) if err != nil { @@ -104,7 +96,7 @@ func (s *Server) getTemplates() *template.Template { return s.cachedTmpl } -func (s *Server) render(w http.ResponseWriter, tmpl string, content interface{} ) { +func (s *Server) render(w http.ResponseWriter, tmpl string, content interface{}) { s.getTemplates().ExecuteTemplate(w, tmpl, content) } @@ -117,7 +109,6 @@ func (s *Server) renderError(w http.ResponseWriter, code int, msg string) { w.Write([]byte(msg)) } - func (s *Server) HandleFuncAuthenticated(path string, f func(c *Context)) *mux.Route { if s.auth == nil { return nil @@ -134,13 +125,11 @@ func (s *Server) HandleFuncCustomAuth(auth auth.AuthManager, path string, f func return s.router.HandleFunc(path, s.authenticated(auth, f)) } - func (s *Server) HandleFunc(path string, f func(c *Context)) error { s.router.HandleFunc(path, s.wrapper(f)) return nil } - func (s *Server) SetDebug(enable bool) { s.debug = enable } @@ -148,11 +137,14 @@ func (s *Server) SetDebug(enable bool) { func (s *Server) EnableStatus(path string) { } - func (s *Server) SetTheme(theme string) { s.theme = theme } +func (s *Server) SetTemplatePath(path string) { + s.templates = path +} + func (s *Server) ServeTLS(keyPath string, certPath string) error { srv := &http.Server{ @@ -163,7 +155,7 @@ func (s *Server) ServeTLS(keyPath string, certPath string) error { ReadTimeout: 120 * time.Second, } - return srv.ListenAndServeTLS(certPath,keyPath) + return srv.ListenAndServeTLS(certPath, keyPath) } // Serve serve content forever @@ -181,11 +173,12 @@ func (s *Server) Serve() error { func New(address string, path string, auth auth.AuthManager) *Server { s := Server{ - router: mux.NewRouter(), - auth: auth, - address: address, - path: path, - theme: "/static/css/default.css", + router: mux.NewRouter(), + auth: auth, + address: address, + path: path, + templates: "templates", + theme: "/static/css/default.css", } s.router.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.Dir(s.path+"static/"))))