Sha256: f20b0c2f0228f392ee6b9c2ba322b0099e0879819d2c014769eba1b2b9cbc838

Contents?: true

Size: 1.88 KB

Versions: 9

Compression:

Stored size: 1.88 KB

Contents

# frozen_string_literal: true

require "securerandom"

module Kiev
  module Rack
    class RequestId
      # for Rails 4
      RAILS_REQUEST_ID = "action_dispatch.request_id"

      def initialize(app)
        @app = app
      end

      def call(env)
        request_id_header_out = to_rack(:request_id)
        tracking_id_header_out = to_rack(:tracking_id)

        tracking_id = make_tracking_id(env[to_http(:tracking_id)] || env[RAILS_REQUEST_ID] || env[to_http(:request_id)])
        RequestStore.store[:tracking_id] = tracking_id
        RequestStore.store[:request_id] = tracking_id
        RequestStore.store[:request_depth] = request_depth(env)
        RequestStore.store[:tree_path] = tree_path(env)

        @app.call(env).tap do |_status, headers, _body|
          headers[tracking_id_header_out] = tracking_id
          headers[request_id_header_out] = tracking_id
        end
      end

      private

      def tree_root?(env)
        tracking_id_header_in = to_http(:tracking_id)
        request_id_header_in = to_http(:request_id)
        !env[tracking_id_header_in] && !env[request_id_header_in]
      end

      def request_depth(env)
        request_depth_header = to_http(:request_depth)
        tree_root?(env) ? 0 : (env[request_depth_header].to_i + 1)
      end

      def tree_path(env)
        tree_path_header = to_http(:tree_path)
        tree_root?(env) ? SubrequestHelper.root_path(synchronous: true) : Util.sanitize(env[tree_path_header])
      end

      def to_http(value)
        Util.to_http(to_rack(value))
      end

      def to_rack(value)
        Config.instance.all_http_propagated_fields[value]
      end

      def make_tracking_id(tracking_id)
        if tracking_id.nil? || tracking_id.empty?
          internal_tracking_id
        else
          Util.sanitize(tracking_id)
        end
      end

      def internal_tracking_id
        SecureRandom.uuid
      end
    end
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
kiev-4.9.0 lib/kiev/rack/request_id.rb
kiev-4.8.3 lib/kiev/rack/request_id.rb
kiev-4.8.2 lib/kiev/rack/request_id.rb
kiev-4.8.1 lib/kiev/rack/request_id.rb
kiev-4.8.0 lib/kiev/rack/request_id.rb
kiev-4.7.0 lib/kiev/rack/request_id.rb
kiev-4.6.0 lib/kiev/rack/request_id.rb
kiev-4.5.0 lib/kiev/rack/request_id.rb
kiev-4.4.0 lib/kiev/rack/request_id.rb