diff --git a/auth/auth.go b/auth/auth.go index 6c314f3..b17cd0e 100644 --- a/auth/auth.go +++ b/auth/auth.go @@ -17,8 +17,8 @@ type Authenticator struct { sessions map[string]token } -func New() Authenticator { - return Authenticator{sessions: make(map[string]token)} +func New() *Authenticator { + return &Authenticator{sessions: make(map[string]token)} } func (a *Authenticator) login(w http.ResponseWriter, r *http.Request) { @@ -55,8 +55,8 @@ func (a *Authenticator) login(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "/", http.StatusFound) } -func (a *Authenticator) Authenticate(in http.HandlerFunc) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { +func (a *Authenticator) Middleware(in http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.String() == "/login" { a.login(w, r) return @@ -73,6 +73,6 @@ func (a *Authenticator) Authenticate(in http.HandlerFunc) http.HandlerFunc { } value.lastAccess = time.Now() a.sessions[c.Value] = value - in(w, r) - } + in.ServeHTTP(w, r) + }) } diff --git a/logging/logger.go b/logging/logger.go new file mode 100644 index 0000000..a409d14 --- /dev/null +++ b/logging/logger.go @@ -0,0 +1,16 @@ +package logging + +import ( + "fmt" + "net/http" + "time" +) + +func Middleware(in http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + start := time.Now() + fmt.Println(r.Method, r.URL.String()) + in.ServeHTTP(w, r) + fmt.Println(r.Method, "finished in", time.Since(start)) + }) +} diff --git a/main.go b/main.go index 9db5c6c..cc45899 100644 --- a/main.go +++ b/main.go @@ -5,7 +5,7 @@ import ( "net/http" "github.com/Bronku/iroon/auth" - "github.com/Bronku/iroon/middleware" + "github.com/Bronku/iroon/logging" "github.com/Bronku/iroon/router" ) @@ -16,12 +16,8 @@ func main() { } defer h.Close() - var a auth.Authenticator - a = auth.New() - - // #todo: make handler functions private, and create a servemux in router - http.HandleFunc("GET /order/", middleware.Logger(a.Authenticate(h.Form))) - http.HandleFunc("GET /", middleware.Logger(a.Authenticate(h.Index))) - http.HandleFunc("POST /", middleware.Logger(a.Authenticate(h.AddOrder))) - http.ListenAndServe(":8080", nil) + var handler http.Handler = h + handler = logging.Middleware(handler) + handler = auth.New().Middleware(handler) + log.Fatal(http.ListenAndServe(":8080", handler)) } diff --git a/middleware/logger.go b/middleware/logger.go deleted file mode 100644 index 3866328..0000000 --- a/middleware/logger.go +++ /dev/null @@ -1,17 +0,0 @@ -package middleware - -import ( - "fmt" - "net/http" - "time" -) - -func Logger(in http.HandlerFunc) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - start := time.Now() - //log := fmt.Sprint(r.Method, " ", r.URL.String()) - fmt.Println(r.Method, r.URL.String()) - in(w, r) - fmt.Println(r.Method, "finished in", time.Since(start)) - } -} diff --git a/router/handler.go b/router/handler.go index 8fa0a96..1ab17e4 100644 --- a/router/handler.go +++ b/router/handler.go @@ -11,18 +11,19 @@ import ( "github.com/Bronku/iroon/store" ) -type Router struct { +type Server struct { tmpl *template.Template s *store.Store + http.Handler } -func (h *Router) Close() { +func (h *Server) Close() { if h.s != nil { h.s.Close() } } -func (h *Router) openStore() error { +func (h *Server) openStore() error { var err error h.s, err = store.OpenStore("./foo.db") if err != nil { @@ -32,27 +33,42 @@ func (h *Router) openStore() error { } // #todo embed templates, and load them in init function -func (h *Router) loadTemplates() error { +func (h *Server) loadTemplates() error { var err error h.tmpl, err = template.ParseFiles("index.html", "order.html") return err } -func New() (*Router, error) { - var router Router - var err error - err = router.loadTemplates() - if err != nil { - return nil, err - } - err = router.openStore() - if err != nil { - return nil, err - } - return &router, nil +func (h *Server) loadHandler() { + mux := http.NewServeMux() + + mux.HandleFunc("GET /order/", h.Form) + mux.HandleFunc("GET /", h.Index) + mux.HandleFunc("POST /", h.AddOrder) + + h.Handler = mux } -func (h *Router) Form(w http.ResponseWriter, r *http.Request) { +func New() (*Server, error) { + var server Server + var err error + + err = server.loadTemplates() + if err != nil { + return nil, err + } + + err = server.openStore() + if err != nil { + return nil, err + } + + server.loadHandler() + + return &server, nil +} + +func (h *Server) Form(w http.ResponseWriter, r *http.Request) { url := strings.Split(r.URL.String(), "/") o := store.Order{ ID: -1, @@ -85,7 +101,7 @@ func (h *Router) Form(w http.ResponseWriter, r *http.Request) { } } -func (h *Router) AddOrder(w http.ResponseWriter, r *http.Request) { +func (h *Server) AddOrder(w http.ResponseWriter, r *http.Request) { err := r.ParseForm() if err != nil { fmt.Println("can't parse the form") @@ -156,7 +172,7 @@ func (h *Router) AddOrder(w http.ResponseWriter, r *http.Request) { w.Write([]byte("accepted back")) } -func (h *Router) Index(w http.ResponseWriter, r *http.Request) { +func (h *Server) Index(w http.ResponseWriter, r *http.Request) { w.Header().Set("content-type", "text/html") orders, err := h.s.GetOrders() if err != nil {