Функция согласования настраиваемого содержимого не работает - PullRequest
0 голосов
/ 27 мая 2020

Я реализовал настраиваемую функцию согласования содержимого для расшифровки входящих запросов. Но когда я вызываю 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
    }
}
...