From c081782e76c61e830b23637733f22d2c58077864 Mon Sep 17 00:00:00 2001 From: Olivia Lee Date: Mon, 17 Mar 2025 21:01:27 -0700 Subject: [PATCH] ignore header case in response_headers parameter This was broken in 1e4a5b25e337b18a3295d97e1a8957ac22275d1a, which moved the header case normalization logic into the http client. After that commit, users needed to pass lowercase headers in response_headers in order for them to be interpreted correctly. --- feedparser/api.py | 5 ++++- tests/test_parse_parameters.py | 10 ++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/feedparser/api.py b/feedparser/api.py index 1c9cf15d..a9915194 100644 --- a/feedparser/api.py +++ b/feedparser/api.py @@ -221,7 +221,10 @@ def parse( file.seek(initial_file_offset) # overwrite existing headers using response_headers - result["headers"].update(response_headers or {}) + # Lowercase the HTTP header keys for comparisons per RFC 2616. + response_headers = response_headers or {} + extra_headers = {k.lower(): v for k, v in response_headers.items()} + result["headers"].update(extra_headers) try: _parse_file_inplace( diff --git a/tests/test_parse_parameters.py b/tests/test_parse_parameters.py index 76c7d204..492dd273 100644 --- a/tests/test_parse_parameters.py +++ b/tests/test_parse_parameters.py @@ -34,6 +34,16 @@ def test_sanitize_html_off(): assert d.entries[0].content[0].value == '' +def test_response_headers_case_insensitive(): + d = feedparser.parse( + io.BytesIO(feed_xml), + response_headers={"CoNtEnT-LoCaTiOn": "http://example.com/feed"}, + ) + assert d.entries[1].content[0].value == ( + 'boo' + ) + + def test_resolve_relative_uris_default(): d = feedparser.parse( io.BytesIO(feed_xml),