在特定的rails路由中忽略Rack :: Timeout中间

Lun*_*Das 7 ruby-on-rails rack-middleware

我已经安装了rack-timeout gem并在初始化器中创建了rack_timeout.rb.我在Rack_timeout.rb中设置了Rack :: Timeout.service_timeout = 1.我想限制rack-timeout以在执行器超出控制器超时时停止执行api内部的控制器只能停止.我已经在lib里面创建了一个名为my_middleware.rb的自定义中间件.

 class MyMiddleware < Rack::Timeout
  def initialize(app, options = {})
    @app = app
    @exclude = options[:exclude]
  end

  def call(env)
    if env['PATH_INFO'].include? "api"
      super(env)
    else
      @app.call(env)
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

配置/ development.rb

config.middleware.use "MyMiddleware"
Run Code Online (Sandbox Code Playgroud)

但它没有工作.机架超时是在发生超时时抛出异常.

小智 2

非常有趣的问题。在执行请求之外使请求超时并不是一个很好的做法,但似乎没有其他现成的解决方案。

我继续分叉rack_timeout,并根据请求路径添加过滤,稍微根据您的代码。

基本上,它Rack::Timeout随着Select类的扩展而扩展

class Select < Timeout
  def call(env)
    if exclude_or_any?(env) #checking for parameters passed on init
      super(env)
    else
      @app.call(env)
    end
  end
  ...
end
Run Code Online (Sandbox Code Playgroud)

它使用原始的初始化方法并接受 2 个附加参数:

  • exclude: ["paths", "to", "exclude"]- 不要对来自包含所提供字符串的路径的请求运行超时。
  • only: ["only_timeout_this"]- 仅处理来自这些路径的请求。

我不建议定期使用它,因为最好将超时保持在您请求的任何进程内,但为了开发和简单性,它应该足够了。

存储库中提供了更多信息: