В конце концов я обнаружил, что использование rack-async с async_sinatra вызывает проблемы с 404 страницами, обработкой исключений и ведением журнала:
!! Unexpected error while processing request: undefined method `bytesize' for nil:NilClass
Вместо этого я использовал следующую оболочку aroute
для регистрации:
module Sinatra::Async
alias :oldaroute :aroute
def aroute verb, path, opts = {}, &block
# Based on aroute from async_sinatra
run_method = :"RunA#{verb} #{path} #{opts.hash}"
define_method run_method, &block
log_method = :"LogA#{verb} #{path} #{opts.hash}"
define_method(log_method) { |*a|
puts "#{request.ip} - #{status} #{verb} #{path}"
}
oldaroute verb, path, opts do |*a|
oldcb = request.env['async.callback']
request.env['async.callback'] = proc { |*args|
async_runner(log_method, *a)
oldcb[*args]
}
async_runner(run_method, *a)
end
end
end
Это для тех же версий async_sinatra, Thin и Rack, которые я использовал, когда задавал этот вопрос в прошлом году; более новые версии могут разрешать использование общего промежуточного программного обеспечения Rack для регистрации.