diff --git a/lib/std/base64.zig b/lib/std/base64.zig index 8b90617c4130b3d7d8e3180fcc45a894fc3f099a..9771436f45b4943669910077e2938a34eae1cd08 100644 --- a/lib/std/base64.zig +++ b/lib/std/base64.zig @@ -31,6 +31,9 @@ pub const standard_alphabet_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopq fn standardBase64DecoderWithIgnore(ignore: []const u8) Base64DecoderWithIgnore { return Base64DecoderWithIgnore.init(standard_alphabet_chars, '=', ignore); } +fn standardNoPadBase64DecoderWithIgnore(ignore: []const u8) Base64DecoderWithIgnore { + return Base64DecoderWithIgnore.init(standard_alphabet_chars, null, ignore); +} /// Standard Base64 codecs, with padding, as defined in /// [RFC 4648 section 4](https://datatracker.ietf.org/doc/html/rfc4648#section-4). @@ -47,7 +50,7 @@ pub const standard = Codecs{ pub const standard_no_pad = Codecs{ .alphabet_chars = standard_alphabet_chars, .pad_char = null, - .decoderWithIgnore = standardBase64DecoderWithIgnore, + .decoderWithIgnore = standardNoPadBase64DecoderWithIgnore, .Encoder = Base64Encoder.init(standard_alphabet_chars, null), .Decoder = Base64Decoder.init(standard_alphabet_chars, null), }; @@ -56,6 +59,9 @@ pub const standard_no_pad = Codecs{ /// [RFC 4648 section 5](https://datatracker.ietf.org/doc/html/rfc4648#section-5). pub const url_safe_alphabet_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".*; fn urlSafeBase64DecoderWithIgnore(ignore: []const u8) Base64DecoderWithIgnore { + return Base64DecoderWithIgnore.init(url_safe_alphabet_chars, '=', ignore); +} +fn urlSafeNoPadBase64DecoderWithIgnore(ignore: []const u8) Base64DecoderWithIgnore { return Base64DecoderWithIgnore.init(url_safe_alphabet_chars, null, ignore); } @@ -74,7 +80,7 @@ pub const url_safe = Codecs{ pub const url_safe_no_pad = Codecs{ .alphabet_chars = url_safe_alphabet_chars, .pad_char = null, - .decoderWithIgnore = urlSafeBase64DecoderWithIgnore, + .decoderWithIgnore = urlSafeNoPadBase64DecoderWithIgnore, .Encoder = Base64Encoder.init(url_safe_alphabet_chars, null), .Decoder = Base64Decoder.init(url_safe_alphabet_chars, null), }; @@ -401,6 +407,20 @@ test "base64 url_safe_no_pad" { try comptime testAllApis(url_safe_no_pad, "comptime", "Y29tcHRpbWU"); } +test "base64 standard_no_pad" { + @setEvalBranchQuota(8000); + try testAllApis(standard_no_pad, "f", "Zg"); + try comptime testAllApis(standard_no_pad, "comptime", "Y29tcHRpbWU"); + try testError(standard_no_pad, "Zg==", error.InvalidCharacter); +} + +test "base64 url_safe" { + @setEvalBranchQuota(8000); + try testAllApis(url_safe, "f", "Zg=="); + try comptime testAllApis(url_safe, "comptime", "Y29tcHRpbWU="); + try testError(url_safe, "Zg", error.InvalidPadding); +} + fn testBase64() !void { const codecs = standard;