mod-python-windows

mod-python-windows Git Source Tree


Root/examples/gzipfilter.py

#
# 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()

Archive Download this file

Branches

Number of commits:
Page rendered in 0.07697s using 11 queries.