Rack :: Server.build_app如何添加中间件?

时间:2016-09-19 18:48:51

标签: ruby rack

我试图理解一块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的不同参数,这就是为什么我感到困惑。

1 个答案:

答案 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中。