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..5bdce3a 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 paddingOnDecode(option: kotlin.io.encoding.Base64.DecodeOption): kotlin.io.encoding.Base64
+
+ public final fun paddingOnEncode(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..6e6b7aa 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 paddingOnEncode(option: EncodeOption): Base64 {
+ return if (option != encodePadding) {
+ Base64(isUrlSafe, isMimeScheme, option, decodePadding)
+ } else {
+ this
+ }
+ }
+
+ public fun paddingOnDecode(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..10e992b 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.paddingOnEncode(Base64.EncodeOption.NO_PADDING).encode(binary)
+ Base64.UrlSafe.paddingOnEncode(Base64.EncodeOption.NO_PADDING).encode(binary)
+
+ // Decode with required padding
+ Base64.decode(text)
+ Base64.Mime.decode(text)
+
+ // Decode with required no padding
+ Base64.paddingOnDecode(Base64.DecodeOption.REQUIRE_NO_PADDING).decode(text)
+ Base64.Mime.paddingOnDecode(Base64.DecodeOption.REQUIRE_NO_PADDING).decode(text)
+
+ // Decode with required padding or no padding
+ Base64.paddingOnDecode(Base64.DecodeOption.REQUIRE_PADDING_OR_NO_PADDING).decode(text)
+ Base64.Mime.paddingOnDecode(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..ba79ec2 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 paddingOnDecode (Lkotlin/io/encoding/Base64$DecodeOption;)Lkotlin/io/encoding/Base64;
+ public final fun paddingOnEncode (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 {
}