gzipcherrypyyslow

tools.gzip appears not to compress content in cherrypy


I'm reviewing my development site with the Yslow tool under Chrome and Firefox, and one of the suggestions is that I gzip appropriate content. As a starting point I just added "tools.gzip.on = True" to my [/] configuration. I know the configuration file and block are being parsed correctly, because I also added options to disable caching in the response headers, since I'm changing the files frequently as I develop the site. I am seeing "Expires" and "Pragma: no-cache" headers in my responses.

For some reason, even after changing the configuration file (and restarting the process, which isn't strictly necessary), Yslow still reports that I'm not using gzip. I've also been using wget and see no Content-Encoding header.

Can anyone suggest how else I might verify what's going on? I'm wondering whether the issue is cherrypy ignoring the gzip setting, or Yslow just getting its facts wrong. I've never had trouble with Yslow before, so I lean toward the former.

I'll add that Yslow is only reporting that my external CSS and JavaScript files (served by the same cherrypy process) need to be compressed, even though the headers shown by "wget -S" don't show gzip encoding even on the main page itself (which is dynamic content).

I've tried adding "tools.gzip.on = True" to my [/css] and [/js] blocks, and I've also tried setting "tools.encode.on = True" in all of the same blocks, thinking perhaps encoding had to be enabled for gzip to work.

Thanks in advance.


Solution

  • The 3.2 docstring for cherrypy.lib.gzip:

    def gzip(compress_level=5, mime_types=['text/html', 'text/plain'], debug=False):
        """Try to gzip the response body if Content-Type in mime_types.
    
        cherrypy.response.headers['Content-Type'] must be set to one of the
        values in the mime_types arg before calling this function.
    
        The provided list of mime-types must be of one of the following form:
            * type/subtype
            * type/*
            * type/*+subtype
    
        No compression is performed if any of the following hold:
            * The client sends no Accept-Encoding request header
            * No 'gzip' or 'x-gzip' is present in the Accept-Encoding header
            * No 'gzip' or 'x-gzip' with a qvalue > 0 is present
            * The 'identity' value is given with a qvalue > 0.
    
        """
    

    My money's on the MIME type, since you mention JS and CSS. You can change that thusly:

    [/static]
    tools.gzip.mime_types: ['text/html', 'text/plain', 'text/javascript', 'text/css']
    

    In CherryPy 3.2+, you can shorten that to:

    [/static]
    tools.gzip.mime_types: ['text/*']