我试图理解一块Rack是如何工作的。
在 lib / rack / 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 :(得分:0)
看起来我的示例中的Rack :: ContentLength类在到达 server.rb 的第344行时将在数组中。该数组通过将false返回respond_to?(:call)
来控制流量。另一方面,logging_middleware不在数组中,并定义了respond_to?(:call)
的lambda对象。
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]
我需要进一步深入了解处理自己数组中这些类的位置/方式,但看起来它不在Rack :: Server.build_app中。