package oasmiddleware import ( "context" "github.com/getkin/kin-openapi/openapi3" "github.com/getkin/kin-openapi/routers" "github.com/getkin/kin-openapi/routers/gorillamux" ) // ValidationRouterOpts represents the options to be passed to the validation router for processing the requests. type ValidationRouterOpts struct { // DeleteServers removes the `Servers` property from the parsed OAS spec to be used within test or even at runtime. // If you want to use it at runtime please read the doc for `ServerPrefix` first. DeleteServers bool // ServerPrefix adds a server entry with the desired prefix // eg: the service expose domain.com/foo/v0/entity . Your spec path are defined at the /entity level and then // /foo/v0 is part of the server entry in the OAS spec. If no prefix is provided, the validation router will either // take the whole server entry like domain.com/foo/v0/entity to validate or if `DeleteServers` is to true it will // only validate `/entity` ServerPrefix string } // NewValidationRouter creates a validation router to be injected in the middlewares // to validate requests or responses. In a case of a bad spec it returns an error func NewValidationRouter(ctx context.Context, doc *openapi3.T, opts *ValidationRouterOpts) (routers.Router, error) { if opts == nil { opts = &ValidationRouterOpts{ DeleteServers: true, } } if opts.DeleteServers { doc.Servers = nil for key, pathItem := range doc.Paths.Map() { pathItem.Servers = nil doc.Paths.Set(key, pathItem) } } if opts.ServerPrefix != "" { doc.Servers = openapi3.Servers{ &openapi3.Server{ URL: opts.ServerPrefix, }, } } if err := doc.Validate(ctx); err != nil { return nil, err } validationRouter, err := gorillamux.NewRouter(doc) if err != nil { return nil, err } return validationRouter, err }