diff -r fceec0368cfa Lib/email/message.py --- a/Lib/email/message.py Sun Mar 02 17:14:33 2014 -0500 +++ b/Lib/email/message.py Mon Mar 03 20:19:17 2014 +0530 @@ -391,17 +391,7 @@ Note: this does not overwrite an existing header with the same field name. Use __delitem__() first to delete any existing headers. """ - max_count = self.policy.header_max_count(name) - if max_count: - lname = name.lower() - found = 0 - for k, v in self._headers: - if k.lower() == lname: - found += 1 - if found >= max_count: - raise ValueError("There may be at most {} {} headers " - "in a message".format(max_count, name)) - self._headers.append(self.policy.header_store_parse(name, val)) + self.set(name, val, pos=len(self) def __delitem__(self, name): """Delete all occurrences of a header, if present. @@ -466,6 +456,23 @@ return self.policy.header_fetch_parse(k, v) return failobj + def set(self, name, val, pos=0): + """Set the value of a header. + + Like __setitem__() but sets the value at a given pos location + """ + max_count = self.policy.header_max_count(name) + if max_count: + lname = name.lower() + found = 0 + for k, v in self._headers: + if k.lower() == lname: + found += 1 + if found >= max_count: + raise ValueError("There may be at most {} {} headers " + "in a message".format(max_count, name)) + self._headers.insert(pos, self.policy.header_store_parse(name, val)) + # # "Internal" methods (public API, but only intended for use by a parser # or generator, not normal application code. @@ -507,6 +514,19 @@ return failobj return values + def _parse_values(self, _value, **_params): + """Parses the header values as string + """ + parts = [] + for k, v in _params.items(): + if v is None: + parts.append(k.replace('_', '-')) + else: + parts.append(_formatparam(k.replace('_', '-'), v)) + if _value is not None: + parts.insert(0, _value) + return SEMISPACE.join(parts) + def add_header(self, _name, _value, **_params): """Extended header setting. @@ -519,6 +539,8 @@ encoded according to RFC2231 rules. Otherwise it will be encoded using the utf-8 charset and a language of ''. + The header is added at the end. + Examples: msg.add_header('content-disposition', 'attachment', filename='bud.gif') @@ -527,15 +549,21 @@ msg.add_header('content-disposition', 'attachment', filename='Fußballer.ppt')) """ - parts = [] - for k, v in _params.items(): - if v is None: - parts.append(k.replace('_', '-')) - else: - parts.append(_formatparam(k.replace('_', '-'), v)) - if _value is not None: - parts.insert(0, _value) - self[_name] = SEMISPACE.join(parts) + self[_name] = self._parse_values(_value, **_params) + + def insert_header(self, _name, _value, **_params): + """Extended header settings + + The header is added at the beginning. + Message.add_header() explains all other documentation. + + Examples: + + msg.insert_header('content-disposition', 'attachment', filename='bud.gif') + msg.insert_header('content-disposition', 'attachment', + filename='Fußballer.ppt')) + """ + self.set(_name, self._parse_values(_value, **_params)) def replace_header(self, _name, _value): """Replace a header.