【问题标题】:How does Rack::Server.build_app add middleware?Rack::Server.build_app 如何添加中间件?
【发布时间】:2016-09-19 18:48:51
【问题描述】:

我正在尝试了解 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 的不同参数,这就是我感到困惑的原因。

【问题讨论】:

    标签: ruby rack


    【解决方案1】:

    看起来我的示例中的 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 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-28
      • 2011-07-17
      • 1970-01-01
      • 2011-10-31
      • 2012-07-13
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多