func newRouter(ctx *Context, next http.Handler) http.Handler { if ctx.router == nil { ctx.router = DefaultRouter(ctx.spec, ctx.api) } isRoot := ctx.spec.BasePath() == "" || ctx.spec.BasePath() == "/" return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { defer context.Clear(r) // use context to lookup routes if isRoot { if _, ok := ctx.RouteInfo(r); ok { next.ServeHTTP(rw, r) return } } else { if p := strings.TrimPrefix(r.URL.Path, ctx.spec.BasePath()); len(p) < len(r.URL.Path) { r.URL.Path = p if _, ok := ctx.RouteInfo(r); ok { next.ServeHTTP(rw, r) return } } } // Not found, check if it exists in the other methods first if others := ctx.AllowedMethods(r); len(others) > 0 { ctx.Respond(rw, r, ctx.spec.RequiredProduces(), nil, errors.MethodNotAllowed(r.Method, others)) return } ctx.Respond(rw, r, ctx.spec.RequiredProduces(), nil, errors.NotFound("path %s was not found", r.URL.Path)) }) }
func petByID(id int64) (*Pet, error) { for _, pet := range pets { if pet.ID == id { return &pet, nil } } return nil, errors.NotFound("not found: pet %d", id) }
// NotFound the default not found responder for when no route has been matched yet func (c *Context) NotFound(rw http.ResponseWriter, r *http.Request) { c.Respond(rw, r, []string{httpkit.JSONMime}, nil, errors.NotFound("not found")) }