Skip to content

Commit

Permalink
Emit a warning when a metadata item can't be decoded
Browse files Browse the repository at this point in the history
Resolves #2078
  • Loading branch information
Sean Gillies committed Jan 10, 2021
1 parent dcc726a commit bef412f
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 13 deletions.
4 changes: 3 additions & 1 deletion CHANGES.txt
@@ -1,9 +1,11 @@
Changes
=======

1.2b2 (2020-01-08)
1.2b2 (2020-01-10)
------------------

- Emit a warning to the Python logger when a metadata item can't be decoded to
a Python unicode object (#2078).
- Use language_level=3 Cython directive for all .pyx sources (#2077).
- Deprecated usage of numpy.ndarray.tostring() has been changed to use
tobytes().
Expand Down
26 changes: 14 additions & 12 deletions rasterio/_base.pyx
@@ -1,6 +1,4 @@
# cython: language_level=3, boundscheck=False

""", c_string_type=unicode, c_string_encoding=utf8"""
# cython: language_level=3, boundscheck=False, c_string_type=unicode, c_string_encoding=utf8"""

"""Numpy-free base classes."""

Expand Down Expand Up @@ -49,7 +47,7 @@ def check_gdal_version(major, minor):

def gdal_version():
"""Return the version as a major.minor.patchlevel string."""
return GDALVersionInfo("RELEASE_NAME").decode("utf-8")
return GDALVersionInfo("RELEASE_NAME")


cdef const char *get_driver_name(GDALDriverH driver):
Expand Down Expand Up @@ -350,11 +348,9 @@ cdef class DatasetBase(object):

def read_crs(self):
"""Return the GDAL dataset's stored CRS"""
cdef const char *wkt_c = GDALGetProjectionRef(self.handle())
wkt_b = wkt_c
if wkt_b == NULL:
cdef const char *wkt = GDALGetProjectionRef(self.handle())
if wkt == NULL:
raise ValueError("Unexpected NULL spatial reference")
wkt = wkt_b.decode("utf-8")
return self._handle_crswkt(wkt)

def read_transform(self):
Expand Down Expand Up @@ -1066,6 +1062,7 @@ cdef class DatasetBase(object):
"""
cdef GDALMajorObjectH obj = NULL
cdef char **metadata = NULL
cdef char *item = NULL
cdef const char *domain = NULL
cdef char *key = NULL
cdef char *val = NULL
Expand All @@ -1083,10 +1080,15 @@ cdef class DatasetBase(object):

tag_items = []
for i in range(num_items):
log.info("Metadata item: i=%r, metadata[i]=%r", i, metadata[i])
val = CPLParseNameValue(metadata[i], &key)
tag_items.append((key[:], val[:]))
CPLFree(key)
item = <char *>metadata[i]
try:
val = CPLParseNameValue(metadata[i], &key)
tag_items.append((key[:], val[:]))
except UnicodeDecodeError:
item_bytes = <bytes>item
log.warning("Failed to decode metadata item: i=%r, item=%r", i, item_bytes)
finally:
CPLFree(key)

return dict(tag_items)

Expand Down

0 comments on commit bef412f

Please sign in to comment.