diff options
author | Stefan Behnel <stefan_ml@behnel.de> | 2021-11-19 17:28:48 +0100 |
---|---|---|
committer | Stefan Behnel <stefan_ml@behnel.de> | 2021-11-19 17:28:48 +0100 |
commit | 8a9579c32782f3d59b73bcf3e7d2fb3b52b80956 (patch) | |
tree | d8e82c3a4a87bcce700af29880685d0959f0e3df /src | |
parent | 7837d13c450eaf48dd9b05c60e3c245b3c7ffe9b (diff) | |
download | python-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.pyx | 15 | ||||
-rw-r--r-- | src/lxml/serializer.pxi | 2 |
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] |