Fix filepath with spaces not working by unescaping the file URI before
loading a file from disk
diff --git a/jsonLoader.go b/jsonLoader.go
index 4f57ff7..5d88af2 100644
--- a/jsonLoader.go
+++ b/jsonLoader.go
@@ -33,6 +33,7 @@
"io"
"io/ioutil"
"net/http"
+ "net/url"
"os"
"path/filepath"
"runtime"
@@ -145,6 +146,12 @@
if reference.HasFileScheme {
filename := strings.TrimPrefix(refToURL.String(), "file://")
+ filename, err = url.QueryUnescape(filename)
+
+ if err != nil {
+ return nil, err
+ }
+
if runtime.GOOS == "windows" {
// on Windows, a file URL may have an extra leading slash, use slashes
// instead of backslashes, and have spaces escaped
diff --git a/schema_test.go b/schema_test.go
index 102e887..c05ddf0 100644
--- a/schema_test.go
+++ b/schema_test.go
@@ -272,6 +272,22 @@
}
}
+func TestFileWithSpace(t *testing.T) {
+ wd, err := os.Getwd()
+
+ if err != nil {
+ panic(err.Error())
+ }
+
+ fileName := filepath.Join(wd, "testdata", "extra", "file with space.json")
+ loader := NewReferenceLoader("file://" + filepath.ToSlash(fileName))
+
+ json, err := loader.LoadJSON()
+
+ assert.Nil(t, err, "Unexpected error when trying to load a filepath containing a space")
+ assert.Equal(t, map[string]interface{}{"foo": true}, json, "Contents of the file do not match")
+}
+
func TestAdditionalPropertiesErrorMessage(t *testing.T) {
schema := `{
"$schema": "http://json-schema.org/draft-07/schema#",
diff --git a/testdata/extra/file with space.json b/testdata/extra/file with space.json
new file mode 100644
index 0000000..de33b4d
--- /dev/null
+++ b/testdata/extra/file with space.json
@@ -0,0 +1 @@
+{"foo": true}