= New Features * A default_status plugin has been added for changing the default status for responses. Previously, the default status was hard coded to 200, this plugin allows you to change it. The plugin takes a block which is instance_evaled in the context of the response: plugin :default_status do headers['Content-Type'] == 'foo' ? 201 : 200 end Note that the default status for empty responses (used when no route handles the response) is still 404, this just changes the default for non-empty responses. * A response_request plugin has been added for giving the response instance access to the related request. This can be useful in conjunction with the default_status plugin, if you want the default status of the response to depend on the request, such as using a different status for different request methods: plugin :response_request plugin :default_status do request.post? ? 201 : 200 end * A run_handler plugin has been added, for modifying rack response arrays before returning them when using r.run. Additionally, it allows for continuing with routing if the response returned by r.run is a 404 response, using the :not_found=>:pass option: plugin :run_handler route do |r| # Keep running code if RackAppFoo returns a 404 response r.run RackAppFoo, :not_found=>:pass # Change response status codes before returning. r.run(RackAppBar) do |response| response[0] = 200 if response[0] == 201 end end * Roda.rewite_path in the path_rewriter extension now accepts a block to allow for dynamic replacements. The block is yielded a MatchData instance: rewrite_path(/\A\/a/(\w+)/){|match| match[1].capitalize} # PATH_INFO '/a/moo' => remaining_path '/a/Moo' rewrite_path(/\A\/a/(\w+)/, :path_info => true) do |match| match[1].capitalize end # PATH_INFO '/a/moo' => PATH_INFO '/a/Moo' * The :host matcher in the header_matchers plugin will now yield the regexp captures to the block if given a regexp when the :host_matcher_captures application option is set. This behavior will become the default behavior in Roda 3. This will allow for code like: opts[:host_matcher_captures] = true route do |r| r.on :host=>/\A(\w+).example.com\z/ do |subdomain| # ... end end = Other Improvements * RodaCache now uses a mutex to synchronize access on MRI. Previously, it relied on the global interpreter lock, but testing has shown that is not reliable in all cases. RodaCache has always used a mutex for synchronization on other ruby implementations, this just extends that code to MRI as well.