diff --git a/route.go b/route.go index d10401e9..d91ac04c 100644 --- a/route.go +++ b/route.go @@ -464,16 +464,18 @@ func (r *Route) PathPrefix(tpl string) *Route { // // - {name:pattern} matches the given regexp pattern. func (r *Route) Queries(pairs ...string) *Route { - length := len(pairs) - if length%2 != 0 { - r.err = fmt.Errorf( - "mux: number of parameters must be multiple of 2, got %v", pairs) - return nil - } - for i := 0; i < length; i += 2 { - if r.err = r.addRegexpMatcher(pairs[i]+"="+pairs[i+1], regexpTypeQuery); r.err != nil { + if r.err == nil { + length := len(pairs) + if length%2 != 0 { + r.err = fmt.Errorf( + "mux: number of parameters must be multiple of 2, got %v", pairs) return r } + for i := 0; i < length; i += 2 { + if r.err = r.addRegexpMatcher(pairs[i]+"="+pairs[i+1], regexpTypeQuery); r.err != nil { + return r + } + } } return r diff --git a/route_test.go b/route_test.go index 283c3ad5..57ed923a 100644 --- a/route_test.go +++ b/route_test.go @@ -152,3 +152,49 @@ func TestRouteMetadata(t *testing.T) { router.ServeHTTP(rw, req) }) } + +func TestQueriesOddParameters(t *testing.T) { + r := NewRouter() + route := r.NewRoute().Queries("odd") + if route == nil { + t.Fatal("Expected route to not be nil") + } + err := route.GetError() + if err == nil { + t.Fatal("Expected an error for odd number of query parameters") + } + expected := "mux: number of parameters must be multiple of 2, got [odd]" + if err.Error() != expected { + t.Errorf("Expected error %q, got %q", expected, err.Error()) + } + + // Verify method chaining does not panic + chained := r.NewRoute().Queries("odd").Path("/test").Methods("GET") + if chained == nil { + t.Fatal("Expected chained route to not be nil") + } + if chained.GetError() == nil { + t.Fatal("Expected chained route to retain error") + } + + // Verify route does not match + req := newRequest("GET", "/test?odd=1") + match := new(RouteMatch) + if chained.Match(req, match) { + t.Error("Expected route with error to not match") + } +} + +func TestQueriesExistingError(t *testing.T) { + r := NewRouter() + route := r.NewRoute().Path("][invalid regexp") + initialErr := route.GetError() + if initialErr == nil { + t.Fatal("Expected path regexp error") + } + + route.Queries("k1", "v1") + if route.GetError() != initialErr { + t.Errorf("Expected initial error to be preserved, got %v", route.GetError()) + } +}