summaryrefslogtreecommitdiff
path: root/internal/middleware/ratelimit.go
diff options
context:
space:
mode:
authorLibravatar kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com>2023-01-03 10:50:59 +0000
committerLibravatar GitHub <noreply@github.com>2023-01-03 11:50:59 +0100
commit71dfea7e47eef3d89b0c4919d71a6ad58e35912d (patch)
treee2585e1b50865fff4d57f8270a4a388bcf61f8c7 /internal/middleware/ratelimit.go
parent[docs] Add troubleshooting section for Apache (#1291) (diff)
downloadgotosocial-71dfea7e47eef3d89b0c4919d71a6ad58e35912d.tar.xz
[chore] shuffle middleware to split rate limitting into client/s2s/fileserver, share gzip middleware globally (#1290)
Signed-off-by: kim <grufwub@gmail.com> Signed-off-by: kim <grufwub@gmail.com>
Diffstat (limited to 'internal/middleware/ratelimit.go')
-rw-r--r--internal/middleware/ratelimit.go30
1 files changed, 10 insertions, 20 deletions
diff --git a/internal/middleware/ratelimit.go b/internal/middleware/ratelimit.go
index ab947a124..48f15eae5 100644
--- a/internal/middleware/ratelimit.go
+++ b/internal/middleware/ratelimit.go
@@ -24,7 +24,6 @@ import (
"time"
"github.com/gin-gonic/gin"
- "github.com/superseriousbusiness/gotosocial/internal/config"
"github.com/ulule/limiter/v3"
limitergin "github.com/ulule/limiter/v3/drivers/middleware/gin"
"github.com/ulule/limiter/v3/drivers/store/memory"
@@ -44,34 +43,25 @@ const rateLimitPeriod = 5 * time.Minute
//
// If the config AdvancedRateLimitRequests value is <= 0, then a noop handler will be returned,
// which performs no rate limiting.
-func RateLimit() gin.HandlerFunc {
- // only enable rate limit middleware if configured
- // advanced-rate-limit-requests is greater than 0
- rateLimitRequests := config.GetAdvancedRateLimitRequests()
- if rateLimitRequests <= 0 {
+func RateLimit(limit int) gin.HandlerFunc {
+ if limit <= 0 {
// use noop middleware if ratelimiting is disabled
- return func(c *gin.Context) {}
+ return func(ctx *gin.Context) {}
}
- rate := limiter.Rate{
- Period: rateLimitPeriod,
- Limit: int64(rateLimitRequests),
- }
-
- limiterInstance := limiter.New(
+ limiter := limiter.New(
memory.NewStore(),
- rate,
+ limiter.Rate{Period: rateLimitPeriod, Limit: int64(limit)},
limiter.WithIPv6Mask(net.CIDRMask(64, 128)), // apply /64 mask to IPv6 addresses
)
- limitReachedHandler := func(c *gin.Context) {
+ // use custom rate limit reached error
+ handler := func(c *gin.Context) {
c.AbortWithStatusJSON(http.StatusTooManyRequests, gin.H{"error": "rate limit reached"})
}
- middleware := limitergin.NewMiddleware(
- limiterInstance,
- limitergin.WithLimitReachedHandler(limitReachedHandler), // use custom rate limit reached error
+ return limitergin.NewMiddleware(
+ limiter,
+ limitergin.WithLimitReachedHandler(handler),
)
-
- return middleware
}