From 55bea115b1b3891bf9f490dfebec79aaa29ccfa4 Mon Sep 17 00:00:00 2001 From: Dave Henderson Date: Wed, 22 Apr 2020 21:30:51 -0400 Subject: Fix bug in file URL parsing Signed-off-by: Dave Henderson --- data/datasource.go | 11 ++++++----- data/datasource_test.go | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 5 deletions(-) (limited to 'data') diff --git a/data/datasource.go b/data/datasource.go index 2073ef54..1fcccf98 100644 --- a/data/datasource.go +++ b/data/datasource.go @@ -230,7 +230,7 @@ func parseSource(value string) (source *Source, err error) { err = errors.Errorf("Invalid datasource (%s). Must provide an alias with files not in working directory", value) return nil, err } - source.URL, err = absURL(f) + source.URL, err = absFileURL(f) if err != nil { return nil, err } @@ -272,7 +272,7 @@ func parseSourceURL(value string) (*url.URL, error) { } if !srcURL.IsAbs() { - srcURL, err = absURL(value) + srcURL, err = absFileURL(value) if err != nil { return nil, err } @@ -280,7 +280,7 @@ func parseSourceURL(value string) (*url.URL, error) { return srcURL, nil } -func absURL(value string) (*url.URL, error) { +func absFileURL(value string) (*url.URL, error) { cwd, err := os.Getwd() if err != nil { return nil, errors.Wrapf(err, "can't get working directory") @@ -290,8 +290,9 @@ func absURL(value string) (*url.URL, error) { Scheme: "file", Path: urlCwd + "/", } - relURL := &url.URL{ - Path: value, + relURL, err := url.Parse(value) + if err != nil { + return nil, fmt.Errorf("can't parse value %s as URL: %w", value, err) } resolved := baseURL.ResolveReference(relURL) // deal with Windows drive letters diff --git a/data/datasource_test.go b/data/datasource_test.go index 5d627b40..cdef3945 100644 --- a/data/datasource_test.go +++ b/data/datasource_test.go @@ -3,6 +3,8 @@ package data import ( "fmt" "net/url" + "os" + "path/filepath" "runtime" "strings" "testing" @@ -303,6 +305,15 @@ func TestDefineDatasource(t *testing.T) { assert.NoError(t, err) assert.Equal(t, "data", s.Alias) assert.Nil(t, s.URL) + + d = &Data{} + _, err = d.DefineDatasource("data", "/otherdir/foo?type=application/x-env") + s = d.Sources["data"] + assert.NoError(t, err) + assert.Equal(t, "data", s.Alias) + m, err := s.mimeType("") + assert.NoError(t, err) + assert.Equal(t, "application/x-env", m) } func TestMimeType(t *testing.T) { @@ -411,3 +422,36 @@ func TestQueryParse(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, expected, u) } + +func TestAbsFileURL(t *testing.T) { + cwd, _ := os.Getwd() + // make this pass on Windows + cwd = filepath.ToSlash(cwd) + expected := &url.URL{ + Scheme: "file", + Host: "", + Path: "/tmp/foo", + } + u, err := absFileURL("/tmp/foo") + assert.NoError(t, err) + assert.EqualValues(t, expected, u) + + expected = &url.URL{ + Scheme: "file", + Host: "", + Path: cwd + "/tmp/foo", + } + u, err = absFileURL("tmp/foo") + assert.NoError(t, err) + assert.EqualValues(t, expected, u) + + expected = &url.URL{ + Scheme: "file", + Host: "", + Path: cwd + "/tmp/foo", + RawQuery: "q=p", + } + u, err = absFileURL("tmp/foo?q=p") + assert.NoError(t, err) + assert.EqualValues(t, expected, u) +} -- cgit v1.2.3