# $Id: gzipfilter.py 106619 2004-11-25 22:10:52Z nd $ # # Usage: # <Directory /where/ever> # PythonOutputFilter gzipfilter # SetOutputFilter gzipfilter # </Directory> from mod_python import apache import os import sys import gzip import cStringIO from mod_python import apache def compress(s): sio = cStringIO.StringIO() f = gzip.GzipFile(mode='wb', fileobj=sio) f.write(s) f.close() return sio.getvalue() def accepts_gzip(req): if req.headers_in.has_key('accept-encoding'): encodings = req.headers_in['accept-encoding'] return (encodings.find("gzip") != -1) return 0 ### ### main filter function ### def outputfilter(filter): if (filter.req.main or not accepts_gzip(filter.req)): # Presense of filter.req.main tells us that # we are in a subrequest. We don't want to compress # the data more than once, so we pass_on() in # subrequests. We also pass_on() if the client # does not accept gzip encoding, of course. filter.pass_on() else: if not filter.req.sent_bodyct: # the above test allows us to set the encoding once # rather than every time the filter is invoked filter.req.headers_out['content-encoding'] = 'gzip' # loop through content, compressing s = filter.read() while s: s = compress(s) filter.write(s) s = filter.read() if s is None: # this means we received an EOS, so we pass it on # by closing the filter filter.close()