Description
Content negotiation for Rack applications, including a Rails-style respond_to block.
Features
-
Allows both file-extension-based and Accept: header-based content negotiation
-
Allows certain routes to pass through without negotiation (useful for static files, etc.)
-
Falls back to a pre-set type if negotiation fails
-
Injects a respond_to method with default handler into the application's namespace
-
Injects negotiated_type, negotiated_ext, and negotiated? methods both into the application and into Rack::Request
Sinatra Example
require 'sinatra'
require 'rack/conneg'
use(Rack::Conneg) { |conneg|
conneg.set :accept_all_extensions, false
conneg.set :fallback, :html
conneg.ignore('/stylesheets/')
conneg.ignore_contents_of(File.join(File.dirname(__FILE__),'public'))
conneg.provide([:json, :xml])
}
before do
if negotiated?
content_type negotiated_type
end
end
get '/hello' do
response = { :message => 'Hello, World!' }
respond_to do |wants|
wants.json { response.to_json }
wants.xml { response.to_xml }
wants.other {
content_type 'text/plain'
error 406, "Not Acceptable"
}
end
end
Release History
-
0.1.2 - Initial release
-
0.1.3 - Added proper RegExp escaping to match content types with + in them
-
0.1.4 - Added ignore_contents_of() to recursively ignore directory contents and negotiated? method to determine if negotiation took place
-
0.1.5 - Allow negotiation to fall back if no Accept: header supplied
-
0.1.6 - Add license