1
0
mirror of https://github.com/meineerde/rackstash.git synced 2026-01-31 17:27:13 +00:00

Retain the original message in a Message object

We only format and convert it after passing it through the formatter.
That way, we can ensure that the actually interesting formatted value
is valid.
This commit is contained in:
Holger Just 2017-01-26 23:20:02 +01:00
parent 2261315dcc
commit d192db441a
4 changed files with 60 additions and 36 deletions

View File

@ -28,7 +28,7 @@ module Rackstash
class RawFormatter
def call(_severity, _timestamp, _progname, msg)
msg
msg.is_a?(String) ? msg : msg.inspect
end
end
end

View File

@ -34,7 +34,7 @@ module Rackstash
progname: PROGNAME,
formatter: RAW_FORMATTER
)
@message = cleanup_message(msg)
@message = dup_freeze(msg)
@severity = Integer(severity)
@severity = 0 if @severity < 0
@ -54,7 +54,7 @@ module Rackstash
end
def to_s
@formatter.call(severity_label, @time, @progname, @message)
cleanup @formatter.call(severity_label, @time, @progname, @message)
end
alias_method :to_str, :to_s
alias_method :as_json, :to_s
@ -66,8 +66,7 @@ module Rackstash
#
# @param msg [#to_s] a message to be added to the buffer
# @return [String] the sanitized frozen message
def cleanup_message(msg)
msg = msg.inspect unless msg.is_a?(String)
def cleanup(msg)
msg = utf8_encode(msg)
# remove useless ANSI color codes
msg.gsub!(/\e\[[0-9;]*m/, EMPTY_STRING)

View File

@ -54,4 +54,12 @@ describe Rackstash::RawFormatter do
msg = 'my message'
expect(formatter.call('ERROR', Time.now, 'progname', msg)).to equal msg
end
it 'inspects non-string messages' do
obj = Object.new
expect(obj).to receive(:inspect).and_return('object')
expect(formatter.call('ERROR', Time.now, 'progname', obj)).to eql 'object'
end
end

View File

@ -11,44 +11,20 @@ require 'rackstash/message'
describe Rackstash::Message do
describe '#message' do
it 'dups the message string' do
str = 'a message'
str = 'a message'.encode(Encoding::ASCII_8BIT)
message = Rackstash::Message.new(str)
expect(message.message).to eql str
expect(message.message).not_to equal str
expect(message.message.encoding).to eql Encoding::ASCII_8BIT
expect(message.message).to be_frozen
end
it 'cleans the message' do
messages = [
["First\r\nSecond", "First\nSecond"],
["First\r\nSecond\n\r", "First\nSecond\n\n"],
["Foo\r\n\rBar", "Foo\n\nBar"],
["\r \tWord\n\nPhrase\n", "\n \tWord\n\nPhrase\n"],
["\e[31mRED TEXT\e[0m", 'RED TEXT']
]
it 'accepts non-string objects' do
exception = StandardError.new('An error')
message = Rackstash::Message.new(exception)
messages.each do |msg, clean|
message = Rackstash::Message.new(msg)
expect(message.message).to eql clean
end
end
it 'encodes the message as UTF-8' do
utf8_str = 'Dönerstraße'
latin_str = utf8_str.encode(Encoding::ISO8859_9)
expect(latin_str.encoding).to eql Encoding::ISO8859_9
message = Rackstash::Message.new(latin_str)
expect(message.message).to eql utf8_str
expect(message.message.encoding).to eql Encoding::UTF_8
end
it 'does not raise an error on incompatible encodings' do
binary = Digest::SHA256.digest('string')
message = Rackstash::Message.new(binary)
expect(message.message).to include '<27>'
expect(message.message).to eq exception
end
end
@ -127,7 +103,7 @@ describe Rackstash::Message do
expect(Rackstash::Message.new('').formatter).to equal Rackstash::Message::RAW_FORMATTER
message = Rackstash::Message.new('Beep boop')
expect(message.to_s).to equal message.message
expect(message.to_s).to eql 'Beep boop'
end
end
@ -153,6 +129,47 @@ describe Rackstash::Message do
expect(message.to_s).to eql 'Formatted Message'
end
it 'cleans the message' do
messages = [
["First\r\nSecond", "First\nSecond"],
["First\r\nSecond\n\r", "First\nSecond\n\n"],
["Foo\r\n\rBar", "Foo\n\nBar"],
["\r \tWord\n\nPhrase\n", "\n \tWord\n\nPhrase\n"],
["\e[31mRED TEXT\e[0m", 'RED TEXT']
]
messages.each do |msg, clean|
message = Rackstash::Message.new(msg)
expect(message.to_s).to eql clean
end
end
it 'encodes the message as UTF-8' do
utf8_str = 'Dönerstraße'
latin_str = utf8_str.encode(Encoding::ISO8859_9)
expect(latin_str.encoding).to eql Encoding::ISO8859_9
message = Rackstash::Message.new(latin_str)
expect(message.to_s).to eql utf8_str
expect(message.to_s.encoding).to eql Encoding::UTF_8
end
it 'does not raise an error on incompatible encodings' do
binary = Digest::SHA256.digest('string')
message = Rackstash::Message.new(binary)
expect(message.to_s).to include '<27>'
expect(message.to_s.encoding).to eql Encoding::UTF_8
end
it 'accepts non-string objects' do
exception = StandardError.new('An error')
message = Rackstash::Message.new(exception)
expect(message.to_s).to eql '#<StandardError: An error>'
end
end
describe '#frozen?' do