X-Git-Url: https://git.openstreetmap.org/rails.git/blobdiff_plain/06f38caccbdc758c60aaed21003f8e0e52400b35..4bc8fcf5b499a490db044fba936e01384d01d803:/vendor/plugins/output_compression/lib/output_compression.rb diff --git a/vendor/plugins/output_compression/lib/output_compression.rb b/vendor/plugins/output_compression/lib/output_compression.rb new file mode 100644 index 000000000..c7652ae1d --- /dev/null +++ b/vendor/plugins/output_compression/lib/output_compression.rb @@ -0,0 +1,66 @@ +# OutputCompression +# Rails output compression filters +# +# Adds two classmethods to ActionController that can be used as after-filters: +# strip_whitespace and compress_output. +# If you use page-caching, you MUST specify the compress_output filter AFTER +# caches_page, otherwise the compressed data will be cached instead of the HTML +# +# class MyController < ApplicationController +# after_filter :strip_whitespace +# caches_page :index +# after_filter :compress_output +# end + +begin + require 'zlib' + require 'stringio' + GZIP_SUPPORTED = true +rescue + GZIP_SUPPORTED = false +end + +module CompressionSystem + def compress_output + return unless accepts_gzip? + output = StringIO.new + def output.close + # Zlib does a close. Bad Zlib... + rewind + end + gz = Zlib::GzipWriter.new(output) + gz.write(response.body) + gz.close + if output.length < response.body.length + @old_response_body = response.body + response.body = output.string + response.headers['Content-encoding'] = @compression_encoding + end + end + + def accepts_gzip? + return false unless GZIP_SUPPORTED + accepts = request.env['HTTP_ACCEPT_ENCODING'] + return false unless accepts && accepts =~ /(x-gzip|gzip)/ + @compression_encoding = $1 + true + end + + def strip_whitespace + response.body.gsub!(/()|(.*?<\/script>)|()|()|\s+/m) do |m| + if m =~ /^()(.*?)<\/script>$/m + $1 + $2.strip.gsub(/\s+/, ' ').gsub('',"\n-->") + '' + elsif m =~ /^$/m + '' + elsif m =~ /^<(textarea|pre)/ + m + else ' ' + end + end + response.body.gsub! /\s+\s+/, '>' + end +end + +class ActionController::Base + include CompressionSystem +end \ No newline at end of file