Sinatra response.status в фильтрах "после" - PullRequest
1 голос
/ 21 февраля 2012

По какой-то причине в фильтре Sinatra «после» я не могу получить доступ к текущему коду состояния

require 'rubygems'
require 'sinatra'

after do
  puts "After hook with code: #{response.status}"
end

get '/hi' do
  halt(401, "wtf?")
end

При запуске curl 127.0.0.1:4567/hi это приводит к:

After hook for code: 200

1 Ответ

3 голосов
/ 21 февраля 2012

Это в основном функция того, как методы реализованы в Синатре. Методы, на которые мы должны обратить внимание: call!, invoke и dispatch!, все методы в Sinatra :: Base (по состоянию на v1.3.2).

call! - метод верхнего уровня, и там он вызывает следующую строку кода:

invoke { dispatch! }

Теперь invoke выглядит так:

def invoke
  res = catch(:halt) { yield }
  res = [res] if Fixnum === res or String === res
  if Array === res and Fixnum === res.first
    status(res.shift)
    body(res.pop)
    headers(*res)
  elsif res.respond_to? :each
    body res
  end
end

На самом деле он устанавливает код ответа на основе того, что вы throw используете :halt. И dispatch! выглядит так:

def dispatch!
  static! if settings.static? && (request.get? || request.head?)
  filter! :before
  route!
rescue ::Exception => boom
  handle_exception!(boom)
ensure
  filter! :after unless env['sinatra.static_file']
end

Видите этот ensure блок? Это запускается как символ :halt, который был thrown, пропускает трассировку стека. Важно отметить, что это до кода настройки состояния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...