Skip to content

Commit 01c872a

Browse files
authored
fix: upgrade smithy and correct formurl serialization of empty lists (#727)
1 parent 3dfae01 commit 01c872a

File tree

4 files changed

+61
-5
lines changed

4 files changed

+61
-5
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"id": "8b692602-06c4-4c97-b554-a08cac97e1ea",
3+
"type": "bugfix",
4+
"description": "Correct formurl serialization of empty lists"
5+
}

gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jsoupVersion=1.14.3
2121
okHttpVersion=5.0.0-alpha.10
2222

2323
# codegen
24-
smithyVersion=1.25.2
24+
smithyVersion=1.26.1
2525
smithyGradleVersion=0.6.0
2626

2727
# testing/utility
@@ -43,4 +43,4 @@ kotlinLoggingVersion=2.1.21
4343
slf4jVersion=1.7.36
4444

4545
# crt
46-
crtKotlinVersion=0.6.5
46+
crtKotlinVersion=0.6.5

runtime/serde/serde-form-url/common/src/aws/smithy/kotlin/runtime/serde/formurl/FormUrlSerializer.kt

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,10 @@ private class FormUrlStructSerializer(
157157

158158
override fun listField(descriptor: SdkFieldDescriptor, block: ListSerializer.() -> Unit) {
159159
val childDescriptor = descriptor.copyWithNewSerialName("${prefix}${descriptor.serialName}")
160-
FormUrlListSerializer(parent, childDescriptor).apply(block)
160+
FormUrlListSerializer(parent, childDescriptor).apply {
161+
block()
162+
endList()
163+
}
161164
}
162165

163166
override fun mapField(descriptor: SdkFieldDescriptor, block: MapSerializer.() -> Unit) {
@@ -179,6 +182,7 @@ private class FormUrlListSerializer(
179182
private val descriptor: SdkFieldDescriptor,
180183
) : ListSerializer {
181184
private val buffer = parent.buffer
185+
private val initialBufferPos = buffer.writePosition
182186
private var idx = 0
183187

184188
private fun prefix(): String = when {
@@ -197,7 +201,15 @@ private class FormUrlListSerializer(
197201
buffer.apply(block)
198202
}
199203

200-
override fun endList() {}
204+
override fun endList() {
205+
if (buffer.writePosition == initialBufferPos) {
206+
// explicit serialization of an empty list
207+
if (buffer.writePosition > 0u) buffer.write("&")
208+
buffer.write(descriptor.serialName)
209+
buffer.write("=")
210+
}
211+
}
212+
201213
override fun serializeBoolean(value: Boolean) = writePrefixed { write("$value") }
202214
override fun serializeChar(value: Char) = writePrefixed { write(value.toString()) }
203215
override fun serializeByte(value: Byte) = writePrefixed { commonWriteNumber(value) }
@@ -312,7 +324,10 @@ private class FormUrlMapSerializer(
312324
writeKey(key)
313325

314326
val childDescriptor = SdkFieldDescriptor(SerialKind.List, FormUrlSerialName("$commonPrefix.${mapName.value}"))
315-
FormUrlListSerializer(parent, childDescriptor).apply(block)
327+
FormUrlListSerializer(parent, childDescriptor).apply {
328+
block()
329+
endList()
330+
}
316331
}
317332

318333
override fun mapEntry(key: String, mapDescriptor: SdkFieldDescriptor, block: MapSerializer.() -> Unit) {

runtime/serde/serde-form-url/common/test/aws/smithy/kotlin/runtime/serde/formurl/FormUrlSerializerTest.kt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -600,4 +600,40 @@ class FormUrlSerializerTest {
600600
val actual = serializer.toByteArray().decodeToString()
601601
assertEquals(expected, actual)
602602
}
603+
604+
@Test
605+
fun itSerializesEmptyList() {
606+
val input = ListInput(
607+
listOf(),
608+
null,
609+
)
610+
611+
val expected = """
612+
PrimitiveList=
613+
""".trimIndent().replace("\n", "")
614+
615+
val serializer = FormUrlSerializer()
616+
input.serialize(serializer)
617+
val actual = serializer.toByteArray().decodeToString()
618+
assertEquals(expected, actual)
619+
}
620+
621+
@Test
622+
fun itSerializesEmptyListInMap() {
623+
val input = MapInput(
624+
mapOfLists = mapOf(
625+
"foo" to listOf(),
626+
),
627+
)
628+
629+
val expected = """
630+
MapOfLists.entry.1.key=foo
631+
&MapOfLists.entry.1.value=
632+
""".trimIndent().replace("\n", "")
633+
634+
val serializer = FormUrlSerializer()
635+
input.serialize(serializer)
636+
val actual = serializer.toByteArray().decodeToString()
637+
assertEquals(expected, actual)
638+
}
603639
}

0 commit comments

Comments
 (0)