Class: Julewire::Rails::RequestMiddleware

Inherits:
Object
  • Object
show all
Defined in:
lib/julewire/rails/request_middleware.rb

Constant Summary collapse

REQUEST_ERROR_ENV_KEY =
"julewire.rails.request_error"
RENDERED_EXCEPTION_ENV_KEY =
"julewire.rails.rendered_exception"

Instance Method Summary collapse

Constructor Details

#initialize(app, configuration = Configuration.new, taggers = nil) ⇒ RequestMiddleware

Returns a new instance of RequestMiddleware.



14
15
16
17
18
# File 'lib/julewire/rails/request_middleware.rb', line 14

def initialize(app, configuration = Configuration.new, taggers = nil)
  @app = app
  @configuration = configuration
  @taggers = taggers || []
end

Instance Method Details

#call(env) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/julewire/rails/request_middleware.rb', line 20

def call(env)
  lifecycle = nil
  request = ::ActionDispatch::Request.new(env)
  RequestErrorOwnership.clear
  return Suppression.suppress { @app.call(env) } if excluded_request?(request)

  lifecycle = RequestLifecycle.new(
    configuration: @configuration,
    env: env,
    request: request,
    taggers: @taggers
  ).start
  request_context = RequestContext.new(configuration: @configuration, request: request)

  response = request_context.call do
    execution_handle = lifecycle.start_execution!(neutral: request_context.neutral_fields)
    execution_handle.run do
      call_app(request, env, execution_handle)
    end
  end

  lifecycle.attach_body_finalizer(response)
rescue Exception => e # rubocop:disable Lint/RescueException -- Rack middleware must re-raise all application exits.
  lifecycle&.finish_error(e)
  raise
ensure
  lifecycle&.finish_unattached
end