8000 urequests: Add support for redirects. · jaejeong1/micropython-lib@b29cffb · GitHub
[go: up one dir, main page]

Skip to content

Commit b29cffb

Browse files
diefessondpgeorge
authored andcommitted
urequests: Add support for redirects.
1 parent b17e9aa commit b29cffb

File tree

1 file changed

+18
-7
lines changed

1 file changed

+18
-7
lines changed

python-ecosys/urequests/urequests.py

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ def json(self):
3636
def request(
3737
method, url, data=None, json=None, headers={}, stream=None, parse_headers=True, auth=None
3838
):
39+
redirect = None # redirection url, None means no redirection
3940
chunked_data = data and getattr(data, "__iter__", None) and not getattr(data, "__len__", None)
4041

4142
if auth is not None:
@@ -123,7 +124,10 @@ def request(
123124
if b"chunked" in l:
124125
raise ValueError("Unsupported " + str(l, "utf-8"))
125126
elif l.startswith(b"Location:") and not 200 <= status <= 299:
126-
raise NotImplementedError("Redirects not yet supported")
127+
if status in [301, 302, 303, 307, 308]:
128+
redirect = str(l[10:-2], "utf-8")
129+
else:
130+
raise NotImplementedError("Redirect %d not yet supported" % status)
127131
if parse_headers is False:
128132
pass
129133
elif parse_headers is True:
@@ -136,12 +140,19 @@ def request(
136140
s.close()
137141
raise
138142

139-
resp = Response(s)
140-
resp.status_code = status
141-
resp.reason = reason
142-
if resp_d is not None:
143-
resp.headers = resp_d
144-
return resp
143+
if redirect:
144+
s.close()
145+
if status in [301, 302, 303]:
146+
return request("GET", redirect, None, None, headers, stream)
147+
else:
148+
return request(method, redirect, data, json, headers, stream)
149+
else:
150+
resp = Response(s)
151+
resp.status_code = status
152+
resp.reason = reason
153+
if resp_d is not None:
154+
resp.headers = resp_d
155+
return resp
145156

146157

147158
def head(url, **kw):

0 commit comments

Comments
 (0)
0