From 3f821a4cb7b50e542dd7828d1e507b76e18ecfb5 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 13 Jan 2011 17:27:00 -0800 Subject: add suffix_mime output filter It's faster than doing it via real Rack middleware. --- lib/metropolis.rb | 1 + lib/metropolis/common.rb | 3 +++ lib/metropolis/suffix_mime.rb | 18 ++++++++++++++++++ test/rack_read_write.rb | 23 +++++++++++++++++++++++ 4 files changed, 45 insertions(+) create mode 100644 lib/metropolis/suffix_mime.rb 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 -- cgit v1.2.3-24-ge0c7