// ServeHTTP dispatches the handler registered in the matched route. // // When there is a match, the route variables can be retrieved calling // mux.Vars(request). func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) { // Clean path to canonical form and redirect. if p := cleanPath(req.URL.Path); p != req.URL.Path { // Added 3 lines (Philip Schlump) - It was droping the query string and #whatever from query. // This matches with fix in go 1.2 r.c. 4 for same problem. Go Issue: // http://code.google.com/p/go/issues/detail?id=5252 url := *req.URL url.Path = p p = url.String() w.Header().Set("Location", p) w.WriteHeader(http.StatusMovedPermanently) return } var match RouteMatch var handler http.Handler if r.Match(req, &match) { handler = match.Handler setVars(req, match.Vars) setCurrentRoute(req, match.Route) } if handler == nil { handler = r.NotFoundHandler if handler == nil { handler = http.NotFoundHandler() } } if !r.KeepContext { defer context.Clear(req) } handler.ServeHTTP(w, req) }
// Auth Handler for net/http func (a *AuthRoute) AuthHandler(h http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { userId, token, err := a.authenticate(w, r) if err != nil { http.Error(w, err.Error(), http.StatusUnauthorized) return } context.Set(r, TokenKey, token) context.Set(r, UserKey, userId) h.ServeHTTP(w, r) context.Clear(r) }) }
// Auth middleware for negroni func (a *AuthRoute) AuthMiddleware(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) { userId, token, err := a.authenticate(w, r) if err != nil { http.Error(w, err.Error(), http.StatusUnauthorized) return } context.Set(r, TokenKey, token) context.Set(r, UserKey, userId) next(w, r) context.Clear(r) }