]> git.openstreetmap.org Git - rails.git/blobdiff - vendor/plugins/output_compression/lib/output_compression.rb
Import the output_compression plugin as the SVN external never works.
[rails.git] / 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 (file)
index 0000000..c7652ae
--- /dev/null
@@ -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