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`, гарантировать уже ничего нельзя.
Общедоступные методы класса
# File lib/rack/events.rb, line 121 def initialize(app, handlers) @app = app @handlers = handlers end
Общедоступные методы экземпляра
# 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.