Skip to content

Commit ea43ca7

Browse files
Bypass any file/URL reading by ReadFromURIFunc (#316)
1 parent 49752fc commit ea43ca7

File tree

2 files changed

+36
-5
lines changed

2 files changed

+36
-5
lines changed

openapi3/swagger_loader.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,12 @@ type SwaggerLoader struct {
2929
// IsExternalRefsAllowed enables visiting other files
3030
IsExternalRefsAllowed bool
3131

32-
// LoadSwaggerFromURIFunc allows overriding the file/URL reading func
32+
// LoadSwaggerFromURIFunc allows overriding the swagger file/URL reading func
3333
LoadSwaggerFromURIFunc func(loader *SwaggerLoader, url *url.URL) (*Swagger, error)
3434

35+
// ReadFromURIFunc allows overriding the any file/URL reading func
36+
ReadFromURIFunc func(loader *SwaggerLoader, url *url.URL) ([]byte, error)
37+
3538
Context context.Context
3639

3740
visitedFiles map[string]struct{}
@@ -68,7 +71,7 @@ func (swaggerLoader *SwaggerLoader) loadSwaggerFromURIInternal(location *url.URL
6871
if f != nil {
6972
return f(swaggerLoader, location)
7073
}
71-
data, err := readURL(location)
74+
data, err := swaggerLoader.readURL(location)
7275
if err != nil {
7376
return nil, err
7477
}
@@ -96,7 +99,7 @@ func (swaggerLoader *SwaggerLoader) loadSingleElementFromURI(ref string, rootPat
9699
return fmt.Errorf("could not resolve path: %v", err)
97100
}
98101

99-
data, err := readURL(resolvedPath)
102+
data, err := swaggerLoader.readURL(resolvedPath)
100103
if err != nil {
101104
return err
102105
}
@@ -107,7 +110,12 @@ func (swaggerLoader *SwaggerLoader) loadSingleElementFromURI(ref string, rootPat
107110
return nil
108111
}
109112

110-
func readURL(location *url.URL) ([]byte, error) {
113+
func (swaggerLoader *SwaggerLoader) readURL(location *url.URL) ([]byte, error) {
114+
f := swaggerLoader.ReadFromURIFunc
115+
if f != nil {
116+
return f(swaggerLoader, location)
117+
}
118+
111119
if location.Scheme != "" && location.Host != "" {
112120
resp, err := http.Get(location.String())
113121
if err != nil {
@@ -143,7 +151,7 @@ func (swaggerLoader *SwaggerLoader) loadSwaggerFromFileInternal(path string) (*S
143151
x, err := f(swaggerLoader, pathAsURL)
144152
return x, err
145153
}
146-
data, err := ioutil.ReadFile(path)
154+
data, err := swaggerLoader.readURL(pathAsURL)
147155
if err != nil {
148156
return nil, err
149157
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package openapi3
2+
3+
import (
4+
"io/ioutil"
5+
"net/url"
6+
"path/filepath"
7+
"testing"
8+
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
func TestLoaderReadFromURIFunc(t *testing.T) {
13+
loader := NewSwaggerLoader()
14+
loader.IsExternalRefsAllowed = true
15+
loader.ReadFromURIFunc = func(loader *SwaggerLoader, url *url.URL) ([]byte, error) {
16+
return ioutil.ReadFile(filepath.Join("testdata", url.Path))
17+
}
18+
doc, err := loader.LoadSwaggerFromFile("recursiveRef/openapi.yml")
19+
require.NoError(t, err)
20+
require.NotNil(t, doc)
21+
require.NoError(t, doc.Validate(loader.Context))
22+
require.Equal(t, "bar", doc.Paths["/foo"].Get.Responses.Get(200).Value.Content.Get("application/json").Schema.Value.Properties["foo"].Value.Properties["bar"].Value.Items.Value.Example)
23+
}

0 commit comments

Comments
 (0)