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

时间:2016-11-23 12:47:38

标签: ruby-on-rails rack-middleware

我已经安装了rack-timeout gem并在初始化器中创建了rack_timeout.rb。我在rack_timeout.rb中设置了Rack :: Timeout.service_timeout = 1.我想限制rack-timeout以在超时超时时暂停执行在api内的控制器以外的控制器中。只有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

配置/ development.rb

config.middleware.use "MyMiddleware"

但它没有工作。机架超时时,超时发生超时时抛出异常。

1 个答案:

答案 0 :(得分:1)

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

我继续进行分叉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

它使用原始的initialize方法并接受2个其他参数:

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

我不建议您定期使用它,因为最好将超时保持在您所请求的任何过程中,但是为了开发和简单起见,就足够了。

更多信息可在回购中找到: