Skip to content

[BUG] Encoding::UndefinedConversionError with logger enabledΒ #300

@erikfercak

Description

@erikfercak

New bug checklist

Bug description

We are hitting the already once reported and fixed encoding conversion error #120 using Ruby 3.4.5 and Truemail 3.3.1 with logging enabled.

Here's a small repro case

Details
# test.rb
require "truemail"

Truemail.configure do |config|
  config.verifier_email = "address@verifier.local"
  config.logger = {
    stdout: true
  }
end

Truemail.validate("almost_gmail@gnail.com", with: :smtp)

And here's the full stack trace:

Details
> ruby test.rb
/Users/erik/.local/share/mise/installs/ruby/3.4.5/lib/ruby/gems/3.4.0/gems/truemail-3.3.1/lib/truemail/log/serializer/validator_base.rb:17:in 'String#encode': "\xD3" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)
        from /Users/erik/.local/share/mise/installs/ruby/3.4.5/lib/ruby/gems/3.4.0/gems/truemail-3.3.1/lib/truemail/log/serializer/validator_base.rb:17:in 'block in Truemail::Log::Serializer::ValidatorBase#replace_invalid_chars'
        from /Users/erik/.local/share/mise/installs/ruby/3.4.5/lib/ruby/gems/3.4.0/gems/truemail-3.3.1/lib/truemail/log/serializer/validator_base.rb:30:in 'Hash#transform_values'
        from /Users/erik/.local/share/mise/installs/ruby/3.4.5/lib/ruby/gems/3.4.0/gems/truemail-3.3.1/lib/truemail/log/serializer/validator_base.rb:30:in 'block in Truemail::Log::Serializer::ValidatorBase#smtp_debug'
        from /Users/erik/.local/share/mise/installs/ruby/3.4.5/lib/ruby/gems/3.4.0/gems/truemail-3.3.1/lib/truemail/log/serializer/validator_base.rb:24:in 'Array#map'
        from /Users/erik/.local/share/mise/installs/ruby/3.4.5/lib/ruby/gems/3.4.0/gems/truemail-3.3.1/lib/truemail/log/serializer/validator_base.rb:24:in 'Truemail::Log::Serializer::ValidatorBase#smtp_debug'
        from /Users/erik/.local/share/mise/installs/ruby/3.4.5/lib/ruby/gems/3.4.0/gems/truemail-3.3.1/lib/truemail/log/serializer/validator_base.rb:43:in 'Truemail::Log::Serializer::ValidatorBase#result'
        from /Users/erik/.local/share/mise/installs/ruby/3.4.5/lib/ruby/gems/3.4.0/gems/truemail-3.3.1/lib/truemail/log/serializer/validator_text.rb:51:in 'Truemail::Log::Serializer::ValidatorText#txt_info_title'
        from /Users/erik/.local/share/mise/installs/ruby/3.4.5/lib/ruby/gems/3.4.0/gems/truemail-3.3.1/lib/truemail/log/serializer/validator_text.rb:11:in 'Truemail::Log::Serializer::ValidatorText#serialize'
        from /Users/erik/.local/share/mise/installs/ruby/3.4.5/lib/ruby/gems/3.4.0/gems/truemail-3.3.1/lib/truemail/log/serializer/base.rb:22:in 'Truemail::Log::Serializer::Base.call'
        from /Users/erik/.local/share/mise/installs/ruby/3.4.5/lib/ruby/gems/3.4.0/gems/truemail-3.3.1/lib/truemail/logger.rb:71:in 'Truemail::Logger#push'
        from /Users/erik/.local/share/mise/installs/ruby/3.4.5/lib/ruby/gems/3.4.0/gems/truemail-3.3.1/lib/truemail/validator.rb:31:in 'Truemail::Validator#run'
        from /Users/erik/.local/share/mise/installs/ruby/3.4.5/lib/ruby/gems/3.4.0/gems/truemail-3.3.1/lib/truemail.rb:30:in 'Truemail.validate'
        from test.rb:10:in ''
  

I did some digging, the problematic string in question is something like "550 mailbox almost_gmail@gnail.com unavailable (\xD3\xCA\xCF\xE4\xB2\xBB\xB4\xE6\xD4\xDA)\n" with the actual byte representation of:

bytes = 
[53, 53, 48, 32, 109, 97, 105, 108, 98, 111, 120, 32, 97, 108, 109, 111, 115, 116, 95, 103, 109, 97, 105, 108, 64, 103, 110, 97, 105, 108, 46, 99, 111, 109, 32, 117, 110, 97, 118, 97, 105, 108, 97, 98, 108, 101, 32, 40, 211, 202, 207, 228, 178, 187, 180, 230, 212, 218, 41, 10]

Converting them back to string and running the relevant sanitization code from Truemail::Log::Serializer::ValidatorBase#replace_invalid_chars triggers the same error:

Details
> irb
irb(main):001* bytes =
irb(main):002> [53, 53, 48, 32, 109, 97, 105, 108, 98, 111, 120, 32, 97, 108, 109, 111, 115, 116, 95, 103, 109, 97, 105, 108, 64, 103, 110, 97, 105, 108, 46, 99, 111, 109, 32, 117, 110, 97, 118, 97, 105, 108, 97, 98, 108, 101, 32, 40, 211, 202, 207, 228, 178, 187, 180, 230, 212, 218, 41, 10]
=>
[53,
...
irb(main):003> bytes.pack("C*")
=> "550 mailbox almost_gmail@gnail.com unavailable (\xD3\xCA\xCF\xE4\xB2\xBB\xB4\xE6\xD4\xDA)\n"
irb(main):004> bytes.pack("C*").encode("UTF-8", invalid: :replace)
(irb):4:in 'String#encode': "\xD3" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)
        from (irb):4:in ''
        from :168:in 'Kernel#loop'
        from /Users/erik/.local/share/mise/installs/ruby/3.4.5/lib/ruby/gems/3.4.0/gems/irb-1.14.3/exe/irb:9:in ''
        from /Users/erik/.local/share/mise/installs/ruby/3.4.5/bin/irb:25:in 'Kernel#load'
        from /Users/erik/.local/share/mise/installs/ruby/3.4.5/bin/irb:25:in ''
irb(main):005>

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions