Skip to content

Commit

Permalink
KTOR-6125 ContentNegotiation with protobuf fails on empty body (#3700)
Browse files Browse the repository at this point in the history
  • Loading branch information
rsinukov committed Jul 20, 2023
1 parent 88119ce commit eb14d53
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ public class KotlinxSerializationConverter(
val fromExtension = extensions.asFlow()
.map { it.deserialize(charset, typeInfo, content) }
.firstOrNull { it != null || content.isClosedForRead }
if (fromExtension != null || content.isClosedForRead) return fromExtension
if (extensions.isNotEmpty() && (fromExtension != null || content.isClosedForRead)) return fromExtension

val serializer = format.serializersModule.serializerForTypeInfo(typeInfo)
val contentPacket = content.readRemaining()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import io.ktor.serialization.kotlinx.*
import io.ktor.serialization.kotlinx.protobuf.*
import io.ktor.test.dispatcher.*
import io.ktor.util.reflect.*
import io.ktor.utils.io.*
import io.ktor.utils.io.charsets.*
import kotlinx.serialization.*
import kotlin.test.*
Expand All @@ -19,6 +20,9 @@ internal data class User(val id: Int, val login: String)
@Serializable
internal data class Photo(val id: Long, val path: String)

@Serializable
data class WithList(val aList: List<String> = emptyList())

@ExperimentalSerializationApi
class ProtoBufSerializationTest {

Expand All @@ -32,6 +36,17 @@ class ProtoBufSerializationTest {
assertContentEquals(byteArrayOf(8, 1, 18, 5, 117, 115, 101, 114, 49), actual)
}

@Test
fun testEmptyList() = testSuspend {
val serializer = KotlinxSerializationConverter(DefaultProtoBuf)

val item = WithList()
val serialized = serializer.testSerialize(item)
val deserialized = serializer.deserialize(Charsets.UTF_8, typeInfo<WithList>(), ByteReadChannel(serialized))

assertEquals(item, deserialized)
}

@Test
fun testRegisterCustomList() = testSuspend {
val serializer = KotlinxSerializationConverter(DefaultProtoBuf)
Expand Down

0 comments on commit eb14d53

Please sign in to comment.