@@ -34,7 +34,8 @@ type SwaggerLoader struct {
3434
3535 Context context.Context
3636
37- visitedFiles map [string ]struct {}
37+ visitedFiles map [string ]struct {}
38+ visitedSwaggers map [string ]* Swagger
3839
3940 visitedHeader map [* Header ]struct {}
4041 visitedParameter map [* Parameter ]struct {}
@@ -53,6 +54,7 @@ func NewSwaggerLoader() *SwaggerLoader {
5354
5455func (swaggerLoader * SwaggerLoader ) reset () {
5556 swaggerLoader .visitedFiles = make (map [string ]struct {})
57+ swaggerLoader .visitedSwaggers = make (map [string ]* Swagger )
5658}
5759
5860// LoadSwaggerFromURI loads a spec from a remote URL
@@ -170,11 +172,22 @@ func (swaggerLoader *SwaggerLoader) LoadSwaggerFromDataWithPath(data []byte, pat
170172}
171173
172174func (swaggerLoader * SwaggerLoader ) loadSwaggerFromDataWithPathInternal (data []byte , path * url.URL ) (* Swagger , error ) {
175+ visited , ok := swaggerLoader .visitedSwaggers [path .String ()]
176+ if ok {
177+ return visited , nil
178+ }
179+
173180 swagger := & Swagger {}
181+ swaggerLoader .visitedSwaggers [path .String ()] = swagger
182+
174183 if err := yaml .Unmarshal (data , swagger ); err != nil {
175184 return nil , err
176185 }
177- return swagger , swaggerLoader .ResolveRefsIn (swagger , path )
186+ if err := swaggerLoader .ResolveRefsIn (swagger , path ); err != nil {
187+ return nil , err
188+ }
189+
190+ return swagger , nil
178191}
179192
180193// ResolveRefsIn expands references if for instance spec was just unmarshalled
0 commit comments