about summary refs log tree commit
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2011-01-13 17:27:00 -0800
committerEric Wong <normalperson@yhbt.net>2011-01-13 17:27:00 -0800
commit3f821a4cb7b50e542dd7828d1e507b76e18ecfb5 (patch)
treeb86584668b1d5a30e1f560756b0387dcab2e0a29
parentd4c2bb35f17e00c528f0cea722b4695af9076a09 (diff)
downloadmetropolis-3f821a4cb7b50e542dd7828d1e507b76e18ecfb5.tar.gz
add suffix_mime output filter
It's faster than doing it via real Rack middleware.
-rw-r--r--lib/metropolis.rb1
-rw-r--r--lib/metropolis/common.rb3
-rw-r--r--lib/metropolis/suffix_mime.rb18
-rw-r--r--test/rack_read_write.rb23
4 files changed, 45 insertions, 0 deletions
diff --git a/lib/metropolis.rb b/lib/metropolis.rb
index 51758b5..284cd30 100644
--- a/lib/metropolis.rb
+++ b/lib/metropolis.rb
@@ -14,6 +14,7 @@ module Metropolis
   autoload :Hash, 'metropolis/hash'
   autoload :TDB, 'metropolis/tdb'
   autoload :MultiHash, 'metropolis/multi_hash'
+  autoload :SuffixMime, 'metropolis/suffix_mime'
 
   def self.new(opts = {})
     opts = opts.dup
diff --git a/lib/metropolis/common.rb b/lib/metropolis/common.rb
index d9cadba..a6688f3 100644
--- a/lib/metropolis/common.rb
+++ b/lib/metropolis/common.rb
@@ -33,6 +33,9 @@ module Metropolis::Common
     else
       raise ArgumentError, "unsupported encoding"
     end
+    if filters = opts[:use]
+      Array(filters).each { |filter| extend filter }
+    end
   end
 
   def r(code, body = nil)
diff --git a/lib/metropolis/suffix_mime.rb b/lib/metropolis/suffix_mime.rb
new file mode 100644
index 0000000..76a3f96
--- /dev/null
+++ b/lib/metropolis/suffix_mime.rb
@@ -0,0 +1,18 @@
+module Metropolis::SuffixMime
+  MIME_TYPES = Rack::Mime::MIME_TYPES
+
+  def get(key, env)
+    set_mime(key, super)
+  end
+
+  def head(key, env)
+    set_mime(key, super)
+  end
+
+  def set_mime(key, response)
+    status, headers, _ = response
+    200 == status && /(\.[^\.]+)\z/ =~ key and
+      type = MIME_TYPES[$1] and headers["Content-Type"] = type
+    response
+  end
+end
diff --git a/test/rack_read_write.rb b/test/rack_read_write.rb
index 9031b6d..5cf102c 100644
--- a/test/rack_read_write.rb
+++ b/test/rack_read_write.rb
@@ -7,6 +7,29 @@ require 'rack'
 module TestRackReadWrite
   attr_reader :app
 
+  def test_rack_read_write_suffix_mime
+    @app = Metropolis.new(@app_opts.merge(:encoding => :deflate,
+                                          :use => Metropolis::SuffixMime))
+    basic_rest
+
+    o = { :lint => true, :fatal => true }
+    req = Rack::MockRequest.new(@app)
+    r = req.put("/asdf.jpg", o.merge(:input => "ASDF"))
+    assert_equal 201, r.status
+    assert_equal "text/plain", r.headers["Content-Type"]
+    assert_equal "Created\n", r.body
+
+    r = req.get("/asdf.jpg")
+    assert_equal 200, r.status
+    assert_equal "image/jpeg", r.headers["Content-Type"]
+    assert_equal "ASDF", r.body
+
+    r = req.request("HEAD", "/asdf.jpg")
+    assert_equal 200, r.status
+    assert_equal "image/jpeg", r.headers["Content-Type"]
+    assert_equal "", r.body
+  end
+
   def test_rack_read_write_deflated
     @app = Metropolis.new(@app_opts.merge(:encoding => :deflate))
     basic_rest