package defaults import ( "io" "net/http" ) // Router implementation // Does not use a dynamic map to hope to be slightly more performant type Router struct { gets *http.ServeMux posts *http.ServeMux deletes *http.ServeMux } // NewRouter creates a new router func NewRouter() *Router { r := &Router{ gets: http.NewServeMux(), posts: http.NewServeMux(), deletes: http.NewServeMux(), } // Nothing gets handled at the root of the authboss router r.gets.Handle("/", http.NotFoundHandler()) r.posts.Handle("/", http.NotFoundHandler()) r.deletes.Handle("/", http.NotFoundHandler()) return r } // Get method route func (r *Router) Get(path string, handler http.Handler) { r.gets.Handle(path, handler) } // Post method route func (r *Router) Post(path string, handler http.Handler) { r.posts.Handle(path, handler) } // Delete method route func (r *Router) Delete(path string, handler http.Handler) { r.deletes.Handle(path, handler) } // ServeHTTP for http.Handler // Only does get/posts, all other request types are a bad request func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) { var router http.Handler switch req.Method { case "GET": router = r.gets case "POST": router = r.posts case "DELETE": router = r.deletes default: w.WriteHeader(http.StatusMethodNotAllowed) io.WriteString(w, "method not allowed") return } router.ServeHTTP(w, req) }