diff --git a/HISTORY.rst b/HISTORY.rst index de6ba5c4..4694e495 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -10,6 +10,15 @@ dev **Bugfixes** +- Parsing empty ``Link`` headers with ``parse_header_links()`` no longer return one bogus entry + +2.18.4 (2017-08-15) ++++++++++++++++++++ + +**Improvements** + +- Error messages for invalid headers now include the header name for easier debugging + **Dependencies** - We now support idna v2.6. diff --git a/requests/__version__.py b/requests/__version__.py index 2d60bcc0..dc33eef6 100644 --- a/requests/__version__.py +++ b/requests/__version__.py @@ -5,8 +5,8 @@ __title__ = 'requests' __description__ = 'Python HTTP for Humans.' __url__ = 'http://python-requests.org' -__version__ = '2.18.3' -__build__ = 0x021803 +__version__ = '2.18.4' +__build__ = 0x021804 __author__ = 'Kenneth Reitz' __author_email__ = 'me@kennethreitz.org' __license__ = 'Apache 2.0' diff --git a/requests/utils.py b/requests/utils.py index 1e4960d7..c52ce2d0 100644 --- a/requests/utils.py +++ b/requests/utils.py @@ -743,7 +743,7 @@ def default_headers(): def parse_header_links(value): - """Return a dict of parsed link headers proxies. + """Return a list of parsed link headers proxies. i.e. Link: ; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" @@ -754,6 +754,10 @@ def parse_header_links(value): replace_chars = ' \'"' + value = value.strip(replace_chars) + if not value: + return links + for val in re.split(', *<', value): try: url, params = val.split(';', 1) @@ -868,8 +872,8 @@ def check_header_validity(header): if not pat.match(value): raise InvalidHeader("Invalid return character or leading space in header: %s" % name) except TypeError: - raise InvalidHeader("Header value %s must be of type str or bytes, " - "not %s" % (value, type(value))) + raise InvalidHeader("Value for header {%s: %s} must be of type str or " + "bytes, not %s" % (name, value, type(value))) def urldefragauth(url): diff --git a/tests/test_requests.py b/tests/test_requests.py index 7ef6bfee..a2b2213f 100644 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -1401,14 +1401,17 @@ class TestRequests: headers_list = {'baz': ['foo', 'bar']} # Test for int - with pytest.raises(InvalidHeader): + with pytest.raises(InvalidHeader) as excinfo: r = requests.get(httpbin('get'), headers=headers_int) + assert 'foo' in str(excinfo.value) # Test for dict - with pytest.raises(InvalidHeader): + with pytest.raises(InvalidHeader) as excinfo: r = requests.get(httpbin('get'), headers=headers_dict) + assert 'bar' in str(excinfo.value) # Test for list - with pytest.raises(InvalidHeader): + with pytest.raises(InvalidHeader) as excinfo: r = requests.get(httpbin('get'), headers=headers_list) + assert 'baz' in str(excinfo.value) def test_header_no_return_chars(self, httpbin): """Ensure that a header containing return character sequences raise an diff --git a/tests/test_utils.py b/tests/test_utils.py index b3f398ee..32e4d4a5 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -498,6 +498,10 @@ def test_iter_slices(value, length): {'url': 'http://.../back.jpeg'} ] ), + ( + '', + [] + ), )) def test_parse_header_links(value, expected): assert parse_header_links(value) == expected