From aefde242fd7bc6c838107aaa734c8808c5d21fe2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristj=C3=A1n=20Valur=20J=C3=B3nsson?= Date: Sun, 19 Jul 2009 22:29:24 +0000 Subject: porting revision 74098 from trunk: http://bugs.python.org/issue6499 zlib/gzip may not be present for all builds. Make xmlrpclib gracefully not supporg gzip encoding in this case --- Lib/test/test_xmlrpc.py | 6 +++++- Lib/xmlrpc/client.py | 16 +++++++++++++--- Lib/xmlrpc/server.py | 9 +++++++-- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py index fab000d..3ea2e1b 100644 --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -799,7 +799,11 @@ def test_main(): xmlrpc_tests.append(SimpleServerTestCase) xmlrpc_tests.append(KeepaliveServerTestCase1) xmlrpc_tests.append(KeepaliveServerTestCase2) - xmlrpc_tests.append(GzipServerTestCase) + try: + import gzip + xmlrpc_tests.append(GzipServerTestCase) + except ImportError: + pass #gzip not supported in this build xmlrpc_tests.append(ServerProxyTestCase) xmlrpc_tests.append(FailingServerTestCase) xmlrpc_tests.append(CGIHandlerTestCase) diff --git a/Lib/xmlrpc/client.py b/Lib/xmlrpc/client.py index 9f72931..fc32925 100644 --- a/Lib/xmlrpc/client.py +++ b/Lib/xmlrpc/client.py @@ -136,10 +136,13 @@ Exported functions: import re, time, operator import http.client from xml.parsers import expat -import gzip import socket import errno from io import BytesIO +try: + import gzip +except ImportError: + gzip = None #python can be built without zlib/gzip support # -------------------------------------------------------------------- # Internal stuff @@ -1030,6 +1033,8 @@ def gzip_encode(data): Encode data using the gzip content encoding as described in RFC 1952 """ + if not gzip: + raise NotImplementedError f = BytesIO() gzf = gzip.GzipFile(mode="wb", fileobj=f, compresslevel=1) gzf.write(data) @@ -1052,6 +1057,8 @@ def gzip_decode(data): Decode data using the gzip content encoding as described in RFC 1952 """ + if not gzip: + raise NotImplementedError f = BytesIO(data) gzf = gzip.GzipFile(mode="rb", fileobj=f) try: @@ -1076,6 +1083,8 @@ class GzipDecodedResponse(gzip.GzipFile): def __init__(self, response): #response doesn't support tell() and read(), required by #GzipFile + if not gzip: + raise NotImplementedError self.io = BytesIO(response.read()) gzip.GzipFile.__init__(self, mode="rb", fileobj=self.io) @@ -1253,7 +1262,7 @@ class Transport: headers = self._extra_headers[:] if debug: connection.set_debuglevel(1) - if self.accept_gzip_encoding: + if self.accept_gzip_encoding and gzip: connection.putrequest("POST", handler, skip_accept_encoding=True) headers.append(("Accept-Encoding", "gzip")) else: @@ -1285,7 +1294,8 @@ class Transport: def send_content(self, connection, request_body): #optionally encode the request if (self.encode_threshold is not None and - self.encode_threshold < len(request_body)): + self.encode_threshold < len(request_body) and + gzip): connection.putheader("Content-Encoding", "gzip") request_body = gzip_encode(request_body) diff --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py index 273202f..2194775 100644 --- a/Lib/xmlrpc/server.py +++ b/Lib/xmlrpc/server.py @@ -509,8 +509,11 @@ class SimpleXMLRPCRequestHandler(BaseHTTPRequestHandler): if len(response) > self.encode_threshold: q = self.accept_encodings().get("gzip", 0) if q: - response = gzip_encode(response) - self.send_header("Content-Encoding", "gzip") + try: + response = gzip_encode(response) + self.send_header("Content-Encoding", "gzip") + except NotImplementedError: + pass self.send_header("Content-length", str(len(response))) self.end_headers() self.wfile.write(response) @@ -523,6 +526,8 @@ class SimpleXMLRPCRequestHandler(BaseHTTPRequestHandler): if encoding == "gzip": try: return gzip_decode(data) + except NotImplementedError: + self.send_response(501, "encoding %r not supported" % encoding) except ValueError: self.send_response(400, "error decoding gzip content") else: -- cgit v0.12