I'm working on an Android application where I need to encrypt the request body before sending it to the server and then decrypt the response received from the server. I'm using Ktor's HTTP client for network requests and I have a CryptoUtils
class that handles encryption and decryption using AES. Here's an outline of what I have done:
- Encryption: I have successfully installed a plugin to encrypt the request body before it's sent to the server. Here's the code for the encryption install (this exemple is for login only, i willl make it global later):
private fun HttpClientConfig<OkHttpConfig>.encryptionInstall() { install("EncryptRequest") { requestPipeline.intercept(HttpRequestPipeline.Transform) { request -> if (request !is EmptyContent) { val request = request as LoginDTO val originalBody = Json.encodeToString(x) val encryptionKey = "MY_ENCRYPTION_KEY" val encryptedBody = CryptoUtils.encryptData( encryptionKey, originalBody ) val encryptedContent = TextContent(encryptedBody, ContentType.Application.Json) proceedWith(encryptedContent) } else { proceedWith(request) } } }}
2. encryption: Now, I'm trying to decrypt the response received from the server using the DecryptResponse
plugin. Here's the code for the decryption install:
private fun HttpClientConfig<OkHttpConfig>.decryptInstall() { install("DecryptResponse") { receivePipeline.intercept(HttpReceivePipeline.After) { response -> val originalResponseReceived = response.body<String>() runCatching { val encryptionKey = "MY_DECRYPTION_KEY" val decryptData = CryptoUtils.decryptData( encryptionKey, originalResponseReceived.toString().replace("\n", "") ) val castedFromStringToObject = Json.decodeFromString<LoginResponseDTO>(decryptData.orEmpty()) // Now I have the decrypted data, how do I proceed with it? // I need to create an HttpResponse object with this decrypted data. // But I can't create an instance of an abstract class HttpResponse. // How can I create a new HttpResponse to proceed with the decrypted data? } } }}
I tried decrypting the response using the DecryptResponse plugin and I successfully decrypted the content. However, I encountered an issue when trying to proceed with the decrypted data. Since HttpResponse is an abstract class, I couldn't directly create an instance of it to proceed with the decrypted data.
I was expecting to be able to create a new HttpResponse object with the decrypted data so that I can continue processing it. However, since HttpResponse is abstract, I'm not sure how to proceed. I need guidance or examples on how to create a new HttpResponse to proceed with the decrypted data after decryption.
Any insights or examples on how to achieve this would be greatly appreciated.
Thank you in advance for your help!