Issue #16012: Fix a regression in pyexpat. The parser's UseForeignDTD()

method doesn't require an argument again.
This commit is contained in:
Christian Heimes 2012-09-24 13:17:08 +02:00
parent cadff70ba5
commit 8112ea2360
3 changed files with 61 additions and 2 deletions

View File

@ -588,6 +588,58 @@ class MalformedInputText(unittest.TestCase):
except expat.ExpatError as e: except expat.ExpatError as e:
self.assertEqual(str(e), 'XML declaration not well-formed: line 1, column 14') self.assertEqual(str(e), 'XML declaration not well-formed: line 1, column 14')
class ForeignDTDTests(unittest.TestCase):
"""
Tests for the UseForeignDTD method of expat parser objects.
"""
def test_use_foreign_dtd(self):
"""
If UseForeignDTD is passed True and a document without an external
entity reference is parsed, ExternalEntityRefHandler is first called
with None for the public and system ids.
"""
handler_call_args = []
def resolve_entity(context, base, system_id, public_id):
handler_call_args.append((public_id, system_id))
return 1
parser = expat.ParserCreate()
parser.UseForeignDTD(True)
parser.SetParamEntityParsing(expat.XML_PARAM_ENTITY_PARSING_ALWAYS)
parser.ExternalEntityRefHandler = resolve_entity
parser.Parse("<?xml version='1.0'?><element/>")
self.assertEqual(handler_call_args, [(None, None)])
# test UseForeignDTD() is equal to UseForeignDTD(True)
handler_call_args[:] = []
parser = expat.ParserCreate()
parser.UseForeignDTD()
parser.SetParamEntityParsing(expat.XML_PARAM_ENTITY_PARSING_ALWAYS)
parser.ExternalEntityRefHandler = resolve_entity
parser.Parse("<?xml version='1.0'?><element/>")
self.assertEqual(handler_call_args, [(None, None)])
def test_ignore_use_foreign_dtd(self):
"""
If UseForeignDTD is passed True and a document with an external
entity reference is parsed, ExternalEntityRefHandler is called with
the public and system ids from the document.
"""
handler_call_args = []
def resolve_entity(context, base, system_id, public_id):
handler_call_args.append((public_id, system_id))
return 1
parser = expat.ParserCreate()
parser.UseForeignDTD(True)
parser.SetParamEntityParsing(expat.XML_PARAM_ENTITY_PARSING_ALWAYS)
parser.ExternalEntityRefHandler = resolve_entity
parser.Parse(
"<?xml version='1.0'?><!DOCTYPE foo PUBLIC 'bar' 'baz'><element/>")
self.assertEqual(handler_call_args, [("bar", "baz")])
def test_main(): def test_main():
run_unittest(SetAttributeTest, run_unittest(SetAttributeTest,
ParseTest, ParseTest,
@ -598,7 +650,8 @@ def test_main():
PositionTest, PositionTest,
sf1296433Test, sf1296433Test,
ChardataBufferTest, ChardataBufferTest,
MalformedInputText) MalformedInputText,
ForeignDTDTests)
if __name__ == "__main__": if __name__ == "__main__":
test_main() test_main()

View File

@ -379,6 +379,12 @@ Library
- Issue #6884: Fix long-standing bugs with MANIFEST.in parsing in distutils - Issue #6884: Fix long-standing bugs with MANIFEST.in parsing in distutils
on Windows. on Windows.
Extension Modules
-----------------
- Issue #16012: Fix a regression in pyexpat. The parser's UseForeignDTD()
method doesn't require an argument again.
Tests Tests
----- -----

View File

@ -1176,7 +1176,7 @@ xmlparse_UseForeignDTD(xmlparseobject *self, PyObject *args)
PyObject *flagobj = NULL; PyObject *flagobj = NULL;
int flag = 1; int flag = 1;
enum XML_Error rc; enum XML_Error rc;
if (!PyArg_ParseTuple(args, "O:UseForeignDTD", &flagobj)) if (!PyArg_ParseTuple(args, "|O:UseForeignDTD", &flagobj))
return NULL; return NULL;
if (flagobj != NULL) { if (flagobj != NULL) {
flag = PyObject_IsTrue(flagobj); flag = PyObject_IsTrue(flagobj);