mirror of
https://github.com/Sagit-chu/flvx.git
synced 2026-09-30 00:06:38 +08:00
94 lines
2.0 KiB
Go
94 lines
2.0 KiB
Go
package api
|
|
|
|
import (
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/go-gost/core/auth"
|
|
"github.com/go-gost/core/logger"
|
|
)
|
|
|
|
func mwLogger() gin.HandlerFunc {
|
|
return func(ctx *gin.Context) {
|
|
// start time
|
|
startTime := time.Now()
|
|
// Processing request
|
|
ctx.Next()
|
|
duration := time.Since(startTime)
|
|
|
|
logger.Default().WithFields(map[string]any{
|
|
"kind": "api",
|
|
"method": ctx.Request.Method,
|
|
"uri": ctx.Request.RequestURI,
|
|
"code": ctx.Writer.Status(),
|
|
"client": ctx.ClientIP(),
|
|
"duration": duration,
|
|
}).Infof("| %3d | %13v | %15s | %-7s %s",
|
|
ctx.Writer.Status(), duration, ctx.ClientIP(), ctx.Request.Method, ctx.Request.RequestURI)
|
|
}
|
|
}
|
|
|
|
func mwBasicAuth(auther auth.Authenticator) gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
if auther == nil {
|
|
return
|
|
}
|
|
u, p, _ := c.Request.BasicAuth()
|
|
if _, ok := auther.Authenticate(c, u, p); !ok {
|
|
c.Writer.Header().Set("WWW-Authenticate", "Basic")
|
|
c.JSON(http.StatusUnauthorized, Response{
|
|
Code: http.StatusUnauthorized,
|
|
Msg: "Unauthorized",
|
|
})
|
|
c.Abort()
|
|
}
|
|
}
|
|
}
|
|
|
|
// GlobalInterceptor 全局HTTP请求拦截器
|
|
func GlobalInterceptor() gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
// 检查认证参数,如果没有认证就静默关闭
|
|
if !hasValidAuth(c) {
|
|
// 获取底层连接并直接关闭
|
|
if hijacker, ok := c.Writer.(http.Hijacker); ok {
|
|
if conn, _, err := hijacker.Hijack(); err == nil {
|
|
conn.Close() // 直接关闭连接,不发送任何数据
|
|
return
|
|
}
|
|
}
|
|
|
|
// 如果无法hijack连接,则中止请求但不返回响应
|
|
c.Abort()
|
|
return
|
|
}
|
|
|
|
c.Next()
|
|
|
|
}
|
|
}
|
|
|
|
// hasValidAuth 检查请求是否包含有效的认证信息
|
|
func hasValidAuth(c *gin.Context) bool {
|
|
// 获取Authorization头
|
|
authHeader := c.GetHeader("Authorization")
|
|
if authHeader == "" {
|
|
return false
|
|
}
|
|
|
|
// 检查是否是Basic认证
|
|
if !strings.HasPrefix(authHeader, "Basic ") {
|
|
return false
|
|
}
|
|
|
|
// 解析Basic认证
|
|
_, _, ok := c.Request.BasicAuth()
|
|
if !ok {
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|