type Middleware interface {
Apply(f HandlerFunc) HandlerFunc
}
type MiddlewareFunc func(HandlerFunc) HandlerFunc
Middleware as a struct:
type MyMiddleware struct {
SomeData string
}
func(m *MyMiddleware) Apply(h HandlerFunc) HandlerFunc {
return func(w http.ResponseWriter, r *http.Request, vars map[string]string) error {
// Do something before handler
h(w, r, vars)
// Do something after handler
}
}
Or as a function
func MyFunctionMiddleware(h HandlerFunc) HandlerFunc {
return func(w http.ResponseWriter, r *http.Request, vars map[string]string) error {
// Do something before handler
h(w, r, vars)
// Do something after handler
}
}
Add them to your router with:
router.Use(MyMiddleware)
router.Use(MiddlewareFunc(MyMiddleware))
Middlewares have to be setup before setting the handlers.
The handler returns an error which can be read/managed by the middlwares. So you can add your Airbrake or Rollbar notification as a simple middleware.
mux.Vars(req)
→ vars map[string]string
argument of Handler
logger := Log.New(os.Stdout, "[http]", 0)
middleware := NewLoggingMiddleware(logger)
router.Use(middleware)
router.Use(MiddlewareFunc(NewCorsMiddleware))
Thie middleware send notification to Rollbar using, you need to configure it previously.
https://github.com/svtp/rollbar
router.Use(MiddlewareFunc(ErrorHandler))