gin-limiter icon indicating copy to clipboard operation
gin-limiter copied to clipboard

A simple gin middleware for ip limiter based on redis.

gin- limiter

A simple gin middleware for IP limiter based on redis.

License HitCount GitHub stars

Installation

  • Download

    Type the following command in your terminal.

    go get github.com/go-redis/redis/v8
    go get github.com/davidleitw/gin-limiter 
    
  • Import

    import "github.com/go-redis/redis/v8"
    import limiter "github.com/davidleitw/gin-limiter"
    

Quickstart

  • Create a limit middleware dispatcher object

    // Set redis client
    rdb := redis.NewClient(&redis.Options{Addr: "localhost:6379", Password: "", DB: 0})
    
    dispatcher, err := limiter.LimitDispatcher("24-M", 100, rdb)
    
    if err != nil {
        log.Println(err)
    }
    
    
  • Add a middleware to controlling each route.

    server := gin.Default()
    
    server.POST("/ExamplePost1", dispatcher.MiddleWare("4-M", 20), func(ctx *gin.Context) {
    ctx.String(http.StatusOK, "Hello ExamplePost1")
    )
    
    erver.GET("/ExampleGet1", dispatcher.MiddleWare("5-M", 10), func(ctx *gin.Context) {
    ctx.String(http.StatusOK, "Hello ExampleGet1")
    )
    
    rr = server.Run(":8080")
    f err != nil {
    log.Println("gin server error = ", err)
    
    

    See more examples HERE.


Response

  • When the total of request times is within limit, we will write data to header.

    Return header:
    
    X-RateLimit-Limit-global     -> Request limit of a single ip can send request for the server. 
    X-RateLimit-Remaining-global -> Remaining times which single ip can send request for the server.
    X-RateLimit-Reset-global     -> Time to global limit reset. 
    
    X-RateLimit-Limit-single     -> Request limit of a single ip can send request for the single route.
    X-RateLimit-Remaining-single -> Remaining times which single ip can send request for the single route.
    X-RateLimit-Reset-single     -> Time to single route limit reset. 
    
    
  • When global limit or single route limit is reached, a 429 HTTP status code is sent. and add the header with:

    Return header:
    
    If global remaining request time < 0
        return global limit reset time. 
    
    If single remaining request time < 0
        return this single route limit reset time.
    

Reference

  • https://github.com/ulule/limiter
  • https://github.com/jpillora/ipfilter
  • https://github.com/KennyChenFight/dcard-simple-demo

If you want to know the updated progress, please check Ipfilter branch.

License

All source code is licensed under the MIT License.