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 __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))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user