diff --git a/src/calibre/utils/xml_parse.py b/src/calibre/utils/xml_parse.py index d0228d5e3f..d53a787721 100644 --- a/src/calibre/utils/xml_parse.py +++ b/src/calibre/utils/xml_parse.py @@ -4,31 +4,28 @@ from __future__ import absolute_import, division, print_function, unicode_literals - from lxml import etree import threading - # resolve_entities is turned off as entities can cause # reads of local files, for example: # ]> - -class GlobalParserTLS(threading.local): - - def __call__(self, recover): - parsers = getattr(self, 'parsers', None) - if parsers is None: - self.parsers = parsers = { - True: etree.XMLParser(recover=True, no_network=True, resolve_entities=False), - False: etree.XMLParser(recover=False, no_network=True, resolve_entities=False) - } - return parsers[recover] - - -_global_tls = GlobalParserTLS() +_global_tls = threading.local() fs = etree.fromstring +def parser(recover): + parsers = getattr(_global_tls, 'parsers', None) + if parsers is None: + _global_tls.parsers = parsers = { + True: + etree.XMLParser(recover=True, no_network=True, resolve_entities=False), + False: + etree.XMLParser(recover=False, no_network=True, resolve_entities=False) + } + return parsers[recover] + + def safe_xml_fromstring(string_or_bytes, recover=True): - return fs(string_or_bytes, _global_tls(recover)) + return fs(string_or_bytes, parser(recover))