diff --git a/mux_test.go b/mux_test.go index edcee57..f2f2d52 100644 --- a/mux_test.go +++ b/mux_test.go @@ -2803,6 +2803,48 @@ func TestSubrouterNotFound(t *testing.T) { } } +// testOptionsMiddleWare returns 200 on an OPTIONS request +func testOptionsMiddleWare(inner http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method == http.MethodOptions { + w.WriteHeader(http.StatusOK) + return + } + inner.ServeHTTP(w, r) + }) +} + +// TestRouterOrder Should Pass whichever order route is defined +func TestRouterOrder(t *testing.T) { + handler := func(w http.ResponseWriter, r *http.Request) {} + router := NewRouter() + router.Path("/a/b").Handler(http.HandlerFunc(handler)).Methods(http.MethodGet) + router.Path("/a/{a}").Handler(nil).Methods(http.MethodOptions) + router.Use(MiddlewareFunc(testOptionsMiddleWare)) + + w := NewRecorder() + req := newRequest(http.MethodOptions, "/a/b") + + router.ServeHTTP(w, req) + + if w.Code != http.StatusOK { + t.Fatalf("Expected status code 200 (got %d)", w.Code) + } + + reversedPathRouter := NewRouter() + reversedPathRouter.Path("/a/{a}").Handler(http.HandlerFunc(handler)).Methods(http.MethodGet) + reversedPathRouter.Path("/a/b").Handler(nil).Methods(http.MethodOptions) + reversedPathRouter.Use(MiddlewareFunc(testOptionsMiddleWare)) + + w = NewRecorder() + + reversedPathRouter.ServeHTTP(w, req) + + if w.Code != http.StatusOK { + t.Fatalf("Expected status code 200 (got %d)", w.Code) + } +} + // mapToPairs converts a string map to a slice of string pairs func mapToPairs(m map[string]string) []string { var i int diff --git a/route.go b/route.go index 7343d78..606e770 100644 --- a/route.go +++ b/route.go @@ -74,11 +74,13 @@ func (r *Route) Match(req *http.Request, match *RouteMatch) bool { return false } - if match.MatchErr == ErrMethodMismatch && r.handler != nil { + if match.MatchErr == ErrMethodMismatch { // We found a route which matches request method, clear MatchErr match.MatchErr = nil // Then override the mis-matched handler - match.Handler = r.handler + if r.handler != nil { + match.Handler = r.handler + } } // Yay, we have a match. Let's collect some info about it.