Skip to content

http.client.HTTPMessage.getallmatchingheaders() always returns [] #57634

Closed

Description

@stachjankowski
BPO 13425
Nosy @orsenthil, @ezio-melotti, @akheron
Superseder
  • bpo-5053: http.client.HTTPMessage.getallmatchingheaders() always returns []
  • Files
  • 13425.patch: Patch for 13425
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields:

    assignee = None
    closed_at = <Date 2011-11-23.19:10:44.631>
    created_at = <Date 2011-11-18.11:03:49.953>
    labels = ['easy', 'type-bug', 'library']
    title = 'http.client.HTTPMessage.getallmatchingheaders() always returns []'
    updated_at = <Date 2011-11-23.19:32:28.275>
    user = 'https://bugs.python.org/stachjankowski'

    bugs.python.org fields:

    activity = <Date 2011-11-23.19:32:28.275>
    actor = 'petri.lehtinen'
    assignee = 'none'
    closed = True
    closed_date = <Date 2011-11-23.19:10:44.631>
    closer = 'stachjankowski'
    components = ['Library (Lib)']
    creation = <Date 2011-11-18.11:03:49.953>
    creator = 'stachjankowski'
    dependencies = []
    files = ['23752']
    hgrepos = []
    issue_num = 13425
    keywords = ['patch', 'easy']
    message_count = 11.0
    messages = ['147849', '147850', '147852', '148107', '148110', '148139', '148173', '148175', '148177', '148179', '148201']
    nosy_count = 5.0
    nosy_names = ['orsenthil', 'ezio.melotti', 'petri.lehtinen', 'stachjankowski', 'rohini']
    pr_nums = []
    priority = 'normal'
    resolution = 'duplicate'
    stage = 'test needed'
    status = 'closed'
    superseder = '5053'
    type = 'behavior'
    url = 'https://bugs.python.org/issue13425'
    versions = ['Python 3.2', 'Python 3.3']

    Activity

    1. stachjankowski commented on Nov 18, 2011

      stachjankowskimannequin
      MannequinAuthor

      http.client.HTTPMessage.getallmatchingheaders() always returns []

      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']
    2. added
      stdlibStandard Library Python modules in the Lib/ directory
      type-bugAn unexpected behavior, bug, or error
      on Nov 18, 2011
    3. ezio-melotti commented on Nov 18, 2011

      @ezio-melotti
      Member

      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().

    4. ezio-melotti commented on Nov 18, 2011

      @ezio-melotti
      Member

      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.

    5. rohini commented on Nov 22, 2011

      rohinimannequin
      Mannequin

      Please review the attached patch. Like getheaders, getallmatchingheaders would also return (header,value) tuples. It is not backward compatible with 2.7.

    6. akheron commented on Nov 22, 2011

      @akheron
      Member

      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:

      1. Document the function to make it officially part of the public API
      2. Rename and move the function to http.server
      3. 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.

    7. akheron commented on Nov 22, 2011

      @akheron
      Member
      1. 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?

    8. stachjankowski commented on Nov 23, 2011

      stachjankowskimannequin
      MannequinAuthor

      @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.

    9. akheron commented on Nov 23, 2011

      @akheron
      Member

      No, it's just random finding.

      This strengthens my impression that no-one is actually using the function. Maybe we should just remove it from 3.3.

    10. orsenthil commented on Nov 23, 2011

      @orsenthil
      Member

      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.

    11. changed the title [-]http.client.HTTPMessage.getallmatchingheaders() always returns [][/-] [+]http.client.HTTPMessage.getallmatchingheaders() always returns[/+] on Nov 23, 2011
    12. akheron commented on Nov 23, 2011

      @akheron
      Member

      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.

      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.

    13. stachjankowski commented on Nov 23, 2011

      stachjankowskimannequin
      MannequinAuthor

      This issue has been reported previously, in bpo-5053. Unfortunately, I overlooked. Sorry.

    14. changed the title [-]http.client.HTTPMessage.getallmatchingheaders() always returns[/-] [+]http.client.HTTPMessage.getallmatchingheaders() always returns [][/+] on Nov 23, 2011
    15. transferred this issue fromon Apr 10, 2022
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Metadata

    Metadata

    Assignees

    No one assigned

      Labels

      easystdlibStandard Library Python modules in the Lib/ directorytype-bugAn unexpected behavior, bug, or error

      Projects

      No projects

        Milestone

        No milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions