diff --git a/godal.go b/godal.go index bc5c6d5..959d518 100644 --- a/godal.go +++ b/godal.go @@ -3903,8 +3903,8 @@ func HasVSIHandler(prefix string) bool { if handlers == nil { return false } - _, ok := handlers[prefix] - return ok + handler, ok := handlers[prefix] + return ok && handler.KeySizerReaderAt != nil } // BuildVRT runs the GDALBuildVRT function and creates a VRT dataset from a list of datasets diff --git a/godal_test.go b/godal_test.go index 50ddf74..22b2da0 100644 --- a/godal_test.go +++ b/godal_test.go @@ -3459,17 +3459,31 @@ func (mvp mvpHandler) ReadAtMulti(k string, buf [][]byte, off []int64) ([]int, e } return b.(KeyMultiReader).ReadAtMulti(k, buf, off) } +func TestHasVSIHandler(t *testing.T) { // stripPrefix false + assert.False(t, HasVSIHandler("prefix://")) + + vpa := vpHandler{datas: make(map[string]KeySizerReaderAt)} + err := RegisterVSIHandler("prefix://", vpa, VSIHandlerStripPrefix(false)) + assert.NoError(t, err) + assert.True(t, HasVSIHandler("prefix://")) + + // nil handler + err = RegisterVSIHandler("nil_prefix://", nil) + assert.NoError(t, err) + assert.False(t, HasVSIHandler("nil_prefix://")) + + // unregistered_prefix + assert.False(t, HasVSIHandler("unregistered_prefix://")) +} func TestVSIPrefix(t *testing.T) { tifdat, _ := ioutil.ReadFile("testdata/test.tif") - assert.False(t, HasVSIHandler("prefix://")) // stripPrefix false vpa := vpHandler{datas: make(map[string]KeySizerReaderAt)} vpa.datas["prefix://test.tif"] = mbufHandler{tifdat} err := RegisterVSIHandler("prefix://", vpa, VSIHandlerStripPrefix(false)) assert.NoError(t, err) - assert.True(t, HasVSIHandler("prefix://")) ds, err := Open("prefix://test.tif") if err != nil {