Convert HttpLog request/response attrs to UTF8 before saving (fixes #2100)

This commit is contained in:
Ryan Lue 2018-07-11 17:01:54 +08:00
parent 2e4b7128f1
commit 680a560c06
3 changed files with 40 additions and 0 deletions

View file

@ -4,6 +4,9 @@ class HttpLog < ApplicationModel
store :request
store :response
# See https://github.com/zammad/zammad/issues/2100
before_save :messages_to_utf8
=begin
cleanup old http logs
@ -21,4 +24,10 @@ optional you can put the max oldest chat entries as argument
true
end
private
def messages_to_utf8
request.transform_values! { |v| v.try(:utf8_encode) || v }
response.transform_values! { |v| v.try(:utf8_encode) || v }
end
end

View file

@ -0,0 +1,12 @@
FactoryBot.define do
factory :http_log do
direction 'in'
facility 'cti'
add_attribute(:method) { 'post' }
url 'https://zammad.fqdn.com/api/v1/integration/cti/log'
request { { content: 'foo' } }
response { { content: 'bar' } }
created_by_id 1
updated_by_id 1
end
end

View file

@ -0,0 +1,19 @@
require 'rails_helper'
RSpec.describe HttpLog do
let(:subject) { build(:http_log) }
describe 'callbacks' do
# See https://github.com/zammad/zammad/issues/2100
it 'converts request/response message data to UTF-8 before saving' do
subject.request[:content] = 'foo'.force_encoding('ascii-8bit')
subject.response[:content] = 'bar'.force_encoding('ascii-8bit')
# rubocop:disable Layout/MultilineMethodCallIndentation
expect { subject.save }
.to change { subject.request[:content].encoding.name }.from('ASCII-8BIT').to('UTF-8')
.and change { subject.response[:content].encoding.name }.from('ASCII-8BIT').to('UTF-8')
# rubocop:enable Layout/MultilineMethodCallIndentation
end
end
end