mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
No need to subclass
This commit is contained in:
parent
fbfebda03f
commit
ad4d1f882a
@ -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:
|
||||
# <!DOCTYPE foo [ <!ENTITY passwd SYSTEM "file:///etc/passwd" >]>
|
||||
|
||||
|
||||
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))
|
||||
|
Loading…
x
Reference in New Issue
Block a user