pkg/adapters/iris/middleware.go (32 lines of code) (raw):
package iris
import (
"net/http"
sentinel "github.com/alibaba/sentinel-golang/api"
"github.com/alibaba/sentinel-golang/core/base"
"github.com/kataras/iris/v12"
)
func SentinelMiddleware(opts ...Option) iris.Handler {
options := evaluateOptions(opts)
return func(c iris.Context) {
resourceName := c.Request().Method + ":" + c.Request().URL.String()
if options.resourceExtract != nil {
resourceName = options.resourceExtract(c)
}
entry, err := sentinel.Entry(
resourceName,
sentinel.WithResourceType(base.ResTypeWeb),
sentinel.WithTrafficType(base.Inbound),
)
if err != nil {
if options.blockFallback != nil {
options.blockFallback(c)
} else {
c.StatusCode(http.StatusTooManyRequests)
c.StopExecution()
}
return
}
defer entry.Exit()
c.Next()
}
}