From 685b3495e1fd9853b1ca5960db3e3cb705920d4f Mon Sep 17 00:00:00 2001 From: R David Murray Date: Fri, 17 Oct 2014 19:30:13 -0400 Subject: [PATCH] #21991: make headerregistry params property MappingProxyType. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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. --- Lib/email/headerregistry.py | 3 ++- Lib/test/test_email/test_headerregistry.py | 3 +++ Misc/NEWS | 4 ++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Lib/email/headerregistry.py b/Lib/email/headerregistry.py index 1fae950820..911a2afea7 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 7d64a3829c..55ecdea9aa 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 2f02651ccc..e04f4cc02d 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. -- 2.40.0