Meddler

Hey, someone meddled with my middleware!

This lets you have on_request and on_response wrappers around a builder, and optionally skip them in either case. It also gives you before and after even hooks, to do something else awesome before you proceed.

Why?

There’s a few reasons you might want to do this. One is that you may have an expensive sub stack that only needs to run on specifiec urls, or you may want to make something available only to part of the userbase. Here’s an example:

require 'meddler'
use Meddler::Builder do
  on_request {|req| req.will_be_expensive? }
  use ExpensiveMiddleware
  use AnotherExpensiveMiddleware
end

Or perhaps you want to give all of your developers Rack::Bug even in production.

require 'meddler'
use Meddler::Builder do
  on_request do |req|
    req.env['warden'].authenticate
    user = req.env['warden'].user
    user && user.staff_developer?
  end
  use Rack::Bug
end

Usage

In your rackup file, do this:

require 'meddler'
use Meddler::Builder do
  on_request {|req| req.post?}
  before {|req| puts "yup, we passed, and now we're onto passing in the request"}
  use MungePostMiddleware
end

Or, on response

require 'meddler'
use Meddler::Builder do
  on_response {|resp| resp.status == 200}
  after {|req| puts "yup, we passed, just about to pass the response back to the middleware stack in here"}
  use MiddlewareThatLikesOkThings
end

You can have as many on_request and on_response as you’d like, and processing will stop on the first one that returns false. before and after hooks will get called in order and be called with an instance of Rack::Request and Rack::Response respectively.