sul-dlss / dlme

Digital Library of the Middle East web application, based on Spotlight
https://dlmenetwork.org/
Other
20 stars 2 forks source link

[dlme/stage] NoMethodError: undefined method `match?' for {"id"=>["themaghribpodcast.podbean.com/047b8c7a-46ac-3448-90ad-78b706ee0ea4"]}:ActiveSupport::HashWithIndifferentAccess #1889

Open jcoyne opened 2 months ago

jcoyne commented 2 months ago

Backtrace

line 28 of [PROJECT_ROOT]/app/models/search_builder.rb: min_match_for_boolean

View full backtrace and more info at honeybadger.io

jcoyne commented 2 months ago

search_state.query_param is a Hash, but we'd expect it to be a string. It's perhaps due to how Blacklight 8 changed fetch and blacklight-spotlight-4.0.3/app/models/sir_trevor_rails/blocks/solr_documents_block.rb:29:indocuments' `

[
  {
    "number": "28",
    "file": "[PROJECT_ROOT]/app/models/search_builder.rb",
    "method": "min_match_for_boolean",
    "source": {
      "26": "  # edismax) will precompose the query strings so everything works out.\n",
      "27": "  def min_match_for_boolean(solr_parameters)\n",
      "28": "    return unless search_state.query_param&.match?(/\\s(AND|OR|NOT)\\s/)\n",
      "29": "\n",
      "30": "    solr_parameters[:mm] = '1'\n"
    }
  },
  {
    "number": "151",
    "file": "[GEM_ROOT]/gems/blacklight-8.4.0/lib/blacklight/search_builder.rb",
    "method": "block (2 levels) in processed_parameters",
    "source": {
      "149": "      request.tap do |request_parameters|\n",
      "150": "        processor_chain.each do |method_name|\n",
      "151": "          send(method_name, request_parameters)\n",
      "152": "        end\n",
      "153": "      end\n"
    }
  },
  {
    "number": "150",
    "file": "[GEM_ROOT]/gems/blacklight-8.4.0/lib/blacklight/search_builder.rb",
    "method": "each",
    "source": {
      "148": "    def processed_parameters\n",
      "149": "      request.tap do |request_parameters|\n",
      "150": "        processor_chain.each do |method_name|\n",
      "151": "          send(method_name, request_parameters)\n",
      "152": "        end\n"
    }
  },
  {
    "number": "150",
    "file": "[GEM_ROOT]/gems/blacklight-8.4.0/lib/blacklight/search_builder.rb",
    "method": "block in processed_parameters",
    "source": {
      "148": "    def processed_parameters\n",
      "149": "      request.tap do |request_parameters|\n",
      "150": "        processor_chain.each do |method_name|\n",
      "151": "          send(method_name, request_parameters)\n",
      "152": "        end\n"
    }
  },
  {
    "number": null,
    "file": null,
    "method": null,
    "source": {}
  },
  {
    "number": "149",
    "file": "[GEM_ROOT]/gems/blacklight-8.4.0/lib/blacklight/search_builder.rb",
    "method": "processed_parameters",
    "source": {
      "147": "    # @return a params hash for searching solr.\n",
      "148": "    def processed_parameters\n",
      "149": "      request.tap do |request_parameters|\n",
      "150": "        processor_chain.each do |method_name|\n",
      "151": "          send(method_name, request_parameters)\n"
    }
  },
  {
    "number": "123",
    "file": "[GEM_ROOT]/gems/blacklight-8.4.0/lib/blacklight/search_builder.rb",
    "method": "to_hash",
    "source": {
      "121": "      return @params unless params_need_update?\n",
      "122": "\n",
      "123": "      @params = processed_parameters\n",
      "124": "                .reverse_merge(@reverse_merged_params)\n",
      "125": "                .merge(@merged_params)\n"
    }
  },
  {
    "number": "116",
    "file": "[GEM_ROOT]/gems/blacklight-8.4.0/lib/blacklight/search_builder.rb",
    "method": "[]",
    "source": {
      "114": "    end\n",
      "115": "\n",
      "116": "    delegate :[], :key?, to: :to_hash\n",
      "117": "\n",
      "118": "    # a solr query method\n"
    }
  },
  {
    "number": "144",
    "file": "[GEM_ROOT]/gems/blacklight-8.4.0/lib/blacklight/solr/repository.rb",
    "method": "uses_json_query_dsl?",
    "source": {
      "142": "    # @return [Boolean]\n",
      "143": "    def uses_json_query_dsl?(solr_params)\n",
      "144": "      solr_params[:json].present?\n",
      "145": "    end\n",
      "146": "  end\n"
    }
  },
  {
    "number": "137",
    "file": "[GEM_ROOT]/gems/blacklight-8.4.0/lib/blacklight/solr/repository.rb",
    "method": "default_search_path",
    "source": {
      "135": "    # @return [String]\n",
      "136": "    def default_search_path(solr_params)\n",
      "137": "      return blacklight_config.json_solr_path if blacklight_config.json_solr_path && uses_json_query_dsl?(solr_params)\n",
      "138": "\n",
      "139": "      blacklight_config.solr_path\n"
    }
  },
  {
    "number": "33",
    "file": "[GEM_ROOT]/gems/blacklight-8.4.0/lib/blacklight/solr/repository.rb",
    "method": "search",
    "source": {
      "31": "      request_params = (params || pos_params).reverse_merge(kwargs).reverse_merge({ qt: blacklight_config.qt })\n",
      "32": "\n",
      "33": "      send_and_receive(path || default_search_path(request_params), request_params)\n",
      "34": "    end\n",
      "35": "\n"
    }
  },
  {
    "number": "23",
    "file": "[GEM_ROOT]/gems/blacklight-8.4.0/lib/blacklight/solr/repository.rb",
    "method": "find_many",
    "source": {
      "21": "    # @param [Hash] _params query parameters\n",
      "22": "    def find_many(params)\n",
      "23": "      search(params: params, path: blacklight_config.fetch_many_documents_path)\n",
      "24": "    end\n",
      "25": "\n"
    }
  },
  {
    "number": "156",
    "file": "[GEM_ROOT]/gems/blacklight-8.4.0/app/services/blacklight/search_service.rb",
    "method": "fetch_many",
    "source": {
      "154": "      # we'll fall back to search if find_many isn't available.\n",
      "155": "      solr_response = if repository.respond_to?(:find_many)\n",
      "156": "                        repository.find_many(query)\n",
      "157": "                      else\n",
      "158": "                        repository.search(query)\n"
    }
  },
  {
    "number": "51",
    "file": "[GEM_ROOT]/gems/blacklight-8.4.0/app/services/blacklight/search_service.rb",
    "method": "fetch",
    "source": {
      "49": "    def fetch(id = nil, extra_controller_params = {})\n",
      "50": "      if id.is_a? Array\n",
      "51": "        fetch_many(id, extra_controller_params)\n",
      "52": "      else\n",
      "53": "        fetch_one(id, extra_controller_params)\n"
    }
  },
  {
    "number": "29",
    "file": "[GEM_ROOT]/gems/blacklight-spotlight-4.0.3/app/models/sir_trevor_rails/blocks/solr_documents_block.rb",
    "method": "documents",
    "source": {
      "27": "        @documents ||= begin\n",
      "28": "          doc_ids = items.pluck(:id)\n",
      "29": "          result = solr_helper.controller.send(:search_service).fetch(doc_ids)\n",
      "30": "\n",
      "31": "          if result.first.is_a? Blacklight::Solr::Response\n"
    }
  },
  {
    "number": "20",
    "file": "[GEM_ROOT]/gems/blacklight-spotlight-4.0.3/app/models/sir_trevor_rails/blocks/solr_documents_block.rb",
    "method": "block in each_document",
    "source": {
      "18": "\n",
      "19": "        items.each do |i|\n",
      "20": "          document = documents.detect { |doc| doc.id == i[:id] }\n",
      "21": "          i[:iiif_tilesource_base] = i.fetch(:iiif_tilesource, '').sub('/info.json', '')\n",
      "22": "          yield i, document if document\n"
    }
  },
  {
    "number": "19",
    "file": "[GEM_ROOT]/gems/blacklight-spotlight-4.0.3/app/models/sir_trevor_rails/blocks/solr_documents_block.rb",
    "method": "each",
    "source": {
      "17": "        return to_enum(:each_document) unless block_given?\n",
      "18": "\n",
      "19": "        items.each do |i|\n",
      "20": "          document = documents.detect { |doc| doc.id == i[:id] }\n",
      "21": "          i[:iiif_tilesource_base] = i.fetch(:iiif_tilesource, '').sub('/info.json', '')\n"
    }
  },
  {
    "number": "19",
    "file": "[GEM_ROOT]/gems/blacklight-spotlight-4.0.3/app/models/sir_trevor_rails/blocks/solr_documents_block.rb",
    "method": "each_document",
    "source": {
      "17": "        return to_enum(:each_document) unless block_given?\n",
      "18": "\n",
      "19": "        items.each do |i|\n",
      "20": "          document = documents.detect { |doc| doc.id == i[:id] }\n",
      "21": "          i[:iiif_tilesource_base] = i.fetch(:iiif_tilesource, '').sub('/info.json', '')\n"
    }
  },
  {
    "number": "40",
    "file": "[GEM_ROOT]/gems/blacklight-spotlight-4.0.3/app/models/sir_trevor_rails/blocks/solr_documents_block.rb",
    "method": "each",
    "source": {
      "38": "\n",
      "39": "      def documents?\n",
      "40": "        each_document.any?\n",
      "41": "      end\n",
      "42": "\n"
    }
  },
  {
    "number": "40",
    "file": "[GEM_ROOT]/gems/blacklight-spotlight-4.0.3/app/models/sir_trevor_rails/blocks/solr_documents_block.rb",
    "method": "any?",
    "source": {
      "38": "\n",
      "39": "      def documents?\n",
      "40": "        each_document.any?\n",
      "41": "      end\n",
      "42": "\n"
    }
  },
  {
    "number": "40",
    "file": "[GEM_ROOT]/gems/blacklight-spotlight-4.0.3/app/models/sir_trevor_rails/blocks/solr_documents_block.rb",
    "method": "documents?",
    "source": {
      "38": "\n",
      "39": "      def documents?\n",
      "40": "        each_document.any?\n",
      "41": "      end\n",
      "42": "\n"
    }
  },
  {
    "number": "4",
    "file": "[GEM_ROOT]/gems/blacklight-spotlight-4.0.3/app/views/spotlight/sir_trevor/blocks/_solr_documents_block.html.erb",
    "method": "__opt_app_dlme_dlme_shared_bundle_ruby_______gems_blacklight_spotlight_______app_views_spotlight_sir_trevor_blocks__solr_documents_block_html_erb___2819937229888063635_483720",
    "source": {
      "2": "\n",
      "3": "<div class=\"content-block items-block row d-block clearfix\">\n",
      "4": "  <% if solr_documents_block.documents? %>\n",
      "5": "\n",
      "6": "    <div class=\"items-col spotlight-flexbox <%= solr_documents_block.text? ? \"col-md-6\" : \"col-md-12\" %> <%= solr_documents_block.content_align == 'right' ? 'float-right float-end' : 'float-left float-start' %>\">\n"
    }
  },
  {
    "number": "263",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/base.rb",
    "method": "public_send",
    "source": {
      "261": "        end\n",
      "262": "      else\n",
      "263": "        public_send(method, locals, buffer, &block)\n",
      "264": "      end\n",
      "265": "    ensure\n"
    }
  },
  {
    "number": "263",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/base.rb",
    "method": "_run",
    "source": {
      "261": "        end\n",
      "262": "      else\n",
      "263": "        public_send(method, locals, buffer, &block)\n",
      "264": "      end\n",
      "265": "    ensure\n"
    }
  },
  {
    "number": "261",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/template.rb",
    "method": "block in render",
    "source": {
      "259": "          nil\n",
      "260": "        else\n",
      "261": "          result = view._run(method_name, self, locals, OutputBuffer.new, add_to_stack: add_to_stack, has_strict_locals: strict_locals?, &block)\n",
      "262": "          result.is_a?(OutputBuffer) ? result.to_s : result\n",
      "263": "        end\n"
    }
  },
  {
    "number": "208",
    "file": "[GEM_ROOT]/gems/activesupport-7.1.4/lib/active_support/notifications.rb",
    "method": "instrument",
    "source": {
      "206": "          instrumenter.instrument(name, payload) { yield payload if block_given? }\n",
      "207": "        else\n",
      "208": "          yield payload if block_given?\n",
      "209": "        end\n",
      "210": "      end\n"
    }
  },
  {
    "number": "550",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/template.rb",
    "method": "instrument_render_template",
    "source": {
      "548": "\n",
      "549": "      def instrument_render_template(&block)\n",
      "550": "        ActiveSupport::Notifications.instrument(\"!render_template.action_view\", instrument_payload, &block)\n",
      "551": "      end\n",
      "552": "\n"
    }
  },
  {
    "number": "249",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/template.rb",
    "method": "render",
    "source": {
      "247": "    # consume this in production. This is only slow if it's being listened to.\n",
      "248": "    def render(view, locals, buffer = nil, implicit_locals: [], add_to_stack: true, &block)\n",
      "249": "      instrument_render_template do\n",
      "250": "        compile!(view)\n",
      "251": "\n"
    }
  },
  {
    "number": "197",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/renderer/collection_renderer.rb",
    "method": "block in collection_with_template",
    "source": {
      "195": "          _template = (cache[path] ||= (template || find_template(path, @locals.keys + [as, counter, iteration])))\n",
      "196": "\n",
      "197": "          content = _template.render(view, locals, implicit_locals: [counter, iteration])\n",
      "198": "          content = layout.render(view, locals) { content } if layout\n",
      "199": "          partial_iteration.iterate!\n"
    }
  },
  {
    "number": "74",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/renderer/collection_renderer.rb",
    "method": "block in each_with_info",
    "source": {
      "72": "        return enum_for(:each_with_info) unless block_given?\n",
      "73": "        variables = [@path] + @variables\n",
      "74": "        @collection.each { |o| yield(o, variables) }\n",
      "75": "      end\n",
      "76": "    end\n"
    }
  },
  {
    "number": "74",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/renderer/collection_renderer.rb",
    "method": "each",
    "source": {
      "72": "        return enum_for(:each_with_info) unless block_given?\n",
      "73": "        variables = [@path] + @variables\n",
      "74": "        @collection.each { |o| yield(o, variables) }\n",
      "75": "      end\n",
      "76": "    end\n"
    }
  },
  {
    "number": "74",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/renderer/collection_renderer.rb",
    "method": "each_with_info",
    "source": {
      "72": "        return enum_for(:each_with_info) unless block_given?\n",
      "73": "        variables = [@path] + @variables\n",
      "74": "        @collection.each { |o| yield(o, variables) }\n",
      "75": "      end\n",
      "76": "    end\n"
    }
  },
  {
    "number": "188",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/renderer/collection_renderer.rb",
    "method": "each",
    "source": {
      "186": "        partial_iteration = PartialIteration.new(collection.size)\n",
      "187": "\n",
      "188": "        collection.each_with_info.map do |object, (path, as, counter, iteration)|\n",
      "189": "          index = partial_iteration.index\n",
      "190": "\n"
    }
  },
  {
    "number": "188",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/renderer/collection_renderer.rb",
    "method": "map",
    "source": {
      "186": "        partial_iteration = PartialIteration.new(collection.size)\n",
      "187": "\n",
      "188": "        collection.each_with_info.map do |object, (path, as, counter, iteration)|\n",
      "189": "          index = partial_iteration.index\n",
      "190": "\n"
    }
  },
  {
    "number": "188",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/renderer/collection_renderer.rb",
    "method": "collection_with_template",
    "source": {
      "186": "        partial_iteration = PartialIteration.new(collection.size)\n",
      "187": "\n",
      "188": "        collection.each_with_info.map do |object, (path, as, counter, iteration)|\n",
      "189": "          index = partial_iteration.index\n",
      "190": "\n"
    }
  },
  {
    "number": "170",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/renderer/collection_renderer.rb",
    "method": "block (2 levels) in render_collection",
    "source": {
      "168": "          collection_body = if template\n",
      "169": "            cache_collection_render(payload, view, template, collection) do |filtered_collection|\n",
      "170": "              collection_with_template(view, template, layout, filtered_collection)\n",
      "171": "            end\n",
      "172": "          else\n"
    }
  },
  {
    "number": "21",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/renderer/partial_renderer/collection_caching.rb",
    "method": "cache_collection_render",
    "source": {
      "19": "\n",
      "20": "      def cache_collection_render(instrumentation_payload, view, template, collection)\n",
      "21": "        return yield(collection) unless will_cache?(@options, view)\n",
      "22": "\n",
      "23": "        collection_iterator = collection\n"
    }
  },
  {
    "number": "169",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/renderer/collection_renderer.rb",
    "method": "block in render_collection",
    "source": {
      "167": "\n",
      "168": "          collection_body = if template\n",
      "169": "            cache_collection_render(payload, view, template, collection) do |filtered_collection|\n",
      "170": "              collection_with_template(view, template, layout, filtered_collection)\n",
      "171": "            end\n"
    }
  },
  {
    "number": "208",
    "file": "[GEM_ROOT]/gems/activesupport-7.1.4/lib/active_support/notifications.rb",
    "method": "instrument",
    "source": {
      "206": "          instrumenter.instrument(name, payload) { yield payload if block_given? }\n",
      "207": "        else\n",
      "208": "          yield payload if block_given?\n",
      "209": "        end\n",
      "210": "      end\n"
    }
  },
  {
    "number": "155",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/renderer/collection_renderer.rb",
    "method": "render_collection",
    "source": {
      "153": "      def render_collection(collection, view, path, template, layout, block)\n",
      "154": "        identifier = (template && template.identifier) || path\n",
      "155": "        ActiveSupport::Notifications.instrument(\n",
      "156": "          \"render_collection.action_view\",\n",
      "157": "          identifier: identifier,\n"
    }
  },
  {
    "number": "127",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/renderer/collection_renderer.rb",
    "method": "render_collection_with_partial",
    "source": {
      "125": "      end\n",
      "126": "\n",
      "127": "      render_collection(collection, context, partial, template, layout, block)\n",
      "128": "    end\n",
      "129": "\n"
    }
  },
  {
    "number": "135",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/renderer/collection_renderer.rb",
    "method": "render_collection_derive_partial",
    "source": {
      "133": "      if paths.uniq.length == 1\n",
      "134": "        # Homogeneous\n",
      "135": "        render_collection_with_partial(collection, paths.first, context, block)\n",
      "136": "      else\n",
      "137": "        if @options[:cached]\n"
    }
  },
  {
    "number": "92",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/renderer/renderer.rb",
    "method": "render_partial_to_object",
    "source": {
      "90": "          # Collection + Derived Partial\n",
      "91": "          renderer = CollectionRenderer.new(@lookup_context, options)\n",
      "92": "          renderer.render_collection_derive_partial(collection, context, block)\n",
      "93": "        else\n",
      "94": "          # Object + Derived Partial\n"
    }
  },
  {
    "number": "55",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/renderer/renderer.rb",
    "method": "render_partial",
    "source": {
      "53": "    # Direct access to partial rendering.\n",
      "54": "    def render_partial(context, options, &block) # :nodoc:\n",
      "55": "      render_partial_to_object(context, options, &block).body\n",
      "56": "    end\n",
      "57": "\n"
    }
  },
  {
    "number": "44",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/helpers/rendering_helper.rb",
    "method": "render",
    "source": {
      "42": "            options.render_in(self, &block)\n",
      "43": "          else\n",
      "44": "            view_renderer.render_partial(self, partial: options, locals: locals, &block)\n",
      "45": "          end\n",
      "46": "        end\n"
    }
  },
  {
    "number": "19",
    "file": "[GEM_ROOT]/gems/blacklight-spotlight-4.0.3/app/views/spotlight/pages/show.html.erb",
    "method": "block in __opt_app_dlme_dlme_shared_bundle_ruby_______gems_blacklight_spotlight_______app_views_spotlight_pages_show_html_erb__2144939207205090344_161140",
    "source": {
      "17": "  <div>\n",
      "18": "    <% if @page.content? %>\n",
      "19": "      <%= render @page.content %>\n",
      "20": "    <% else %>\n",
      "21": "      <%= render 'empty' %>\n"
    }
  },
  {
    "number": "219",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/helpers/cache_helper.rb",
    "method": "cache_if",
    "source": {
      "217": "          cache(name, options, &block)\n",
      "218": "        else\n",
      "219": "          yield\n",
      "220": "        end\n",
      "221": "\n"
    }
  },
  {
    "number": "232",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/helpers/cache_helper.rb",
    "method": "cache_unless",
    "source": {
      "230": "      #   <% end %>\n",
      "231": "      def cache_unless(condition, name = {}, options = {}, &block)\n",
      "232": "        cache_if !condition, name, options, &block\n",
      "233": "      end\n",
      "234": "\n"
    }
  },
  {
    "number": "8",
    "file": "[GEM_ROOT]/gems/blacklight-spotlight-4.0.3/app/views/spotlight/pages/show.html.erb",
    "method": "__opt_app_dlme_dlme_shared_bundle_ruby_______gems_blacklight_spotlight_______app_views_spotlight_pages_show_html_erb__2144939207205090344_161140",
    "source": {
      "6": "<% end if @page.display_sidebar?%>\n",
      "7": "\n",
      "8": "<%= cache_unless current_user, [current_exhibit, @page, I18n.locale, request.query_string] do %>\n",
      "9": "  <div class=\"clearfix\">\n",
      "10": "    <%= render 'edit_page_link' if can? :edit, @page %>\n"
    }
  },
  {
    "number": "263",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/base.rb",
    "method": "public_send",
    "source": {
      "261": "        end\n",
      "262": "      else\n",
      "263": "        public_send(method, locals, buffer, &block)\n",
      "264": "      end\n",
      "265": "    ensure\n"
    }
  },
  {
    "number": "263",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/base.rb",
    "method": "_run",
    "source": {
      "261": "        end\n",
      "262": "      else\n",
      "263": "        public_send(method, locals, buffer, &block)\n",
      "264": "      end\n",
      "265": "    ensure\n"
    }
  },
  {
    "number": "261",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/template.rb",
    "method": "block in render",
    "source": {
      "259": "          nil\n",
      "260": "        else\n",
      "261": "          result = view._run(method_name, self, locals, OutputBuffer.new, add_to_stack: add_to_stack, has_strict_locals: strict_locals?, &block)\n",
      "262": "          result.is_a?(OutputBuffer) ? result.to_s : result\n",
      "263": "        end\n"
    }
  },
  {
    "number": "208",
    "file": "[GEM_ROOT]/gems/activesupport-7.1.4/lib/active_support/notifications.rb",
    "method": "instrument",
    "source": {
      "206": "          instrumenter.instrument(name, payload) { yield payload if block_given? }\n",
      "207": "        else\n",
      "208": "          yield payload if block_given?\n",
      "209": "        end\n",
      "210": "      end\n"
    }
  },
  {
    "number": "550",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/template.rb",
    "method": "instrument_render_template",
    "source": {
      "548": "\n",
      "549": "      def instrument_render_template(&block)\n",
      "550": "        ActiveSupport::Notifications.instrument(\"!render_template.action_view\", instrument_payload, &block)\n",
      "551": "      end\n",
      "552": "\n"
    }
  },
  {
    "number": "249",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/template.rb",
    "method": "render",
    "source": {
      "247": "    # consume this in production. This is only slow if it's being listened to.\n",
      "248": "    def render(view, locals, buffer = nil, implicit_locals: [], add_to_stack: true, &block)\n",
      "249": "      instrument_render_template do\n",
      "250": "        compile!(view)\n",
      "251": "\n"
    }
  },
  {
    "number": "66",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/renderer/template_renderer.rb",
    "method": "block (2 levels) in render_template",
    "source": {
      "64": "            locals: locals\n",
      "65": "          ) do\n",
      "66": "            template.render(view, locals) { |*name| view._layout_for(*name) }\n",
      "67": "          end\n",
      "68": "        end\n"
    }
  },
  {
    "number": "206",
    "file": "[GEM_ROOT]/gems/activesupport-7.1.4/lib/active_support/notifications.rb",
    "method": "block in instrument",
    "source": {
      "204": "      def instrument(name, payload = {})\n",
      "205": "        if notifier.listening?(name)\n",
      "206": "          instrumenter.instrument(name, payload) { yield payload if block_given? }\n",
      "207": "        else\n",
      "208": "          yield payload if block_given?\n"
    }
  },
  {
    "number": "58",
    "file": "[GEM_ROOT]/gems/activesupport-7.1.4/lib/active_support/notifications/instrumenter.rb",
    "method": "instrument",
    "source": {
      "56": "        handle.start\n",
      "57": "        begin\n",
      "58": "          yield payload if block_given?\n",
      "59": "        rescue Exception => e\n",
      "60": "          payload[:exception] = [e.class.name, e.message]\n"
    }
  },
  {
    "number": "206",
    "file": "[GEM_ROOT]/gems/activesupport-7.1.4/lib/active_support/notifications.rb",
    "method": "instrument",
    "source": {
      "204": "      def instrument(name, payload = {})\n",
      "205": "        if notifier.listening?(name)\n",
      "206": "          instrumenter.instrument(name, payload) { yield payload if block_given? }\n",
      "207": "        else\n",
      "208": "          yield payload if block_given?\n"
    }
  },
  {
    "number": "60",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/renderer/template_renderer.rb",
    "method": "block in render_template",
    "source": {
      "58": "      def render_template(view, template, layout_name, locals)\n",
      "59": "        render_with_layout(view, template, layout_name, locals) do |layout|\n",
      "60": "          ActiveSupport::Notifications.instrument(\n",
      "61": "            \"render_template.action_view\",\n",
      "62": "            identifier: template.identifier,\n"
    }
  },
  {
    "number": "76",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/renderer/template_renderer.rb",
    "method": "block in render_with_layout",
    "source": {
      "74": "        body = if layout\n",
      "75": "          ActiveSupport::Notifications.instrument(\"render_layout.action_view\", identifier: layout.identifier) do\n",
      "76": "            view.view_flow.set(:layout, yield(layout))\n",
      "77": "            layout.render(view, locals) { |*name| view._layout_for(*name) }\n",
      "78": "          end\n"
    }
  },
  {
    "number": "206",
    "file": "[GEM_ROOT]/gems/activesupport-7.1.4/lib/active_support/notifications.rb",
    "method": "block in instrument",
    "source": {
      "204": "      def instrument(name, payload = {})\n",
      "205": "        if notifier.listening?(name)\n",
      "206": "          instrumenter.instrument(name, payload) { yield payload if block_given? }\n",
      "207": "        else\n",
      "208": "          yield payload if block_given?\n"
    }
  },
  {
    "number": "58",
    "file": "[GEM_ROOT]/gems/activesupport-7.1.4/lib/active_support/notifications/instrumenter.rb",
    "method": "instrument",
    "source": {
      "56": "        handle.start\n",
      "57": "        begin\n",
      "58": "          yield payload if block_given?\n",
      "59": "        rescue Exception => e\n",
      "60": "          payload[:exception] = [e.class.name, e.message]\n"
    }
  },
  {
    "number": "206",
    "file": "[GEM_ROOT]/gems/activesupport-7.1.4/lib/active_support/notifications.rb",
    "method": "instrument",
    "source": {
      "204": "      def instrument(name, payload = {})\n",
      "205": "        if notifier.listening?(name)\n",
      "206": "          instrumenter.instrument(name, payload) { yield payload if block_given? }\n",
      "207": "        else\n",
      "208": "          yield payload if block_given?\n"
    }
  },
  {
    "number": "75",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/renderer/template_renderer.rb",
    "method": "render_with_layout",
    "source": {
      "73": "\n",
      "74": "        body = if layout\n",
      "75": "          ActiveSupport::Notifications.instrument(\"render_layout.action_view\", identifier: layout.identifier) do\n",
      "76": "            view.view_flow.set(:layout, yield(layout))\n",
      "77": "            layout.render(view, locals) { |*name| view._layout_for(*name) }\n"
    }
  },
  {
    "number": "59",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/renderer/template_renderer.rb",
    "method": "render_template",
    "source": {
      "57": "      # supplied as well.\n",
      "58": "      def render_template(view, template, layout_name, locals)\n",
      "59": "        render_with_layout(view, template, layout_name, locals) do |layout|\n",
      "60": "          ActiveSupport::Notifications.instrument(\n",
      "61": "            \"render_template.action_view\",\n"
    }
  },
  {
    "number": "11",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/renderer/template_renderer.rb",
    "method": "render",
    "source": {
      "9": "      prepend_formats(template.format)\n",
      "10": "\n",
      "11": "      render_template(context, template, options[:layout], options[:locals] || {})\n",
      "12": "    end\n",
      "13": "\n"
    }
  },
  {
    "number": "63",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/renderer/renderer.rb",
    "method": "render_template_to_object",
    "source": {
      "61": "\n",
      "62": "    def render_template_to_object(context, options) # :nodoc:\n",
      "63": "      TemplateRenderer.new(@lookup_context).render(context, options)\n",
      "64": "    end\n",
      "65": "\n"
    }
  },
  {
    "number": "31",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/renderer/renderer.rb",
    "method": "render_to_object",
    "source": {
      "29": "        render_partial_to_object(context, options)\n",
      "30": "      else\n",
      "31": "        render_template_to_object(context, options)\n",
      "32": "      end\n",
      "33": "    end\n"
    }
  },
  {
    "number": "135",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/rendering.rb",
    "method": "block in _render_template",
    "source": {
      "133": "\n",
      "134": "        rendered_template = context.in_rendering_context(options) do |renderer|\n",
      "135": "          renderer.render_to_object(context, options)\n",
      "136": "        end\n",
      "137": "\n"
    }
  },
  {
    "number": "290",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/base.rb",
    "method": "in_rendering_context",
    "source": {
      "288": "      end\n",
      "289": "\n",
      "290": "      yield @view_renderer\n",
      "291": "    ensure\n",
      "292": "      @view_renderer = old_view_renderer\n"
    }
  },
  {
    "number": "134",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/rendering.rb",
    "method": "_render_template",
    "source": {
      "132": "        lookup_context.variants = variant if variant\n",
      "133": "\n",
      "134": "        rendered_template = context.in_rendering_context(options) do |renderer|\n",
      "135": "          renderer.render_to_object(context, options)\n",
      "136": "        end\n"
    }
  },
  {
    "number": "256",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_controller/metal/streaming.rb",
    "method": "_render_template",
    "source": {
      "254": "          Body.new view_renderer.render_body(view_context, options)\n",
      "255": "        else\n",
      "256": "          super\n",
      "257": "        end\n",
      "258": "      end\n"
    }
  },
  {
    "number": "121",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/rendering.rb",
    "method": "render_to_body",
    "source": {
      "119": "    def render_to_body(options = {})\n",
      "120": "      _process_options(options)\n",
      "121": "      _render_template(options)\n",
      "122": "    end\n",
      "123": "\n"
    }
  },
  {
    "number": "158",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_controller/metal/rendering.rb",
    "method": "render_to_body",
    "source": {
      "156": "\n",
      "157": "    def render_to_body(options = {}) # :nodoc:\n",
      "158": "      super || _render_in_priorities(options) || \" \"\n",
      "159": "    end\n",
      "160": "\n"
    }
  },
  {
    "number": "141",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_controller/metal/renderers.rb",
    "method": "render_to_body",
    "source": {
      "139": "    # <tt>ActionView::Rendering.render_to_body</tt>, if present.\n",
      "140": "    def render_to_body(options)\n",
      "141": "      _render_to_body_with_renderer(options) || super\n",
      "142": "    end\n",
      "143": "\n"
    }
  },
  {
    "number": "27",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/abstract_controller/rendering.rb",
    "method": "render",
    "source": {
      "25": "    def render(*args, &block)\n",
      "26": "      options = _normalize_render(*args, &block)\n",
      "27": "      rendered_body = render_to_body(options)\n",
      "28": "      if options[:html]\n",
      "29": "        _set_html_content_type\n"
    }
  },
  {
    "number": "139",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_controller/metal/rendering.rb",
    "method": "render",
    "source": {
      "137": "    def render(*args)\n",
      "138": "      raise ::AbstractController::DoubleRenderError if response_body\n",
      "139": "      super\n",
      "140": "    end\n",
      "141": "\n"
    }
  },
  {
    "number": "29",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_controller/metal/instrumentation.rb",
    "method": "block (2 levels) in render",
    "source": {
      "27": "      render_output = nil\n",
      "28": "      self.view_runtime = cleanup_view_runtime do\n",
      "29": "        Benchmark.ms { render_output = super }\n",
      "30": "      end\n",
      "31": "      render_output\n"
    }
  },
  {
    "number": "311",
    "file": "/usr/local/rvm/rubies/ruby-3.2.2/lib/ruby/3.2.0/benchmark.rb",
    "method": "realtime",
    "source": {
      "309": "  def realtime # :yield:\n",
      "310": "    r0 = Process.clock_gettime(Process::CLOCK_MONOTONIC)\n",
      "311": "    yield\n",
      "312": "    Process.clock_gettime(Process::CLOCK_MONOTONIC) - r0\n",
      "313": "  end\n"
    }
  },
  {
    "number": "14",
    "file": "[GEM_ROOT]/gems/activesupport-7.1.4/lib/active_support/core_ext/benchmark.rb",
    "method": "ms",
    "source": {
      "12": "  #   # => 0.074\n",
      "13": "  def ms(&block)\n",
      "14": "    1000 * realtime(&block)\n",
      "15": "  end\n",
      "16": "end\n"
    }
  },
  {
    "number": "29",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_controller/metal/instrumentation.rb",
    "method": "block in render",
    "source": {
      "27": "      render_output = nil\n",
      "28": "      self.view_runtime = cleanup_view_runtime do\n",
      "29": "        Benchmark.ms { render_output = super }\n",
      "30": "      end\n",
      "31": "      render_output\n"
    }
  },
  {
    "number": "98",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_controller/metal/instrumentation.rb",
    "method": "cleanup_view_runtime",
    "source": {
      "96": "      #   end\n",
      "97": "      def cleanup_view_runtime # :doc:\n",
      "98": "        yield\n",
      "99": "      end\n",
      "100": "\n"
    }
  },
  {
    "number": "39",
    "file": "[GEM_ROOT]/gems/activerecord-7.1.4/lib/active_record/railties/controller_runtime.rb",
    "method": "cleanup_view_runtime",
    "source": {
      "37": "            db_rt_before_render = ActiveRecord::RuntimeRegistry.reset\n",
      "38": "            self.db_runtime = (db_runtime || 0) + db_rt_before_render\n",
      "39": "            runtime = super\n",
      "40": "            queries_rt = ActiveRecord::RuntimeRegistry.sql_runtime - ActiveRecord::RuntimeRegistry.async_sql_runtime\n",
      "41": "            db_rt_after_render = ActiveRecord::RuntimeRegistry.reset\n"
    }
  },
  {
    "number": "28",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_controller/metal/instrumentation.rb",
    "method": "render",
    "source": {
      "26": "    def render(*)\n",
      "27": "      render_output = nil\n",
      "28": "      self.view_runtime = cleanup_view_runtime do\n",
      "29": "        Benchmark.ms { render_output = super }\n",
      "30": "      end\n"
    }
  },
  {
    "number": "37",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_controller/metal/implicit_render.rb",
    "method": "default_render",
    "source": {
      "35": "    def default_render\n",
      "36": "      if template_exists?(action_name.to_s, _prefixes, variants: request.variant)\n",
      "37": "        render\n",
      "38": "      elsif any_templates?(action_name.to_s, _prefixes)\n",
      "39": "        message = \"#{self.class.name}\\##{action_name} is missing a template \" \\\n"
    }
  },
  {
    "number": "7",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_controller/metal/basic_implicit_render.rb",
    "method": "send_action",
    "source": {
      "5": "    def send_action(method, *args)\n",
      "6": "      ret = super\n",
      "7": "      default_render unless performed?\n",
      "8": "      ret\n",
      "9": "    end\n"
    }
  },
  {
    "number": "224",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/abstract_controller/base.rb",
    "method": "process_action",
    "source": {
      "222": "      # which is *not* necessarily the same as the action name.\n",
      "223": "      def process_action(...)\n",
      "224": "        send_action(...)\n",
      "225": "      end\n",
      "226": "\n"
    }
  },
  {
    "number": "165",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_controller/metal/rendering.rb",
    "method": "process_action",
    "source": {
      "163": "      def process_action(*) # :nodoc:\n",
      "164": "        self.formats = request.formats.filter_map(&:ref)\n",
      "165": "        super\n",
      "166": "      end\n",
      "167": "\n"
    }
  },
  {
    "number": "259",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/abstract_controller/callbacks.rb",
    "method": "block in process_action",
    "source": {
      "257": "      def process_action(...)\n",
      "258": "        run_callbacks(:process_action) do\n",
      "259": "          super\n",
      "260": "        end\n",
      "261": "      end\n"
    }
  },
  {
    "number": "121",
    "file": "[GEM_ROOT]/gems/activesupport-7.1.4/lib/active_support/callbacks.rb",
    "method": "block in run_callbacks",
    "source": {
      "119": "              current.invoke_before(env)\n",
      "120": "              if current.final?\n",
      "121": "                env.value = !env.halted && (!block_given? || yield)\n",
      "122": "              elsif current.skip?(env)\n",
      "123": "                (skipped ||= []) << current\n"
    }
  },
  {
    "number": "23",
    "file": "[GEM_ROOT]/gems/actiontext-7.1.4/lib/action_text/rendering.rb",
    "method": "with_renderer",
    "source": {
      "21": "        previous_renderer = self.renderer\n",
      "22": "        self.renderer = renderer\n",
      "23": "        yield\n",
      "24": "      ensure\n",
      "25": "        self.renderer = previous_renderer\n"
    }
  },
  {
    "number": "69",
    "file": "[GEM_ROOT]/gems/actiontext-7.1.4/lib/action_text/engine.rb",
    "method": "block (4 levels) in <class:Engine>",
    "source": {
      "67": "        ActiveSupport.on_load(base) do\n",
      "68": "          around_action do |controller, action|\n",
      "69": "            ActionText::Content.with_renderer(controller, &action)\n",
      "70": "          end\n",
      "71": "        end\n"
    }
  },
  {
    "number": "130",
    "file": "[GEM_ROOT]/gems/activesupport-7.1.4/lib/active_support/callbacks.rb",
    "method": "instance_exec",
    "source": {
      "128": "                begin\n",
      "129": "                  target, block, method, *arguments = current.expand_call_template(env, invoke_sequence)\n",
      "130": "                  target.send(method, *arguments, &block)\n",
      "131": "                ensure\n",
      "132": "                  next_sequence = current\n"
    }
  },
  {
    "number": "130",
    "file": "[GEM_ROOT]/gems/activesupport-7.1.4/lib/active_support/callbacks.rb",
    "method": "block in run_callbacks",
    "source": {
      "128": "                begin\n",
      "129": "                  target, block, method, *arguments = current.expand_call_template(env, invoke_sequence)\n",
      "130": "                  target.send(method, *arguments, &block)\n",
      "131": "                ensure\n",
      "132": "                  next_sequence = current\n"
    }
  },
  {
    "number": "141",
    "file": "[GEM_ROOT]/gems/activesupport-7.1.4/lib/active_support/callbacks.rb",
    "method": "run_callbacks",
    "source": {
      "139": "          end\n",
      "140": "\n",
      "141": "          invoke_sequence.call\n",
      "142": "        end\n",
      "143": "      end\n"
    }
  },
  {
    "number": "258",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/abstract_controller/callbacks.rb",
    "method": "process_action",
    "source": {
      "256": "      # <tt>process_action</tt> callbacks around the normal behavior.\n",
      "257": "      def process_action(...)\n",
      "258": "        run_callbacks(:process_action) do\n",
      "259": "          super\n",
      "260": "        end\n"
    }
  },
  {
    "number": "25",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_controller/metal/rescue.rb",
    "method": "process_action",
    "source": {
      "23": "    private\n",
      "24": "      def process_action(*)\n",
      "25": "        super\n",
      "26": "      rescue Exception => exception\n",
      "27": "        request.env[\"action_dispatch.show_detailed_exceptions\"] ||= show_detailed_exceptions?\n"
    }
  },
  {
    "number": "74",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_controller/metal/instrumentation.rb",
    "method": "block in process_action",
    "source": {
      "72": "\n",
      "73": "        ActiveSupport::Notifications.instrument(\"process_action.action_controller\", raw_payload) do |payload|\n",
      "74": "          result = super\n",
      "75": "          payload[:response] = response\n",
      "76": "          payload[:status]   = response.status\n"
    }
  },
  {
    "number": "206",
    "file": "[GEM_ROOT]/gems/activesupport-7.1.4/lib/active_support/notifications.rb",
    "method": "block in instrument",
    "source": {
      "204": "      def instrument(name, payload = {})\n",
      "205": "        if notifier.listening?(name)\n",
      "206": "          instrumenter.instrument(name, payload) { yield payload if block_given? }\n",
      "207": "        else\n",
      "208": "          yield payload if block_given?\n"
    }
  },
  {
    "number": "58",
    "file": "[GEM_ROOT]/gems/activesupport-7.1.4/lib/active_support/notifications/instrumenter.rb",
    "method": "instrument",
    "source": {
      "56": "        handle.start\n",
      "57": "        begin\n",
      "58": "          yield payload if block_given?\n",
      "59": "        rescue Exception => e\n",
      "60": "          payload[:exception] = [e.class.name, e.message]\n"
    }
  },
  {
    "number": "206",
    "file": "[GEM_ROOT]/gems/activesupport-7.1.4/lib/active_support/notifications.rb",
    "method": "instrument",
    "source": {
      "204": "      def instrument(name, payload = {})\n",
      "205": "        if notifier.listening?(name)\n",
      "206": "          instrumenter.instrument(name, payload) { yield payload if block_given? }\n",
      "207": "        else\n",
      "208": "          yield payload if block_given?\n"
    }
  },
  {
    "number": "73",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_controller/metal/instrumentation.rb",
    "method": "process_action",
    "source": {
      "71": "        ActiveSupport::Notifications.instrument(\"start_processing.action_controller\", raw_payload)\n",
      "72": "\n",
      "73": "        ActiveSupport::Notifications.instrument(\"process_action.action_controller\", raw_payload) do |payload|\n",
      "74": "          result = super\n",
      "75": "          payload[:response] = response\n"
    }
  },
  {
    "number": "261",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_controller/metal/params_wrapper.rb",
    "method": "process_action",
    "source": {
      "259": "      def process_action(*)\n",
      "260": "        _perform_parameter_wrapping if _wrapper_enabled?\n",
      "261": "        super\n",
      "262": "      end\n",
      "263": "\n"
    }
  },
  {
    "number": "32",
    "file": "[GEM_ROOT]/gems/activerecord-7.1.4/lib/active_record/railties/controller_runtime.rb",
    "method": "process_action",
    "source": {
      "30": "          # and it won't be cleaned up by the method below.\n",
      "31": "          ActiveRecord::RuntimeRegistry.reset\n",
      "32": "          super\n",
      "33": "        end\n",
      "34": "\n"
    }
  },
  {
    "number": "160",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/abstract_controller/base.rb",
    "method": "process",
    "source": {
      "158": "      @_response_body = nil\n",
      "159": "\n",
      "160": "      process_action(action_name, *args)\n",
      "161": "    end\n",
      "162": "    ruby2_keywords(:process)\n"
    }
  },
  {
    "number": "40",
    "file": "[GEM_ROOT]/gems/actionview-7.1.4/lib/action_view/rendering.rb",
    "method": "process",
    "source": {
      "38": "    def process(...) # :nodoc:\n",
      "39": "      old_config, I18n.config = I18n.config, I18nProxy.new(I18n.config, lookup_context)\n",
      "40": "      super\n",
      "41": "    ensure\n",
      "42": "      I18n.config = old_config\n"
    }
  },
  {
    "number": "227",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_controller/metal.rb",
    "method": "dispatch",
    "source": {
      "225": "      set_request!(request)\n",
      "226": "      set_response!(response)\n",
      "227": "      process(name)\n",
      "228": "      request.commit_flash\n",
      "229": "      to_a\n"
    }
  },
  {
    "number": "309",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_controller/metal.rb",
    "method": "dispatch",
    "source": {
      "307": "        middleware_stack.build(name) { |env| new.dispatch(name, req, res) }.call req.env\n",
      "308": "      else\n",
      "309": "        new.dispatch(name, req, res)\n",
      "310": "      end\n",
      "311": "    end\n"
    }
  },
  {
    "number": "49",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/routing/route_set.rb",
    "method": "dispatch",
    "source": {
      "47": "\n",
      "48": "          def dispatch(controller, action, req, res)\n",
      "49": "            controller.dispatch(action, req, res)\n",
      "50": "          end\n",
      "51": "      end\n"
    }
  },
  {
    "number": "32",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/routing/route_set.rb",
    "method": "serve",
    "source": {
      "30": "          controller = controller req\n",
      "31": "          res        = controller.make_response! req\n",
      "32": "          dispatch(controller, params[:action], req, res)\n",
      "33": "        rescue ActionController::RoutingError\n",
      "34": "          if @raise_on_name_error\n"
    }
  },
  {
    "number": "51",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/journey/router.rb",
    "method": "block in serve",
    "source": {
      "49": "          req.route_uri_pattern = route.path.spec.to_s\n",
      "50": "\n",
      "51": "          _, headers, _ = response = route.app.serve(req)\n",
      "52": "\n",
      "53": "          if \"pass\" == headers[Constants::X_CASCADE]\n"
    }
  },
  {
    "number": "131",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/journey/router.rb",
    "method": "block in find_routes",
    "source": {
      "129": "              path_parameters[name.to_sym] = Utils.unescape_uri(val) if val\n",
      "130": "            }\n",
      "131": "            yield [match_data, path_parameters, r]\n",
      "132": "          }\n",
      "133": "        end\n"
    }
  },
  {
    "number": "124",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/journey/router.rb",
    "method": "each",
    "source": {
      "122": "          routes.sort_by!(&:precedence)\n",
      "123": "\n",
      "124": "          routes.each { |r|\n",
      "125": "            match_data = r.path.match(path_info)\n",
      "126": "            path_parameters = {}\n"
    }
  },
  {
    "number": "124",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/journey/router.rb",
    "method": "find_routes",
    "source": {
      "122": "          routes.sort_by!(&:precedence)\n",
      "123": "\n",
      "124": "          routes.each { |r|\n",
      "125": "            match_data = r.path.match(path_info)\n",
      "126": "            path_parameters = {}\n"
    }
  },
  {
    "number": "32",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/journey/router.rb",
    "method": "serve",
    "source": {
      "30": "\n",
      "31": "      def serve(req)\n",
      "32": "        find_routes(req) do |match, parameters, route|\n",
      "33": "          set_params  = req.path_parameters\n",
      "34": "          path_info   = req.path_info\n"
    }
  },
  {
    "number": "882",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/routing/route_set.rb",
    "method": "call",
    "source": {
      "880": "        req = make_request(env)\n",
      "881": "        req.path_info = Journey::Router::Utils.normalize_path(req.path_info)\n",
      "882": "        @router.serve(req)\n",
      "883": "      end\n",
      "884": "\n"
    }
  },
  {
    "number": "536",
    "file": "[GEM_ROOT]/gems/railties-7.1.4/lib/rails/engine.rb",
    "method": "call",
    "source": {
      "534": "    def call(env)\n",
      "535": "      req = build_request env\n",
      "536": "      app.call req.env\n",
      "537": "    end\n",
      "538": "\n"
    }
  },
  {
    "number": "226",
    "file": "[GEM_ROOT]/gems/railties-7.1.4/lib/rails/railtie.rb",
    "method": "public_send",
    "source": {
      "224": "        def method_missing(name, *args, &block)\n",
      "225": "          if !abstract_railtie? && instance.respond_to?(name)\n",
      "226": "            instance.public_send(name, *args, &block)\n",
      "227": "          else\n",
      "228": "            super\n"
    }
  },
  {
    "number": "226",
    "file": "[GEM_ROOT]/gems/railties-7.1.4/lib/rails/railtie.rb",
    "method": "method_missing",
    "source": {
      "224": "        def method_missing(name, *args, &block)\n",
      "225": "          if !abstract_railtie? && instance.respond_to?(name)\n",
      "226": "            instance.public_send(name, *args, &block)\n",
      "227": "          else\n",
      "228": "            super\n"
    }
  },
  {
    "number": "31",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/routing/mapper.rb",
    "method": "block in <class:Constraints>",
    "source": {
      "29": "\n",
      "30": "        SERVE = ->(app, req) { app.serve req }\n",
      "31": "        CALL  = ->(app, req) { app.call req.env }\n",
      "32": "\n",
      "33": "        def initialize(app, constraints, strategy)\n"
    }
  },
  {
    "number": "60",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/routing/mapper.rb",
    "method": "serve",
    "source": {
      "58": "          return [ 404, { Constants::X_CASCADE => \"pass\" }, [] ] unless matches?(req)\n",
      "59": "\n",
      "60": "          @strategy.call @app, req\n",
      "61": "        end\n",
      "62": "\n"
    }
  },
  {
    "number": "51",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/journey/router.rb",
    "method": "block in serve",
    "source": {
      "49": "          req.route_uri_pattern = route.path.spec.to_s\n",
      "50": "\n",
      "51": "          _, headers, _ = response = route.app.serve(req)\n",
      "52": "\n",
      "53": "          if \"pass\" == headers[Constants::X_CASCADE]\n"
    }
  },
  {
    "number": "131",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/journey/router.rb",
    "method": "block in find_routes",
    "source": {
      "129": "              path_parameters[name.to_sym] = Utils.unescape_uri(val) if val\n",
      "130": "            }\n",
      "131": "            yield [match_data, path_parameters, r]\n",
      "132": "          }\n",
      "133": "        end\n"
    }
  },
  {
    "number": "124",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/journey/router.rb",
    "method": "each",
    "source": {
      "122": "          routes.sort_by!(&:precedence)\n",
      "123": "\n",
      "124": "          routes.each { |r|\n",
      "125": "            match_data = r.path.match(path_info)\n",
      "126": "            path_parameters = {}\n"
    }
  },
  {
    "number": "124",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/journey/router.rb",
    "method": "find_routes",
    "source": {
      "122": "          routes.sort_by!(&:precedence)\n",
      "123": "\n",
      "124": "          routes.each { |r|\n",
      "125": "            match_data = r.path.match(path_info)\n",
      "126": "            path_parameters = {}\n"
    }
  },
  {
    "number": "32",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/journey/router.rb",
    "method": "serve",
    "source": {
      "30": "\n",
      "31": "      def serve(req)\n",
      "32": "        find_routes(req) do |match, parameters, route|\n",
      "33": "          set_params  = req.path_parameters\n",
      "34": "          path_info   = req.path_info\n"
    }
  },
  {
    "number": "882",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/routing/route_set.rb",
    "method": "call",
    "source": {
      "880": "        req = make_request(env)\n",
      "881": "        req.path_info = Journey::Router::Utils.normalize_path(req.path_info)\n",
      "882": "        @router.serve(req)\n",
      "883": "      end\n",
      "884": "\n"
    }
  },
  {
    "number": "103",
    "file": "[GEM_ROOT]/gems/rack-attack-6.7.0/lib/rack/attack.rb",
    "method": "call",
    "source": {
      "101": "\n",
      "102": "    def call(env)\n",
      "103": "      return @app.call(env) if !self.class.enabled || env[\"rack.attack.called\"]\n",
      "104": "\n",
      "105": "      env[\"rack.attack.called\"] = true\n"
    }
  },
  {
    "number": "110",
    "file": "[GEM_ROOT]/gems/rack-attack-6.7.0/lib/rack/attack.rb",
    "method": "call",
    "source": {
      "108": "\n",
      "109": "      if configuration.safelisted?(request)\n",
      "110": "        @app.call(env)\n",
      "111": "      elsif configuration.blocklisted?(request)\n",
      "112": "        # Deprecated: Keeping blocklisted_response for backwards compatibility\n"
    }
  },
  {
    "number": "36",
    "file": "[GEM_ROOT]/gems/warden-1.2.9/lib/warden/manager.rb",
    "method": "block in call",
    "source": {
      "34": "      result = catch(:warden) do\n",
      "35": "        env['warden'].on_request\n",
      "36": "        @app.call(env)\n",
      "37": "      end\n",
      "38": "\n"
    }
  },
  {
    "number": "34",
    "file": "[GEM_ROOT]/gems/warden-1.2.9/lib/warden/manager.rb",
    "method": "catch",
    "source": {
      "32": "\n",
      "33": "      env['warden'] = Proxy.new(env, self)\n",
      "34": "      result = catch(:warden) do\n",
      "35": "        env['warden'].on_request\n",
      "36": "        @app.call(env)\n"
    }
  },
  {
    "number": "34",
    "file": "[GEM_ROOT]/gems/warden-1.2.9/lib/warden/manager.rb",
    "method": "call",
    "source": {
      "32": "\n",
      "33": "      env['warden'] = Proxy.new(env, self)\n",
      "34": "      result = catch(:warden) do\n",
      "35": "        env['warden'].on_request\n",
      "36": "        @app.call(env)\n"
    }
  },
  {
    "number": "20",
    "file": "[GEM_ROOT]/gems/rack-3.1.7/lib/rack/tempfile_reaper.rb",
    "method": "call",
    "source": {
      "18": "\n",
      "19": "      begin\n",
      "20": "        _, _, body = response = @app.call(env)\n",
      "21": "      rescue Exception\n",
      "22": "        env[RACK_TEMPFILES]&.each(&:close!)\n"
    }
  },
  {
    "number": "29",
    "file": "[GEM_ROOT]/gems/rack-3.1.7/lib/rack/etag.rb",
    "method": "call",
    "source": {
      "27": "\n",
      "28": "    def call(env)\n",
      "29": "      status, headers, body = response = @app.call(env)\n",
      "30": "\n",
      "31": "      if etag_status?(status) && body.respond_to?(:to_ary) && !skip_caching?(headers)\n"
    }
  },
  {
    "number": "31",
    "file": "[GEM_ROOT]/gems/rack-3.1.7/lib/rack/conditional_get.rb",
    "method": "call",
    "source": {
      "29": "      case env[REQUEST_METHOD]\n",
      "30": "      when \"GET\", \"HEAD\"\n",
      "31": "        status, headers, body = response = @app.call(env)\n",
      "32": "\n",
      "33": "        if status == 200 && fresh?(env, headers)\n"
    }
  },
  {
    "number": "15",
    "file": "[GEM_ROOT]/gems/rack-3.1.7/lib/rack/head.rb",
    "method": "call",
    "source": {
      "13": "\n",
      "14": "    def call(env)\n",
      "15": "      _, _, body = response = @app.call(env)\n",
      "16": "\n",
      "17": "      if env[REQUEST_METHOD] == HEAD\n"
    }
  },
  {
    "number": "36",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/http/permissions_policy.rb",
    "method": "call",
    "source": {
      "34": "\n",
      "35": "      def call(env)\n",
      "36": "        _, headers, _ = response = @app.call(env)\n",
      "37": "\n",
      "38": "        return response if policy_present?(headers)\n"
    }
  },
  {
    "number": "33",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/http/content_security_policy.rb",
    "method": "call",
    "source": {
      "31": "\n",
      "32": "      def call(env)\n",
      "33": "        status, headers, _ = response = @app.call(env)\n",
      "34": "\n",
      "35": "        # Returning CSP headers with a 304 Not Modified is harmful, since nonces in the new\n"
    }
  },
  {
    "number": "272",
    "file": "[GEM_ROOT]/gems/rack-session-2.0.0/lib/rack/session/abstract/id.rb",
    "method": "context",
    "source": {
      "270": "          req = make_request env\n",
      "271": "          prepare_session(req)\n",
      "272": "          status, headers, body = app.call(req.env)\n",
      "273": "          res = Rack::Response::Raw.new status, headers\n",
      "274": "          commit_session(req, res)\n"
    }
  },
  {
    "number": "266",
    "file": "[GEM_ROOT]/gems/rack-session-2.0.0/lib/rack/session/abstract/id.rb",
    "method": "call",
    "source": {
      "264": "\n",
      "265": "        def call(env)\n",
      "266": "          context(env)\n",
      "267": "        end\n",
      "268": "\n"
    }
  },
  {
    "number": "689",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/middleware/cookies.rb",
    "method": "call",
    "source": {
      "687": "    def call(env)\n",
      "688": "      request = ActionDispatch::Request.new(env)\n",
      "689": "      response = @app.call(env)\n",
      "690": "\n",
      "691": "      if request.have_cookie_jar?\n"
    }
  },
  {
    "number": "29",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/middleware/callbacks.rb",
    "method": "block in call",
    "source": {
      "27": "      error = nil\n",
      "28": "      result = run_callbacks :call do\n",
      "29": "        @app.call(env)\n",
      "30": "      rescue => error\n",
      "31": "      end\n"
    }
  },
  {
    "number": "101",
    "file": "[GEM_ROOT]/gems/activesupport-7.1.4/lib/active_support/callbacks.rb",
    "method": "run_callbacks",
    "source": {
      "99": "\n",
      "100": "      if callbacks.empty?\n",
      "101": "        yield if block_given?\n",
      "102": "      else\n",
      "103": "        env = Filters::Environment.new(self, false, nil)\n"
    }
  },
  {
    "number": "28",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/middleware/callbacks.rb",
    "method": "call",
    "source": {
      "26": "    def call(env)\n",
      "27": "      error = nil\n",
      "28": "      result = run_callbacks :call do\n",
      "29": "        @app.call(env)\n",
      "30": "      rescue => error\n"
    }
  },
  {
    "number": "154",
    "file": "[GEM_ROOT]/gems/rack-timeout-0.7.0/lib/rack/timeout/core.rb",
    "method": "block in call",
    "source": {
      "152": "\n",
      "153": "      response = timeout.timeout(info.timeout) do           # perform request with timeout\n",
      "154": "        begin  @app.call(env)                               # boom, send request down the middleware chain\n",
      "155": "        rescue RequestTimeoutException => e                 # will actually hardly ever get to this point because frameworks tend to catch this. see README for more\n",
      "156": "          raise RequestTimeoutError.new(env), e.message, e.backtrace  # but in case it does get here, re-raise RequestTimeoutException as RequestTimeoutError\n"
    }
  },
  {
    "number": "19",
    "file": "[GEM_ROOT]/gems/rack-timeout-0.7.0/lib/rack/timeout/support/timeout.rb",
    "method": "timeout",
    "source": {
      "17": "    thr = Thread.current                                    # reference to current thread to be used in timeout thread\n",
      "18": "    job = @scheduler.run_in(secs) { @on_timeout.call thr }  # schedule this thread to be timed out; should get cancelled if block completes on time\n",
      "19": "    return block.call                                       # do what you gotta do\n",
      "20": "  ensure                                                    #\n",
      "21": "    job.cancel! if job                                      # cancel the scheduled timeout job; if the block completed on time, this\n"
    }
  },
  {
    "number": "153",
    "file": "[GEM_ROOT]/gems/rack-timeout-0.7.0/lib/rack/timeout/core.rb",
    "method": "call",
    "source": {
      "151": "      end\n",
      "152": "\n",
      "153": "      response = timeout.timeout(info.timeout) do           # perform request with timeout\n",
      "154": "        begin  @app.call(env)                               # boom, send request down the middleware chain\n",
      "155": "        rescue RequestTimeoutException => e                 # will actually hardly ever get to this point because frameworks tend to catch this. see README for more\n"
    }
  },
  {
    "number": "29",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/middleware/debug_exceptions.rb",
    "method": "call",
    "source": {
      "27": "\n",
      "28": "    def call(env)\n",
      "29": "      _, headers, body = response = @app.call(env)\n",
      "30": "\n",
      "31": "      if headers[Constants::X_CASCADE] == \"pass\"\n"
    }
  },
  {
    "number": "31",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/middleware/show_exceptions.rb",
    "method": "call",
    "source": {
      "29": "\n",
      "30": "    def call(env)\n",
      "31": "      @app.call(env)\n",
      "32": "    rescue Exception => exception\n",
      "33": "      request = ActionDispatch::Request.new env\n"
    }
  },
  {
    "number": "37",
    "file": "[GEM_ROOT]/gems/railties-7.1.4/lib/rails/rack/logger.rb",
    "method": "call_app",
    "source": {
      "35": "\n",
      "36": "          logger.info { started_request_message(request) }\n",
      "37": "          status, headers, body = response = @app.call(env)\n",
      "38": "          body = ::Rack::BodyProxy.new(body, &handle.method(:finish))\n",
      "39": "\n"
    }
  },
  {
    "number": "24",
    "file": "[GEM_ROOT]/gems/railties-7.1.4/lib/rails/rack/logger.rb",
    "method": "block in call",
    "source": {
      "22": "\n",
      "23": "        if logger.respond_to?(:tagged)\n",
      "24": "          logger.tagged(*compute_tags(request)) { call_app(request, env) }\n",
      "25": "        else\n",
      "26": "          call_app(request, env)\n"
    }
  },
  {
    "number": "139",
    "file": "[GEM_ROOT]/gems/activesupport-7.1.4/lib/active_support/tagged_logging.rb",
    "method": "block in tagged",
    "source": {
      "137": "    def tagged(*tags)\n",
      "138": "      if block_given?\n",
      "139": "        formatter.tagged(*tags) { yield self }\n",
      "140": "      else\n",
      "141": "        logger = ActiveSupport::TaggedLogging.new(self)\n"
    }
  },
  {
    "number": "39",
    "file": "[GEM_ROOT]/gems/activesupport-7.1.4/lib/active_support/tagged_logging.rb",
    "method": "tagged",
    "source": {
      "37": "      def tagged(*tags)\n",
      "38": "        pushed_count = tag_stack.push_tags(tags).size\n",
      "39": "        yield self\n",
      "40": "      ensure\n",
      "41": "        pop_tags(pushed_count)\n"
    }
  },
  {
    "number": "139",
    "file": "[GEM_ROOT]/gems/activesupport-7.1.4/lib/active_support/tagged_logging.rb",
    "method": "tagged",
    "source": {
      "137": "    def tagged(*tags)\n",
      "138": "      if block_given?\n",
      "139": "        formatter.tagged(*tags) { yield self }\n",
      "140": "      else\n",
      "141": "        logger = ActiveSupport::TaggedLogging.new(self)\n"
    }
  },
  {
    "number": "241",
    "file": "[GEM_ROOT]/gems/activesupport-7.1.4/lib/active_support/broadcast_logger.rb",
    "method": "method_missing",
    "source": {
      "239": "          super(name, *args, **kwargs, &block)\n",
      "240": "        elsif loggers.one?\n",
      "241": "          loggers.first.send(name, *args, **kwargs, &block)\n",
      "242": "        else\n",
      "243": "          loggers.map { |logger| logger.send(name, *args, **kwargs, &block) }\n"
    }
  },
  {
    "number": "24",
    "file": "[GEM_ROOT]/gems/railties-7.1.4/lib/rails/rack/logger.rb",
    "method": "call",
    "source": {
      "22": "\n",
      "23": "        if logger.respond_to?(:tagged)\n",
      "24": "          logger.tagged(*compute_tags(request)) { call_app(request, env) }\n",
      "25": "        else\n",
      "26": "          call_app(request, env)\n"
    }
  },
  {
    "number": "92",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/middleware/remote_ip.rb",
    "method": "call",
    "source": {
      "90": "      req = ActionDispatch::Request.new env\n",
      "91": "      req.remote_ip = GetIp.new(req, check_ip, proxies)\n",
      "92": "      @app.call(req.env)\n",
      "93": "    end\n",
      "94": "\n"
    }
  },
  {
    "number": "19",
    "file": "[GEM_ROOT]/gems/request_store-1.7.0/lib/request_store/middleware.rb",
    "method": "call",
    "source": {
      "17": "      RequestStore.begin!\n",
      "18": "\n",
      "19": "      status, headers, body = @app.call(env)\n",
      "20": "\n",
      "21": "      body = Rack::BodyProxy.new(body) do\n"
    }
  },
  {
    "number": "28",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/middleware/request_id.rb",
    "method": "call",
    "source": {
      "26": "      req = ActionDispatch::Request.new env\n",
      "27": "      req.request_id = make_request_id(req.headers[@header])\n",
      "28": "      @app.call(env).tap { |_status, headers, _body| headers[@header] = req.request_id }\n",
      "29": "    end\n",
      "30": "\n"
    }
  },
  {
    "number": "28",
    "file": "[GEM_ROOT]/gems/rack-3.1.7/lib/rack/method_override.rb",
    "method": "call",
    "source": {
      "26": "      end\n",
      "27": "\n",
      "28": "      @app.call(env)\n",
      "29": "    end\n",
      "30": "\n"
    }
  },
  {
    "number": "24",
    "file": "[GEM_ROOT]/gems/rack-3.1.7/lib/rack/runtime.rb",
    "method": "call",
    "source": {
      "22": "    def call(env)\n",
      "23": "      start_time = Utils.clock_time\n",
      "24": "      _, headers, _ = response = @app.call(env)\n",
      "25": "\n",
      "26": "      request_time = Utils.clock_time - start_time\n"
    }
  },
  {
    "number": "29",
    "file": "[GEM_ROOT]/gems/activesupport-7.1.4/lib/active_support/cache/strategy/local_cache_middleware.rb",
    "method": "call",
    "source": {
      "27": "          def call(env)\n",
      "28": "            LocalCacheRegistry.set_cache_for(local_cache_key, LocalStore.new)\n",
      "29": "            response = @app.call(env)\n",
      "30": "            response[2] = ::Rack::BodyProxy.new(response[2]) do\n",
      "31": "              LocalCacheRegistry.set_cache_for(local_cache_key, nil)\n"
    }
  },
  {
    "number": "14",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/middleware/executor.rb",
    "method": "call",
    "source": {
      "12": "      state = @executor.run!(reset: true)\n",
      "13": "      begin\n",
      "14": "        response = @app.call(env)\n",
      "15": "\n",
      "16": "        if env[\"action_dispatch.report_exception\"]\n"
    }
  },
  {
    "number": "25",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/middleware/static.rb",
    "method": "call",
    "source": {
      "23": "\n",
      "24": "    def call(env)\n",
      "25": "      @file_handler.attempt(env) || @app.call(env)\n",
      "26": "    end\n",
      "27": "  end\n"
    }
  },
  {
    "number": "114",
    "file": "[GEM_ROOT]/gems/rack-3.1.7/lib/rack/sendfile.rb",
    "method": "call",
    "source": {
      "112": "\n",
      "113": "    def call(env)\n",
      "114": "      _, headers, body = response = @app.call(env)\n",
      "115": "\n",
      "116": "      if body.respond_to?(:to_path)\n"
    }
  },
  {
    "number": "79",
    "file": "[GEM_ROOT]/gems/actionpack-7.1.4/lib/action_dispatch/middleware/ssl.rb",
    "method": "call",
    "source": {
      "77": "\n",
      "78": "      if request.ssl?\n",
      "79": "        @app.call(env).tap do |status, headers, body|\n",
      "80": "          set_hsts_header! headers\n",
      "81": "          flag_cookies_as_secure! headers if @secure_cookies && !@exclude.call(request)\n"
    }
  },
  {
    "number": "8",
    "file": "[GEM_ROOT]/gems/slowpoke-0.5.0/lib/slowpoke/middleware.rb",
    "method": "call",
    "source": {
      "6": "\n",
      "7": "    def call(env)\n",
      "8": "      @app.call(env)\n",
      "9": "    ensure\n",
      "10": "      # extremely important\n"
    }
  },
  {
    "number": "536",
    "file": "[GEM_ROOT]/gems/railties-7.1.4/lib/rails/engine.rb",
    "method": "call",
    "source": {
      "534": "    def call(env)\n",
      "535": "      req = build_request env\n",
      "536": "      app.call req.env\n",
      "537": "    end\n",
      "538": "\n"
    }
  },
  {
    "number": "107",
    "file": "/usr/lib/ruby/vendor_ruby/phusion_passenger/rack/thread_handler_extension.rb",
    "method": "process_request",
    "source": {
      "105": "\n",
      "106": "          begin\n",
      "107": "            status, headers, body = @app.call(env)\n",
      "108": "          rescue => e\n",
      "109": "            if e.is_a?(Errno::ENOBUFS)\n"
    }
  },
  {
    "number": "149",
    "file": "/usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler/thread_handler.rb",
    "method": "accept_and_process_next_request",
    "source": {
      "147": "          begin\n",
      "148": "            if headers[REQUEST_METHOD] == GET\n",
      "149": "              process_request(headers, connection, socket_wrapper, @protocol == :http)\n",
      "150": "            elsif headers[REQUEST_METHOD] == PING\n",
      "151": "              process_ping(headers, connection)\n"
    }
  },
  {
    "number": "110",
    "file": "/usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler/thread_handler.rb",
    "method": "main_loop",
    "source": {
      "108": "          finish_callback.call\n",
      "109": "          while true\n",
      "110": "            hijacked = accept_and_process_next_request(socket_wrapper, channel, buffer)\n",
      "111": "            socket_wrapper = Utils::UnseekableSocket.new if hijacked\n",
      "112": "          end\n"
    }
  },
  {
    "number": "419",
    "file": "/usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler.rb",
    "method": "block (3 levels) in start_threads",
    "source": {
      "417": "              handler = thread_handler.new(self, main_socket_options)\n",
      "418": "              handler.install\n",
      "419": "              handler.main_loop(set_initialization_state_to_true)\n",
      "420": "            ensure\n",
      "421": "              set_initialization_state.call(false)\n"
    }
  },
  {
    "number": "113",
    "file": "/usr/lib/ruby/vendor_ruby/phusion_passenger/utils.rb",
    "method": "block in create_thread_and_abort_on_exception",
    "source": {
      "111": "        Thread.current.abort_on_exception = true\n",
      "112": "        begin\n",
      "113": "          yield(*args)\n",
      "114": "        rescue SystemExit\n",
      "115": "          raise\n"
    }
  }
]