Spec-Zone.ru › Ruby / Rack

class Rack::Events

This middleware provides hooks to certain places in the request /

жизненный цикл ответа. Это позволяет промежуточному ПО, которому не нужно фильтровать данные ответа, безопасно оставить их без изменений и не передавать сообщения по традиционной «цепочке Rack».

События:

  • on_start(request, response)

    Это событие отправляется в начале обработки запроса, до вызова следующего промежуточного ПО в цепочке. Этот метод вызывается с объектом запроса и объектом ответа. В настоящий момент объект ответа всегда равен nil, но в будущем он может стать настоящим объектом ответа.

  • on_commit(request, response)

    Ответ зафиксирован. Приложение вернуло управление, но ответ ещё не отправлен веб-серверу. Этот метод всегда вызывается с объектом запроса и объектом ответа. Объект ответа создаётся на основе тройки Rack, возвращённой приложением. На этом этапе объект ответа ещё можно изменить.

  • on_send(request, response)

    Веб-сервер начал перебирать тело ответа или вызвал потоковое тело и, предположительно, начал передавать данные по сети. Этот метод всегда вызывается с объектом запроса и объектом ответа. Объект ответа создаётся на основе тройки Rack, возвращённой приложением. НЕ СЛЕДУЕТ изменять объект ответа, поскольку веб-сервер уже начал передавать данные. Любые изменения, скорее всего, приведут к исключению.

  • on_finish(request, response)

    Веб-сервер закрыл ответ, и все данные записаны в сокет ответа. На этом этапе объекты запроса и ответа должны быть доступны только для чтения. Тело ответа МОЖЕТ быть недоступно, так как оно могло быть передано в сокет.

  • on_error(request, response, error)

    В приложении или событии ‘on_commit` произошло исключение. Этот метод получает запрос, ответ (если он доступен) и возникшее исключение.

## Порядок

‘on_start` вызывается для обработчиков в том порядке, в котором они переданы конструктору. `on_commit`, on_send`, `on_finish` и `on_error` вызываются в обратном порядке. Обработчики `on_finish` вызываются внутри блока `ensure`, поэтому гарантируется их вызов, даже если возникает исключение. Если исключение возникает в методе `on_finish`, гарантировать уже ничего нельзя.

Общедоступные методы класса

new (app, handlers) Показать исходный код
# File lib/rack/events.rb, line 121
def initialize(app, handlers)
  @app      = app
  @handlers = handlers
end

Общедоступные методы экземпляра

call (env) Показать исходный код
# File lib/rack/events.rb, line 126
def call(env)
  request = make_request env
  on_start request, nil

  begin
    status, headers, body = @app.call request.env
    response = make_response status, headers, body
    on_commit request, response
  rescue StandardError => e
    on_error request, response, e
    on_finish request, response
    raise
  end

  body = EventedBodyProxy.new(body, request, response, @handlers) do
    on_finish request, response
  end
  [response.status, response.headers, body]
end

© 2007-2021 Leah Neukirchen
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API