You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
HTTPMessage.getallmatchingheaders() stopped working sometime after
Python 3.0 release. In a recent (1 day ago) svn update the
implementation says the method was copied from rfc822.message; the
Python 3.x implementation is broken (iterates through self.keys instead
of header values). I've not looked back to see where the change was
introduced but I do know that it broke post 3.0 release.
But more importantly than the flaw in this method, the functionality is
duplicated elsewhere in Python 3.x.
I propose either deprecating getallmatchingheaders() or if it is to be
kept for compatibility, the fix can be simply replacing the method body
with:
self.get_all(name)
The docstring for get_all (defined in email.message) affirms that its
output is indeed compatible with that which was intended for
getallmatchingheaders().
get_all(self, name, failobj=None) method of client.HTTPMessage instance
Return a list of all the values for the named field.
These will be sorted in the order they appeared in the original
message, and may contain duplicates. Any fields deleted and
re-inserted are always appended to the header list.
If no such fields exist, failobj is returned (defaults to None).
I've tested the use of get_all against one web server (QP) which runs on
both Python 2.x and 3.x.
As a result of the broken getallmatchingheaders() the QP web server now
uses for the same purpose as getallmatchingheaders() instead:
get_all(name) (defined in email.message.Message in Py3k and
getheaders(name) (defined in rfc822.Message).
See also issues on documentation and changed API in bpo-4773, bpo-3428
changed the title [-]http.client.HTTPMessage.getallmatchingheaders()[/-][+]http.client.HTTPMessage.getallmatchingheaders() always returns [][/+]on Jan 26, 2009
ggenellina commented on Jan 27, 2009
ggenellinamannequin
Mannequin
More actions
I think unified diffs are preferred.
Isn't there an existing test for this method?
... Returns nothing, so not only does the email package need a test for
this but so does http.client.
Incidentally test_mailbox.py has a test for the proposed alternative -
get_all(), which I noted above. That's another good reason for ridding
the world of getallmatchingheaders() or at least simply calling
get_all() from within getallmatchingheaders() if compatibility is a
legitimate concern.
mwatkins commented on Jan 27, 2009
mwatkinsmannequin
MannequinAuthor
More actions
Further investigation ( grep -r getallmatchingheaders Lib/* ) reveals
that in addition to having no tests, and being implemented incorrectly
in http.client, getallmatchingheaders() is called only once, in
http.server; that code is also broken (I reported this yesterday in bpo-5053).
Maybe Python 3 is where getallmatchingheaders can make a graceful
goodbye (and a 2to3 conversion added?).
In bpo-13425 Petri proposes 4 alternatives, copying them here:
Document the function to make it officially part of the public API
Rename and move the function to http.server
Leave it undocumented and just fix it
Deprecate the function to be removed in 3.4 or 3.5 and "fix" it to always return [].
I assume 4) meant:
4) Deprecate the function to be removed in 3.4 or 3.5 and fix to do what its docstring specifies.
My proposal is a more explicitly spelled out version 2):
5) Remove the function, replace its usage in http.server.CGIHTTPRequestHandler and add a test for http.server.CGIHTTPRequestHandler that exercises the part that currently uses getallmatchingheaders since that's obviously broken now.
The rationale for removal without deprecation is:
the function duplicates get_all so there's no reason to have it
it's probably not used by any (working) code because it just doesn't work
Mike can you tell us how you found out about this breakage? Were you using the function? Did you use something else to workaround it since it's broken now?
Senthil, Petri do you agree with option 5)? If so I can provide a patch.
My 4) actually meant that it should always return []. This is what it currently does, so it could be spelled out clearly in the code.
IIRC, getallmatchingheaders() cannot be emulated one-to-one using get_all(), because it handles continuation lines differently. That's why I thought removing or deprecating without fixing it would be the best.
rfc822.Message.getallmatchingheaders() is documented in Python 2, so removing it could make it harder to port code from Python 2 to Python 3. On the other hand, it's broken, so having it removed could actually make things better by not introducing hard-to-find bugs.
All in all, I'm not sure what's the best thing to do.
The CGIHTTPRequestHandler fix and test would be the best thing to start with, though, as it's not related to the eventual fate of getallmatchingheaders().
I agree with Catalin’s proposal to remove it straight away. It just causes confusion, and to me the intended behaviour is not equivalent to Message.get_all(). I would remove the entire HTTPMessage class and replace it as an alias of email.message.Message.
Posting a patch to remove the entire HTTPMessage class. This assumes my patch for bpo-5054 is accepted, which will remove the only existing reference to getallmatchingheaders().
vpython commented on Mar 19, 2017
vpythonmannequin
Mannequin
More actions
It is certainly true that getallmatchingheaders is broken... because the data it is looking at has changed format.
Here is a replacement that is as compatible as can be, based on the changed format.
The changed format has merged continuation lines, and separated keys and values into a list of duplet tuples. Iterators keys, values, and items exist, keys are not necessarily unique.
@vadmium, do you mind to create a PR based on your patch? It needs a NEWS and What's New entries, and perhaps some updates in the stdlib documentation.
Sorry Serhiy I’m not likely to create a pull request. I still think removing the class is the way forward, and I don’t mind if someone else makes a pull request though.
Note that getallmatchingheaders could be removed because it was only used by the CGI handler which I removed in #133811. I kept it in my PR for legacy reasons but maybe we could deprecate it eagerly and remove it?
Activity
mwatkins commentedon Jan 25, 2009
HTTPMessage.getallmatchingheaders() stopped working sometime after
Python 3.0 release. In a recent (1 day ago) svn update the
implementation says the method was copied from rfc822.message; the
Python 3.x implementation is broken (iterates through self.keys instead
of header values). I've not looked back to see where the change was
introduced but I do know that it broke post 3.0 release.
But more importantly than the flaw in this method, the functionality is
duplicated elsewhere in Python 3.x.
I propose either deprecating getallmatchingheaders() or if it is to be
kept for compatibility, the fix can be simply replacing the method body
with:
The docstring for get_all (defined in email.message) affirms that its
output is indeed compatible with that which was intended for
getallmatchingheaders().
get_all(self, name, failobj=None) method of client.HTTPMessage instance
Return a list of all the values for the named field.
I've tested the use of get_all against one web server (QP) which runs on
both Python 2.x and 3.x.
As a result of the broken getallmatchingheaders() the QP web server now
uses for the same purpose as getallmatchingheaders() instead:
get_all(name) (defined in email.message.Message in Py3k and
getheaders(name) (defined in rfc822.Message).
See also issues on documentation and changed API in bpo-4773, bpo-3428
mwatkins commentedon Jan 25, 2009
Trivial patch for http.client attached.
[-]http.client.HTTPMessage.getallmatchingheaders()[/-][+]http.client.HTTPMessage.getallmatchingheaders() always returns [][/+]ggenellina commentedon Jan 27, 2009
I think unified diffs are preferred.
Isn't there an existing test for this method?
mwatkins commentedon Jan 27, 2009
Re diffs, noted for the future.
Re tests:
# py3k-devel/Lib/test % grep -r getallmatchingheaders *
... Returns nothing, so not only does the email package need a test for
this but so does http.client.
Incidentally test_mailbox.py has a test for the proposed alternative -
get_all(), which I noted above. That's another good reason for ridding
the world of getallmatchingheaders() or at least simply calling
get_all() from within getallmatchingheaders() if compatibility is a
legitimate concern.
mwatkins commentedon Jan 27, 2009
Further investigation ( grep -r getallmatchingheaders Lib/* ) reveals
that in addition to having no tests, and being implemented incorrectly
in http.client, getallmatchingheaders() is called only once, in
http.server; that code is also broken (I reported this yesterday in
bpo-5053).
Maybe Python 3 is where getallmatchingheaders can make a graceful
goodbye (and a 2to3 conversion added?).
akheron commentedon Nov 23, 2011
bpo-13425 was marked as duplicate of this issue.
cataliniacob commentedon Jul 7, 2012
So, how to move this further?
In bpo-13425 Petri proposes 4 alternatives, copying them here:
I assume 4) meant:
4) Deprecate the function to be removed in 3.4 or 3.5 and fix to do what its docstring specifies.
My proposal is a more explicitly spelled out version 2):
5) Remove the function, replace its usage in http.server.CGIHTTPRequestHandler and add a test for http.server.CGIHTTPRequestHandler that exercises the part that currently uses getallmatchingheaders since that's obviously broken now.
The rationale for removal without deprecation is:
Mike can you tell us how you found out about this breakage? Were you using the function? Did you use something else to workaround it since it's broken now?
Senthil, Petri do you agree with option 5)? If so I can provide a patch.
akheron commentedon Jul 7, 2012
My 4) actually meant that it should always return []. This is what it currently does, so it could be spelled out clearly in the code.
IIRC, getallmatchingheaders() cannot be emulated one-to-one using get_all(), because it handles continuation lines differently. That's why I thought removing or deprecating without fixing it would be the best.
rfc822.Message.getallmatchingheaders() is documented in Python 2, so removing it could make it harder to port code from Python 2 to Python 3. On the other hand, it's broken, so having it removed could actually make things better by not introducing hard-to-find bugs.
All in all, I'm not sure what's the best thing to do.
akheron commentedon Jul 7, 2012
The CGIHTTPRequestHandler fix and test would be the best thing to start with, though, as it's not related to the eventual fate of getallmatchingheaders().
vadmium commentedon Feb 12, 2015
I agree with Catalin’s proposal to remove it straight away. It just causes confusion, and to me the intended behaviour is not equivalent to Message.get_all(). I would remove the entire HTTPMessage class and replace it as an alias of email.message.Message.
vadmium commentedon Feb 15, 2015
Posting a patch to remove the entire HTTPMessage class. This assumes my patch for bpo-5054 is accepted, which will remove the only existing reference to getallmatchingheaders().
vpython commentedon Mar 19, 2017
It is certainly true that getallmatchingheaders is broken... because the data it is looking at has changed format.
Here is a replacement that is as compatible as can be, based on the changed format.
The changed format has merged continuation lines, and separated keys and values into a list of duplet tuples. Iterators keys, values, and items exist, keys are not necessarily unique.
serhiy-storchaka commentedon Jan 27, 2024
@vadmium, do you mind to create a PR based on your patch? It needs a NEWS and What's New entries, and perhaps some updates in the stdlib documentation.
vadmium commentedon May 11, 2025
Sorry Serhiy I’m not likely to create a pull request. I still think removing the class is the way forward, and I don’t mind if someone else makes a pull request though.
picnixz commentedon May 11, 2025
Note that
getallmatchingheaderscould be removed because it was only used by the CGI handler which I removed in #133811. I kept it in my PR for legacy reasons but maybe we could deprecate it eagerly and remove it?picnixz commentedon May 16, 2025
cc @hugovk Maybe we can use this issue to schedule the deprecation and removal of this function?
hugovk commentedon May 16, 2025
I think it'll be clearer to open a new one and close this.
hugovk commentedon Jul 13, 2026
Closing in favour #153648.