2016-09-19 9 views
2

私はRackの仕組みを理解しようとしています。 のlib /ラック/ server.rbRack :: Server.build_appはどのようにミドルウェアを追加しますか?

このライン(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をデフォルトのミドルウェアの例(それは1つのように見えます)。

https://github.com/rack/rack/blob/master/lib/rack/content_length.rb (ライン14)

は、私がこれを正しく読んでいる、または私が何かを見逃していますか? Rack :: ContentLength a)が最初に初期化されたいと思っていて、b)callのために別の引数を必要としているように見えます。それが私が混乱している理由です。

答えて

0

私の例のRack :: ContentLengthクラスは、server.rbという行344に到達すると配列になるようです。その配列は、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。

関連する問題