Sha256: 0c39919f999c578e9cf50273e4792f7990971c99a6a20a3fdaba7225c367fb09

Contents?: true

Size: 1.15 KB

Versions: 5

Compression:

Stored size: 1.15 KB

Contents

# frozen_string_literal: true

require_relative 'gateway/request'
require_relative '../../instrumentation/gateway'
require_relative '../../response'

module Datadog
  module AppSec
    module Contrib
      module Rack
        # Rack request body middleware for AppSec
        # This should be inserted just below Rack::JSONBodyParser or
        # legacy Rack::PostBodyContentTypeParser from rack-contrib
        class RequestBodyMiddleware
          def initialize(app, opt = {})
            @app = app
          end

          def call(env)
            context = env['datadog.waf.context']

            return @app.call(env) unless context

            # TODO: handle exceptions, except for @app.call

            request_return, request_response = Instrumentation.gateway.push(
              'rack.request.body',
              Gateway::Request.new(env)
            ) do
              @app.call(env)
            end

            if request_response && request_response.any? { |action, _event| action == :block }
              request_return = AppSec::Response.negotiate(env).to_rack
            end

            request_return
          end
        end
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
ddtrace-1.11.1 lib/datadog/appsec/contrib/rack/request_body_middleware.rb
ddtrace-1.11.0 lib/datadog/appsec/contrib/rack/request_body_middleware.rb
ddtrace-1.11.0.beta1 lib/datadog/appsec/contrib/rack/request_body_middleware.rb
ddtrace-1.10.1 lib/datadog/appsec/contrib/rack/request_body_middleware.rb
ddtrace-1.10.0 lib/datadog/appsec/contrib/rack/request_body_middleware.rb