diff --git a/uaiohttpclient/uaiohttpclient.py b/uaiohttpclient/uaiohttpclient.py index 2ad3fc53..6043297e 100644 --- a/uaiohttpclient/uaiohttpclient.py +++ b/uaiohttpclient/uaiohttpclient.py @@ -13,6 +13,35 @@ class ClientResponse: return "" % (self.status, self.headers) +class ChunkedClientResponse(ClientResponse): + + def __init__(self, reader): + self.content = reader + self.chunk_size = 0 + + def read(self, sz=4*1024*1024): + if self.chunk_size == 0: + l = yield from self.content.readline() + #print("chunk line:", l) + l = l.split(b";", 1)[0] + self.chunk_size = int(l, 16) + #print("chunk size:", self.chunk_size) + if self.chunk_size == 0: + # End of message + sep = yield from self.content.read(2) + assert sep == b"\r\n" + return b'' + data = yield from self.content.read(min(sz, self.chunk_size)) + self.chunk_size -= len(data) + if self.chunk_size == 0: + sep = yield from self.content.read(2) + assert sep == b"\r\n" + return data + + def __repr__(self): + return "" % (self.status, self.headers) + + def request_raw(method, url): try: proto, dummy, host, path = url.split("/", 3) @@ -31,16 +60,23 @@ def request_raw(method, url): def request(method, url): reader = yield from request_raw(method, url) - resp = ClientResponse(reader) headers = [] sline = yield from reader.readline() protover, st, msg = sline.split(None, 2) - resp.status = int(st) + chunked = False while True: line = yield from reader.readline() if not line or line == b"\r\n": break headers.append(line) + if line.startswith(b"Transfer-Encoding:"): + if b"chunked" in line: + chunked = True + if chunked: + resp = ChunkedClientResponse(reader) + else: + resp = ClientResponse(reader) + resp.status = int(st) resp.headers = headers return resp