mirror of
https://github.com/sinatra/sinatra
synced 2023-03-27 23:18:01 -04:00
c1aa6663a5
Moved Rack middleware management into Sinatra::Application and enabled support for assembling custom Rack middleware pipelines before an app. require 'sinatra' use Rack::Lint use Rack::Authentication get '/' do "Hello, World" end Assuming a default set of options, this would result in the following pipeline leading to the application: CommonLogger -> Lint -> Authentication -> Application (The Rack::CommonLogger middleware is created automatically when the :logging option is enabled.) Also worth noting is that the pipeline leading to the application is reassembled on each request during reload in :development mode.
66 lines
2 KiB
Ruby
66 lines
2 KiB
Ruby
require File.dirname(__FILE__) + '/helper'
|
|
|
|
class UpcaseMiddleware
|
|
def initialize(app, *args, &block)
|
|
@app = app
|
|
@args = args
|
|
@block = block
|
|
end
|
|
def call(env)
|
|
env['PATH_INFO'] = env['PATH_INFO'].to_s.upcase
|
|
@app.call(env)
|
|
end
|
|
end
|
|
|
|
context "Middleware Pipelines" do
|
|
|
|
setup do
|
|
Sinatra.application = nil
|
|
@app = Sinatra.application
|
|
end
|
|
|
|
teardown do
|
|
Sinatra.application = nil
|
|
end
|
|
|
|
specify "includes default middleware with options set" do
|
|
@app.set_options :sessions => true, :logging => true
|
|
@app.send(:optional_middleware).should.include([Rack::Session::Cookie, [], nil])
|
|
@app.send(:optional_middleware).should.include([Rack::CommonLogger, [], nil])
|
|
end
|
|
|
|
specify "does not include default middleware with options unset" do
|
|
@app.set_options :sessions => false, :logging => false
|
|
@app.send(:optional_middleware).should.not.include([Rack::Session::Cookie, [], nil])
|
|
@app.send(:optional_middleware).should.not.include([Rack::CommonLogger, [], nil])
|
|
end
|
|
|
|
specify "includes only optional middleware when no explicit middleware added" do
|
|
@app.set_options :sessions => true, :logging => true
|
|
@app.send(:middleware).should.equal @app.send(:optional_middleware)
|
|
end
|
|
|
|
specify "should clear middleware before reload" do
|
|
@app.clearables.should.include(@app.send(:explicit_middleware))
|
|
end
|
|
|
|
specify "should add middleware with use" do
|
|
block = Proc.new { |env| }
|
|
@app.use UpcaseMiddleware
|
|
@app.use UpcaseMiddleware, "foo", "bar"
|
|
@app.use UpcaseMiddleware, "foo", "bar", &block
|
|
@app.send(:middleware).should.include([UpcaseMiddleware, [], nil])
|
|
@app.send(:middleware).should.include([UpcaseMiddleware, ["foo", "bar"], nil])
|
|
@app.send(:middleware).should.include([UpcaseMiddleware, ["foo", "bar"], block])
|
|
end
|
|
|
|
specify "should run middleware added with use" do
|
|
get('/foo') { "FAIL!" }
|
|
get('/FOO') { "PASS!" }
|
|
use UpcaseMiddleware
|
|
get_it '/foo'
|
|
should.be.ok
|
|
body.should.equal "PASS!"
|
|
end
|
|
|
|
end
|