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
Python 3.2.2:
Calling the code below does not give the expected result.
sjankowski@sjankowski:~$ python3
Python 3.2.2rc1 (default, Aug 14 2011, 18:43:44)
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from urllib.request import urlopen
>>> fp = urlopen('http://www.python.org/')
>>> fp.headers.getallmatchingheaders('Content-Type')
[]
At Python 2.7.2 returns the result.
sjankowski@sjankowski:~$ python
Python 2.7.2+ (default, Aug 16 2011, 09:23:59)
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from urllib import urlopen
>>> fp = urlopen('http://www.python.org/')
>>> fp.headers.getallmatchingheaders('Content-Type')
['Content-Type: text/html\r\n']
Actually the headers are already parsed, so the code should use self.items() instead of self.keys(), check if the key (without ':') matches, and append the key-value pair to the list.
Having a list of key-value pairs seems more useful than having a bare string, but this would be incompatible with 2.7.
This function also doesn't seem to be tested and documented, and it's used only once in the stdlib.
Please review the attached patch. Like getheaders, getallmatchingheaders would also return (header,value) tuples. It is not backward compatible with 2.7.
getallmatchinheaders() is not documented, i.e. it's not part of the public API. Furthermore, it's only used by http.server.CGIHTTPRequestHandler, and the comment above it even says that it should be moved there.
There are three options now:
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
In any case, the first thing that should be done is to add a test for CGIHTTPRequestHandler that fails with the current (broken) getallmatchinheaders() implementation.
Deprecate the function to be removed in 3.4 or 3.5 and "fix" it to always return [].
This way we won't break any 3.0-3.2 code that is using the function, but the users of such code will start to get DeprecationWarnings in 3.3.
There's no meaningful way to fix the function correctly, as the original header data isn't stored anywhere in HTTPMessage or its base class email.message.Message. The function is also obsolete: the get_all() method of email.message.Message can be used.
@stachjankowski: How did you find this issue? Are you porting from 2.x to 3.x or have new 3.x code that uses this function?
stachjankowski commented on Nov 23, 2011
stachjankowskimannequin
MannequinAuthor
More actions
@stachjankowski: How did you find this issue? Are you porting from 2.x to 3.x or have new 3.x code that uses this function?
No, it's just random finding.
Let's make it useful, that's much better instead of removing it. I am
+1 with Ezio's suggestion on this to return a list of tuples with
matching headers.
changed the title [-]http.client.HTTPMessage.getallmatchingheaders() always returns [][/-][+]http.client.HTTPMessage.getallmatchingheaders() always returns[/+]on Nov 23, 2011
Let's make it useful, that's much better instead of removing it. I am
+1 with Ezio's suggestion on this to return a list of tuples with
matching headers.
changed the title [-]http.client.HTTPMessage.getallmatchingheaders() always returns[/-][+]http.client.HTTPMessage.getallmatchingheaders() always returns [][/+]on Nov 23, 2011
Activity
stachjankowski commentedon Nov 18, 2011
http.client.HTTPMessage.getallmatchingheaders() always returns []
Python 3.2.2:
Calling the code below does not give the expected result.
At Python 2.7.2 returns the result.
ezio-melotti commentedon Nov 18, 2011
The problem seems to be in Lib/http/client.py:227.
The code adds a ':' that is not found in the list of headers returned by self.keys().
ezio-melotti commentedon Nov 18, 2011
Actually the headers are already parsed, so the code should use self.items() instead of self.keys(), check if the key (without ':') matches, and append the key-value pair to the list.
Having a list of key-value pairs seems more useful than having a bare string, but this would be incompatible with 2.7.
This function also doesn't seem to be tested and documented, and it's used only once in the stdlib.
rohini commentedon Nov 22, 2011
Please review the attached patch. Like getheaders, getallmatchingheaders would also return (header,value) tuples. It is not backward compatible with 2.7.
akheron commentedon Nov 22, 2011
getallmatchinheaders() is not documented, i.e. it's not part of the public API. Furthermore, it's only used by http.server.CGIHTTPRequestHandler, and the comment above it even says that it should be moved there.
There are three options now:
In any case, the first thing that should be done is to add a test for CGIHTTPRequestHandler that fails with the current (broken) getallmatchinheaders() implementation.
akheron commentedon Nov 22, 2011
This way we won't break any 3.0-3.2 code that is using the function, but the users of such code will start to get DeprecationWarnings in 3.3.
There's no meaningful way to fix the function correctly, as the original header data isn't stored anywhere in HTTPMessage or its base class email.message.Message. The function is also obsolete: the get_all() method of email.message.Message can be used.
@stachjankowski: How did you find this issue? Are you porting from 2.x to 3.x or have new 3.x code that uses this function?
stachjankowski commentedon Nov 23, 2011
akheron commentedon Nov 23, 2011
This strengthens my impression that no-one is actually using the function. Maybe we should just remove it from 3.3.
orsenthil commentedon Nov 23, 2011
Let's make it useful, that's much better instead of removing it. I am
+1 with Ezio's suggestion on this to return a list of tuples with
matching headers.
[-]http.client.HTTPMessage.getallmatchingheaders() always returns [][/-][+]http.client.HTTPMessage.getallmatchingheaders() always returns[/+]akheron commentedon Nov 23, 2011
But there's already a function that does it:
http://docs.python.org/dev/library/email.message.html#email.message.Message.get_all
HTTPMessage is a subclass of email.message.Message, so it's available in HTTPMessage as well.
stachjankowski commentedon Nov 23, 2011
This issue has been reported previously, in bpo-5053. Unfortunately, I overlooked. Sorry.
[-]http.client.HTTPMessage.getallmatchingheaders() always returns[/-][+]http.client.HTTPMessage.getallmatchingheaders() always returns [][/+]