Files
gitlab-foss/lib/gitlab/xml_converter.rb
2024-05-08 21:12:23 +00:00

33 lines
962 B
Ruby

# frozen_string_literal: true
# rubocop:disable Gitlab/NamespacedClass -- Base method live in the global namespace
module Gitlab
MAX_XML_SIZE = 30.megabytes
class XmlConverter < ActiveSupport::XMLConverter
# Override the default Nokogiri parser in to allow parsing huge XML files
def initialize(xml, disallowed_types = nil)
return unless xml.present?
if xml.size > MAX_XML_SIZE
raise ArgumentError, format(_("The XML file must be less than %{max_size} MB."),
max_size: MAX_XML_SIZE / 1.megabyte)
end
doc = Nokogiri::XML(xml, &:huge)
raise doc.errors.first unless doc.errors.empty?
# These two variables are internally required by `ActiveSupport::XMLConverter`
@xml = normalize_keys(doc.to_hash)
@disallowed_types = disallowed_types || DISALLOWED_TYPES
end
def to_h
return unless @xml.present?
super
end
end
end
# rubocop:enable Gitlab/NamespacedClass