20 Star 164 Fork 26

qiqi / orange

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
middleware.go 2.58 KB
一键复制 编辑 原始数据 按行查看 历史
package app
import (
"gitee.com/zhucheer/orange/cfg"
"gitee.com/zhucheer/orange/encrypt"
"gitee.com/zhucheer/orange/internal"
"gitee.com/zhucheer/orange/logger"
"gitee.com/zhucheer/orange/prome"
"gitee.com/zhucheer/orange/session"
"time"
)
// MiddlewareFunc defines a function to process middleware.
type MiddlewareFunc func(HandlerFunc) HandlerFunc
type HandlerFunc func(*Context) error
type MiddleWare interface {
Func() MiddlewareFunc
}
// 翻转中间件,因执行时是从最外层函数开始,定义时需要从最后一个中间件开始定义
func reverseMiddleWare(middlewares []MiddleWare) []MiddleWare {
length := len(middlewares)
for i := 0; i < length/2; i++ {
middlewares[length-1-i], middlewares[i] = middlewares[i], middlewares[length-1-i]
}
return middlewares
}
func startCsrfToken(session session.Store) string {
csrfToken := internal.GetAppKey() + time.Now().String()
csrfTokenMd5 := encrypt.Md5ToUpper(csrfToken)
sessionKey := "CSRF-TOKEN"
if token := session.Get(sessionKey); token != nil {
return token.(string)
}
session.Set(sessionKey, csrfTokenMd5)
return csrfTokenMd5
}
func checkCsrfToken(next HandlerFunc) HandlerFunc {
return func(c *Context) error {
tokenInHeader := c.request.Header.Get("CSRF-TOKEN")
if c.request.Method == "POST" && tokenInHeader != c.CsrfToken {
return c.ResponseWrite([]byte("csrf token verify error"))
}
return next(c)
}
}
// accessLog 请求日志
func accessLog(next HandlerFunc) HandlerFunc {
return func(c *Context) error {
appName := cfg.GetString("app.name", cfg.ConfigDef.GetString("app.name"))
c.AddDelayAfterDo(func(c *Context) {
if cfg.GetBool("prome.open", false) {
promeHandler := prome.PromeHandler()
promeHandler.ReqCnt.WithLabelValues(c.Request().Method, c.RoutePath()).Inc()
promeHandler.DurSummary.WithLabelValues(c.Request().Method, c.RoutePath()).Observe(float64(c.GetMs().Milliseconds()))
}
if cfg.GetBool("app.accessLog", cfg.ConfigDef.GetBool("app.accessLog")) {
reqBody := getSplitString(string(c.OrangeInput.FormBody), 500)
responseBody := getSplitString(string(c.ResponseBody()), 500)
logger.Infow("ACCESS-LOG",
"appName", appName,
"method", c.request.Method,
"routePath", c.RoutePath(),
"host", c.OrangeInput.Host(),
"uri", c.OrangeInput.URI(),
"costMilli", c.GetMs().Milliseconds(),
"requestRaw", reqBody,
"response", responseBody)
}
}, 0)
return next(c)
}
}
func getSplitString(val string, maxLen int) (resp string) {
if len(val) > maxLen {
resp = val[:maxLen] + "...EOF"
} else {
resp = val
}
return resp
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/zhucheer/orange.git
git@gitee.com:zhucheer/orange.git
zhucheer
orange
orange
v0.5.5

搜索帮助

344bd9b3 5694891 D2dac590 5694891