pkg/adapters/goframe/middleware.go (32 lines of code) (raw):
package goframe
import (
"github.com/alibaba/sentinel-golang/api"
"github.com/alibaba/sentinel-golang/core/base"
"github.com/gogf/gf/v2/net/ghttp"
"net/http"
)
// SentinelMiddleware returns new ghttp.HandlerFunc
// Default resource name is {method}:{path}, such as "GET:/api/users/:id"
// Default block fallback is returning 429 status code
// Define your own behavior by setting options
func SentinelMiddleware(opts ...Option) ghttp.HandlerFunc {
options := evaluateOptions(opts)
return func(r *ghttp.Request) {
resourceName := r.Method + ":" + r.URL.Path
if options.resourceExtract != nil {
resourceName = options.resourceExtract(r)
}
entry, err := api.Entry(
resourceName,
api.WithResourceType(base.ResTypeWeb),
api.WithTrafficType(base.Inbound),
)
if err != nil {
if options.blockFallback != nil {
options.blockFallback(r)
} else {
r.Response.WriteHeader(http.StatusTooManyRequests)
r.Response.Writeln("Too Many Requests")
}
return
}
defer entry.Exit()
r.Middleware.Next()
}
}