diff --git a/python-ecosys/requests/manifest.py b/python-ecosys/requests/manifest.py index b49ae557e..cbb311fbd 100644 --- a/python-ecosys/requests/manifest.py +++ b/python-ecosys/requests/manifest.py @@ -1,3 +1,3 @@ -metadata(version="1.1.0", pypi="requests") +metadata(version="1.1.1", pypi="requests") package("requests") diff --git a/python-ecosys/requests/requests/__init__.py b/python-ecosys/requests/requests/__init__.py index 68f63d13c..b0e479ead 100644 --- a/python-ecosys/requests/requests/__init__.py +++ b/python-ecosys/requests/requests/__init__.py @@ -223,10 +223,11 @@ def request( if not l or l == b"\r\n": break # print(l) - if l.startswith(b"Transfer-Encoding:"): + lowerl = l.lower() + if lowerl.startswith(b"transfer-encoding:"): if b"chunked" in l: chunked = True - elif l.startswith(b"Location:") and not 200 <= status <= 299: + elif lowerl.startswith(b"location:") and not 200 <= status <= 299: if status in [301, 302, 303, 307, 308]: redirect = str(l[10:-2], "utf-8") if redirect.startswith("/"): @@ -240,7 +241,7 @@ def request( k, v = l.split(":", 1) v = v.strip() resp_d[k] = v - if k.lower() == "content-length": + if lowerl.startswith(b"content-length:"): remaining = int(v) else: parse_headers(l, resp_d) diff --git a/python-ecosys/requests/test_requests.py b/python-ecosys/requests/test_requests.py index 38f5b8026..c12589c02 100644 --- a/python-ecosys/requests/test_requests.py +++ b/python-ecosys/requests/test_requests.py @@ -332,6 +332,43 @@ def test_redirect_relative(): socket.socket = lambda *a, **k: Socket() +def test_chunked_response_lowercase_header(): + socket.socket = lambda *a, **k: Socket( + read_data=b"HTTP/1.1 200 OK\r\ntransfer-encoding: chunked\r\n\r\n5\r\nhello\r\n6\r\n world\r\n0\r\n\r\n" + ) + response = requests.request("GET", "http://example.com") + assert response.content == b"hello world" + socket.socket = lambda *a, **k: Socket() + + +def test_redirect_lowercase_location(): + server = iter( + [ + b"HTTP/1.1 301 OK\r\nlocation: /index\r\n\r\n", + SERVER_RESPONSE_200_OK, + ] + ) + socket.socket = lambda *a, **k: Socket(next(server)) + + response = requests.request("GET", "http://example.com") + + assert response.raw._write_buffer.getvalue() == ( + b"GET /index HTTP/1.1\r\nConnection: close\r\nHost: example.com\r\n\r\n" + ), format_message(response) + + socket.socket = lambda *a, **k: Socket() + + +def test_content_length_lowercase_header(): + socket.socket = lambda *a, **k: Socket( + read_data=b"HTTP/1.1 200 OK\r\ncontent-length: 5\r\n\r\nhello" + ) + response = requests.request("GET", "http://example.com") + assert response.content == b"hello" + assert response.headers["content-length"] == "5" + socket.socket = lambda *a, **k: Socket() + + test_simple_get() test_get_query_anchor() test_get_auth() @@ -354,3 +391,6 @@ def test_redirect_relative(): test_raw_readinto_content_length() test_redirect_absolute() test_redirect_relative() +test_chunked_response_lowercase_header() +test_redirect_lowercase_location() +test_content_length_lowercase_header()