summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStefan Behnel <stefan_ml@behnel.de>2021-11-19 17:28:48 +0100
committerStefan Behnel <stefan_ml@behnel.de>2021-11-19 17:28:48 +0100
commit8a9579c32782f3d59b73bcf3e7d2fb3b52b80956 (patch)
treed8e82c3a4a87bcce700af29880685d0959f0e3df /src
parent7837d13c450eaf48dd9b05c60e3c245b3c7ffe9b (diff)
downloadpython-lxml-8a9579c32782f3d59b73bcf3e7d2fb3b52b80956.tar.gz
Make sure the namespace mapping stack in C14NWriterTarget contains only Unicode strings, not bytes.
See https://mail.python.org/archives/list/lxml@python.org/thread/6ZFBHFOVHOS5GFDOAMPCT6HM5HZPWQ4Q/ See https://github.com/lxml/lxml/pull/332
Diffstat (limited to 'src')
-rw-r--r--src/lxml/etree.pyx15
-rw-r--r--src/lxml/serializer.pxi2
2 files changed, 16 insertions, 1 deletions
diff --git a/src/lxml/etree.pyx b/src/lxml/etree.pyx
index b4467548..689c3309 100644
--- a/src/lxml/etree.pyx
+++ b/src/lxml/etree.pyx
@@ -170,6 +170,20 @@ cdef dict _DEFAULT_NAMESPACE_PREFIXES = {
b"http://codespeak.net/lxml/objectify/pytype" : b"py",
}
+# To avoid runtime encoding overhead, we keep a Unicode copy
+# of the uri-prefix mapping as (str, str) items view (list in Py2).
+cdef object _DEFAULT_NAMESPACE_PREFIXES_ITEMS = []
+
+cdef _update_default_namespace_prefixes_items():
+ cdef bytes ns, prefix
+ global _DEFAULT_NAMESPACE_PREFIXES_ITEMS
+ _DEFAULT_NAMESPACE_PREFIXES_ITEMS = {
+ ns.decode('utf-8') : prefix.decode('utf-8')
+ for ns, prefix in _DEFAULT_NAMESPACE_PREFIXES.items()
+ }.items()
+
+_update_default_namespace_prefixes_items()
+
cdef object _check_internal_prefix = re.compile(b"ns\d+$").match
def register_namespace(prefix, uri):
@@ -190,6 +204,7 @@ def register_namespace(prefix, uri):
if k == uri_utf or v == prefix_utf:
del _DEFAULT_NAMESPACE_PREFIXES[k]
_DEFAULT_NAMESPACE_PREFIXES[uri_utf] = prefix_utf
+ _update_default_namespace_prefixes_items()
# Error superclass for ElementTree compatibility
diff --git a/src/lxml/serializer.pxi b/src/lxml/serializer.pxi
index 545bcabb..ec45cf1d 100644
--- a/src/lxml/serializer.pxi
+++ b/src/lxml/serializer.pxi
@@ -1028,7 +1028,7 @@ cdef class C14NWriterTarget:
# Stack with user declared namespace prefixes as (uri, prefix) pairs.
self._ns_stack = []
if not rewrite_prefixes:
- self._ns_stack.append(_DEFAULT_NAMESPACE_PREFIXES.items())
+ self._ns_stack.append(_DEFAULT_NAMESPACE_PREFIXES_ITEMS)
self._ns_stack.append([])
self._prefix_map = {}
self._preserve_space = [False]