Я реализовал настраиваемую функцию согласования содержимого для расшифровки входящих запросов. Но когда я вызываю call.receiveText()
, функция convertForReceive()
не вызывается в конвейере, поэтому я все равно получаю зашифрованный контент в своем контроллере маршрута.
Вот как я регистрирую функцию:
fun main(args: Array<String>): Unit = io.ktor.server.netty.EngineMain.main(args)
@kotlin.jvm.JvmOverloads
fun Application.module(testing: Boolean = false) {
install(DefaultHeaders)
install(CallLogging)
install(ConditionalHeaders)
install(Compression)
install(ContentNegotiation) {
register(ContentType.Any, CryptoFeature())
}
install(Routing) {
user()
}
}
И определение функции:
class CryptoFeature : ContentConverter {
override suspend fun convertForSend(
context: PipelineContext<Any, ApplicationCall>,
contentType: ContentType,
value: Any
): Any? {
return TextContent(value as String, contentType.withCharset(context.call.suitableCharset()))
}
override suspend fun convertForReceive(context: PipelineContext<ApplicationReceiveRequest, ApplicationCall>): Any? {
val request = context.subject
val channel = request.value as? ByteReadChannel ?: return null
val encryptedBody = channel.toInputStream().reader(context.call.request.contentCharset() ?: Charsets.UTF_8).readText()
val decryptedString = CryptoHelper.decrypt(encryptedBody)
return decryptedString
}
}