From cf57124f1d4afc95248c663c559ef789ee099087 Mon Sep 17 00:00:00 2001 From: Martin Hamrle Date: Mon, 25 Jul 2016 18:05:24 +0200 Subject: [PATCH] Fix error handling in Router.Walk In old version error was not returned properly, In one walkFn call error was checked only for SkipRouter but not for nil. --- mux.go | 3 +++ mux_test.go | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/mux.go b/mux.go index f8c10f3..5e0dd69 100644 --- a/mux.go +++ b/mux.go @@ -285,6 +285,9 @@ func (r *Router) walk(walkFn WalkFunc, ancestors []*Route) error { if err == SkipRouter { continue } + if err != nil { + return err + } for _, sr := range t.matchers { if h, ok := sr.(*Router); ok { err := h.walk(walkFn, ancestors) diff --git a/mux_test.go b/mux_test.go index 98ac82d..dd684cf 100644 --- a/mux_test.go +++ b/mux_test.go @@ -5,6 +5,7 @@ package mux import ( + "errors" "fmt" "net/http" "strings" @@ -1195,6 +1196,42 @@ func TestWalkNested(t *testing.T) { } } +func TestWalkErrorRoute(t *testing.T) { + router := NewRouter() + router.Path("/g") + expectedError := errors.New("error") + err := router.Walk(func(route *Route, router *Router, ancestors []*Route) error { + return expectedError + }) + if err != expectedError { + t.Errorf("Expected %v routes, found %v", expectedError, err) + } +} + +func TestWalkErrorMatcher(t *testing.T) { + router := NewRouter() + expectedError := router.Path("/g").Subrouter().Path("").GetError() + err := router.Walk(func(route *Route, router *Router, ancestors []*Route) error { + return route.GetError() + }) + if err != expectedError { + t.Errorf("Expected %v routes, found %v", expectedError, err) + } +} + +func TestWalkErrorHandler(t *testing.T) { + handler := NewRouter() + expectedError := handler.Path("/path").Subrouter().Path("").GetError() + router := NewRouter() + router.Path("/g").Handler(handler) + err := router.Walk(func(route *Route, router *Router, ancestors []*Route) error { + return route.GetError() + }) + if err != expectedError { + t.Errorf("Expected %v routes, found %v", expectedError, err) + } +} + func TestSubrouterErrorHandling(t *testing.T) { superRouterCalled := false subRouterCalled := false