Ai
1 Star 0 Fork 0

Souki/go-framework

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
vars.go 2.59 KB
一键复制 编辑 原始数据 按行查看 历史
王少奇 提交于 2021-08-11 14:24 +08:00 . 新增 middleware
package httpserver
import (
"context"
"gitee.com/scottq/go-framework/src/utils"
"golang.org/x/time/rate"
"net/http"
"runtime/debug"
)
//response
var DefaultResponseMiddleware Middleware = func(ctx *Ctx, next func(*Ctx)) {
ctx.SetResponseHandler(NewHttpResponse(ctx.Writer()))
next(ctx)
}
//qps限流
var GlobalMiddlewareQPSLimiter = func(r rate.Limit, b int) Middleware {
limiter := rate.NewLimiter(r, b)
return func(ctx *Ctx, next func(ctx *Ctx)) {
if !limiter.Allow() {
ctx.writer.WriteHeader(http.StatusNoContent)
return
}
next(ctx)
}
}
//panic处理
var GlobalMiddlewarePanic Middleware = func(ctx *Ctx, next func(*Ctx)) {
defer func() {
if err := recover(); err != nil {
debug.PrintStack()
ctx.WriteHeader(http.StatusInternalServerError)
ctx.Response()
return
}
}()
next(ctx)
}
//添加requestId
var GlobalMiddlewareAddRequestId = func(requestIdField string) Middleware {
return func(ctx *Ctx, next func(*Ctx)) {
//添加requestId
c := context.WithValue(ctx.request.Context(), requestIdField, utils.NewRequestId())
ctx.request = ctx.request.WithContext(c)
next(ctx)
}
}
//OPTION请求过滤
var GlobalMiddlewareOptionRequest Middleware = func(ctx *Ctx, next func(*Ctx)) {
if ctx.request.Method == "OPTIONS" {
ctx.writer.WriteHeader(http.StatusNoContent)
return
}
next(ctx)
}
//跨域资源请求
var GlobalMiddlewareCorsMiddleware = func(domainWhites []string) Middleware {
return func(ctx *Ctx, next func(*Ctx)) {
allow := false
//跨域设置
if origin := ctx.request.Header.Get("Origin"); origin != "" {
if domainWhites == nil {
allow = true
} else {
for _, white := range domainWhites {
if white == origin {
allow = true
break
}
}
}
if allow {
ctx.writer.Header().Set("Access-Control-Allow-Origin", origin)
}
}
ctx.writer.Header().Set("Access-Control-Allow-Credentials", "true")
ctx.writer.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
ctx.writer.Header().Set("Access-Control-Allow-Headers", "Content-type,Authorization,x-requested-with,Request-Service")
next(ctx)
}
}
const limiterR = 100
const limiterInit = 100
const requestIdFiled = "RequestId"
var BaseMiddlewareArr = []Middleware{
GlobalMiddlewarePanic,
GlobalMiddlewareAddRequestId(requestIdFiled),
GlobalMiddlewareCorsMiddleware(nil),
GlobalMiddlewareOptionRequest,
}
var HealthMiddlewareArr = []Middleware{
GlobalMiddlewarePanic,
GlobalMiddlewareAddRequestId(requestIdFiled),
GlobalMiddlewareCorsMiddleware(nil),
GlobalMiddlewareOptionRequest,
GlobalMiddlewareQPSLimiter(limiterR, limiterInit),
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/scottq/go-framework.git
git@gitee.com:scottq/go-framework.git
scottq
go-framework
go-framework
v1.1.6

搜索帮助