No need to subclass

This commit is contained in:
Kovid Goyal 2020-01-01 14:10:57 +05:30
parent fbfebda03f
commit ad4d1f882a
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -4,31 +4,28 @@
from __future__ import absolute_import, division, print_function, unicode_literals from __future__ import absolute_import, division, print_function, unicode_literals
from lxml import etree from lxml import etree
import threading import threading
# resolve_entities is turned off as entities can cause # resolve_entities is turned off as entities can cause
# reads of local files, for example: # reads of local files, for example:
# <!DOCTYPE foo [ <!ENTITY passwd SYSTEM "file:///etc/passwd" >]> # <!DOCTYPE foo [ <!ENTITY passwd SYSTEM "file:///etc/passwd" >]>
_global_tls = threading.local()
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()
fs = etree.fromstring 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): def safe_xml_fromstring(string_or_bytes, recover=True):
return fs(string_or_bytes, _global_tls(recover)) return fs(string_or_bytes, parser(recover))