package auth import ( "errors" "log" "net/http" ) type RouterOption struct { AuthAgent *AuthAgent RequireAuth bool //This router require authentication DeniedHandler func(http.ResponseWriter, *http.Request) //Things to do when request is rejected } type RouterDef struct { option RouterOption endpoints map[string]func(http.ResponseWriter, *http.Request) } func NewManagedHTTPRouter(option RouterOption) *RouterDef { return &RouterDef{ option: option, endpoints: map[string]func(http.ResponseWriter, *http.Request){}, } } func (router *RouterDef) HandleFunc(endpoint string, handler func(http.ResponseWriter, *http.Request)) error { //Check if the endpoint already registered if _, exist := router.endpoints[endpoint]; exist { log.Println("WARNING! Duplicated registering of web endpoint: " + endpoint) return errors.New("endpoint register duplicated") } authAgent := router.option.AuthAgent //OK. Register handler http.HandleFunc(endpoint, func(w http.ResponseWriter, r *http.Request) { //Check authentication of the user if router.option.RequireAuth { authAgent.HandleCheckAuth(w, r, func(w http.ResponseWriter, r *http.Request) { handler(w, r) }) } else { handler(w, r) } }) router.endpoints[endpoint] = handler return nil }