Skip to content

Commit 8b7a02e

Browse files
committed
requests: Add support for relative redirect URLs.
A redirection URL in the "Location:" header may be relative and start with a "/". Handle such cases. Signed-off-by: Damien George <damien@micropython.org>
1 parent 68f8fe4 commit 8b7a02e

3 files changed

Lines changed: 44 additions & 2 deletions

File tree

python-ecosys/requests/manifest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
metadata(version="1.0.0", pypi="requests")
1+
metadata(version="1.0.1", pypi="requests")
22

33
package("requests")

python-ecosys/requests/requests/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,8 @@ def request(
204204
elif l.startswith(b"Location:") and not 200 <= status <= 299:
205205
if status in [301, 302, 303, 307, 308]:
206206
redirect = str(l[10:-2], "utf-8")
207+
if redirect.startswith("/"):
208+
redirect = proto + "//" + host + ":" + str(port) + redirect
207209
else:
208210
raise NotImplementedError("Redirect %d not yet supported" % status)
209211
if parse_headers is False:

python-ecosys/requests/test_requests.py

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import io
22
import sys
33

4+
SERVER_RESPONSE_200_OK = b"HTTP/1.1 200 OK\r\n\r\n"
5+
46

57
class Socket:
6-
def __init__(self, read_data=b"HTTP/1.1 200 OK\r\n\r\n"):
8+
def __init__(self, read_data=SERVER_RESPONSE_200_OK):
79
self._write_buffer = io.BytesIO()
810
self._read_buffer = io.BytesIO(read_data)
911

@@ -226,6 +228,42 @@ def test_raw_readinto_content_length():
226228
socket.socket = lambda *a, **k: Socket()
227229

228230

231+
def test_redirect_absolute():
232+
server = iter(
233+
[
234+
b"HTTP/1.1 301 OK\r\nLocation: http://example.com/index\r\n\r\n",
235+
SERVER_RESPONSE_200_OK,
236+
]
237+
)
238+
socket.socket = lambda *a, **k: Socket(next(server))
239+
240+
response = requests.request("GET", "http://example.com")
241+
242+
assert response.raw._write_buffer.getvalue() == (
243+
b"GET /index HTTP/1.1\r\nConnection: close\r\nHost: example.com\r\n\r\n"
244+
), format_message(response)
245+
246+
socket.socket = lambda *a, **k: Socket()
247+
248+
249+
def test_redirect_relative():
250+
server = iter(
251+
[
252+
b"HTTP/1.1 301 OK\r\nLocation: /index\r\n\r\n",
253+
SERVER_RESPONSE_200_OK,
254+
]
255+
)
256+
socket.socket = lambda *a, **k: Socket(next(server))
257+
258+
response = requests.request("GET", "http://example.com")
259+
260+
assert response.raw._write_buffer.getvalue() == (
261+
b"GET /index HTTP/1.1\r\nConnection: close\r\nHost: example.com\r\n\r\n"
262+
), format_message(response)
263+
264+
socket.socket = lambda *a, **k: Socket()
265+
266+
229267
test_simple_get()
230268
test_get_auth()
231269
test_get_custom_header()
@@ -240,3 +278,5 @@ def test_raw_readinto_content_length():
240278
test_raw_open_before_content()
241279
test_raw_incremental_content_length()
242280
test_raw_readinto_content_length()
281+
test_redirect_absolute()
282+
test_redirect_relative()

0 commit comments

Comments
 (0)