summaryrefslogtreecommitdiff
path: root/vendor/github.com/ulule/limiter/v3/drivers/middleware/gin/middleware.go
diff options
context:
space:
mode:
authorLibravatar nya1 <nya1git@imap.cc>2022-08-31 12:06:14 +0200
committerLibravatar GitHub <noreply@github.com>2022-08-31 12:06:14 +0200
commitbee8458a2d12bdd42079fcb2c4ca88ebeafe305b (patch)
treec114acf28a460c1ebaa85965c89f2e7fb540eecc /vendor/github.com/ulule/limiter/v3/drivers/middleware/gin/middleware.go
parent[feature] Sort follow requests, followers, and following by updated_at (#774) (diff)
downloadgotosocial-bee8458a2d12bdd42079fcb2c4ca88ebeafe305b.tar.xz
[feature] add rate limit middleware (#741)
* feat: add rate limit middleware * chore: update vendor dir * chore: update readme with new dependency * chore: add rate limit infos to swagger.md file * refactor: add ipv6 mask limiter option Add IPv6 CIDR /64 mask * refactor: increase rate limit to 1000 Address https://github.com/superseriousbusiness/gotosocial/pull/741#discussion_r945584800 Co-authored-by: tobi <31960611+tsmethurst@users.noreply.github.com>
Diffstat (limited to 'vendor/github.com/ulule/limiter/v3/drivers/middleware/gin/middleware.go')
-rw-r--r--vendor/github.com/ulule/limiter/v3/drivers/middleware/gin/middleware.go65
1 files changed, 65 insertions, 0 deletions
diff --git a/vendor/github.com/ulule/limiter/v3/drivers/middleware/gin/middleware.go b/vendor/github.com/ulule/limiter/v3/drivers/middleware/gin/middleware.go
new file mode 100644
index 000000000..23bad417a
--- /dev/null
+++ b/vendor/github.com/ulule/limiter/v3/drivers/middleware/gin/middleware.go
@@ -0,0 +1,65 @@
+package gin
+
+import (
+ "strconv"
+
+ "github.com/gin-gonic/gin"
+
+ "github.com/ulule/limiter/v3"
+)
+
+// Middleware is the middleware for gin.
+type Middleware struct {
+ Limiter *limiter.Limiter
+ OnError ErrorHandler
+ OnLimitReached LimitReachedHandler
+ KeyGetter KeyGetter
+ ExcludedKey func(string) bool
+}
+
+// NewMiddleware return a new instance of a gin middleware.
+func NewMiddleware(limiter *limiter.Limiter, options ...Option) gin.HandlerFunc {
+ middleware := &Middleware{
+ Limiter: limiter,
+ OnError: DefaultErrorHandler,
+ OnLimitReached: DefaultLimitReachedHandler,
+ KeyGetter: DefaultKeyGetter,
+ ExcludedKey: nil,
+ }
+
+ for _, option := range options {
+ option.apply(middleware)
+ }
+
+ return func(ctx *gin.Context) {
+ middleware.Handle(ctx)
+ }
+}
+
+// Handle gin request.
+func (middleware *Middleware) Handle(c *gin.Context) {
+ key := middleware.KeyGetter(c)
+ if middleware.ExcludedKey != nil && middleware.ExcludedKey(key) {
+ c.Next()
+ return
+ }
+
+ context, err := middleware.Limiter.Get(c, key)
+ if err != nil {
+ middleware.OnError(c, err)
+ c.Abort()
+ return
+ }
+
+ c.Header("X-RateLimit-Limit", strconv.FormatInt(context.Limit, 10))
+ c.Header("X-RateLimit-Remaining", strconv.FormatInt(context.Remaining, 10))
+ c.Header("X-RateLimit-Reset", strconv.FormatInt(context.Reset, 10))
+
+ if context.Reached {
+ middleware.OnLimitReached(c)
+ c.Abort()
+ return
+ }
+
+ c.Next()
+}