@@ -7,20 +7,11 @@ import com.algolia.search.model.multipleindex.IndexQuery
77import com.algolia.search.model.multipleindex.MultipleQueriesStrategy
88import com.algolia.search.model.search.Query
99import com.algolia.search.model.settings.Settings
10- import io.ktor.http.Parameters
11- import io.ktor.http.formUrlEncode
12- import io.ktor.util.InternalAPI
10+ import io.ktor.http.*
1311import kotlinx.serialization.ExperimentalSerializationApi
1412import kotlinx.serialization.encoding.Decoder
1513import kotlinx.serialization.encoding.Encoder
16- import kotlinx.serialization.json.Json
17- import kotlinx.serialization.json.JsonArray
18- import kotlinx.serialization.json.JsonDecoder
19- import kotlinx.serialization.json.JsonElement
20- import kotlinx.serialization.json.JsonEncoder
21- import kotlinx.serialization.json.JsonObject
22- import kotlinx.serialization.json.JsonPrimitive
23- import kotlinx.serialization.json.jsonObject
14+ import kotlinx.serialization.json.*
2415
2516internal val Json = Json {
2617 encodeDefaults = true
@@ -50,20 +41,36 @@ internal fun JsonObject.merge(jsonObject: JsonObject): JsonObject {
5041 }
5142}
5243
53- @OptIn(InternalAPI ::class ) // https://youtrack.jetbrains.com/issue/KT-48127
5444internal fun JsonObject.urlEncode (): String? {
5545 return if (isNotEmpty()) {
5646 Parameters .build {
5747 entries.forEach { (key, element) ->
5848 when (element) {
59- is JsonPrimitive -> append(key, element.content)
49+ is JsonPrimitive -> {
50+ append(key, sanitizeString(element.content))
51+ }
52+
6053 else -> append(key, Json .encodeToString(JsonElement .serializer(), element))
6154 }
6255 }
6356 }.formUrlEncode()
6457 } else null
6558}
6659
60+ internal fun sanitizeString (input : String ): String {
61+ return buildString {
62+ input.forEachIndexed { index, char ->
63+ val next = index + 1
64+ if (char.isHighSurrogate() && next < input.length && input[next].isLowSurrogate()) {
65+ append(char)
66+ append(input[next])
67+ } else if (! char.isSurrogate()) {
68+ append(char)
69+ }
70+ }
71+ }
72+ }
73+
6774internal fun Query.toJsonNoDefaults (): JsonObject {
6875 return JsonNoDefaults .encodeToJsonElement(Query .serializer(), this ).jsonObject
6976}
0 commit comments