Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/freshdata/parsers/gpx.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ def parse(self, source: Any) -> ParseResult:
except ValueError as exc:
return ParseResult(self.format, {v: pd.DataFrame() for v in _POINT_KIND.values()},
self.suggested_domain, {}, [f"unsafe GPX XML: {exc}"])
except ET.ParseError as exc:
except (ET.ParseError, LookupError) as exc:
return ParseResult(self.format, {v: pd.DataFrame() for v in _POINT_KIND.values()},
self.suggested_domain, {}, [f"invalid GPX XML: {exc}"])
finally:
Expand Down
2 changes: 1 addition & 1 deletion src/freshdata/parsers/sdmx.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ def parse(self, source: Any) -> ParseResult:
except ValueError as exc:
return ParseResult(self.format, {"observations": pd.DataFrame()},
None, {}, [f"unsafe SDMX XML: {exc} (audit only)"])
except ET.ParseError as exc:
except (ET.ParseError, LookupError) as exc:
return ParseResult(self.format, {"observations": pd.DataFrame()},
None, {}, [f"invalid SDMX XML: {exc} (audit only)"])
finally:
Expand Down
10 changes: 10 additions & 0 deletions tests/parsers/test_gpx.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,16 @@ def test_malformed_xml_returns_warning_not_exception():
assert any("invalid GPX XML" in w for w in result.warnings)


def test_unknown_xml_encoding_returns_warning_not_exception():
bad = (
'<?xml version="1.0" encoding="x-unknown-enc"?>'
'<gpx version="1.1" xmlns="http://www.topografix.com/GPX/1/1"/>'
)
result = fd.parse_domain(bad, format="gpx")
assert all(df.empty for df in result.frames.values())
assert any("invalid GPX XML" in w for w in result.warnings)


def test_doctype_entities_are_rejected():
entity_gpx = """<!DOCTYPE gpx [<!ENTITY x "expanded">]>
<gpx version="1.1" xmlns="http://www.topografix.com/GPX/1/1">
Expand Down
10 changes: 10 additions & 0 deletions tests/parsers/test_sdmx.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,16 @@ def test_invalid_xml_is_audit_only():
assert any("invalid SDMX XML" in w and "audit only" in w for w in result.warnings)


def test_unknown_xml_encoding_is_audit_only():
bad = (
'<?xml version="1.0" encoding="x-unknown-enc"?>'
"<StructureSpecificData><DataSet/></StructureSpecificData>"
)
result = fd.parse_domain(bad, format="sdmx")
assert result.frames["observations"].empty
assert any("invalid SDMX XML" in w and "audit only" in w for w in result.warnings)


def test_doctype_entities_are_rejected():
entity_sdmx = """<!DOCTYPE data [<!ENTITY x "expanded">]>
<StructureSpecificData>
Expand Down
Loading