2016-09-19 2 views
2

Я пытаюсь понять, как работает часть стойки.Как Rack :: Server.build_app добавить промежуточное ПО?

В Lib/стойку/server.rb есть эта линия (344) ...

https://github.com/rack/rack/blob/master/lib/rack/server.rb

middleware = middleware.call(self) if middleware.respond_to?(:call) 

... и это выглядит как часть этой линии будет эквивалентно :

Rack::ContentLength.call(Rack::Server) 

... если мы используем Rack :: ContentLength в качестве промежуточного слоя пример по умолчанию (он выглядит, как он будет один).

https://github.com/rack/rack/blob/master/lib/rack/content_length.rb (строка 14)

Могу ли я читать это правильно, или я что-то пропустил? Похоже, что Rack :: ContentLength a) хочет сначала инициализироваться, и b) хочет другой аргумент для call, поэтому я смущен.

ответ

0

Похоже, что класс Rack :: ContentLength в моем примере будет находиться в массиве, когда он достигнет строки 344 из server.rb. Этот массив управляет потоком, возвращая false в respond_to?(:call). logging_middleware, с другой стороны, не находится в массиве и определяет объект лямбда, который будет respond_to?(:call).

def default_middleware_by_environment 
    m = Hash.new {|h,k| h[k] = []} 
    m["deployment"] = [ 
     [Rack::ContentLength], 
     [Rack::Chunked], 
     logging_middleware, 
     [Rack::TempfileReaper] 
    ] 
    m["development"] = [ 
     [Rack::ContentLength], 
     [Rack::Chunked], 
     logging_middleware, 
     [Rack::ShowExceptions], 
     [Rack::Lint] 

Я буду копать дальше, чтобы понять, где/как эти классы в своих собственных массивах обрабатываются, но, похоже, это не в стойке :: Server.build_app.

Смежные вопросы