diff --git a/python-ecosys/requests/manifest.py b/python-ecosys/requests/manifest.py index 6a5130be1..924d12d72 100644 --- a/python-ecosys/requests/manifest.py +++ b/python-ecosys/requests/manifest.py @@ -1,3 +1,3 @@ -metadata(version="1.0.0", pypi="requests") +metadata(version="1.0.1", pypi="requests") package("requests") diff --git a/python-ecosys/requests/requests/__init__.py b/python-ecosys/requests/requests/__init__.py index 88badc204..93aaa8afe 100644 --- a/python-ecosys/requests/requests/__init__.py +++ b/python-ecosys/requests/requests/__init__.py @@ -204,6 +204,8 @@ def request( elif l.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("/"): + redirect = proto + "//" + host + ":" + str(port) + redirect else: raise NotImplementedError("Redirect %d not yet supported" % status) if parse_headers is False: diff --git a/python-ecosys/requests/test_requests.py b/python-ecosys/requests/test_requests.py index fa3a63279..3c8683674 100644 --- a/python-ecosys/requests/test_requests.py +++ b/python-ecosys/requests/test_requests.py @@ -1,9 +1,11 @@ import io import sys +SERVER_RESPONSE_200_OK = b"HTTP/1.1 200 OK\r\n\r\n" + class Socket: - def __init__(self, read_data=b"HTTP/1.1 200 OK\r\n\r\n"): + def __init__(self, read_data=SERVER_RESPONSE_200_OK): self._write_buffer = io.BytesIO() self._read_buffer = io.BytesIO(read_data) @@ -226,6 +228,42 @@ def test_raw_readinto_content_length(): socket.socket = lambda *a, **k: Socket() +def test_redirect_absolute(): + server = iter( + [ + b"HTTP/1.1 301 OK\r\nLocation: http://example.com/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_redirect_relative(): + 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() + + test_simple_get() test_get_auth() test_get_custom_header() @@ -240,3 +278,5 @@ def test_raw_readinto_content_length(): test_raw_open_before_content() test_raw_incremental_content_length() test_raw_readinto_content_length() +test_redirect_absolute() +test_redirect_relative()