Skip to content

Commit a076668

Browse files
committed
chore: SSE and multipart in client
1 parent fe55e6a commit a076668

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

shared/src/commonMain/kotlin/dev/suresh/http/HttpClient.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import io.ktor.client.plugins.contentnegotiation.*
99
import io.ktor.client.plugins.cookies.*
1010
import io.ktor.client.plugins.logging.*
1111
import io.ktor.client.plugins.resources.*
12+
import io.ktor.client.plugins.sse.SSE
1213
import io.ktor.client.plugins.websocket.WebSockets
1314
import io.ktor.client.plugins.websocket.pingInterval
1415
import io.ktor.http.*
@@ -103,6 +104,11 @@ expect fun httpClient(
103104
HttpHeaders.ContentType, ContentType.Application.Json.toString())
104105
}
105106

107+
install(SSE) {
108+
maxReconnectionAttempts = retry.attempts
109+
reconnectionTime = timeout.connection
110+
}
111+
106112
install(WebSockets) { pingInterval = timeout.read }
107113

108114
expectSuccess = true

shared/src/commonMain/kotlin/dev/suresh/http/MediaApiClient.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import io.github.oshai.kotlinlogging.KotlinLogging
44
import io.ktor.client.call.*
55
import io.ktor.client.plugins.*
66
import io.ktor.client.plugins.resources.*
7+
import io.ktor.http.content.*
78
import io.ktor.resources.*
89
import kotlinx.serialization.Serializable
910
import kotlinx.serialization.json.JsonIgnoreUnknownKeys
@@ -12,6 +13,8 @@ import kotlinx.serialization.json.JsonIgnoreUnknownKeys
1213

1314
@Resource("/media-api/videos.json") class VideoRes
1415

16+
@Resource("/multipart") class MultiPartRes
17+
1518
@Serializable
1619
@JsonIgnoreUnknownKeys
1720
data class Image(
@@ -59,5 +62,26 @@ data class MediaApiClient(
5962

6063
suspend fun videos() = client.get(VideoRes()).body<List<Video>>()
6164

65+
suspend fun multiPart() {
66+
val multipart = client.post(MultiPartRes()).body<MultiPartData>()
67+
multipart.forEachPart { part ->
68+
when (part) {
69+
is PartData.FormItem -> {
70+
println("Form item key: ${part.name}")
71+
val value = part.value
72+
// ...
73+
}
74+
is PartData.FileItem -> {
75+
println("file: ${part.name}")
76+
println(part.originalFileName)
77+
val fileContent = part.provider()
78+
// ...
79+
}
80+
else -> error("Unsupported part: ${part.name}")
81+
}
82+
part.dispose()
83+
}
84+
}
85+
6286
override fun close() = client.close()
6387
}

0 commit comments

Comments
 (0)