summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorR David Murray <rdmurray@bitdance.com>2014-10-17 23:30:13 (GMT)
committerR David Murray <rdmurray@bitdance.com>2014-10-17 23:30:13 (GMT)
commit685b3495e1fd9853b1ca5960db3e3cb705920d4f (patch)
tree890832e8c33e710072208220a20175442b9b29a5
parentd6967320256a65b847cfc64173d12bf818171db5 (diff)
downloadcpython-685b3495e1fd9853b1ca5960db3e3cb705920d4f.zip
cpython-685b3495e1fd9853b1ca5960db3e3cb705920d4f.tar.gz
cpython-685b3495e1fd9853b1ca5960db3e3cb705920d4f.tar.bz2
#21991: make headerregistry params property MappingProxyType.
It is unlikely anyone is using the fact that the dictionary returned by the 'params' attribute was previously writable, but even if someone is the API is provisional so this kind of change is acceptable (and needed, to get the API "right" before it becomes official). Patch by Stéphane Wirtel.
-rw-r--r--Lib/email/headerregistry.py3
-rw-r--r--Lib/test/test_email/test_headerregistry.py3
-rw-r--r--Misc/NEWS4
3 files changed, 9 insertions, 1 deletions
diff --git a/Lib/email/headerregistry.py b/Lib/email/headerregistry.py
index 1fae950..911a2af 100644
--- a/Lib/email/headerregistry.py
+++ b/Lib/email/headerregistry.py
@@ -7,6 +7,7 @@ Eventually HeaderRegistry will be a public API, but it isn't yet,
and will probably change some before that happens.
"""
+from types import MappingProxyType
from email import utils
from email import errors
@@ -454,7 +455,7 @@ class ParameterizedMIMEHeader:
@property
def params(self):
- return self._params.copy()
+ return MappingProxyType(self._params)
class ContentTypeHeader(ParameterizedMIMEHeader):
diff --git a/Lib/test/test_email/test_headerregistry.py b/Lib/test/test_email/test_headerregistry.py
index 7d64a38..55ecdea 100644
--- a/Lib/test/test_email/test_headerregistry.py
+++ b/Lib/test/test_email/test_headerregistry.py
@@ -1,6 +1,7 @@
import datetime
import textwrap
import unittest
+import types
from email import errors
from email import policy
from email.message import Message
@@ -235,6 +236,8 @@ class TestContentTypeHeader(TestHeaderBase):
self.assertEqual(h.maintype, maintype)
self.assertEqual(h.subtype, subtype)
self.assertEqual(h.params, parmdict)
+ with self.assertRaises(TypeError):
+ h.params['abc'] = 'xyz' # params is read-only.
self.assertDefectsEqual(h.defects, defects)
self.assertEqual(h, decoded)
self.assertEqual(h.fold(policy=policy.default), folded)
diff --git a/Misc/NEWS b/Misc/NEWS
index 2f02651..e04f4cc 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -33,6 +33,10 @@ Core and Builtins
Library
-------
+- Issue #21991: Make email.headerregistry's header 'params' attributes
+ be read-only (MappingProxyType). Previously the dictionary was modifiable
+ but a new one was created on each access of the attribute.
+
- Issue #22641: In asyncio, the default SSL context for client connections
is now created using ssl.create_default_context(), for stronger security.