web-dev-qa-db-ja.com

一般的なラックアプリケーションでミドルウェアの注文リストを取得しますか?

私が探している機能は、一般的なラックアプリケーションを除いて、Railsのrake middlewareコマンドに似ています。

27
Buzzy

これにより、すべてのラックアプリケーション(ミドルウェアを含む)のリストが返されます。

require 'rack'

def middleware_classes(app)                                                                                                                                              
  r = [app]

  while ((next_app = r.last.instance_variable_get(:@app)) != nil)
    r << next_app
  end

  r.map{|e| e.instance_variable_defined?(:@app) ? e.class : e }
end

app = Rack::Builder.parse_file('config.ru').first

p middleware_classes(app)
18
Michael Hale
$ rake middleware

use ActionDispatch::Static
use Rack::Lock
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x007ffd148f9468>
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use ActionDispatch::DebugExceptions
use ActionDispatch::RemoteIp
use ActionDispatch::Reloader
use ActionDispatch::Callbacks
use ActiveRecord::Migration::CheckPending
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use ActionDispatch::ParamsParser
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
run RackTest::Application.routes

http://pothibo.com/2013/11/Ruby-on-Rails-inside-actiondispatch-and-rack/

29
Peter Ehrlich

Sinatra::Baseを拡張するSinatraアプリを使用している場合は、MichaelHaleの回答を少し変更したバージョンを使用する必要がありました。

require 'rack'
​
def middleware_classes(app)
  r = [app]
  ​
  while ((next_app = r.last.instance_variable_get(:@app)) != nil)
    r << next_app
  end
  ​
  r.map{|e| e.instance_variable_defined?(:@app) ? e.class : e }
end
​
sinatra_app = Rack::Builder.parse_file('config.ru').first
sinatra_rack_builder = sinatra_app.build(sinatra_app)
sinatra_extended_app = sinatra_rack_builder.to_app
rack_app = sinatra_extended_app.app

pp middleware_classes(rack_app)

これをdump_middleware.rbなどのファイルに入れた後、期待どおりにミドルウェアを確認できました。

$ bundle exec Ruby ./dump_middleware.rb
[Rack::Head,
 Rack::NullLogger,
 Rack::Session::Cookie,
 Rack::Protection::FrameOptions,
 Rack::Protection::HttpOrigin,
 Rack::Protection::IPSpoofing,
 Rack::Protection::JsonCsrf,
 Rack::Protection::PathTraversal,
 Rack::Protection::RemoteToken,
 Rack::Protection::SessionHijacking,
 Rack::Protection::XSSHeader,
 Warden::Manager,
 SinatraApp]

これを行うためのよりクリーンな方法があるかもしれません。

0
AlanFoster