From 9f16500047a7985ac1533e3dc0e1c0e3da23502f Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Wed, 22 Jan 2014 08:49:09 -0500 Subject: Don't parse unicode XML with encoding Fix another place where a unicode XML string with an encoding declaration may be read. Cf. 0f8d403d1a86cfbfe8222662dc445e16e8f7eff9 --- src/lib/Bcfg2/Client/XML.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'src/lib/Bcfg2/Client/XML.py') diff --git a/src/lib/Bcfg2/Client/XML.py b/src/lib/Bcfg2/Client/XML.py index 91d4ac5c6..1f1b7df7d 100644 --- a/src/lib/Bcfg2/Client/XML.py +++ b/src/lib/Bcfg2/Client/XML.py @@ -5,9 +5,18 @@ # pylint: disable=E0611,W0611,W0613,C0103 try: - from lxml.etree import Element, SubElement, XML, tostring + from lxml.etree import Element, SubElement, tostring from lxml.etree import XMLSyntaxError as ParseError + from lxml.etree import XML as _XML driver = 'lxml' + + def XML(val, **kwargs): + try: + return _XML(val, **kwargs) + except ValueError: + # unicode strings w/encoding declaration are not supported + # in recent lxml.etree + return _XML(val.encode(), **kwargs) except ImportError: # lxml not available from xml.parsers.expat import ExpatError as ParseError -- cgit v1.2.3-1-g7c22 From e957f89d17e431cd4210f08def2f62dfe8fcf91f Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Wed, 22 Jan 2014 09:18:00 -0500 Subject: added missing docstring --- src/lib/Bcfg2/Client/XML.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'src/lib/Bcfg2/Client/XML.py') diff --git a/src/lib/Bcfg2/Client/XML.py b/src/lib/Bcfg2/Client/XML.py index 1f1b7df7d..561cd25a8 100644 --- a/src/lib/Bcfg2/Client/XML.py +++ b/src/lib/Bcfg2/Client/XML.py @@ -8,14 +8,17 @@ try: from lxml.etree import Element, SubElement, tostring from lxml.etree import XMLSyntaxError as ParseError from lxml.etree import XML as _XML + from Bcfg2.Compat import wraps driver = 'lxml' + @wraps(_XML) def XML(val, **kwargs): + """ unicode strings w/encoding declaration are not supported in + recent lxml.etree, so we try to read XML, and if it fails we try + encoding the string. """ try: return _XML(val, **kwargs) except ValueError: - # unicode strings w/encoding declaration are not supported - # in recent lxml.etree return _XML(val.encode(), **kwargs) except ImportError: # lxml not available -- cgit v1.2.3-1-g7c22 From 79f5fce2a387f5dfc13e10146b36cb620a5bf166 Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Tue, 28 Jan 2014 15:52:42 -0500 Subject: Client: let lxml.etree XML implementation parse very large documents --- src/lib/Bcfg2/Client/XML.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'src/lib/Bcfg2/Client/XML.py') diff --git a/src/lib/Bcfg2/Client/XML.py b/src/lib/Bcfg2/Client/XML.py index 561cd25a8..e35ce4497 100644 --- a/src/lib/Bcfg2/Client/XML.py +++ b/src/lib/Bcfg2/Client/XML.py @@ -5,17 +5,25 @@ # pylint: disable=E0611,W0611,W0613,C0103 try: - from lxml.etree import Element, SubElement, tostring + from lxml.etree import Element, SubElement, tostring, XMLParser from lxml.etree import XMLSyntaxError as ParseError from lxml.etree import XML as _XML from Bcfg2.Compat import wraps driver = 'lxml' + try: + # libxml2 2.9.0+ doesn't parse 10M+ documents by default: + # https://mail.gnome.org/archives/commits-list/2012-August/msg00645.html + _parser = XMLParser(huge_tree=True) + except TypeError: + _parser = XMLParser() + @wraps(_XML) def XML(val, **kwargs): """ unicode strings w/encoding declaration are not supported in recent lxml.etree, so we try to read XML, and if it fails we try encoding the string. """ + kwargs.setdefault('parser', _parser) try: return _XML(val, **kwargs) except ValueError: -- cgit v1.2.3-1-g7c22 From 8ac001a3dffebf8e7d3fa7db20f13e58b90dd5b4 Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Thu, 30 Jan 2014 07:30:18 -0500 Subject: fixed pylint tests --- src/lib/Bcfg2/Client/XML.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/lib/Bcfg2/Client/XML.py') diff --git a/src/lib/Bcfg2/Client/XML.py b/src/lib/Bcfg2/Client/XML.py index e35ce4497..4ba06abae 100644 --- a/src/lib/Bcfg2/Client/XML.py +++ b/src/lib/Bcfg2/Client/XML.py @@ -11,9 +11,9 @@ try: from Bcfg2.Compat import wraps driver = 'lxml' + # libxml2 2.9.0+ doesn't parse 10M+ documents by default: + # https://mail.gnome.org/archives/commits-list/2012-August/msg00645.html try: - # libxml2 2.9.0+ doesn't parse 10M+ documents by default: - # https://mail.gnome.org/archives/commits-list/2012-August/msg00645.html _parser = XMLParser(huge_tree=True) except TypeError: _parser = XMLParser() -- cgit v1.2.3-1-g7c22