inline middlewares

This commit is contained in:
2025-08-16 14:43:41 +05:30
parent 855b82e9df
commit 216fe93a55
3 changed files with 39 additions and 25 deletions

36
mux.go
View File

@@ -35,37 +35,38 @@ func (m *Mux) Use(h ...func(http.Handler) http.Handler) {
if m == nil { if m == nil {
panic("mux: func Use was called on nil") panic("mux: func Use was called on nil")
} }
m.middlewares = append(m.middlewares, h...) m.middlewares = append(m.middlewares, h...)
} }
// GET method route // GET method route
func (m *Mux) GET(pattern string, h http.HandlerFunc) { func (m *Mux) GET(pattern string, h http.HandlerFunc, mw ...func(http.Handler) http.Handler) {
m.handle(http.MethodGet, pattern, h) m.handle(http.MethodGet, pattern, h, mw...)
} }
// HEAD method route // HEAD method route
func (m *Mux) HEAD(pattern string, h http.HandlerFunc) { func (m *Mux) HEAD(pattern string, h http.HandlerFunc, mw ...func(http.Handler) http.Handler) {
m.handle(http.MethodHead, pattern, h) m.handle(http.MethodHead, pattern, h, mw...)
} }
// POST method route // POST method route
func (m *Mux) POST(pattern string, h http.HandlerFunc) { func (m *Mux) POST(pattern string, h http.HandlerFunc, mw ...func(http.Handler) http.Handler) {
m.handle(http.MethodPost, pattern, h) m.handle(http.MethodPost, pattern, h, mw...)
} }
// PUT method route // PUT method route
func (m *Mux) PUT(pattern string, h http.HandlerFunc) { func (m *Mux) PUT(pattern string, h http.HandlerFunc, mw ...func(http.Handler) http.Handler) {
m.handle(http.MethodPut, pattern, h) m.handle(http.MethodPut, pattern, h, mw...)
} }
// PATCH method route // PATCH method route
func (m *Mux) PATCH(pattern string, h http.HandlerFunc) { func (m *Mux) PATCH(pattern string, h http.HandlerFunc, mw ...func(http.Handler) http.Handler) {
m.handle(http.MethodPatch, pattern, h) m.handle(http.MethodPatch, pattern, h, mw...)
} }
// DELETE method route // DELETE method route
func (m *Mux) DELETE(pattern string, h http.HandlerFunc) { func (m *Mux) DELETE(pattern string, h http.HandlerFunc, mw ...func(http.Handler) http.Handler) {
m.handle(http.MethodDelete, pattern, h) m.handle(http.MethodDelete, pattern, h, mw...)
} }
// CONNECT method route // CONNECT method route
@@ -86,7 +87,7 @@ func (m *Mux) TRACE(pattern string, h http.HandlerFunc) {
// handle registers the handler for the given pattern. // handle registers the handler for the given pattern.
// If the given pattern conflicts, with one that is already registered, HandleFunc // If the given pattern conflicts, with one that is already registered, HandleFunc
// panics. // 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 { if m == nil {
panic("mux: func Handle() was called on 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) path := fmt.Sprintf("%s %s", method, pattern)
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.mux.Handle(path, stack(m.middlewares, h))
}
m.routes.Add(path) m.routes.Add(path)
} }
// With adds inline middlewares for an endpoint handler. // With adds inline middlewares for an endpoint handler.
func (m *Mux) With(middleware ...func(http.Handler) http.Handler) *Mux { 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) copy(mws, m.middlewares)
mws = append(mws, middleware...) mws = append(mws, middleware...)

View File

@@ -153,7 +153,8 @@ func TestRouterGroup(t *testing.T) {
func TestRouterResource(t *testing.T) { func TestRouterResource(t *testing.T) {
r := New() r := New()
r.Resource("/users", func(res *Resource) { r.Resource("/users",
func(res *Resource) {
res.Index(func(w http.ResponseWriter, r *http.Request) { res.Index(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "All users") fmt.Fprint(w, "All users")
}) })

View File

@@ -21,7 +21,7 @@ type Resource struct {
// - PUT /pattern/:id update a resource // - PUT /pattern/:id update a resource
// - PATCH /pattern/:id partial update a resource // - PATCH /pattern/:id partial update a resource
// - DELETE /resource/:id delete 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 { if m == nil {
panic("mux: Resource() called on nil") panic("mux: Resource() called on nil")
} }
@@ -35,9 +35,14 @@ func (m *Mux) Resource(pattern string, fn func(res *Resource)) {
} }
// Copy root middlewares. // 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) copy(mws, m.middlewares)
// Append inline middlewares.
if len(mw) > 0 {
mws = append(mws, mw...)
}
fn(&Resource{ fn(&Resource{
mux: m.mux, mux: m.mux,
pattern: pattern, pattern: pattern,