diff --git a/mux.go b/mux.go index db397de..89b0010 100644 --- a/mux.go +++ b/mux.go @@ -35,37 +35,38 @@ func (m *Mux) Use(h ...func(http.Handler) http.Handler) { if m == nil { panic("mux: func Use was called on nil") } + m.middlewares = append(m.middlewares, h...) } // GET method route -func (m *Mux) GET(pattern string, h http.HandlerFunc) { - m.handle(http.MethodGet, pattern, h) +func (m *Mux) GET(pattern string, h http.HandlerFunc, mw ...func(http.Handler) http.Handler) { + m.handle(http.MethodGet, pattern, h, mw...) } // HEAD method route -func (m *Mux) HEAD(pattern string, h http.HandlerFunc) { - m.handle(http.MethodHead, pattern, h) +func (m *Mux) HEAD(pattern string, h http.HandlerFunc, mw ...func(http.Handler) http.Handler) { + m.handle(http.MethodHead, pattern, h, mw...) } // POST method route -func (m *Mux) POST(pattern string, h http.HandlerFunc) { - m.handle(http.MethodPost, pattern, h) +func (m *Mux) POST(pattern string, h http.HandlerFunc, mw ...func(http.Handler) http.Handler) { + m.handle(http.MethodPost, pattern, h, mw...) } // PUT method route -func (m *Mux) PUT(pattern string, h http.HandlerFunc) { - m.handle(http.MethodPut, pattern, h) +func (m *Mux) PUT(pattern string, h http.HandlerFunc, mw ...func(http.Handler) http.Handler) { + m.handle(http.MethodPut, pattern, h, mw...) } // PATCH method route -func (m *Mux) PATCH(pattern string, h http.HandlerFunc) { - m.handle(http.MethodPatch, pattern, h) +func (m *Mux) PATCH(pattern string, h http.HandlerFunc, mw ...func(http.Handler) http.Handler) { + m.handle(http.MethodPatch, pattern, h, mw...) } // DELETE method route -func (m *Mux) DELETE(pattern string, h http.HandlerFunc) { - m.handle(http.MethodDelete, pattern, h) +func (m *Mux) DELETE(pattern string, h http.HandlerFunc, mw ...func(http.Handler) http.Handler) { + m.handle(http.MethodDelete, pattern, h, mw...) } // CONNECT method route @@ -86,7 +87,7 @@ func (m *Mux) TRACE(pattern string, h http.HandlerFunc) { // handle registers the handler for the given pattern. // If the given pattern conflicts, with one that is already registered, HandleFunc // panics. -func (m *Mux) handle(method, pattern string, h http.HandlerFunc) { +func (m *Mux) handle(method, pattern string, h http.HandlerFunc, mw ...func(http.Handler) http.Handler) { if m == nil { panic("mux: func Handle() was called on nil") } @@ -100,13 +101,20 @@ func (m *Mux) handle(method, pattern string, h http.HandlerFunc) { } path := fmt.Sprintf("%s %s", method, pattern) - m.mux.Handle(path, stack(m.middlewares, h)) + if len(mw) > 0 { + mws := make([]func(http.Handler) http.Handler, 0, len(m.middlewares)+len(mw)) + copy(mws, m.middlewares) + mws = append(mws, mw...) + } else { + m.mux.Handle(path, stack(m.middlewares, h)) + } + m.routes.Add(path) } // With adds inline middlewares for an endpoint handler. func (m *Mux) With(middleware ...func(http.Handler) http.Handler) *Mux { - mws := make([]func(http.Handler) http.Handler, len(m.middlewares)) + mws := make([]func(http.Handler) http.Handler, 0, len(m.middlewares)+len(middleware)) copy(mws, m.middlewares) mws = append(mws, middleware...) diff --git a/mux_test.go b/mux_test.go index 2808d43..78ebb34 100644 --- a/mux_test.go +++ b/mux_test.go @@ -153,16 +153,17 @@ func TestRouterGroup(t *testing.T) { func TestRouterResource(t *testing.T) { r := New() - r.Resource("/users", func(res *Resource) { - res.Index(func(w http.ResponseWriter, r *http.Request) { - fmt.Fprint(w, "All users") - }) + r.Resource("/users", + func(res *Resource) { + res.Index(func(w http.ResponseWriter, r *http.Request) { + fmt.Fprint(w, "All users") + }) - res.View(func(w http.ResponseWriter, r *http.Request) { - id := r.PathValue("id") - fmt.Fprintf(w, "User %s", id) + res.View(func(w http.ResponseWriter, r *http.Request) { + id := r.PathValue("id") + fmt.Fprintf(w, "User %s", id) + }) }) - }) ts := httptest.NewServer(r) defer ts.Close() diff --git a/resource.go b/resource.go index fdb16b6..44c3de4 100644 --- a/resource.go +++ b/resource.go @@ -21,7 +21,7 @@ type Resource struct { // - PUT /pattern/:id update a resource // - PATCH /pattern/:id partial update a resource // - DELETE /resource/:id delete a resource -func (m *Mux) Resource(pattern string, fn func(res *Resource)) { +func (m *Mux) Resource(pattern string, fn func(res *Resource), mw ...func(http.Handler) http.Handler) { if m == nil { panic("mux: Resource() called on nil") } @@ -35,9 +35,14 @@ func (m *Mux) Resource(pattern string, fn func(res *Resource)) { } // Copy root middlewares. - mws := make([]func(http.Handler) http.Handler, len(m.middlewares)) + mws := make([]func(http.Handler) http.Handler, 0, len(m.middlewares)+len(mw)) copy(mws, m.middlewares) + // Append inline middlewares. + if len(mw) > 0 { + mws = append(mws, mw...) + } + fn(&Resource{ mux: m.mux, pattern: pattern,