Remove any BOM and encoding declaration from xml text. #185
This commit is contained in:
parent
6b7176bf67
commit
58d3d9dc04
2 changed files with 46 additions and 19 deletions
|
|
@ -2656,10 +2656,20 @@ class XMLBox(Jp2kBox):
|
||||||
warnings.warn(msg, UserWarning)
|
warnings.warn(msg, UserWarning)
|
||||||
|
|
||||||
# Strip out any trailing nulls, as they can foul up XML parsing.
|
# Strip out any trailing nulls, as they can foul up XML parsing.
|
||||||
|
# Remove any byte order markers.
|
||||||
text = text.rstrip(chr(0))
|
text = text.rstrip(chr(0))
|
||||||
|
if u'\ufeff' in text:
|
||||||
|
msg = 'An illegal BOM (byte order marker) was detected and '
|
||||||
|
msg += 'removed from the XML contents in the box starting at byte '
|
||||||
|
msg += 'offset {0}'.format(offset)
|
||||||
|
warnings.warn(msg)
|
||||||
|
text = text.replace(u'\ufeff', '')
|
||||||
|
# Remove any encoding declaration.
|
||||||
|
if text.startswith('<?xml version="1.0" encoding="UTF-8"?>'):
|
||||||
|
text = text[38:]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
elt = ET.fromstring(text.encode('utf-8'))
|
elt = ET.fromstring(text)
|
||||||
xml = ET.ElementTree(elt)
|
xml = ET.ElementTree(elt)
|
||||||
except ET.ParseError as err:
|
except ET.ParseError as err:
|
||||||
msg = 'A problem was encountered while parsing an XML box:'
|
msg = 'A problem was encountered while parsing an XML box:'
|
||||||
|
|
|
||||||
|
|
@ -94,24 +94,6 @@ class TestXML(unittest.TestCase):
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
os.unlink(self.xmlfile)
|
os.unlink(self.xmlfile)
|
||||||
|
|
||||||
@unittest.skipIf(OPJ_DATA_ROOT is None,
|
|
||||||
"OPJ_DATA_ROOT environment variable not set")
|
|
||||||
def test_invalid_utf8(self):
|
|
||||||
"""Bad byte sequence that cannot be parsed."""
|
|
||||||
filename = opj_data_file(os.path.join('input',
|
|
||||||
'nonregression',
|
|
||||||
'26ccf3651020967f7778238ef5af08af.SIGFPE.d25.527.jp2'))
|
|
||||||
if sys.hexversion < 0x03000000:
|
|
||||||
with warnings.catch_warnings():
|
|
||||||
warnings.simplefilter("ignore")
|
|
||||||
jp2 = Jp2k(filename)
|
|
||||||
else:
|
|
||||||
with self.assertWarns(UserWarning):
|
|
||||||
jp2 = Jp2k(filename)
|
|
||||||
|
|
||||||
self.assertIsNone(jp2.box[3].box[1].box[1].xml)
|
|
||||||
|
|
||||||
|
|
||||||
def test_negative_file_and_xml(self):
|
def test_negative_file_and_xml(self):
|
||||||
"""The XML should come from only one source."""
|
"""The XML should come from only one source."""
|
||||||
xml_object = ET.parse(self.xmlfile)
|
xml_object = ET.parse(self.xmlfile)
|
||||||
|
|
@ -305,3 +287,38 @@ class TestBadButRecoverableXmlFile(unittest.TestCase):
|
||||||
b'<test>this is a test</test>')
|
b'<test>this is a test</test>')
|
||||||
|
|
||||||
|
|
||||||
|
class TestXML_OpjDataRoot(unittest.TestCase):
|
||||||
|
"""Test suite for XML boxes, requires OPJ_DATA_ROOT."""
|
||||||
|
|
||||||
|
def test_bom(self):
|
||||||
|
"""Byte order markers are illegal in UTF-8. Issue 185"""
|
||||||
|
filename = opj_data_file(os.path.join('input',
|
||||||
|
'nonregression',
|
||||||
|
'issue171.jp2'))
|
||||||
|
if sys.hexversion < 0x03000000:
|
||||||
|
with warnings.catch_warnings():
|
||||||
|
warnings.simplefilter("ignore")
|
||||||
|
jp2 = Jp2k(filename)
|
||||||
|
else:
|
||||||
|
with self.assertWarns(UserWarning):
|
||||||
|
jp2 = Jp2k(filename)
|
||||||
|
self.assertIsNotNone(jp2.box[3].xml)
|
||||||
|
|
||||||
|
|
||||||
|
def test_invalid_utf8(self):
|
||||||
|
"""Bad byte sequence that cannot be parsed."""
|
||||||
|
filename = opj_data_file(os.path.join('input',
|
||||||
|
'nonregression',
|
||||||
|
'26ccf3651020967f7778238ef5af08af.SIGFPE.d25.527.jp2'))
|
||||||
|
if sys.hexversion < 0x03000000:
|
||||||
|
with warnings.catch_warnings():
|
||||||
|
warnings.simplefilter("ignore")
|
||||||
|
jp2 = Jp2k(filename)
|
||||||
|
else:
|
||||||
|
with self.assertWarns(UserWarning):
|
||||||
|
jp2 = Jp2k(filename)
|
||||||
|
|
||||||
|
self.assertIsNone(jp2.box[3].box[1].box[1].xml)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue