From 5c0a3965cdb9cac87d0b0ea773a6276c73a27ba6 Mon Sep 17 00:00:00 2001 From: Helmut Grohne Date: Sun, 29 Mar 2009 17:42:48 +0200 Subject: quite some changes for py3 These changes introduce some compatibility code. They don't make wsgitools usable with Python 3.0, but they also don't break compatibility with Python 2.5. --- wsgitools/filters.py | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) (limited to 'wsgitools/filters.py') diff --git a/wsgitools/filters.py b/wsgitools/filters.py index 5821c00..5b97e27 100644 --- a/wsgitools/filters.py +++ b/wsgitools/filters.py @@ -11,9 +11,18 @@ import sys import time import gzip try: - import cStringIO as StringIO -except ImportError: - import StringIO + import io +except NameError: + try: + import cStringIO as io + except ImportError: + import StringIO as io + +try: + next +except NameError: + def next(it): + return it.next() __all__.append("CloseableIterator") class CloseableIterator: @@ -26,7 +35,7 @@ class CloseableIterator: """ if close_function is not None: self.close = close_function - self.iterators = map(iter, iterators) + self.iterators = list(map(iter, iterators)) def __iter__(self): """iterator interface @rtype: gen() @@ -37,10 +46,10 @@ class CloseableIterator: if not self.iterators: raise StopIteration try: - return self.iterators[0].next() + return next(self.iterators[0]) except StopIteration: self.iterators.pop(0) - return self.next() + return next(self) __all__.append("CloseableList") class CloseableList(list): @@ -165,7 +174,7 @@ class WSGIFilterMiddleware: exc_info = reqfilter.filter_exc_info(exc_info) status = reqfilter.filter_status(status) headers = (reqfilter.filter_header(h, v) for h, v in headers) - headers = filter(None, headers) + headers = [h for h in headers if h] headers = reqfilter.filter_headers(headers) write = start_response(status, headers, exc_info) def modified_write(data): @@ -180,7 +189,8 @@ class WSGIFilterMiddleware: getattr(ret, "close", lambda:0)() if isinstance(ret, list): - return CloseableList(modified_close, map(reqfilter.filter_data, ret) + return CloseableList(modified_close, + list(map(reqfilter.filter_data, ret)) + list(reqfilter.append_data())) ret = iter(ret) def late_append_data(): @@ -257,7 +267,7 @@ class RequestLogWSGIFilter(BaseWSGIFilter): line = '%s "%s"' % (line, self.useragent) else: line += " -" - print >> self.log, line + self.log.write("%s\n", line) __all__.append("TimerWSGIFilter") class TimerWSGIFilter(BaseWSGIFilter): @@ -357,7 +367,7 @@ class GzipWSGIFilter(BaseWSGIFilter): acceptenc = map(str.strip, acceptenc) if "gzip" in acceptenc: self.compress = True - self.sio = StringIO.StringIO() + self.sio = io.StringIO() self.gzip = gzip.GzipFile(fileobj=self.sio, mode="w") return environ def filter_header(self, headername, headervalue): @@ -434,12 +444,12 @@ class ReusableWSGIInputFilter(BaseWSGIFilter): @type environ: {str: str} """ - if isinstance(environ["wsgi.input"], StringIO): + if isinstance(environ["wsgi.input"], io.StringIO): return environ # nothing to be done # XXX: is this really a good idea? use with care environ["wsgitools.oldinput"] = environ["wsgi.input"] - data = StringIO(environ["wsgi.input"].read(self.maxrequestsize)) + data = io.StringIO(environ["wsgi.input"].read(self.maxrequestsize)) environ["wsgi.input"] = data return environ -- cgit v1.2.3