diff options
author | 2022-08-31 12:06:14 +0200 | |
---|---|---|
committer | 2022-08-31 12:06:14 +0200 | |
commit | bee8458a2d12bdd42079fcb2c4ca88ebeafe305b (patch) | |
tree | c114acf28a460c1ebaa85965c89f2e7fb540eecc /vendor/github.com/ulule/limiter/v3/drivers/middleware/gin/middleware.go | |
parent | [feature] Sort follow requests, followers, and following by updated_at (#774) (diff) | |
download | gotosocial-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.go | 65 |
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() +} |