-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Open
Description
Using alice with httprouter to chain middleware and wrapping params before passing it to the middleware function.
func (s *Server) wrap(next http.Handler) httprouter.Handle {
return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
ctx := context.WithValue(r.Context(), params, ps)
next.ServeHTTP(w, r.WithContext(ctx))
}
}
/ routes configure server API endpoints
func (s *Server) routes() http.Handler {
r := httprouter.New()
secure := alice.New(s.authenticateWithIDMS)
// unsecured end points
r.HandlerFunc(http.MethodGet, "/api/v2/projects/:id", s.getProject)
// secured end points
r.GET("/api/v2/projects/:id", s.wrap(secure.ThenFunc(s.getProject)))
return s.enableCORS(r)
}
func (s *Server) enableCORS(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Methods", "GET,POST,DELETE,PUT,PATCH")
w.Header().Set("Access-Control-Allow-Headers", "Content-Type,Authorization")
next.ServeHTTP(w, r)
})
}
// getProject returns all the projects as an API response
func (s *Server) getProject(w http.ResponseWriter, r *http.Request) {
params := httprouter.ParamsFromContext(r.Context())
log.Println(params)
id, err := strconv.Atoi(params.ByName("id"))
if err != nil {
s.logger.Println(errors.New("invalid movie id : "), err)
utils.ErrorJSON(w, err)
return
}
utils.WriteJSON(w, http.StatusOK, id, "data")
}
Inside getProjects(), r.Context().Value("params") returns [{id 1}] but httprouter.ParamsFromContext(r.Context()) returns [] when I use the s.wrap() call, but if I do not use it then the params are passed properly.
Any pointers?
Metadata
Metadata
Assignees
Labels
No labels