GNUmakefile: no news yet...
[metropolis.git] / lib / metropolis / gzip.rb
blobb3191dcedf73444e81e619b7e429b8a2129ea58d
1 # -*- encoding: binary -*-
2 require "zlib"
4 # allows storing pre-gzipped data on disk and serving it
5 # as-is for clients that accept that gzip encoding
6 module Metropolis::Gzip
7   def get(key, env)
8     status, headers, body = r = super
9     if 200 == status && /\bgzip\b/ !~ env['HTTP_ACCEPT_ENCODING']
10       body[0] = Zlib::GzipReader.new(StringIO.new(body[0])).read
11       headers['Content-Length'] = body[0].size.to_s
12       headers.delete('Content-Encoding')
13       headers.delete('Vary')
14     end
15     r
16   end
18   def put(key, env)
19     Wrapper.new(env) if 'gzip' != env['HTTP_CONTENT_ENCODING']
20     super(key, env)
21   end
23   def self.extended(obj)
24     obj.instance_eval do
25       @headers['Content-Encoding'] = 'gzip'
26       @headers['Vary'] = 'Accept-Encoding'
27     end
28   end
30   class Wrapper < Metropolis::InputWrapper
32     def read_all
33       zipped = StringIO.new("")
34       Zlib::GzipWriter.wrap(zipped) { |io| io.write(@input.read) }
35       zipped.string
36     end
37   end
38 end