discourse/lib/freedom_patches/safe_buffer.rb
Loïc Guitaut 357011eb3b DEV: Clean up freedom patches
This patch removes some of our freedom patches that have been deprecated
for some time now.
Some of them have been updated so we’re not shipping code based on an
old version of Rails.
2022-04-06 10:07:14 +02:00

37 lines
1.3 KiB
Ruby

# frozen_string_literal: true
# For some reason safe buffer is getting invalid encoding in some cases
# we work around the issue and log the problems
#
# The alternative is a broken website when this happens
module FreedomPatches
module SafeBuffer
def concat(value, raise_encoding_err = false)
super(value)
rescue Encoding::CompatibilityError
raise if raise_encoding_err
encoding_diags = +"internal encoding #{Encoding.default_internal}, external encoding #{Encoding.default_external}"
if encoding != Encoding::UTF_8
encoding_diags << " my encoding is #{encoding} "
force_encoding("UTF-8")
unless valid_encoding?
encode!("utf-16", "utf-8", invalid: :replace)
encode!("utf-8", "utf-16")
end
Rails.logger.warn("Encountered a non UTF-8 string in SafeBuffer - #{self} - #{encoding_diags}")
end
if value.encoding != Encoding::UTF_8
encoding_diags << " attempted to append encoding #{value.encoding} "
value = value.dup.force_encoding("UTF-8").scrub
Rails.logger.warn("Attempted to concat a non UTF-8 string in SafeBuffer - #{value} - #{encoding_diags}")
end
concat(value, _raise = true)
end
ActiveSupport::SafeBuffer.prepend(self)
ActiveSupport::SafeBuffer.class_eval("alias << concat")
end
end