@@ -9,6 +9,7 @@ import io.ktor.server.request.contentType
9
9
import io.ktor.server.request.host
10
10
import io.ktor.server.request.httpMethod
11
11
import io.ktor.server.request.receive
12
+ import io.ktor.server.request.receiveText
12
13
import io.ktor.server.response.header
13
14
import io.ktor.server.response.respond
14
15
import io.ktor.server.response.respondNullable
@@ -440,15 +441,22 @@ public class StreamableHttpServerTransport(
440
441
}
441
442
442
443
private suspend fun parseBody (call : ApplicationCall ): List <JSONRPCMessage >? {
443
- return when (val element = call.receive<JsonElement >()) {
444
+ val body = call.receiveText()
445
+ return when (val element = McpJson .parseToJsonElement(body)) {
444
446
is JsonObject -> listOf (McpJson .decodeFromJsonElement(element))
445
- is JsonArray -> McpJson .decodeFromJsonElement(element)
447
+ is JsonArray -> McpJson .decodeFromJsonElement< List < JSONRPCMessage >> (element)
446
448
else -> {
447
- call.reject(
448
- HttpStatusCode .BadRequest , ErrorCode .Defined .ParseError ,
449
- " Invalid JSON format"
449
+ call.response.status(HttpStatusCode .BadRequest )
450
+ call.respond(
451
+ JSONRPCResponse (
452
+ id = null ,
453
+ error = JSONRPCError (
454
+ code = ErrorCode .Defined .InvalidRequest ,
455
+ message = " Invalid Request: Server already initialized"
456
+ )
457
+ )
450
458
)
451
- null
459
+ return null
452
460
}
453
461
}
454
462
}
@@ -457,7 +465,7 @@ public class StreamableHttpServerTransport(
457
465
if (this == null ) return false
458
466
459
467
val escaped = Regex .escape(mime.toString())
460
- val pattern = Regex (""" (^|,\s*)$escaped (\s*;|$ )""" , RegexOption .IGNORE_CASE )
468
+ val pattern = Regex (""" (^|,\s*)$escaped (\s*(;|,|$) )""" , RegexOption .IGNORE_CASE )
461
469
return pattern.containsMatchIn(this )
462
470
}
463
471
0 commit comments