A Reminder about Base64#encode64 in Ruby
Some days ago I was in a integration with a third-party service, so I ended up making use of an HTTP authorization header.
As normal, I needed to pass username and password base64-encoded in the format "username:password".
The first thing on my mind was to use Base64#encode64
from Ruby's standard library as usual (see the snippet below).
require 'base64'
Base64.encode64('myusername:mysuperpassword')
However, I could not authenticate, I just received the following error message "':' is missing".
Not for the first time, after a while dealing with this particular issue, I found out the reason. As very well documented, encode64
adds a \n
to every 60 encoded chars in the output string.
require 'base64'
Base64.encode64('a') # => "YQ==\n"
Base64.encode64('a') == "YQ==" # => false
As solution, we could use Base64#strict_encode64
or keep Base64#encode64
and then replace \n
occurrences. See below:
require 'base64'
Base64.strict_encode64('a') # => "YQ=="
Base64.strict_encode64('a') == "YQ==" # => true
require 'base64'
Base64.encode64('a') # => "YQ==\n"
Base64.encode64('a').gsub("\n", '') == "YQ==" # => true
But the first approach is faster (2x at least on avg):
puts Benchmark.measure { 5000.times{ Base64.strict_encode64('a') } }
0.010000 0.000000 0.010000 ( 0.009167)
puts Benchmark.measure { 5000.times{ Base64.encode64('a').gsub("\n", '') } }
0.020000 0.000000 0.020000 ( 0.024225)
I hope don't forget it anymore.
See you.