Sha256: 5dd6157b6d5b55fa1e5e8fcdb1a349f4cd260044b3cfb78093a827a8395d5d62

Contents?: true

Size: 1.92 KB

Versions: 9

Compression:

Stored size: 1.92 KB

Contents

# Copyright (c) 2022 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
# frozen_string_literal: true

require 'contrast/agent/inventory/dependency_usage_analysis'

module Contrast
  module Framework
    module Rails
      module Patch
        # This class acts as our patch into the ActionController::Live::Buffer class, allowing us to track the close
        # event on streamed responses.
        module ActionControllerLiveBuffer
          class << self
            def send_messages
              return unless (context = Contrast::Agent::REQUEST_TRACKER.current)

              [
                context.observed_route
              ].each do |event|
                Contrast::Agent.reporter&.send_event_immediately(event)
              end

              if Contrast::Agent::Reporter.enabled?
                event = Contrast::Agent::Reporting::DtmMessage.dtm_to_event(context.activity)
                Contrast::Agent.reporter&.send_event_immediately(event)
              else
                Contrast::Agent.messaging_queue&.send_event_immediately(context.activity)
              end
            end

            def instrument
              @_instrument ||= begin
                ::ActionController::Live::Buffer.class_eval do
                  # normally pre->in->post filters are applied however, in a streamed response we can run into a case
                  # where it's pre -> in -> post -> more infilters in order to submit anything found during the
                  # infilters after the response has been written we need to explicitly send them
                  alias_method(:cs__close, :close)
                  def close
                    Contrast::Framework::Rails::Patch::ActionControllerLiveBuffer.send_messages
                    cs__close
                  end
                end
                true
              end
            end
          end
        end
      end
    end
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
contrast-agent-6.6.4 lib/contrast/framework/rails/patch/action_controller_live_buffer.rb
contrast-agent-6.6.3 lib/contrast/framework/rails/patch/action_controller_live_buffer.rb
contrast-agent-6.6.2 lib/contrast/framework/rails/patch/action_controller_live_buffer.rb
contrast-agent-6.6.1 lib/contrast/framework/rails/patch/action_controller_live_buffer.rb
contrast-agent-6.6.0 lib/contrast/framework/rails/patch/action_controller_live_buffer.rb
contrast-agent-6.5.1 lib/contrast/framework/rails/patch/action_controller_live_buffer.rb
contrast-agent-6.5.0 lib/contrast/framework/rails/patch/action_controller_live_buffer.rb
contrast-agent-6.4.0 lib/contrast/framework/rails/patch/action_controller_live_buffer.rb
contrast-agent-6.3.0 lib/contrast/framework/rails/patch/action_controller_live_buffer.rb