A Ktor server plugin that provides HTTP response compression and request decompression capabilities with support for gzip, deflate, and identity encoding algorithms.
npx @tessl/cli install tessl/maven-io-ktor--ktor-server-compression-jvm@3.2.0Ktor Server Compression is a server-side plugin for the Ktor framework that provides comprehensive HTTP response compression and request decompression capabilities. It supports multiple compression algorithms including gzip, deflate, and identity encoding, with intelligent content negotiation and configurable compression criteria.
build.gradle.kts:implementation("io.ktor:ktor-server-compression-jvm:3.2.0")import io.ktor.server.plugins.compression.*
import io.ktor.server.application.*
import io.ktor.server.http.content.* // For suppression functions
import io.ktor.util.* // For ContentEncoder typesimport io.ktor.server.application.*
import io.ktor.server.plugins.compression.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
fun Application.module() {
// Install with default configuration (gzip, deflate, identity)
install(Compression)
routing {
get("/") {
call.respondText("This response will be compressed if client supports it")
}
}
}The compression plugin operates at the Ktor pipeline level, intercepting outgoing responses for compression and incoming requests for decompression. It uses a priority-based encoder selection system that respects client Accept-Encoding headers and applies configurable conditions to determine when compression should occur.
Key components:
Install the Compression plugin with customizable encoding algorithms and operational modes.
val Compression: RouteScopedPlugin<CompressionConfig>
fun Application.install(plugin: RouteScopedPlugin<CompressionConfig>, configure: CompressionConfig.() -> Unit = {})Built-in support for standard HTTP compression algorithms with configurable priority and conditions.
fun CompressionConfig.gzip(block: CompressionEncoderBuilder.() -> Unit = {})
fun CompressionConfig.deflate(block: CompressionEncoderBuilder.() -> Unit = {})
fun CompressionConfig.identity(block: CompressionEncoderBuilder.() -> Unit = {})Configure when compression should be applied based on content type, size, and custom predicates.
fun ConditionsHolderBuilder.condition(predicate: ApplicationCall.(OutgoingContent) -> Boolean)
fun ConditionsHolderBuilder.minimumSize(minSize: Long)
fun ConditionsHolderBuilder.matchContentType(vararg mimeTypes: ContentType)
fun ConditionsHolderBuilder.excludeContentType(vararg mimeTypes: ContentType)Automatic decompression of compressed request bodies with decoder tracking.
val ApplicationRequest.appliedDecoders: List<String>Runtime control to suppress compression or decompression on a per-request basis.
fun ApplicationCall.suppressCompression()
fun ApplicationCall.suppressDecompression()
val ApplicationCall.isCompressionSuppressed: Boolean
val ApplicationCall.isDecompressionSuppressed: Booleandata class CompressionConfig(
var mode: Mode = Mode.All,
val encoders: MutableMap<String, CompressionEncoderBuilder> = hashMapOf(),
val conditions: MutableList<ApplicationCall.(OutgoingContent) -> Boolean> = arrayListOf()
)
enum class CompressionConfig.Mode(
internal val request: Boolean,
internal val response: Boolean
) {
CompressResponse(false, true),
DecompressRequest(true, false),
All(true, true)
}
data class CompressionEncoderConfig(
val encoder: ContentEncoder,
val conditions: List<ApplicationCall.(OutgoingContent) -> Boolean>,
val priority: Double
)
class CompressionEncoderBuilder(
val encoder: ContentEncoder
) : ConditionsHolderBuilder {
val conditions: ArrayList<ApplicationCall.(OutgoingContent) -> Boolean>
var priority: Double = 1.0
}
interface ConditionsHolderBuilder {
val conditions: MutableList<ApplicationCall.(OutgoingContent) -> Boolean>
}