diff --git a/restkit/client/request.py b/restkit/client/request.py index 94abc98d..a8a24d64 100644 --- a/restkit/client/request.py +++ b/restkit/client/request.py @@ -248,7 +248,6 @@ def request(self, url, method='GET', body=None, headers=None): self.found_headers = found_headers - # Finally do the request return self.do_send() @@ -266,7 +265,7 @@ def _req_headers(self): ua = self.found_headers.get('USER-AGENT') - accept_encoding = self.found_headers.get('CONTENT-ENCODING') + accept_encoding = self.found_headers.get('ACCEPT-ENCODING') connection = self.found_headers.get('CONNECTION') # default host header @@ -280,7 +279,7 @@ def _req_headers(self): req_headers = [ "%s %s %s\r\n" % (self.method, req_path, httpver), "Host: %s\r\n" % host, - "User-Agent: %s\r\n" % ua or USER-AGENT, + "User-Agent: %s\r\n" % ua or USER_AGENT, "Accept-Encoding: %s\r\n" % accept_encoding or 'identity' ] diff --git a/restkit/http/body.py b/restkit/http/body.py index 0ce47fd4..71d06127 100644 --- a/restkit/http/body.py +++ b/restkit/http/body.py @@ -135,6 +135,7 @@ def read(self, size): break data = self.unreader.read() + buf = buf.getvalue() ret, rest = buf[:size], buf[size:] self.unreader.unread(rest) @@ -289,10 +290,10 @@ def readlines(self, size=None): ret.append(line) return ret - + class GzipBody(Body): def __init__(self, reader): - Body.__init__(self, reader) + super(GzipBody, self).__init__(reader) self._d = zlib.decompressobj(16+zlib.MAX_WBITS) def _decompress(self, data): @@ -308,21 +309,20 @@ def read(self, size=None): ret, rest = data[:size], data[size:] self.buf.truncate(0) self.buf.write(rest) - return ret + return self._decompress(ret) while size > self.buf.tell(): data = self.reader.read(1024) if not len(data): self.close() break - data = self._decompress(data) self.buf.write(data) data = self.buf.getvalue() ret, rest = data[:size], data[size:] self.buf.truncate(0) self.buf.write(rest) - return ret + return self._decompress(ret) def readline(self, size=None): size = self.getsize(size) @@ -335,8 +335,7 @@ def readline(self, size=None): if not len(data): self.close() break - data = self._decompress(data) - self.buf.write(data) + self.buf.write(self._decompress(data)) idx = self.buf.getvalue().find("\n") if size < self.buf.tell(): break @@ -358,6 +357,10 @@ def readline(self, size=None): self.buf.truncate(0) self.buf.write(rest) return ret - - - + + +class DeflateBody(GzipBody): + def __init__(self, reader): + super(DeflateBody, self).__init__(reader) + self._d = zlib.decompressobj() + diff --git a/restkit/http/message.py b/restkit/http/message.py index 0a73eb36..fcca649c 100644 --- a/restkit/http/message.py +++ b/restkit/http/message.py @@ -12,7 +12,7 @@ from StringIO import StringIO from restkit.http.body import ChunkedReader, LengthReader, EOFReader, Body, \ -GzipBody +GzipBody, DeflateBody from restkit.errors import InvalidHeader, InvalidHeaderName, NoMoreData, \ InvalidRequestLine, InvalidRequestMethod, InvalidHTTPVersion, InvalidHTTPStatus @@ -105,7 +105,6 @@ def parse_headers(self, data): def set_body_reader(self): chunked = False clength = None - for (name, value) in self.headers: if name.upper() == "CONTENT-LENGTH": try: @@ -117,9 +116,6 @@ def set_body_reader(self): elif name.upper() == "CONTENT-ENCODING": self.encoding = value.lower() - if clength is not None or chunked: - break - if chunked: self.body = Body(ChunkedReader(self, self.unreader)) elif clength is not None: @@ -223,5 +219,7 @@ def set_body_reader(self): super(Response, self).set_body_reader() if self.encoding == "gzip": self.body = GzipBody(self.body.reader) + elif self.encoding == "deflate": + self.body = DeflateBody(self.body.reader) diff --git a/tests/responses/008.http b/tests/responses/008.http new file mode 100644 index 00000000..6b48a03c Binary files /dev/null and b/tests/responses/008.http differ diff --git a/tests/responses/008.py b/tests/responses/008.py new file mode 100644 index 00000000..f69f2261 --- /dev/null +++ b/tests/responses/008.py @@ -0,0 +1,11 @@ +response = { + "status": "200 OK", + "version": (1, 1), + "headers": [ + ('Content-Type', 'text/html; charset=UTF-8'), + ('Content-Length', '31'), + ('Content-Encoding', 'gzip'), + ('Date', 'Thu, 31 Dec 2009 20:55:48 +0000'), + ], + "body": "hello world" +} diff --git a/tests/treq.py b/tests/treq.py index c600a7a8..58eedd20 100644 --- a/tests/treq.py +++ b/tests/treq.py @@ -336,4 +336,4 @@ def same(self, resp, sizer, matcher, exp): t.eq(resp.version, exp["version"]) t.eq(resp.headers, exp["headers"]) matcher(resp, exp["body"], sizer) - t.eq(resp.trailers, exp.get("trailers", [])) \ No newline at end of file + t.eq(resp.trailers, exp.get("trailers", []))