Rack::timout
https://github.com/zombocom/rack-timeout
Rack::Timeout is not a solution to the problem of long-running requests, it's a debug and remediation tool
記事
Rack::Timeoutによるリクエストタイムアウトの仕組み
注意
Rack::timoutより以前に読み込まれたmiddlewareでReDoSが発生した場合はタイムアウト出来ない
確認コード(Github)
code:config.ru
require "rack-timeout"
class Redos
def initialize(app, options = {})
@app = app
end
def call(env)
("\t" * 100000 +"\ta,a\t").split(/\s*,\s*/)
@app.call(env)
end
end
class Server
def call(env)
[200, {}, []]
end
end
# use Redos # Rack::Timeoutでのタイムアウトが動作しない
use Rack::Timeout, service_timeout: 5
use Redos # Rack::Timeoutでのタイムアウトが動作する
run Server.new
Rack::Timeoutより後のmiddlewareで発生したReDoSに対してはタイムアウトが機能する
code:log
❯ bundle exec puma
...
2023-02-24 23:02:30 +0900 Rack app ("GET /" - (127.0.0.1)): #<Rack::Timeout::RequestTimeoutError: Request ran for longer than 5000ms >
^C- Gracefully stopping, waiting for requests to finish
#Rack