func newRoutableUntypedAPI(spec *spec.Document, api *untyped.API, context *Context) *routableUntypedAPI { var handlers map[string]http.Handler if spec == nil || api == nil { return nil } for _, hls := range spec.Operations() { for _, op := range hls { schemes := spec.SecurityDefinitionsFor(op) if oh, ok := api.OperationHandlerFor(op.ID); ok { if handlers == nil { handlers = make(map[string]http.Handler) } handlers[op.ID] = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // lookup route info in the context route, _ := context.RouteInfo(r) // bind and validate the request using reflection bound, validation := context.BindAndValidate(r, route) if validation != nil { context.Respond(w, r, route.Produces, route, validation) return } // actually handle the request result, err := oh.Handle(bound) if err != nil { // respond with failure context.Respond(w, r, route.Produces, route, err) return } // respond with success context.Respond(w, r, route.Produces, route, result) }) if len(schemes) > 0 { handlers[op.ID] = newSecureAPI(context, handlers[op.ID]) } } } } return &routableUntypedAPI{ api: api, handlers: handlers, defaultProduces: api.DefaultProduces, defaultConsumes: api.DefaultConsumes, } }