diff --git a/parsedmarc/__init__.py b/parsedmarc/__init__.py index c38b62b1..5942109d 100644 --- a/parsedmarc/__init__.py +++ b/parsedmarc/__init__.py @@ -222,11 +222,14 @@ def parse_aggregate_report_xml(xml, ip_db_path=None, offline=False, xmltodict.parse(xml)["feedback"] except Exception as e: errors.append("Invalid XML: {0}".format(e.__str__())) - tree = etree.parse( - BytesIO(xml.encode('utf-8')), - etree.XMLParser(recover=True, resolve_entities=False)) - s = etree.tostring(tree) - xml = '' if s is None else s.decode('utf-8') + try: + tree = etree.parse( + BytesIO(xml.encode('utf-8')), + etree.XMLParser(recover=True, resolve_entities=False)) + s = etree.tostring(tree) + xml = '' if s is None else s.decode('utf-8') + except Exception: + xml = u'' try: # Replace XML header (sometimes they are invalid) diff --git a/samples/empty.xml b/samples/empty.xml new file mode 100644 index 00000000..e69de29b diff --git a/tests.py b/tests.py index 8f659ed6..86ac83a5 100644 --- a/tests.py +++ b/tests.py @@ -38,6 +38,11 @@ def testAggregateSamples(self): print("\n") print(parsedmarc.parsed_aggregate_reports_to_csv(parsed_report)) + def testEmptySample(self): + """Test empty/unparasable report""" + with self.assertRaises(parsedmarc.InvalidDMARCReport): + parsedmarc.parse_report_file('samples/empty.xml') + def testForensicSamples(self): """Test sample forensic/ruf/failure DMARC reports""" sample_paths = glob("samples/forensic/*.eml")