summaryrefslogtreecommitdiff
path: root/vendor/github.com/ulule/limiter/v3/drivers/middleware/gin/middleware.go
diff options
context:
space:
mode:
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()
+}