diff --git a/documentation/mkdocs/docs/ktor-server-rate-limiting/index.md b/documentation/mkdocs/docs/ktor-server-rate-limiting/index.md index c97e4e56..6876f1ec 100644 --- a/documentation/mkdocs/docs/ktor-server-rate-limiting/index.md +++ b/documentation/mkdocs/docs/ktor-server-rate-limiting/index.md @@ -43,8 +43,8 @@ routing { whiteListedHosts = setOf("trusted-host.com") blackListedAgents = setOf("malicious-agent") rateLimitExceededHandler = { rateLimiterResponse -> + ... respond(HttpStatusCode.TooManyRequests, rateLimiterResponse.message) - ... } } @@ -92,10 +92,10 @@ routing { rateLimitExceededHandler = { limitedBy -> // Respond with a 429 status and appropriate headers for rate-limited callers - respond(HttpStatusCode.TooManyRequests, "Rate limit exceeded: ${limitedBy.message}") response.headers.append("X-RateLimit-Limit", "${limitedBy.rateLimiter.capacity}") response.headers.append("X-RateLimit-Measured-by", limitedBy.rateLimiter.callVolumeUnit.name) response.headers.append("X-RateLimit-Reset", "${limitedBy.resetIn.inWholeMilliseconds}") + respond(HttpStatusCode.TooManyRequests, "Rate limit exceeded: ${limitedBy.message}") } ``` diff --git a/gradle.properties b/gradle.properties index 05069713..4b90151a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ github.repository.name=extra-ktor-plugins kotlin.native.cacheKind.linuxX64=none kotlin.native.ignoreDisabledTargets=true gradle.publish.enable.module-metadata=true -version=2.1.1 +version=2.1.2 gpr.user=flaxoos org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=2g -kotlin.mpp.applyDefaultHierarchyTemplate=false \ No newline at end of file +kotlin.mpp.applyDefaultHierarchyTemplate=false diff --git a/ktor-server-rate-limiting/src/commonMain/kotlin/io/github/flaxoos/ktor/server/plugins/ratelimiter/RateLimitingConfiguration.kt b/ktor-server-rate-limiting/src/commonMain/kotlin/io/github/flaxoos/ktor/server/plugins/ratelimiter/RateLimitingConfiguration.kt index 0265f7c4..c9df620e 100644 --- a/ktor-server-rate-limiting/src/commonMain/kotlin/io/github/flaxoos/ktor/server/plugins/ratelimiter/RateLimitingConfiguration.kt +++ b/ktor-server-rate-limiting/src/commonMain/kotlin/io/github/flaxoos/ktor/server/plugins/ratelimiter/RateLimitingConfiguration.kt @@ -83,13 +83,13 @@ class RateLimitingConfiguration { */ var rateLimitExceededHandler: suspend ApplicationCall.(RateLimiterResponse.LimitedBy) -> Unit = { rateLimiterResponse -> - respond(HttpStatusCode.TooManyRequests, "$RATE_LIMIT_EXCEEDED_MESSAGE: ${rateLimiterResponse.message}") this.response.headers.append("$X_RATE_LIMIT-Limit", "${rateLimiterResponse.rateLimiter.capacity}") this.response.headers.append( "$X_RATE_LIMIT-Measured-by", rateLimiterResponse.rateLimiter.callVolumeUnit.name, ) this.response.headers.append("$X_RATE_LIMIT-Reset", "${rateLimiterResponse.resetIn.inWholeMilliseconds}") + respond(HttpStatusCode.TooManyRequests, "$RATE_LIMIT_EXCEEDED_MESSAGE: ${rateLimiterResponse.message}") } /** diff --git a/ktor-server-rate-limiting/src/jvmTest/kotlin/io/github/flaxoos/ktor/server/plugins/ratelimiter/RateLimitingPluginTest.kt b/ktor-server-rate-limiting/src/jvmTest/kotlin/io/github/flaxoos/ktor/server/plugins/ratelimiter/RateLimitingPluginTest.kt index d96d6b85..905f72ae 100644 --- a/ktor-server-rate-limiting/src/jvmTest/kotlin/io/github/flaxoos/ktor/server/plugins/ratelimiter/RateLimitingPluginTest.kt +++ b/ktor-server-rate-limiting/src/jvmTest/kotlin/io/github/flaxoos/ktor/server/plugins/ratelimiter/RateLimitingPluginTest.kt @@ -11,6 +11,7 @@ import io.kotest.core.spec.style.scopes.FunSpecContainerScope import io.kotest.datatest.withData import io.kotest.inspectors.forAll import io.kotest.matchers.collections.shouldContain +import io.kotest.matchers.collections.shouldContainAll import io.kotest.matchers.collections.shouldContainOnly import io.kotest.matchers.comparables.shouldBeLessThan import io.ktor.client.HttpClient @@ -347,6 +348,7 @@ class RateLimitingPluginTest : FunSpec() { withClue("Should be limited") { logErrors() map { it.status } shouldContain TooManyRequests + flatMap { it.headers.names() } shouldContainAll listOf("X-RateLimit-Limit", "X-RateLimit-Measured-by", "X-RateLimit-Reset") } }