httprouter.ParamsWithContext(r.Context()) is returning []

Author: samirprakashCreated May 24, 2022Updated Dec 3, 2024

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?

Source: julienschmidt/httprouter