uaiohttpclient: Add support for redirects.

pull/226/merge
Paul Sokolovsky 2014-11-30 01:59:25 +02:00
rodzic 5e1af0f277
commit 16c57c50f4
1 zmienionych plików z 26 dodań i 14 usunięć

Wyświetl plik

@ -59,24 +59,36 @@ def request_raw(method, url):
def request(method, url): def request(method, url):
reader = yield from request_raw(method, url) redir_cnt = 0
headers = [] redir_url = None
sline = yield from reader.readline() while redir_cnt < 2:
protover, st, msg = sline.split(None, 2) reader = yield from request_raw(method, url)
chunked = False headers = []
while True: sline = yield from reader.readline()
line = yield from reader.readline() protover, status, msg = sline.split(None, 2)
if not line or line == b"\r\n": status = int(status)
break chunked = False
headers.append(line) while True:
if line.startswith(b"Transfer-Encoding:"): line = yield from reader.readline()
if b"chunked" in line: if not line or line == b"\r\n":
chunked = True break
headers.append(line)
if line.startswith(b"Transfer-Encoding:"):
if b"chunked" in line:
chunked = True
elif line.startswith(b"Location:"):
url = line.rstrip().split(None, 1)[1].decode("latin-1")
if 301 <= status <= 303:
redir_cnt += 1
yield from reader.close()
continue
break
if chunked: if chunked:
resp = ChunkedClientResponse(reader) resp = ChunkedClientResponse(reader)
else: else:
resp = ClientResponse(reader) resp = ClientResponse(reader)
resp.status = int(st) resp.status = status
resp.headers = headers resp.headers = headers
return resp return resp