package main import ( "log/slog" "net/http" "code.patial.tech/go/mux" "code.patial.tech/go/mux/middleware" ) func main() { // create a new router m := mux.New() m.Use(middleware.CORS(middleware.CORSOption{ AllowedOrigins: []string{"*"}, AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, AllowedHeaders: []string{"Accept", "Authorization", "Content-Type", "X-CSRF-AccessToken", "X-Real-IP"}, ExposedHeaders: []string{"Link"}, AllowCredentials: true, MaxAge: 300, })) m.Use(middleware.Helmet(middleware.HelmetOption{ StrictTransportSecurity: &middleware.TransportSecurity{ MaxAge: 31536000, IncludeSubDomains: true, Preload: true, }, XssProtection: true, XFrameOption: middleware.XFrameDeny, })) // you can use any middleware that is: "func(http.Handler) http.Handler" // so you can use any of it // - https://github.com/gorilla/handlers // - https://github.com/go-chi/chi/tree/master/middleware // add some root level middlewares, these will apply to all routes after it m.Use(middleware1, middleware2) // let's add a route m.GET("/hello", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("i am route /hello")) }) // r.Post(pattern string, h http.HandlerFunc) // r.Put(pattern string, h http.HandlerFunc) // ... // you can inline middleware(s) to a route m. With(mwInline). GET("/hello-2", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("i am route /hello-2 with my own middleware")) }) // define a resource m.Resource("/photos", func(res *mux.Resource) { res.Index(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("all photos")) }) res.CreateView(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("new photo view")) }) res.Create(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("new photo")) }) res.View(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("view photo detail")) }) res.Update(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("update photos")) }) res.UpdatePartial(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("update few of photo fields")) }) res.Delete(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("removed a phot")) }) }) // create a group of few routes with their own middlewares m.Group(func(grp *mux.Mux) { grp.Use(mwGroup) grp.GET("/group", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("i am route /group")) }) }) // catches all m.GET("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("hello there")) }) m.GET("/routes", func(w http.ResponseWriter, r *http.Request) { m.PrintRoutes(w) }) // Serve allows graceful shutdown, you can use it m.Serve(func(srv *http.Server) error { srv.Addr = ":3001" // srv.ReadTimeout = time.Minute // srv.WriteTimeout = time.Minute slog.Info("listening on http://localhost" + srv.Addr) return srv.ListenAndServe() }) } func middleware1(h http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { slog.Info("i am middleware 1") h.ServeHTTP(w, r) }) } func middleware2(h http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { slog.Info("i am middleware 2") h.ServeHTTP(w, r) }) } func mwInline(h http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { slog.Info("i am inline middleware") h.ServeHTTP(w, r) }) } func mwGroup(h http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { slog.Info("i am group middleware") h.ServeHTTP(w, r) }) }