lib/base64: Support line breaks in base64 strings.
authorPhilippe Pepos Petitclerc <ppeposp@gmail.com>
Thu, 12 May 2016 19:06:31 +0000 (15:06 -0400)
committerPhilippe Pepos Petitclerc <ppeposp@gmail.com>
Thu, 12 May 2016 19:06:31 +0000 (15:06 -0400)
This allows to read directly ascii-armored blocks.

Signed-off-by: Philippe Pepos Petitclerc <ppeposp@gmail.com>

lib/base64.nit

index cb73b3b..8f6565b 100644 (file)
@@ -78,15 +78,22 @@ redef class NativeString
        # Decodes `self` from base64
        #
        #      assert "c3RyaW5n".decode_base64 == "string"
+       #      assert "c3Rya\nW5n".decode_base64 == "string"
        #
        # REQUIRE: `length % 4 == 0`
        private fun decode_base64(length: Int, padding: nullable Byte): Bytes do
                if padding == null then padding = '='.ascii
                var inv = once inverted_base64_chars
                if length == 0 then return new Bytes.empty
-               assert length % 4 == 0 else print "base64::decode_base64 only supports strings of length multiple of 4"
 
-               var bytes = self
+               # Remove non-base64 chars
+               var bytes = new Bytes.with_capacity(length)
+               for k in [0 .. length[ do
+                       var byte = self[k]
+                       if inv.has_key(byte) or byte == padding then bytes.add(byte)
+               end
+               length = bytes.length
+
                var steps = length / 4
                var result_length = steps * 3