Skip to content

Commit 11d6cda

Browse files
king-phyteFlaxoos
andauthored
Add rate limit headers before returning response by default (#78)
* fix: rate limit headers not included in response * docs: add rate limit headers before returning response * test: add test for rate limit headers * Bump minor version --------- Co-authored-by: Ido Flax <[email protected]>
1 parent d0b1546 commit 11d6cda

File tree

4 files changed

+7
-5
lines changed

4 files changed

+7
-5
lines changed

documentation/mkdocs/docs/ktor-server-rate-limiting/index.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ routing {
4343
whiteListedHosts = setOf("trusted-host.com")
4444
blackListedAgents = setOf("malicious-agent")
4545
rateLimitExceededHandler = { rateLimiterResponse ->
46+
...
4647
respond(HttpStatusCode.TooManyRequests, rateLimiterResponse.message)
47-
...
4848
}
4949
}
5050

@@ -92,10 +92,10 @@ routing {
9292

9393
rateLimitExceededHandler = { limitedBy ->
9494
// Respond with a 429 status and appropriate headers for rate-limited callers
95-
respond(HttpStatusCode.TooManyRequests, "Rate limit exceeded: ${limitedBy.message}")
9695
response.headers.append("X-RateLimit-Limit", "${limitedBy.rateLimiter.capacity}")
9796
response.headers.append("X-RateLimit-Measured-by", limitedBy.rateLimiter.callVolumeUnit.name)
9897
response.headers.append("X-RateLimit-Reset", "${limitedBy.resetIn.inWholeMilliseconds}")
98+
respond(HttpStatusCode.TooManyRequests, "Rate limit exceeded: ${limitedBy.message}")
9999
}
100100

101101
```

gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ github.repository.name=extra-ktor-plugins
33
kotlin.native.cacheKind.linuxX64=none
44
kotlin.native.ignoreDisabledTargets=true
55
gradle.publish.enable.module-metadata=true
6-
version=2.1.1
6+
version=2.1.2
77
gpr.user=flaxoos
88
org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=2g
9-
kotlin.mpp.applyDefaultHierarchyTemplate=false
9+
kotlin.mpp.applyDefaultHierarchyTemplate=false

ktor-server-rate-limiting/src/commonMain/kotlin/io/github/flaxoos/ktor/server/plugins/ratelimiter/RateLimitingConfiguration.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,13 +83,13 @@ class RateLimitingConfiguration {
8383
*/
8484
var rateLimitExceededHandler: suspend ApplicationCall.(RateLimiterResponse.LimitedBy) -> Unit =
8585
{ rateLimiterResponse ->
86-
respond(HttpStatusCode.TooManyRequests, "$RATE_LIMIT_EXCEEDED_MESSAGE: ${rateLimiterResponse.message}")
8786
this.response.headers.append("$X_RATE_LIMIT-Limit", "${rateLimiterResponse.rateLimiter.capacity}")
8887
this.response.headers.append(
8988
"$X_RATE_LIMIT-Measured-by",
9089
rateLimiterResponse.rateLimiter.callVolumeUnit.name,
9190
)
9291
this.response.headers.append("$X_RATE_LIMIT-Reset", "${rateLimiterResponse.resetIn.inWholeMilliseconds}")
92+
respond(HttpStatusCode.TooManyRequests, "$RATE_LIMIT_EXCEEDED_MESSAGE: ${rateLimiterResponse.message}")
9393
}
9494

9595
/**

ktor-server-rate-limiting/src/jvmTest/kotlin/io/github/flaxoos/ktor/server/plugins/ratelimiter/RateLimitingPluginTest.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import io.kotest.core.spec.style.scopes.FunSpecContainerScope
1111
import io.kotest.datatest.withData
1212
import io.kotest.inspectors.forAll
1313
import io.kotest.matchers.collections.shouldContain
14+
import io.kotest.matchers.collections.shouldContainAll
1415
import io.kotest.matchers.collections.shouldContainOnly
1516
import io.kotest.matchers.comparables.shouldBeLessThan
1617
import io.ktor.client.HttpClient
@@ -347,6 +348,7 @@ class RateLimitingPluginTest : FunSpec() {
347348
withClue("Should be limited") {
348349
logErrors()
349350
map { it.status } shouldContain TooManyRequests
351+
flatMap { it.headers.names() } shouldContainAll listOf("X-RateLimit-Limit", "X-RateLimit-Measured-by", "X-RateLimit-Reset")
350352
}
351353
}
352354

0 commit comments

Comments
 (0)