Add encode and decode padding options
diff --git a/libraries/stdlib/api/js/kotlin.io.encoding.kt b/libraries/stdlib/api/js/kotlin.io.encoding.kt index 8241b5b..3843517 100644 --- a/libraries/stdlib/api/js/kotlin.io.encoding.kt +++ b/libraries/stdlib/api/js/kotlin.io.encoding.kt
@@ -17,11 +17,29 @@ public final fun encodeToByteArray(source: kotlin.ByteArray, startIndex: kotlin.Int = ..., endIndex: kotlin.Int = ...): kotlin.ByteArray + public final fun withDecodeOption(option: kotlin.io.encoding.Base64.DecodeOption): kotlin.io.encoding.Base64 + + public final fun withEncodeOption(option: kotlin.io.encoding.Base64.EncodeOption): kotlin.io.encoding.Base64 + + public final enum class DecodeOption : kotlin.Enum<kotlin.io.encoding.Base64.DecodeOption> { + enum entry REQUIRE_PADDING + + enum entry REQUIRE_NO_PADDING + + enum entry REQUIRE_PADDING_OR_NO_PADDING + } + public companion object of Base64 Default : kotlin.io.encoding.Base64 { public final val Mime: kotlin.io.encoding.Base64 { get; } public final val UrlSafe: kotlin.io.encoding.Base64 { get; } } + + public final enum class EncodeOption : kotlin.Enum<kotlin.io.encoding.Base64.EncodeOption> { + enum entry PADDING + + enum entry NO_PADDING + } } @kotlin.RequiresOptIn(level = Level.ERROR)
diff --git a/libraries/stdlib/src/kotlin/io/encoding/Base64.kt b/libraries/stdlib/src/kotlin/io/encoding/Base64.kt index 8f94169..e84ae7d 100644 --- a/libraries/stdlib/src/kotlin/io/encoding/Base64.kt +++ b/libraries/stdlib/src/kotlin/io/encoding/Base64.kt
@@ -19,12 +19,41 @@ @ExperimentalEncodingApi public open class Base64 private constructor( internal val isUrlSafe: Boolean, - internal val isMimeScheme: Boolean + internal val isMimeScheme: Boolean, + private val encodePadding: EncodeOption = EncodeOption.PADDING, + private val decodePadding: DecodeOption = DecodeOption.REQUIRE_PADDING ) { init { require(!isUrlSafe || !isMimeScheme) } + public enum class EncodeOption { + PADDING, + NO_PADDING + } + + public enum class DecodeOption { + REQUIRE_PADDING, + REQUIRE_NO_PADDING, + REQUIRE_PADDING_OR_NO_PADDING + } + + public fun withEncodeOption(option: EncodeOption): Base64 { + return if (option != encodePadding) { + Base64(isUrlSafe, isMimeScheme, option, decodePadding) + } else { + this + } + } + + public fun withDecodeOption(option: DecodeOption): Base64 { + return if (option != decodePadding) { + Base64(isUrlSafe, isMimeScheme, encodePadding, option) + } else { + this + } + } + /** * Encodes bytes from the specified [source] array or its subrange. * Returns a [ByteArray] containing the resulting symbols.
diff --git a/libraries/stdlib/test/io.encoding/Base64Test.kt b/libraries/stdlib/test/io.encoding/Base64Test.kt index 8696425..b71b1f1 100644 --- a/libraries/stdlib/test/io.encoding/Base64Test.kt +++ b/libraries/stdlib/test/io.encoding/Base64Test.kt
@@ -272,4 +272,29 @@ val expected = "Zm9vYmFy".repeat(76).chunked(76).joinToString(separator = "\r\n") testEncode(Base64.Mime, "foobar".repeat(76).encodeToByteArray(), expected) } +} + +private fun f() { + val binary = "foobar".encodeToByteArray() + val text = "Zm9vYmFy".encodeToByteArray() + + // Encode with padding + Base64.encode(binary) + Base64.Mime.encode(binary) + + // Encode without padding + Base64.withEncodeOption(Base64.EncodeOption.NO_PADDING).encode(binary) + Base64.UrlSafe.withEncodeOption(Base64.EncodeOption.NO_PADDING).encode(binary) + + // Decode with required padding + Base64.decode(text) + Base64.Mime.decode(text) + + // Decode with required no padding + Base64.withDecodeOption(Base64.DecodeOption.REQUIRE_NO_PADDING).decode(text) + Base64.Mime.withDecodeOption(Base64.DecodeOption.REQUIRE_NO_PADDING).decode(text) + + // Decode with required padding or no padding + Base64.withDecodeOption(Base64.DecodeOption.REQUIRE_PADDING_OR_NO_PADDING).decode(text) + Base64.Mime.withDecodeOption(Base64.DecodeOption.REQUIRE_PADDING_OR_NO_PADDING).decode(text) } \ No newline at end of file
diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt index 94f966a9..fe52837 100644 --- a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt +++ b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt
@@ -3279,7 +3279,6 @@ public class kotlin/io/encoding/Base64 { public static final field Default Lkotlin/io/encoding/Base64$Default; - public synthetic fun <init> (ZZLkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun decode (Ljava/lang/CharSequence;II)[B public final fun decode ([BII)[B public static synthetic fun decode$default (Lkotlin/io/encoding/Base64;Ljava/lang/CharSequence;IIILjava/lang/Object;)[B @@ -3296,6 +3295,17 @@ public static synthetic fun encodeToAppendable$default (Lkotlin/io/encoding/Base64;[BLjava/lang/Appendable;IIILjava/lang/Object;)Ljava/lang/Appendable; public final fun encodeToByteArray ([BII)[B public static synthetic fun encodeToByteArray$default (Lkotlin/io/encoding/Base64;[BIIILjava/lang/Object;)[B + public final fun withDecodeOption (Lkotlin/io/encoding/Base64$DecodeOption;)Lkotlin/io/encoding/Base64; + public final fun withEncodeOption (Lkotlin/io/encoding/Base64$EncodeOption;)Lkotlin/io/encoding/Base64; +} + +public final class kotlin/io/encoding/Base64$DecodeOption : java/lang/Enum { + public static final field REQUIRE_NO_PADDING Lkotlin/io/encoding/Base64$DecodeOption; + public static final field REQUIRE_PADDING Lkotlin/io/encoding/Base64$DecodeOption; + public static final field REQUIRE_PADDING_OR_NO_PADDING Lkotlin/io/encoding/Base64$DecodeOption; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lkotlin/io/encoding/Base64$DecodeOption; + public static fun values ()[Lkotlin/io/encoding/Base64$DecodeOption; } public final class kotlin/io/encoding/Base64$Default : kotlin/io/encoding/Base64 { @@ -3303,6 +3313,14 @@ public final fun getUrlSafe ()Lkotlin/io/encoding/Base64; } +public final class kotlin/io/encoding/Base64$EncodeOption : java/lang/Enum { + public static final field NO_PADDING Lkotlin/io/encoding/Base64$EncodeOption; + public static final field PADDING Lkotlin/io/encoding/Base64$EncodeOption; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lkotlin/io/encoding/Base64$EncodeOption; + public static fun values ()[Lkotlin/io/encoding/Base64$EncodeOption; +} + public abstract interface annotation class kotlin/io/encoding/ExperimentalEncodingApi : java/lang/annotation/Annotation { }