gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:43:25 25 4
gpt4 key购买 nike

我想了解 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 使用不同的参数,这就是我感到困惑的原因。

最佳答案

我的示例中的 Rack::ContentLength 类在到达 server.rb 的第 344 行时看起来会在一个数组中。该数组通过向 respond_to?(:call) 返回 false 来控制流。另一方面,logging_middleware 不在数组中,它定义了一个 lambda 对象,它将 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]

我将不得不进一步深入了解它们自己数组中的这些类在何处/如何处理,但看起来它不在 Rack::Server.build_app 中。

关于ruby - Rack::Server.build_app 如何添加中间件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39580105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com