diff options
author | Eric Wong <normalperson@yhbt.net> | 2011-01-13 17:27:00 -0800 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2011-01-13 17:27:00 -0800 |
commit | 3f821a4cb7b50e542dd7828d1e507b76e18ecfb5 (patch) | |
tree | b86584668b1d5a30e1f560756b0387dcab2e0a29 | |
parent | d4c2bb35f17e00c528f0cea722b4695af9076a09 (diff) | |
download | metropolis-3f821a4cb7b50e542dd7828d1e507b76e18ecfb5.tar.gz |
add suffix_mime output filter
It's faster than doing it via real Rack middleware.
-rw-r--r-- | lib/metropolis.rb | 1 | ||||
-rw-r--r-- | lib/metropolis/common.rb | 3 | ||||
-rw-r--r-- | lib/metropolis/suffix_mime.rb | 18 | ||||
-rw-r--r-- | test/rack_read_write.rb | 23 |
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 |