Just enforce the output encoding for Ansi2html
Fixes https://sentry.gitlap.com/gitlab/gitlabcom/issues/27545/
This commit is contained in:
parent
ec9f6180bc
commit
b07da07c82
3 changed files with 24 additions and 12 deletions
|
@ -172,7 +172,7 @@ module Ci
|
|||
close_open_tags()
|
||||
|
||||
OpenStruct.new(
|
||||
html: @out,
|
||||
html: @out.force_encoding(Encoding.default_external),
|
||||
state: state,
|
||||
append: append,
|
||||
truncated: truncated,
|
||||
|
|
|
@ -14,14 +14,7 @@ module Gitlab
|
|||
|
||||
def initialize
|
||||
@stream = yield
|
||||
if @stream
|
||||
@stream.binmode
|
||||
# Ci::Ansi2html::Converter would read from @stream directly,
|
||||
# using @stream.each_line to be specific. It's safe to set
|
||||
# the encoding here because IO#seek(bytes) and IO#read(bytes)
|
||||
# are not characters based, so encoding doesn't matter to them.
|
||||
@stream.set_encoding(Encoding.default_external)
|
||||
end
|
||||
@stream.binmode if @stream
|
||||
end
|
||||
|
||||
def valid?
|
||||
|
@ -68,8 +61,8 @@ module Gitlab
|
|||
|
||||
def html(last_lines: nil)
|
||||
text = raw(last_lines: last_lines)
|
||||
stream = StringIO.new(text)
|
||||
::Ci::Ansi2html.convert(stream).html
|
||||
buffer = StringIO.new(text)
|
||||
::Ci::Ansi2html.convert(buffer).html
|
||||
end
|
||||
|
||||
def extract_coverage(regex)
|
||||
|
|
|
@ -71,12 +71,20 @@ describe Gitlab::Ci::Trace::Stream do
|
|||
end
|
||||
|
||||
describe '#append' do
|
||||
let(:tempfile) { Tempfile.new }
|
||||
|
||||
let(:stream) do
|
||||
described_class.new do
|
||||
StringIO.new("12345678")
|
||||
tempfile.write("12345678")
|
||||
tempfile.rewind
|
||||
tempfile
|
||||
end
|
||||
end
|
||||
|
||||
after do
|
||||
tempfile.unlink
|
||||
end
|
||||
|
||||
it "truncates and append content" do
|
||||
stream.append("89", 4)
|
||||
stream.seek(0)
|
||||
|
@ -84,6 +92,17 @@ describe Gitlab::Ci::Trace::Stream do
|
|||
expect(stream.size).to eq(6)
|
||||
expect(stream.raw).to eq("123489")
|
||||
end
|
||||
|
||||
it 'appends in binary mode' do
|
||||
'😺'.force_encoding('ASCII-8BIT').each_char.with_index do |byte, offset|
|
||||
stream.append(byte, offset)
|
||||
end
|
||||
|
||||
stream.seek(0)
|
||||
|
||||
expect(stream.size).to eq(4)
|
||||
expect(stream.raw).to eq('😺')
|
||||
end
|
||||
end
|
||||
|
||||
describe '#set' do
|
||||
|
|
Loading…
Reference in a new issue