代码之家  ›  专栏  ›  技术社区  ›  Buzzy

获取通用机架应用程序中中间件的有序列表?

  •  24
  • Buzzy  · 技术社区  · 14 年前

    rake middleware Rails中的命令,通用机架应用程序除外。

    3 回复  |  直到 9 年前
        1
  •  18
  •   Gavin Miller    10 年前

    这将返回所有机架应用程序(包括中间件)的列表:

    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)
    
        2
  •  36
  •   grepsedawk    5 年前
    $ 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/

        3
  •  0
  •   AlanFoster    4 年前

    Sinatra::Base ,我不得不用一个稍微修改过的版本来回答迈克尔·黑尔的问题:

    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]
    

        4
  •  -4
  •   Vassilis    11 年前

    我知道,这早就应该了

    here's a nice thread

    根据Marc Andre的评论更新:

    link

    Rack没有这样的机制,而且并不是所有的中间件都是通过@middleware添加的,所以Sinatra无法告诉您使用了什么中间件。顺便说一句,rails也不能告诉你什么是可能的。中间件不必是线性列表(即,当使用机架路由器或其他东西时)。