diff --git a/lib/gitlab/json.rb b/lib/gitlab/json.rb index 561cd4509b1ad340cbb657b998b1ccd63440b2e9..767ce310b5a05b737fa86c53b6f3b89ff7e8e39d 100644 --- a/lib/gitlab/json.rb +++ b/lib/gitlab/json.rb @@ -242,7 +242,7 @@ class LimitedEncoder def self.encode(object, limit: 25.megabytes) return ::Gitlab::Json.dump(object) unless Feature.enabled?(:json_limited_encoder) - buffer = [] + buffer = StringIO.new buffer_size = 0 ::Yajl::Encoder.encode(object) do |data_chunk| @@ -254,7 +254,7 @@ def self.encode(object, limit: 25.megabytes) buffer_size += chunk_size end - buffer.join('') + buffer.string end end end diff --git a/spec/lib/gitlab/json_spec.rb b/spec/lib/gitlab/json_spec.rb index 42c4b315edf034b56799bff92093a40e604d3bb0..f9f57752b0ab01bd79419bbe30cf55b70669cf30 100644 --- a/spec/lib/gitlab/json_spec.rb +++ b/spec/lib/gitlab/json_spec.rb @@ -411,7 +411,7 @@ end describe Gitlab::Json::LimitedEncoder do - subject { described_class.encode(obj, limit: 8.kilobytes) } + subject { described_class.encode(obj, limit: 10.kilobytes) } context 'when object size is acceptable' do let(:obj) { { test: true } } @@ -431,6 +431,16 @@ end end + context 'when object contains ASCII-8BIT encoding' do + let(:obj) { [{ a: "\x8F" }] * 1000 } + + it 'does not raise encoding error' do + expect { subject }.not_to raise_error + expect(subject).to be_a(String) + expect(subject.size).to eq(10001) + end + end + context 'when json_limited_encoder is disabled' do let(:obj) { [{ test: true }] * 1000 }