2016-09-19 2 views
2

저는 랙 조각이 어떻게 작동하는지 이해하려고합니다.Rack :: Server.build_app는 미들웨어를 어떻게 추가합니까?

lib 디렉토리/랙이 라인 (344)이있다/server.rb]로에서

...

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

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

... 그리고 그 라인의 일부에 해당 될 것 같습니다 : 우리는 예를 들어 기본 미들웨어로 랙 :: ContentLength을 사용하는 경우

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

은 (는 하나가 될 것이다 것 같습니다).

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.

관련 문제