This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: httplib.HTTPConnection._send_request should not blindly assume dicts for headers
Type: enhancement Stage: resolved
Components: Library (Lib) Versions: Python 2.5
process
Status: closed Resolution: not a bug
Dependencies: Superseder:
Assigned To: Nosy List: iritkatriel, ludvig.ericson, piotr.dobrogost, terry.reedy
Priority: normal Keywords: patch

Created on 2008-07-04 00:19 by ludvig.ericson, last changed 2022-04-11 14:56 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
httplib.py.diff ludvig.ericson, 2008-07-04 00:19
Messages (3)
msg69234 - (view) Author: toxik (ludvig.ericson) Date: 2008-07-04 00:19
Presently it's impossible to use httplib.HTTPConnection.request and send 
the several headers with the same name. This is because _send_request 
assumes a dict is passed in, or a dict-like interface. Obviously one could 
make a list subclass or some such and give it an iteritems that returns 
itself, but IMHO the solution is to fix httplib.

Attached patch changes the current behavior to using iteritems only if it 
exists, otherwise iterate directly (which would fit with sequences of two-
tuples).
msg107439 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2010-06-09 23:16
This is a feature request for now old versions. It would have to be reformulated as a feature request for a 3.2 module. I do not see the dict (mapping now?) requirement being changed.
msg396203 - (view) Author: Irit Katriel (iritkatriel) * (Python committer) Date: 2021-06-20 23:05
Indeed, as Terry wrote the assumption is that header is a mapping (not necessarily a dict). It is not hard to implement a Multimap that has this API:

import collections.abc

class Multimap(collections.abc.Mapping):
    def __init__(self):
        self.data = collections.defaultdict(list)

    def __getitem__(self, key):
        return self.data[key]

    def __setitem__(self, key, value):
        self.data[key].append(value)

    def __iter__(self):
        yield from self.data

    def items(self):
        for k in list(self.data.keys()):
            for v in list(self.data[k]):
                yield (k,v)

    def __len__(self):
        return sum([len(v) for v in self.data.values()])

mm = Multimap()
mm['1'] = 'a'
mm['1'] = 'aa'
mm['1'] = 'aaa'
mm['2'] = 'b'
mm['3'] = 'c'
mm['3'] = 'cc'
print(f'len = {len(mm)}')
print(f'mm.items() = {list(mm.items())}')

Output:
len = 6
mm.items() = [('1', 'a'), ('1', 'aa'), ('1', 'aaa'), ('2', 'b'), ('3', 'c'), ('3', 'cc')]
History
Date User Action Args
2022-04-11 14:56:36adminsetgithub: 47526
2021-06-20 23:05:01iritkatrielsetstatus: open -> closed

nosy: + iritkatriel
messages: + msg396203

resolution: out of date -> not a bug
stage: resolved
2011-12-04 23:00:33piotr.dobrogostsetstatus: pending -> open
nosy: + piotr.dobrogost
2010-06-09 23:16:45terry.reedysetstatus: open -> pending

type: enhancement
versions: - Python 2.4, Python 2.3, Python 2.2.3, Python 2.2.2, Python 2.2.1, Python 2.2, Python 2.1.2, Python 2.1.1
nosy: + terry.reedy

messages: + msg107439
resolution: out of date
2008-07-04 00:19:28ludvig.ericsoncreate